SF.net SVN: geany:[3349] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Tue Dec 9 13:16:52 UTC 2008


Revision: 3349
          http://geany.svn.sourceforge.net/geany/?rev=3349&view=rev
Author:   ntrel
Date:     2008-12-09 13:16:52 +0000 (Tue, 09 Dec 2008)

Log Message:
-----------
Move Stash data types to stash.c, so Stash functions could be used
by plugins without breaking the ABI when appending fields. Also the
user code is neater and has type checking.

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

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-12-09 12:38:00 UTC (rev 3348)
+++ trunk/ChangeLog	2008-12-09 13:16:52 UTC (rev 3349)
@@ -1,3 +1,11 @@
+2008-12-09  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/stash.c, src/stash.h, src/keyfile.c, src/keyfile.h, src/main.c:
+   Move Stash data types to stash.c, so Stash functions could be used
+   by plugins without breaking the ABI when appending fields. Also the
+   user code is neater and has type checking.
+
+
 2008-12-08  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * wscript:

Modified: trunk/src/keyfile.c
===================================================================
--- trunk/src/keyfile.c	2008-12-09 12:38:00 UTC (rev 3348)
+++ trunk/src/keyfile.c	2008-12-09 13:16:52 UTC (rev 3349)
@@ -85,15 +85,84 @@
 #define GEANY_TOGGLE_MARK				"~ "
 #define GEANY_MAX_AUTOCOMPLETE_WORDS	30
 
+/* @param ptr should be a (gpointer*), needed for implementation. */
+#define foreach_ptr_array(item, ptr, ptr_array) \
+	for (ptr = ptr_array->pdata, item = *ptr; \
+		ptr < &ptr_array->pdata[ptr_array->len]; ++ptr, item = *ptr)
 
+
 static gchar *scribble_text = NULL;
 static GPtrArray *session_files = NULL;
 static gint session_notebook_page;
 static gint hpan_position;
 static gint vpan_position;
 
+static GPtrArray *pref_groups = NULL;
 
