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