[Xfce4-commits] <mousepad:matt/gtksourceview> Add colour scheme support.
Matthew Brush
noreply at xfce.org
Thu Oct 6 23:18:11 CEST 2011
Updating branch refs/heads/matt/gtksourceview
to cc401c48985b9f06c855cac39175ddcbe0efe091 (commit)
from 9a6ad0cb703ec1ef475458cec656cbeef9d865dc (commit)
commit cc401c48985b9f06c855cac39175ddcbe0efe091
Author: Matthew Brush <mbrush at codebrainz.ca>
Date: Mon Oct 3 20:06:24 2011 -0700
Add colour scheme support.
* Add new preference 'color-scheme' that stores the scheme's ID string.
* Add new 'Color Schemes' menu and placeholder for items to UI XML file.
* Add new actions for all colour schemes and merge into UI manager menu.
* Handle actions by looping though all textview widgets and setting style.
* Using 'g_str_hash' of scheme id for radio action value which might be bad.
mousepad/mousepad-document.c | 18 +++-
mousepad/mousepad-preferences.c | 9 ++
mousepad/mousepad-private.h | 2 +
mousepad/mousepad-window-ui.xml | 4 +
mousepad/mousepad-window.c | 196 +++++++++++++++++++++++++++++++++++++++
5 files changed, 224 insertions(+), 5 deletions(-)
diff --git a/mousepad/mousepad-document.c b/mousepad/mousepad-document.c
index 638f639..1f80b12 100644
--- a/mousepad/mousepad-document.c
+++ b/mousepad/mousepad-document.c
@@ -163,11 +163,12 @@ mousepad_document_class_init (MousepadDocumentClass *klass)
static void
mousepad_document_init (MousepadDocument *document)
{
- GtkTargetList *target_list;
- gboolean word_wrap, auto_indent, line_numbers, insert_spaces;
- gchar *font_name;
- gint tab_size;
- MousepadPreferences *preferences;
+ GtkTargetList *target_list;
+ gboolean word_wrap, auto_indent, line_numbers, insert_spaces;
+ gchar *font_name, *color_scheme;
+ gint tab_size;
+ GtkSourceStyleScheme *scheme = NULL;
+ MousepadPreferences *preferences;
/* private structure */
document->priv = MOUSEPAD_DOCUMENT_GET_PRIVATE (document);
@@ -215,6 +216,7 @@ mousepad_document_init (MousepadDocument *document)
"view-font-name", &font_name,
"view-tab-size", &tab_size,
"view-insert-spaces", &insert_spaces,
+ "view-color-scheme", &color_scheme,
NULL);
/* release the preferences */
@@ -227,9 +229,15 @@ mousepad_document_init (MousepadDocument *document)
mousepad_view_set_auto_indent (document->textview, auto_indent);
mousepad_view_set_tab_size (document->textview, tab_size);
mousepad_view_set_insert_spaces (document->textview, insert_spaces);
+
+ if (g_strcmp0 (color_scheme, "none") != 0)
+ scheme = gtk_source_style_scheme_manager_get_scheme (gtk_source_style_scheme_manager_get_default (), color_scheme);
+ gtk_source_buffer_set_highlight_syntax (GTK_SOURCE_BUFFER (document->buffer), (scheme != NULL));
+ gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (document->buffer), scheme);
/* cleanup */
g_free (font_name);
+ g_free (color_scheme);
/* attach signals to the text view and buffer */
g_signal_connect (G_OBJECT (document->buffer), "notify::cursor-position", G_CALLBACK (mousepad_document_notify_cursor_position), document);
diff --git a/mousepad/mousepad-preferences.c b/mousepad/mousepad-preferences.c
index cbf1ec1..5b45b71 100644
--- a/mousepad/mousepad-preferences.c
+++ b/mousepad/mousepad-preferences.c
@@ -61,6 +61,7 @@ enum
PROP_VIEW_TAB_WIDTH,
PROP_VIEW_TABS_AS_SPACES,
PROP_VIEW_WORD_WRAP,
+ PROP_VIEW_COLOR_SCHEME,
/* window preferences */
PROP_WINDOW_HEIGHT,
@@ -213,6 +214,14 @@ mousepad_preferences_class_init (MousepadPreferencesClass *klass)
NULL,
FALSE,
MOUSEPAD_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_VIEW_COLOR_SCHEME,
+ g_param_spec_string ("view-color-scheme",
+ "ViewColorScheme",
+ NULL,
+ "none",
+ MOUSEPAD_PARAM_READWRITE));
/**
diff --git a/mousepad/mousepad-private.h b/mousepad/mousepad-private.h
index 520a9f7..85fae3c 100644
--- a/mousepad/mousepad-private.h
+++ b/mousepad/mousepad-private.h
@@ -22,6 +22,8 @@
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <gtksourceview/gtksourceview.h>
+#include <gtksourceview/gtksourcestylescheme.h>
+#include <gtksourceview/gtksourcestyleschememanager.h>
G_BEGIN_DECLS
diff --git a/mousepad/mousepad-window-ui.xml b/mousepad/mousepad-window-ui.xml
index b6b6575..2fd1c3f 100644
--- a/mousepad/mousepad-window-ui.xml
+++ b/mousepad/mousepad-window-ui.xml
@@ -68,6 +68,10 @@
<menuitem action="font" />
<separator />
<menuitem action="statusbar" />
+ <separator />
+ <menu action="color-scheme-menu">
+ <placeholder name="placeholder-color-scheme-items" />
+ </menu>
</menu>
<menu action="text-menu">
diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c
index 2d8b97c..4c5e33e 100644
--- a/mousepad/mousepad-window.c
+++ b/mousepad/mousepad-window.c
@@ -98,6 +98,11 @@ static gboolean mousepad_window_close_document (MousepadW
MousepadDocument *document);
static void mousepad_window_set_title (MousepadWindow *window);
+/* color scheme functions */
+static gint mousepad_window_color_schemes_compare_by_name(gconstpointer a,
+ gconstpointer b);
+static GList *mousepad_window_color_schemes_sorted_by_name (void);
+
/* notebook signals */
static void mousepad_window_notebook_switch_page (GtkNotebook *notebook,
GtkNotebookPage *page,
@@ -171,6 +176,7 @@ static void mousepad_window_update_actions (MousepadW
static gboolean mousepad_window_update_gomenu_idle (gpointer user_data);
static void mousepad_window_update_gomenu_idle_destroy (gpointer user_data);
static void mousepad_window_update_gomenu (MousepadWindow *window);
+static void mousepad_window_menu_color_schemes (MousepadWindow *window);
/* recent functions */
static void mousepad_window_recent_add (MousepadWindow *window,
@@ -316,6 +322,8 @@ static void mousepad_window_action_auto_indent (GtkToggle
MousepadWindow *window);
static void mousepad_window_action_tab_size (GtkToggleAction *action,
MousepadWindow *window);
+static void mousepad_window_action_color_scheme (GtkToggleAction *action,
+ MousepadWindow *window);
static void mousepad_window_action_insert_spaces (GtkToggleAction *action,
MousepadWindow *window);
static void mousepad_window_action_line_ending (GtkRadioAction *action,
@@ -421,6 +429,7 @@ static const GtkActionEntry action_entries[] =
{ "view-menu", NULL, N_("_View"), NULL, NULL, NULL, },
{ "font", GTK_STOCK_SELECT_FONT, N_("Select F_ont..."), NULL, N_("Change the editor font"), G_CALLBACK (mousepad_window_action_select_font), },
+ { "color-scheme-menu", NULL, N_("_Color Scheme"), NULL, NULL, NULL, },
{ "text-menu", NULL, N_("_Text"), NULL, NULL, NULL, },
{ "convert-menu", NULL, N_("_Convert"), NULL, NULL, NULL, },
@@ -604,6 +613,9 @@ mousepad_window_init (MousepadWindow *window)
/* add tab size menu */
mousepad_window_menu_tab_sizes (window);
+
+ /* add color schemes menu */
+ mousepad_window_menu_color_schemes (window);
/* set accel group for the window */
accel_group = gtk_ui_manager_get_accel_group (window->ui_manager);
@@ -3043,6 +3055,130 @@ mousepad_window_delete_event (MousepadWindow *window,
/**
+ * Colour scheme functions
+ */
+static gint
+mousepad_window_color_schemes_compare_by_name (gconstpointer a,
+ gconstpointer b)
+{
+ const gchar *name_a, *name_b;
+
+ if (G_UNLIKELY (!a))
+ return -(a != b);
+ if (G_UNLIKELY (!b))
+ return a != b;
+
+ name_a = gtk_source_style_scheme_get_name (GTK_SOURCE_STYLE_SCHEME (a));
+ name_b = gtk_source_style_scheme_get_name (GTK_SOURCE_STYLE_SCHEME (b));
+
+ return g_strcmp0 (name_a, name_b);
+}
+
+
+
+static GList *
+mousepad_window_color_schemes_sorted_by_name (void)
+{
+ GList *list = NULL;
+ const gchar * const *schemes;
+ GtkSourceStyleScheme *scheme;
+
+ schemes = gtk_source_style_scheme_manager_get_scheme_ids (
+ gtk_source_style_scheme_manager_get_default ());
+
+ while (*schemes)
+ {
+ scheme = gtk_source_style_scheme_manager_get_scheme (
+ gtk_source_style_scheme_manager_get_default (), *schemes);
+ list = g_list_prepend (list, scheme);
+ schemes++;
+ }
+
+ return g_list_sort (list, mousepad_window_color_schemes_compare_by_name);
+}
+
+
+
+static void
+mousepad_window_menu_color_schemes (MousepadWindow *window)
+{
+ GtkRadioAction *action;
+ GSList *group = NULL;
+ GList *schemes, *iter;
+ gint merge_id;
+ gchar *name;
+
+ /* lock menu updates */
+ lock_menu_updates++;
+
+ /* get list of schemes */
+ schemes = mousepad_window_color_schemes_sorted_by_name ();
+
+ /* create merge id */
+ merge_id = gtk_ui_manager_new_merge_id (window->ui_manager);
+
+ /* create a "none" action */
+ action = gtk_radio_action_new ("color-scheme-none",
+ _("None"),
+ _("Turn off color schemes"),
+ NULL,
+ g_str_hash ("none"));
+ gtk_radio_action_set_group (action, group);
+ group = gtk_radio_action_get_group (action);
+ g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (mousepad_window_action_color_scheme), window);
+ gtk_action_group_add_action_with_accel (window->action_group, GTK_ACTION (action), "");
+
+ /* release the action */
+ g_object_unref (G_OBJECT (action));
+
+ /* add the action to the go menu */
+ gtk_ui_manager_add_ui (window->ui_manager, merge_id,
+ "/main-menu/view-menu/color-scheme-menu/placeholder-color-scheme-items",
+ "color-scheme-none", "color-scheme-none", GTK_UI_MANAGER_MENUITEM, FALSE);
+
+ /* add a separator */
+ gtk_ui_manager_add_ui (window->ui_manager, merge_id,
+ "/main-menu/view-menu/color-scheme-menu/placeholder-color-scheme-items",
+ "color-scheme-separator", NULL, GTK_UI_MANAGER_SEPARATOR, FALSE);
+
+ /* add the color schemes to the menu */
+ for (iter = schemes; iter != NULL; iter = g_list_next (iter))
+ {
+ /* create action name */
+ name = g_strdup_printf ("color-scheme_%s", gtk_source_style_scheme_get_id (iter->data));
+
+ action = gtk_radio_action_new (name,
+ gtk_source_style_scheme_get_name (iter->data),
+ gtk_source_style_scheme_get_description (iter->data),
+ NULL,
+ g_str_hash (gtk_source_style_scheme_get_id (iter->data)));
+ gtk_radio_action_set_group (action, group);
+ group = gtk_radio_action_get_group (action);
+ g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (mousepad_window_action_color_scheme), window);
+ gtk_action_group_add_action_with_accel (window->action_group, GTK_ACTION (action), "");
+
+ /* release the action */
+ g_object_unref (G_OBJECT (action));
+
+ /* add the action to the go menu */
+ gtk_ui_manager_add_ui (window->ui_manager, merge_id,
+ "/main-menu/view-menu/color-scheme-menu/placeholder-color-scheme-items",
+ name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
+
+ /* cleanup */
+ g_free (name);
+ }
+
+ /* cleanup the list */
+ g_list_free (schemes);
+
+ /* unlock */
+ lock_menu_updates--;
+}
+
+
+
+/**
* Menu Actions
*
* All those function should be sorted by the menu structure so it's
@@ -4458,6 +4594,66 @@ mousepad_window_action_tab_size (GtkToggleAction *action,
static void
+mousepad_window_action_color_scheme (GtkToggleAction *action,
+ MousepadWindow *window)
+{
+ gint page_num = 0;
+ guint scheme_id_hash;
+ GtkWidget *page;
+ GtkTextBuffer *buffer;
+ GtkSourceStyleScheme *scheme = NULL;
+ MousepadDocument *document;
+ GList *schemes, *iter;
+
+ mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+
+ /* leave when menu updates are locked */
+ if (lock_menu_updates == 0 && gtk_toggle_action_get_active (action))
+ {
+ mousepad_return_if_fail (MOUSEPAD_IS_DOCUMENT (window->active));
+
+ /* get the color scheme id hashed */
+ scheme_id_hash = (guint) gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
+
+ if (scheme_id_hash != g_str_hash ("none"))
+ {
+ /* lookup the scheme from the id hash */
+ schemes = mousepad_window_color_schemes_sorted_by_name ();
+ for (iter = schemes; iter != NULL; iter = g_list_next (iter))
+ {
+ if (scheme_id_hash == g_str_hash (gtk_source_style_scheme_get_id (iter->data)))
+ {
+ scheme = iter->data;
+ break;
+ }
+ }
+ g_list_free (schemes);
+ }
+
+ /* store as last used value */
+ g_object_set (G_OBJECT (window->preferences),
+ "view-color-scheme",
+ (scheme != NULL) ? gtk_source_style_scheme_get_id (scheme) : "none",
+ NULL);
+
+ /* apply colour scheme to all open textviews */
+ while ((page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), page_num)))
+ {
+ if (G_LIKELY (MOUSEPAD_IS_DOCUMENT (page)))
+ {
+ document = MOUSEPAD_DOCUMENT (page);
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (document->textview));
+ gtk_source_buffer_set_highlight_syntax (GTK_SOURCE_BUFFER (buffer), (scheme != NULL));
+ gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (buffer), scheme);
+ }
+ page_num++;
+ }
+ }
+}
+
+
+
+static void
mousepad_window_action_insert_spaces (GtkToggleAction *action,
MousepadWindow *window)
{
More information about the Xfce4-commits
mailing list