SF.net SVN: geany:[4395] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Wed Nov 4 12:36:56 UTC 2009


Revision: 4395
          http://geany.svn.sourceforge.net/geany/?rev=4395&view=rev
Author:   ntrel
Date:     2009-11-04 12:36:56 +0000 (Wed, 04 Nov 2009)

Log Message:
-----------
Add 'View->Editor->Color Schemes' menu, for now only shown if color
scheme files exist in a colorschemes config directory. Color scheme
files must end in ".conf" and currently only the [named_styles]
section is read.

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

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-11-03 20:04:42 UTC (rev 4394)
+++ trunk/ChangeLog	2009-11-04 12:36:56 UTC (rev 4395)
@@ -1,3 +1,13 @@
+2009-11-04  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/highlighting.c, src/highlighting.h, src/keyfile.c, src/main.c,
+   src/editor.h:
+   Add 'View->Editor->Color Schemes' menu, for now only shown if color
+   scheme files exist in a colorschemes config directory. Color scheme
+   files must end in ".conf" and currently only the [named_styles]
+   section is read.
+
+
 2009-10-30  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
 
  * src/stash.c, src/stash.h:

Modified: trunk/src/editor.h
===================================================================
--- trunk/src/editor.h	2009-11-03 20:04:42 UTC (rev 4394)
+++ trunk/src/editor.h	2009-11-04 12:36:56 UTC (rev 4395)
@@ -130,6 +130,7 @@
 	guint		autoclose_chars;
 	gboolean	autocomplete_doc_words;
 	gboolean	completion_drops_rest_of_word;
+	gchar		*color_scheme;
 }
 GeanyEditorPrefs;
 

Modified: trunk/src/highlighting.c
===================================================================
--- trunk/src/highlighting.c	2009-11-03 20:04:42 UTC (rev 4394)
+++ trunk/src/highlighting.c	2009-11-04 12:36:56 UTC (rev 4395)
@@ -40,13 +40,19 @@
 #include "symbols.h"
 #include "ui_utils.h"
 #include "utils.h"
+#include "main.h"
+#include "support.h"
 
 
+#define GEANY_COLORSCHEMES_SUBDIR "colorschemes"
+
 /* Whitespace has to be set after setting wordchars. */
 #define GEANY_WHITESPACE_CHARS " \t" "!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~"
 
+
 static gchar *whitespace_chars;
 
+
 static void styleset_markup(ScintillaObject *sci, gboolean set_keywords);
 
 
@@ -512,14 +518,31 @@
 }
 
 
-static void styleset_common_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
+static GKeyFile *utils_key_file_new(const gchar *filename)
 {
-	/* named styles */
+	GKeyFile *config = g_key_file_new();
+
+	g_key_file_load_from_file(config, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
+	return config;
+}
+
+
+static void read_named_styles(GKeyFile *config, GKeyFile *config_home)
+{
+	const gchar *scheme = editor_prefs.color_scheme;
+
 	if (named_style_hash)
 		g_hash_table_destroy(named_style_hash);	/* reloading */
 
 	named_style_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 
+	if (NZV(scheme))
+	{
+		config = utils_key_file_new(
+			utils_build_path(app->datadir, GEANY_COLORSCHEMES_SUBDIR, scheme, NULL));
+		config_home = utils_key_file_new(
+			utils_build_path(app->configdir, GEANY_COLORSCHEMES_SUBDIR, scheme, NULL));
+	}
 	/* first set default to the "default" named style */
 	add_named_style(config, "default");
 	add_named_style(config_home, "default");
@@ -529,6 +552,18 @@
 	/* home overrides any system named style */
 	get_named_styles(config_home);
 
+	if (NZV(scheme))
+	{
+		g_key_file_free(config);
+		g_key_file_free(config_home);
+	}
+}
+
+
+static void styleset_common_init(gint ft_id, GKeyFile *config, GKeyFile *config_home)
+{
+	read_named_styles(config, config_home);
+
 	get_keyfile_style(config, config_home, "default", &common_style_set.styling[GCS_DEFAULT]);
 	get_keyfile_style(config, config_home, "selection", &common_style_set.styling[GCS_SELECTION]);
 	get_keyfile_style(config, config_home, "brace_good", &common_style_set.styling[GCS_BRACE_GOOD]);
@@ -3322,3 +3357,145 @@
 	 * with array indices) */
 	return get_style(ft_id, style_id);
 }
