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