SF.net SVN: geany:[3996] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Mon Jul 20 12:00:07 UTC 2009


Revision: 3996
          http://geany.svn.sourceforge.net/geany/?rev=3996&view=rev
Author:   ntrel
Date:     2009-07-20 12:00:06 +0000 (Mon, 20 Jul 2009)

Log Message:
-----------
Add stash_group_add_widget_property() so we can save any widget's
read/write properties.
Use Stash for ui_prefs.sidebar_page setting.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/callbacks.c
    trunk/src/keyfile.c
    trunk/src/stash.c
    trunk/src/stash.h
    trunk/src/treeviews.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-07-20 11:21:05 UTC (rev 3995)
+++ trunk/ChangeLog	2009-07-20 12:00:06 UTC (rev 3996)
@@ -1,3 +1,12 @@
+2009-07-20  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/treeviews.c, src/callbacks.c, src/stash.c, src/stash.h,
+   src/keyfile.c:
+   Add stash_group_add_widget_property() so we can save any widget's
+   read/write properties.
+   Use Stash for ui_prefs.sidebar_page setting.
+
+
 2009-07-19  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * src/dialogs.c:

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2009-07-20 11:21:05 UTC (rev 3995)
+++ trunk/src/callbacks.c	2009-07-20 12:00:06 UTC (rev 3996)
@@ -1629,10 +1629,6 @@
 	if (ignore_callback)
 		return;
 
-	if (ui_prefs.sidebar_visible)
-		ui_prefs.sidebar_page = gtk_notebook_get_current_page(
-			GTK_NOTEBOOK(main_widgets.sidebar_notebook));
-
 	ui_prefs.sidebar_visible = ! ui_prefs.sidebar_visible;
 
 	if ((! interface_prefs.sidebar_openfiles_visible && ! interface_prefs.sidebar_symbol_visible))
@@ -1642,8 +1638,6 @@
 	}
 
 	ui_sidebar_show_hide();
-	gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.sidebar_notebook),
-		ui_prefs.sidebar_page);
 }
 
 

Modified: trunk/src/keyfile.c
===================================================================
--- trunk/src/keyfile.c	2009-07-20 11:21:05 UTC (rev 3995)
+++ trunk/src/keyfile.c	2009-07-20 12:00:06 UTC (rev 3996)
@@ -452,14 +452,7 @@
 
 static void save_ui_prefs(GKeyFile *config)
 {
-	/* If the sidebar is visible, retrieve the active page number. Otherwise it was already
-	 * set on hiding the sidebar. */
-	if (ui_prefs.sidebar_visible)
-		ui_prefs.sidebar_page = gtk_notebook_get_current_page(
-			GTK_NOTEBOOK(main_widgets.sidebar_notebook));
-
 	g_key_file_set_boolean(config, PACKAGE, "sidebar_visible", ui_prefs.sidebar_visible);
-	g_key_file_set_integer(config, PACKAGE, "sidebar_page", ui_prefs.sidebar_page);
 	g_key_file_set_boolean(config, PACKAGE, "statusbar_visible", interface_prefs.statusbar_visible);
 	g_key_file_set_boolean(config, PACKAGE, "msgwindow_visible", ui_prefs.msgwindow_visible);
 	g_key_file_set_boolean(config, PACKAGE, "fullscreen", ui_prefs.fullscreen);
@@ -809,7 +802,6 @@
 	GError *error = NULL;
 
 	ui_prefs.sidebar_visible = utils_get_setting_boolean(config, PACKAGE, "sidebar_visible", TRUE);
-	ui_prefs.sidebar_page = utils_get_setting_integer(config, PACKAGE, "sidebar_page", 0);
 	ui_prefs.msgwindow_visible = utils_get_setting_boolean(config, PACKAGE, "msgwindow_visible", TRUE);
 	ui_prefs.fullscreen = utils_get_setting_boolean(config, PACKAGE, "fullscreen", FALSE);
 	ui_prefs.custom_date_format = utils_get_setting_string(config, PACKAGE, "custom_date_format", "");

Modified: trunk/src/stash.c
===================================================================
--- trunk/src/stash.c	2009-07-20 11:21:05 UTC (rev 3995)
+++ trunk/src/stash.c	2009-07-20 12:00:06 UTC (rev 3996)
@@ -31,8 +31,18 @@
  *
  * Memory Usage
  * Stash will not duplicate strings if they are normally static arrays, such as
- * keyfile group names and key names, string default values or widget_id names.
- * String settings and other dynamically allocated settings must be initialized to NULL.
+ * keyfile group names and key names, string default values, widget_id names, property names.
+ *
+ * String Settings
+ * String settings and other dynamically allocated settings must be initialized to NULL as they
+ * will be freed before reassigning.
+ *
+ * Widget Support
+ * Widgets very commonly used in configuration dialogs will be supported with their own function.
+ * Widgets less commonly used such as GtkExpander or widget settings that aren't commonly needed
+ * to be persistent won't be directly supported, to keep the library lightweight. However, you can
+ * use stash_group_add_widget_property() to also save these settings for any read/write widget
+ * property.
  */
 
 /* Implementation Note
@@ -251,8 +261,10 @@
 	{
 		if (entry->widget_type == GTK_TYPE_RADIO_BUTTON)
 			g_free(entry->fields);
+		else if (entry->widget_type == G_TYPE_PARAM)
+			continue;
 		else
-			g_assert(entry->fields == NULL);
+			g_assert(entry->fields == NULL);	/* to prevent memory leaks, must handle fields above */
 	}
 	g_array_free(group->entries, TRUE);
 	g_free(group);
@@ -407,8 +419,7 @@
 
 /* taken from Glade 2.x generated support.c */
 static GtkWidget*