-/* probably this enum will be removed */
+
+static void add_pref_group(GeanyPrefGroup *group)
+{
+	if (pref_groups == NULL)
+		pref_groups = g_ptr_array_new();
+
+	g_ptr_array_add(pref_groups, group);
+}
+
+
+static void init_pref_groups(void)
+{
+	GeanyPrefGroup *group;
+
+	group = stash_group_new(PACKAGE);
+	add_pref_group(group);
+	stash_group_add_string(group,
+		 &prefs.default_open_path, "default_open_path", "");
+
+	stash_group_add_boolean(group,
+		 &file_prefs.cmdline_new_files, "cmdline_new_files", TRUE);
+
+	stash_group_add_boolean(group,
+		 &search_prefs.suppress_dialogs, "pref_main_suppress_search_dialogs", FALSE);
+	stash_group_add_boolean(group,
+		 &search_prefs.use_current_word, "pref_main_search_use_current_word", TRUE);
+
+	stash_group_add_boolean(group,
+		 &editor_prefs.indentation->detect_type, "check_detect_indent", FALSE);
+	stash_group_add_boolean(group,
+		 &editor_prefs.use_tab_to_indent, "use_tab_to_indent", TRUE);
+	stash_group_add_integer(group,
+		 &editor_prefs.indentation->width, "pref_editor_tab_width", 4);
+	stash_group_add_integer(group,
+		 &editor_prefs.indentation->hard_tab_width, "indent_hard_tab_width", 8);
+	stash_group_add_integer(group,
+		 (gint*)&editor_prefs.indentation->auto_indent_mode, "indent_mode", GEANY_AUTOINDENT_CURRENTCHARS);
+	stash_group_add_integer(group,
+		 (gint*)&editor_prefs.indentation->type, "indent_type", GEANY_INDENT_TYPE_TABS);
+	stash_group_add_integer(group,
+		 (gint*)&editor_prefs.autocompletion_max_entries, "autocompletion_max_entries", GEANY_MAX_AUTOCOMPLETE_WORDS);
+
+	group = stash_group_new("search");
+	add_pref_group(group);
+	stash_group_add_boolean(group,
+		 &search_prefs.use_current_file_dir, "pref_search_current_file_dir", TRUE);
+
+	/* hidden prefs (don't overwrite them so users can edit them manually) */
+	group = stash_group_new(PACKAGE);
+	add_pref_group(group);
+	stash_group_set_write_once(group, TRUE);
+	stash_group_add_boolean(group,
+		 &editor_prefs.show_scrollbars, "show_editor_scrollbars", TRUE);
+	stash_group_add_boolean(group,
+		 &editor_prefs.brace_match_ltgt, "brace_match_ltgt", FALSE);
+	stash_group_add_boolean(group,
+		 &editor_prefs.use_gtk_word_boundaries, "use_gtk_word_boundaries", TRUE);
+	stash_group_add_boolean(group,
+		 &editor_prefs.complete_snippets_whilst_editing, "complete_snippets_whilst_editing", FALSE);
+	stash_group_add_boolean(group,
+		 &interface_prefs.show_symbol_list_expanders, "show_symbol_list_expanders", TRUE);
+}
+
+
 typedef enum SettingAction
 {
 	SETTING_READ,
@@ -103,68 +172,17 @@
 
 static void settings_action(GKeyFile *config, SettingAction action)
 {
-	GeanyPrefEntry package_items[] =
-	{
-		{G_TYPE_STRING, &prefs.default_open_path, "default_open_path", "", NULL},
-
-		{G_TYPE_BOOLEAN, &file_prefs.cmdline_new_files, "cmdline_new_files",
-			(gpointer)TRUE, NULL},
-
-		{G_TYPE_BOOLEAN, &search_prefs.suppress_dialogs, "pref_main_suppress_search_dialogs",
-			(gpointer)FALSE, NULL},
-		{G_TYPE_BOOLEAN, &search_prefs.use_current_word, "pref_main_search_use_current_word",
-			(gpointer)TRUE, NULL},
-
-		{G_TYPE_BOOLEAN, &editor_prefs.indentation->detect_type, "check_detect_indent",
-			(gpointer)FALSE, NULL},
-		{G_TYPE_BOOLEAN, &editor_prefs.use_tab_to_indent, "use_tab_to_indent",
-			(gpointer)TRUE, NULL},
-		{G_TYPE_INT, &editor_prefs.indentation->width, "pref_editor_tab_width",
-			(gpointer)4, NULL},
-		{G_TYPE_INT, &editor_prefs.indentation->hard_tab_width, "indent_hard_tab_width",
-			(gpointer)8, NULL},
-		{G_TYPE_INT, &editor_prefs.indentation->auto_indent_mode, "indent_mode",
-			(gpointer)GEANY_AUTOINDENT_CURRENTCHARS, NULL},
-		{G_TYPE_INT, &editor_prefs.indentation->type, "indent_type",
-			(gpointer)GEANY_INDENT_TYPE_TABS, NULL},
-		{G_TYPE_INT, &editor_prefs.autocompletion_max_entries, "autocompletion_max_entries",
-			(gpointer)GEANY_MAX_AUTOCOMPLETE_WORDS, NULL}
-	};
-	GeanyPrefEntry search_items[] =
-	{
-		{G_TYPE_BOOLEAN, &search_prefs.use_current_file_dir, "pref_search_current_file_dir",
-			(gpointer)TRUE, NULL}
-	};
-	/* hidden prefs (don't overwrite them so users can edit them manually) */
-	GeanyPrefEntry hidden_items[] =
-	{
-		{G_TYPE_BOOLEAN, &editor_prefs.show_scrollbars, "show_editor_scrollbars",
-			(gpointer)TRUE, NULL},
-		{G_TYPE_BOOLEAN, &editor_prefs.brace_match_ltgt, "brace_match_ltgt",
-			(gpointer)FALSE, NULL},
-		{G_TYPE_BOOLEAN, &editor_prefs.use_gtk_word_boundaries, "use_gtk_word_boundaries",
-			(gpointer)TRUE, NULL},
-		{G_TYPE_BOOLEAN, &editor_prefs.complete_snippets_whilst_editing, "complete_snippets_whilst_editing",
-			(gpointer)FALSE, NULL},
-		{G_TYPE_BOOLEAN, &interface_prefs.show_symbol_list_expanders, "show_symbol_list_expanders",
-			(gpointer)TRUE, NULL}
-	};
-	GeanyPrefGroup groups[] =
-	{
-		{PACKAGE, package_items, G_N_ELEMENTS(package_items), FALSE},
-		{"search", search_items, G_N_ELEMENTS(search_items), FALSE},
-		{PACKAGE, hidden_items, G_N_ELEMENTS(hidden_items), TRUE}
-	};
+	gpointer *ptr;
 	GeanyPrefGroup *group;
 
-	foreach_c_array(group, groups, G_N_ELEMENTS(groups))
+	foreach_ptr_array(group, ptr, pref_groups)
 	{
 		switch (action)
 		{
 			case SETTING_READ:
-				stash_load_group(group, config); break;
+				stash_group_load(group, config); break;
 			case SETTING_WRITE:
-				stash_save_group(group, config); break;
+				stash_group_save(group, config); break;
 		}
 	}
 }
@@ -1073,3 +1091,21 @@
 
 #endif
 
+
+void configuration_init(void)
+{
+	init_pref_groups();
+}
+
+
+void configuration_finalize(void)
+{
+	gpointer *ptr;
+	GeanyPrefGroup *group;
+
+	foreach_ptr_array(group, ptr, pref_groups)
+		stash_group_free(group);
+
+	g_ptr_array_free(pref_groups, TRUE);
+}
+

Modified: trunk/src/keyfile.h
===================================================================
--- trunk/src/keyfile.h	2008-12-09 12:38:00 UTC (rev 3348)
+++ trunk/src/keyfile.h	2008-12-09 13:16:52 UTC (rev 3349)
@@ -26,6 +26,10 @@
 #define GEANY_KEYFILE_H 1
 
 
+void configuration_init(void);
+
+void configuration_finalize(void);
+
 void configuration_save(void);
 
 gboolean configuration_load(void);

Modified: trunk/src/main.c
===================================================================
--- trunk/src/main.c	2008-12-09 12:38:00 UTC (rev 3348)
+++ trunk/src/main.c	2008-12-09 13:16:52 UTC (rev 3349)
@@ -920,6 +920,7 @@
 	encodings_init();
 	editor_init();
 
+	configuration_init();
 	load_settings();
 
 	msgwin_init();
@@ -1054,6 +1055,8 @@
 	editor_snippets_free();
 	encodings_finalize();
 	toolbar_finalize();
+	configuration_finalize();
+	/* must be last */
 	log_finalize();
 
 	tm_workspace_free(TM_WORK_OBJECT(app->tm_workspace));

Modified: trunk/src/stash.c
===================================================================
--- trunk/src/stash.c	2008-12-09 12:38:00 UTC (rev 3348)
+++ trunk/src/stash.c	2008-12-09 13:16:52 UTC (rev 3349)
@@ -31,7 +31,27 @@
 #include "stash.h"
 #include "utils.h"
 
+#define foreach_array(type, item, array) \
+	foreach_c_array(item, ((type*)(gpointer)array->data), array->len)
 
+
+struct GeanyPrefEntry
+{
+	GType type;					/* e.g. G_TYPE_INT */
+	gpointer setting;
+	const gchar *key_name;
+	gpointer default_value;
+	const gchar *widget_name;
+};
+
+struct GeanyPrefGroup
+{
+	const gchar *name;			/* group name to use in the keyfile */
+	GArray *entries;			/* array of GeanyPrefEntry */
+	gboolean write_once;		/* only write settings if they don't already exist */
+};
+
+
 typedef enum SettingAction
 {
 	SETTING_READ,
@@ -41,7 +61,7 @@
 
 
 
-static void handle_bool_setting(GeanyPrefGroup *group, GeanyPrefEntry *se,
+static void handle_boolean_setting(GeanyPrefGroup *group, GeanyPrefEntry *se,
 		GKeyFile *config, SettingAction action)
 {
 	gboolean *setting = se->setting;
@@ -59,7 +79,7 @@
 }
 
 
-static void handle_int_setting(GeanyPrefGroup *group, GeanyPrefEntry *se,
+static void handle_integer_setting(GeanyPrefGroup *group, GeanyPrefEntry *se,
 		GKeyFile *config, SettingAction action)
 {
 	gboolean *setting = se->setting;
@@ -100,7 +120,7 @@
 {
 	GeanyPrefEntry *entry;
 
-	foreach_c_array(entry, group->entries, group->entries_len)
+	foreach_array(GeanyPrefEntry, entry, group->entries)
 	{
 		if (group->write_once && action == SETTING_WRITE &&
 			g_key_file_has_key(keyfile, group->name, entry->key_name, NULL))
@@ -109,9 +129,9 @@
 		switch (entry->type)
 		{
 			case G_TYPE_BOOLEAN:
-				handle_bool_setting(group, entry, keyfile, action); break;
+				handle_boolean_setting(group, entry, keyfile, action); break;
 			case G_TYPE_INT:
-				handle_int_setting(group, entry, keyfile, action); break;
+				handle_integer_setting(group, entry, keyfile, action); break;
 			case G_TYPE_STRING:
 				handle_string_setting(group, entry, keyfile, action); break;
 			default:
@@ -121,15 +141,68 @@
 }
 
 
-void stash_load_group(GeanyPrefGroup *group, GKeyFile *keyfile)
+void stash_group_load(GeanyPrefGroup *group, GKeyFile *keyfile)
 {
 	keyfile_action(group, keyfile, SETTING_READ);
 }
 
 
-void stash_save_group(GeanyPrefGroup *group, GKeyFile *keyfile)
+void stash_group_save(GeanyPrefGroup *group, GKeyFile *keyfile)
 {
 	keyfile_action(group, keyfile, SETTING_WRITE);
 }
 
 
+GeanyPrefGroup *stash_group_new(const gchar *name)
+{
+	GeanyPrefGroup *group = g_new0(GeanyPrefGroup, 1);
+
+	group->name = name;
+	group->entries = g_array_new(FALSE, FALSE, sizeof(GeanyPrefEntry));
+	return group;
+}
+
+
+void stash_group_free(GeanyPrefGroup *group)
+{
+	g_array_free(group->entries, TRUE);
+	g_free(group);
+}
+
+
+void stash_group_set_write_once(GeanyPrefGroup *group, gboolean write_once)
+{
+	group->write_once = write_once;
+}
+
+
+static void add_pref(GeanyPrefGroup *group, GType type, gpointer setting,
+		const gchar *key_name, gpointer default_value)
+{
+	GeanyPrefEntry entry = {type, setting, key_name, default_value, NULL};
+
+	g_array_append_val(group->entries, entry);
+}
+
+
+void stash_group_add_boolean(GeanyPrefGroup *group, gboolean *setting,
+		const gchar *key_name, gboolean default_value)
+{
+	add_pref(group, G_TYPE_BOOLEAN, setting, key_name, GINT_TO_POINTER(default_value));
+}
+
+
+void stash_group_add_integer(GeanyPrefGroup *group, gint *setting,
+		const gchar *key_name, gint default_value)
+{
+	add_pref(group, G_TYPE_INT, setting, key_name, GINT_TO_POINTER(default_value));
+}
+
+
+void stash_group_add_string(GeanyPrefGroup *group, gchar **setting,
+		const gchar *key_name, const gchar *default_value)
+{
+	add_pref(group, G_TYPE_STRING, setting, key_name, g_strdup(default_value));
+}
+
+

Modified: trunk/src/stash.h
===================================================================
--- trunk/src/stash.h	2008-12-09 12:38:00 UTC (rev 3348)
+++ trunk/src/stash.h	2008-12-09 13:16:52 UTC (rev 3349)
@@ -25,27 +25,28 @@
 #ifndef GEANY_STASH_H
 #define GEANY_STASH_H
 
-typedef struct GeanyPrefEntry
-{
-	GType type;					/* e.g. G_TYPE_INT */
-	gpointer setting;
-	const gchar *key_name;
-	gpointer default_value;
-	const gchar *widget_name;
-}
-GeanyPrefEntry;
+typedef struct GeanyPrefEntry GeanyPrefEntry;
 
-typedef struct GeanyPrefGroup
-{
-	const gchar *name;			/* group name to use in the keyfile */
-	GeanyPrefEntry *entries;
-	gsize entries_len;
-	gboolean write_once;		/* only write settings if they don't already exist */
-}
-GeanyPrefGroup;
+typedef struct GeanyPrefGroup GeanyPrefGroup;
 
 
-void stash_load_group(GeanyPrefGroup *group, GKeyFile *keyfile);
-void stash_save_group(GeanyPrefGroup *group, GKeyFile *keyfile);
+GeanyPrefGroup *stash_group_new(const gchar *name);
 
+void stash_group_set_write_once(GeanyPrefGroup *group, gboolean write_once);
+
+void stash_group_add_boolean(GeanyPrefGroup *group, gboolean *setting,
+                const gchar *key_name, gboolean default_value);
+
+void stash_group_add_integer(GeanyPrefGroup *group, gint *setting,
+                const gchar *key_name, gint default_value);
+
+void stash_group_add_string(GeanyPrefGroup *group, gchar **setting,
+                const gchar *key_name, const gchar *default_value);
+
+void stash_group_load(GeanyPrefGroup *group, GKeyFile *keyfile);
+
+void stash_group_save(GeanyPrefGroup *group, GKeyFile *keyfile);
+
+void stash_group_free(GeanyPrefGroup *group);
+
 #endif


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