+
+
+static void
+on_color_scheme_clicked(GtkMenuItem *menuitem, gpointer user_data)
+{
+	gchar *fname;
+	gchar *path;
+
+	/* check if default item */
+	if (user_data)
+	{
+		setptr(editor_prefs.color_scheme, NULL);
+		/* TODO: should be changed to only reload color schemes */
+		main_reload_configuration();
+		return;
+	}
+	fname = ui_menu_item_get_text(menuitem);
+	setptr(fname, utils_get_locale_from_utf8(fname));
+
+	/* fname is just the basename from the menu item, so prepend the custom files path */
+	path = g_build_path(G_DIR_SEPARATOR_S, app->configdir, GEANY_COLORSCHEMES_SUBDIR, fname, NULL);
+	if (!g_file_test(path, G_FILE_TEST_EXISTS))
+	{
+		/* try the system path */
+		g_free(path);
+		path = g_build_path(G_DIR_SEPARATOR_S, app->datadir, GEANY_COLORSCHEMES_SUBDIR, fname, NULL);
+	}
+	if (g_file_test(path, G_FILE_TEST_EXISTS))
+	{
+		setptr(editor_prefs.color_scheme, fname);
+		fname = NULL;
+		/* TODO: should be changed to only reload color schemes */
+		main_reload_configuration();
+	}
+	else
+	{
+		setptr(fname, utils_get_utf8_from_locale(fname));
+		ui_set_statusbar(TRUE, _("Could not find file '%s'."), fname);
+	}
+	g_free(path);
+	g_free(fname);
+}
+
+
+static void add_color_scheme_item(const gchar *fname, GtkWidget *menu)
+{
+	GtkWidget *tmp_button;
+	gchar *label;
+
+	g_return_if_fail(fname);
+	g_return_if_fail(menu);
+
+	label = utils_get_utf8_from_locale(fname);
+
+	tmp_button = gtk_menu_item_new_with_label(label);
+	gtk_widget_show(tmp_button);
+	gtk_container_add(GTK_CONTAINER(menu), tmp_button);
+	g_signal_connect(tmp_button, "activate", G_CALLBACK(on_color_scheme_clicked), NULL);
+
+	g_free(label);
+}
+
+
+/* TODO: move */
+static void utils_slist_remove_next(GSList *node)
+{
+	GSList *old = node->next;
+
+	g_return_if_fail(old);
+
+	node->next = old->next;
+	g_slist_free_1(old);
+}
+
+
+/* note: color scheme code adapted from custom file template code */
+static gboolean add_color_scheme_items(GtkWidget *menu)
+{
+	gchar *path = g_build_path(G_DIR_SEPARATOR_S, app->configdir, GEANY_COLORSCHEMES_SUBDIR, NULL);
+	GSList *list = utils_get_file_list_full(path, FALSE, FALSE, NULL);
+	GSList *syslist, *node;
+
+	if (!list)
+	{
+		utils_mkdir(path, FALSE);
+	}
+	setptr(path, g_build_path(G_DIR_SEPARATOR_S, app->datadir, GEANY_COLORSCHEMES_SUBDIR, NULL));
+	syslist = utils_get_file_list_full(path, FALSE, FALSE, NULL);
+	/* merge lists */
+	list = g_slist_concat(list, syslist);
+
+	list = g_slist_sort(list, (GCompareFunc) utils_str_casecmp);
+	/* remove duplicates (next to each other after sorting) */
+	foreach_slist(node, list)
+	{
+		if (node->next && utils_str_equal(node->next->data, node->data))
+		{
+			g_free(node->next->data);
+			utils_slist_remove_next(node);
+		}
+	}
+	foreach_slist(node, list)
+	{
+		gchar *fname = node->data;
+
+		if (g_str_has_suffix(fname, ".conf"))
+			add_color_scheme_item(fname, menu);
+		g_free(fname);
+	}
+	g_slist_free(list);
+	g_free(path);
+	return list != NULL;
+}
+
+
+static void create_color_scheme_menu(void)
+{
+	GtkWidget *item, *menu, *root;
+
+	menu = ui_lookup_widget(main_widgets.window, "menu_view_editor1_menu");
+	item = ui_image_menu_item_new(GTK_STOCK_SELECT_COLOR, _("_Color Schemes"));
+	gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item);
+	root = item;
+
+	menu = gtk_menu_new();
+	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
+
+	item = gtk_menu_item_new_with_mnemonic(_("_Default"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_color_scheme_clicked), GINT_TO_POINTER(TRUE));
+
+	/* for now we don't show the color scheme menu unless there are files */
+	if (add_color_scheme_items(menu))
+		gtk_widget_show_all(root);
+}
+
+
+void highlighting_init(void)
+{
+	create_color_scheme_menu();
+}
+

Modified: trunk/src/highlighting.h
===================================================================
--- trunk/src/highlighting.h	2009-11-03 20:04:42 UTC (rev 4394)
+++ trunk/src/highlighting.h	2009-11-04 12:36:56 UTC (rev 4395)
@@ -41,6 +41,8 @@
 GeanyLexerStyle;
 
 
+void highlighting_init(void);
+
 void highlighting_init_styles(gint filetype_idx, GKeyFile *config, GKeyFile *configh);
 
 void highlighting_set_styles(ScintillaObject *sci, GeanyFiletype *ft);

Modified: trunk/src/keyfile.c
===================================================================
--- trunk/src/keyfile.c	2009-11-03 20:04:42 UTC (rev 4394)
+++ trunk/src/keyfile.c	2009-11-04 12:36:56 UTC (rev 4395)
@@ -161,6 +161,8 @@
 	stash_group_add_spin_button_integer(group, (gint*)&editor_prefs.autocompletion_max_entries,
 		"autocompletion_max_entries", GEANY_MAX_AUTOCOMPLETE_WORDS,
 		"spin_autocompletion_max_entries");
+	stash_group_add_string(group, &editor_prefs.color_scheme,
+		"color_scheme", NULL);
 
 	/* files */
 	stash_group_add_spin_button_integer(group, (gint*)&file_prefs.mru_length,

Modified: trunk/src/main.c
===================================================================
--- trunk/src/main.c	2009-11-03 20:04:42 UTC (rev 4394)
+++ trunk/src/main.c	2009-11-04 12:36:56 UTC (rev 4395)
@@ -943,6 +943,7 @@
 	sidebar_init();
 	load_settings();	/* load keyfile */
 
+	highlighting_init();
 	msgwin_init();
 	build_init();
 	ui_create_insert_menu_items();
@@ -1107,6 +1108,7 @@
 	g_free(interface_prefs.msgwin_font);
 	g_free(editor_prefs.long_line_color);
 	g_free(editor_prefs.comment_toggle_mark);
+	g_free(editor_prefs.color_scheme);
 	g_free(tool_prefs.context_action_cmd);
 	g_free(template_prefs.developer);
 	g_free(template_prefs.company);


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