-lookup_widget                          (GtkWidget       *widget,
-                                        const gchar     *widget_name)
+lookup_widget(GtkWidget *widget, const gchar *widget_name)
 {
 	GtkWidget *parent, *found_widget;
 
@@ -495,6 +506,28 @@
 }
 
 
+static void handle_widget_property(GtkWidget *widget, GeanyPrefEntry *entry,
+		PrefAction action)
+{
+	GObject *object = G_OBJECT(widget);
+	const gchar *name = entry->fields;
+
+	switch (action)
+	{
+		case PREF_DISPLAY:
+			g_object_set(object, name, entry->setting, NULL);
+			break;
+		case PREF_UPDATE:
+			if (entry->setting_type == G_TYPE_STRING)
+				g_free(entry->setting);
+			/* TODO: Which other types need freeing here? */
+
+			g_object_get(object, name, entry->setting, NULL);
+			break;
+	}
+}
+
+
 static void pref_action(PrefAction action, GeanyPrefGroup *group, GtkWidget *owner)
 {
 	GeanyPrefEntry *entry;
@@ -503,9 +536,11 @@
 	{
 		GtkWidget *widget;
 
+		/* ignore settings with no widgets */
 		if (entry->widget_type == G_TYPE_NONE)
 			continue;
 
+		/* radio buttons have several widgets */
 		if (entry->widget_type == GTK_TYPE_RADIO_BUTTON)
 		{
 			handle_radio_buttons(owner, entry->fields, entry->setting, action);
@@ -531,6 +566,8 @@
 			handle_combo_box_entry(widget, entry, action);
 		else if (entry->widget_type == GTK_TYPE_ENTRY)
 			handle_entry(widget, entry, action);
+		else if (entry->widget_type == G_TYPE_PARAM)
+			handle_widget_property(widget, entry, action);
 		else
 			g_warning("Unhandled type for %s::%s in %s()!", group->name, entry->key_name,
 				G_STRFUNC);
@@ -663,3 +700,33 @@
 }
 
 
+static GType object_get_property_type(GObject *object, const gchar *property_name)
+{
+	GObjectClass *klass = G_OBJECT_GET_CLASS(object);
+	GParamSpec *ps;
+
+	ps = g_object_class_find_property(klass, property_name);
+	return ps->value_type;
+}
+
+
+/* Add a widget's read/write property to the stash group. The property will be set when calling
+ * stash_group_display(), and read when calling stash_group_update().
+ * @param setting address of e.g. an integer if using an integer property.
+ * @param default_value should be cast into a pointer e.g. with @c GINT_TO_POINTER().
+ * @param type can be 0 if passing a GtkWidget as the @a widget_id argument to look it up from the
+ * GObject data.
+ * @warning Currently only string GValue properties will be freed before setting; patch for
+ * other types - see handle_widget_property(). */
+void stash_group_add_widget_property(GeanyPrefGroup *group, gpointer setting,
+		const gchar *key_name, gpointer default_value, gpointer widget_id,
+		const gchar *property_name, GType type)
+{
+	if (!type)
+		type = object_get_property_type(G_OBJECT(widget_id), property_name);
+
+	add_widget_pref(group, type, setting, key_name, default_value,
+		G_TYPE_PARAM, widget_id)->fields = (gchar*)property_name;
+}
+
+

Modified: trunk/src/stash.h
===================================================================
--- trunk/src/stash.h	2009-07-20 11:21:05 UTC (rev 3995)
+++ trunk/src/stash.h	2009-07-20 12:00:06 UTC (rev 3996)
@@ -76,6 +76,10 @@
 void stash_group_add_entry(GeanyPrefGroup *group, gchar **setting,
 		const gchar *key_name, const gchar *default_value, gpointer widget_id);
 
+void stash_group_add_widget_property(GeanyPrefGroup *group, gpointer setting,
+		const gchar *key_name, gpointer default_value, gpointer widget_id,
+		const gchar *property_name, GType type);
+
 void stash_group_display(GeanyPrefGroup *group, GtkWidget *owner);
 
 void stash_group_update(GeanyPrefGroup *group, GtkWidget *owner);

Modified: trunk/src/treeviews.c
===================================================================
--- trunk/src/treeviews.c	2009-07-20 11:21:05 UTC (rev 3995)
+++ trunk/src/treeviews.c	2009-07-20 12:00:06 UTC (rev 3996)
@@ -885,24 +885,38 @@
 }
 
 
+GeanyPrefGroup *stash_group = NULL;
+
 static void on_load_settings(void)
 {
 	tag_window = ui_lookup_widget(main_widgets.window, "scrolledwindow2");
 
 	prepare_openfiles();
+	/* note: ui_prefs.sidebar_page is reapplied after plugins are loaded */
+	stash_group_display(stash_group, NULL);
 }
 
 
+static void on_save_settings(void)
+{
+	stash_group_update(stash_group, NULL);
+}
+
+
 void treeviews_init(void)
 {
 	GeanyPrefGroup *group;
 
 	group = stash_group_new(PACKAGE);
 	stash_group_add_boolean(group, &documents_show_paths, "documents_show_paths", TRUE);
+	stash_group_add_widget_property(group, &ui_prefs.sidebar_page, "sidebar_page", GINT_TO_POINTER(0),
+		main_widgets.sidebar_notebook, "page", 0);
 	configuration_add_pref_group(group, FALSE);
+	stash_group = group;
 
 	/* delay building documents treeview until sidebar font has been read */
 	g_signal_connect(geany_object, "load-settings", on_load_settings, NULL);
+	g_signal_connect(geany_object, "save-settings", on_save_settings, NULL);
 }
 
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list