added global color table support for all widgets

This commit is contained in:
Jesse van den Kieboom 2006-04-01 14:27:40 +00:00
parent 4ccc539137
commit 3d1ab9f28d
9 changed files with 504 additions and 130 deletions

View File

@ -1,3 +1,12 @@
2006-01-04 Jesse van den Kieboom <jesse@icecrew.nl>
* gnoemoe/widgets/gm-log-view.c:
* gnoemoe/widgets/gm-source-style-scheme.[ch]:
* gnoemoe/widgets/gm-editor-view.c:
* gnoemoe/widgets/gm-world-input-view.c:
* gnoemoe/widgets/Makefile.include:
* gnoemoe/gm-support.[ch]:
added color table support for all widgets
2006-31-03 Jesse van den Kieboom <jesse@icecrew.nl>
* gnoemoe/gm-support.[ch]: added find parent function
* gnoemoe/widgets/gm-world-view.c: improved tab showing

View File

@ -21,6 +21,8 @@
#include "gm-debug.h"
#include "gm-pixbuf.h"
#include "gm-string.h"
#include "gm-color-table.h"
#include "gm-app.h"
#define URL_REGEXP "(((mailto|news|telnet|nttp|file|http|sftp|ftp|https|dav|callto)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.@:]+[^]''\\.}>\\) ,\\/\\\"\\!]+(:[0-9]*)?(/|/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"\\!])?"
static regex_t url_regexp;
@ -645,3 +647,152 @@ gm_container_item(GtkContainer *cnt, GType type) {
g_list_free(child_first);
return result;
}
static void
modify_cursor_color(GtkWidget *textview, GdkColor *color) {
static const char cursor_color_rc[] =
"style \"svs-cc\"\n"
"{\n"
"GtkTextView::cursor-color=\"#%04x%04x%04x\"\n"
"}\n"
"widget \"*.%s\" style : application \"svs-cc\"\n";
const gchar *name;
gchar *rc_temp;
name = gtk_widget_get_name(textview);
if (!name) {
gtk_widget_set_name(textview, "GmSchemedTextView");
name = gtk_widget_get_name(textview);
}
g_return_if_fail(name != NULL);
if (color != NULL) {
rc_temp = g_strdup_printf(cursor_color_rc, color->red, color->green,
color->blue, name);
} else {
GtkRcStyle *rc_style;
rc_style = gtk_widget_get_modifier_style(textview);
rc_temp = g_strdup_printf(cursor_color_rc,
rc_style->text[GTK_STATE_NORMAL].red,
rc_style->text[GTK_STATE_NORMAL].green,
rc_style->text[GTK_STATE_NORMAL].blue,
name);
}
gtk_rc_parse_string(rc_temp);
gtk_widget_reset_rc_styles(textview);
g_free(rc_temp);
}
void
on_color_changed(GmColorTable *table, gchar const *color, GtkWidget *widget) {
GdkColor col;
g_object_set_data(G_OBJECT(widget), "gm_schemed_modifying_style",
GINT_TO_POINTER(1));
if (strcmp(color, "fg_default") == 0) {
gm_color_table_get(table, color, &col);
gtk_widget_modify_text(widget, GTK_STATE_NORMAL, &col);
// Modify the cursor color
if (GTK_IS_TEXT_VIEW(widget)) {
modify_cursor_color(widget, &col);
}
} else if (strcmp(color, "bg_default") == 0) {
gm_color_table_get(table, color, &col);
gtk_widget_modify_base(widget, GTK_STATE_NORMAL, &col);
}
g_object_set_data(G_OBJECT(widget), "gm_schemed_modifying_style",
GINT_TO_POINTER(0));
}
void
on_font_changed(GmColorTable *table, gchar const *font, GtkWidget *widget) {
PangoFontDescription *desc = pango_font_description_from_string(font);
if (desc) {
gtk_widget_modify_font(widget, desc);
pango_font_description_free(desc);
}
}
void
on_style_set(GtkWidget *widget, GtkStyle *prev, gpointer user_data) {
GmSchemedFlags flags = GPOINTER_TO_INT(user_data);
GmColorTable *table = GM_COLOR_TABLE(g_object_get_data(G_OBJECT(widget),
"gm_color_table"));
gpointer modifying = g_object_get_data(G_OBJECT(widget),
"gm_schemed_modifying_style");
if (modifying != NULL && GPOINTER_TO_INT(modifying) == 1) {
return;
}
if (flags & GM_SCHEMED_COLORS) {
on_color_changed(table, "fg_default", widget);
on_color_changed(table, "bg_default", widget);
}
if (flags & GM_SCHEMED_FONT) {
on_font_changed(table, gm_color_table_font_description(table), widget);
}
}
void
on_widget_destroy(GtkWidget *widget, gpointer data) {
GmSchemedFlags flags = GPOINTER_TO_INT(data);
GmColorTable *table = GM_COLOR_TABLE(g_object_get_data(G_OBJECT(widget),
"gm_color_table"));
if (flags & GM_SCHEMED_COLORS) {
g_signal_handlers_disconnect_by_func(table,
G_CALLBACK(on_color_changed), widget);
}
if (flags & GM_SCHEMED_FONT) {
g_signal_handlers_disconnect_by_func(table,
G_CALLBACK(on_font_changed), widget);
}
//g_signal_handlers_disconnect_by_func(widget, G_CALLBACK(on_style_set),
// data);
g_signal_handlers_disconnect_by_func(widget, G_CALLBACK(on_widget_destroy),
data);
}
void
gm_register_schemed(GtkWidget *widget, GmColorTable *table,
GmSchemedFlags flags) {
gpointer data = g_object_get_data(G_OBJECT(widget), "gm_color_table");
if (data != NULL) {
on_widget_destroy(widget, GINT_TO_POINTER(flags));
}
if (table == NULL) {
return;
}
g_object_set_data(G_OBJECT(widget), "gm_color_table", table);
if (flags & GM_SCHEMED_COLORS) {
g_signal_connect(table, "color-changed",
G_CALLBACK(on_color_changed), widget);
on_color_changed(table, "fg_default", widget);
on_color_changed(table, "bg_default", widget);
}
if (flags & GM_SCHEMED_FONT) {
g_signal_connect(table, "font-changed",
G_CALLBACK(on_font_changed), widget);
on_font_changed(table, gm_color_table_font_description(table), widget);
}
//g_signal_connect(widget, "style-set",
// G_CALLBACK(on_style_set), GINT_TO_POINTER(flags));
g_signal_connect(widget, "destroy",
G_CALLBACK(on_widget_destroy), GINT_TO_POINTER(flags));
}

View File

@ -9,6 +9,7 @@
#include <libgnomevfs/gnome-vfs.h>
#undef _
#include <glib/gi18n.h>
#include "gm-color-table.h"
/*
* Standard gettext macros.
@ -156,4 +157,12 @@ gchar *gm_to_utf8_with_fallback(gchar const *text, gssize len,
GtkWidget *gm_container_item(GtkContainer *cnt, GType type);
typedef enum _GmSchemedFlags {
GM_SCHEMED_COLORS = 1 << 0,
GM_SCHEMED_FONT = 1 << 1
} GmSchemedFlags;
void gm_register_schemed(GtkWidget *widget, GmColorTable *Table,
GmSchemedFlags flags);
#endif /* __GM_SUPPORT_H__ */

View File

@ -17,4 +17,6 @@ gnoemoe_SOURCES += \
$(widgetsdir)/eggtrayicon.c $(widgetsdir)/eggtrayicon.h \
$(widgetsdir)/eggnotificationbubble.c \
$(widgetsdir)/eggnotificationbubble.h \
$(widgetsdir)/gm-worlds-view.c $(widgetsdir)/gm-worlds-view.h
$(widgetsdir)/gm-worlds-view.c $(widgetsdir)/gm-worlds-view.h \
$(widgetsdir)/gm-source-style-scheme.c \
$(widgetsdir)/gm-source-style-scheme.h

View File

@ -14,7 +14,7 @@
#include "gm-color-table.h"
#include "gm-app.h"
#include "parser/gm-parser.h"
#include "gm-source-style-scheme.h"
#include "gm-searchable.h"
#define GM_EDITOR_VIEW_GET_PRIVATE(object)( \
@ -115,6 +115,9 @@ gm_editor_view_init_language() {
language_manager = gtk_source_languages_manager_new();
language = gtk_source_languages_manager_get_language_from_mime_type(
language_manager, "text/x-moo");
gtk_source_language_set_style_scheme(language,
gm_source_style_scheme_get_default());
}
}
@ -148,7 +151,7 @@ gm_editor_view_create_source_view(GmEditorView *view) {
gchar *line;
GList *lines;
PangoFontDescription *f;
GtkSourceTagStyle *st;
source_view = gtk_source_view_new();
@ -161,6 +164,9 @@ gm_editor_view_create_source_view(GmEditorView *view) {
gtk_source_buffer_begin_not_undoable_action(GTK_SOURCE_BUFFER(buffer));
gtk_text_buffer_get_end_iter(buffer, &iter);
gm_register_schemed(source_view, gm_app_color_table(gm_app_instance()),
GM_SCHEMED_COLORS | GM_SCHEMED_FONT);
for (lines = gm_editor_lines(view->priv->editor); lines;
lines = lines->next) {
line = (gchar *) (lines->data);
@ -192,10 +198,11 @@ gm_editor_view_create_source_view(GmEditorView *view) {
gtk_source_view_set_auto_indent(GTK_SOURCE_VIEW(source_view), TRUE);
gtk_source_view_set_show_line_numbers(GTK_SOURCE_VIEW(source_view), TRUE);
gtk_source_view_set_tabs_width(GTK_SOURCE_VIEW(source_view), 2);
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(source_view), GTK_WRAP_WORD_CHAR);
gtk_text_view_set_left_margin(GTK_TEXT_VIEW(source_view), 6);
gtk_text_view_set_right_margin(GTK_TEXT_VIEW(source_view), 6);
//gtk_text_view_set_left_margin(GTK_TEXT_VIEW(source_view), 6);
//gtk_text_view_set_right_margin(GTK_TEXT_VIEW(source_view), 6);
if (gm_editor_is_code(view->priv->editor)) {
gtk_source_buffer_set_highlight(GTK_SOURCE_BUFFER(buffer), TRUE);

View File

@ -26,8 +26,6 @@ static void gm_log_view_searchable_iface_init(
GmSearchableInterface *iface);
static GtkTextView *gm_log_view_searchable_get_text_view(GmSearchable *sea);
void on_gm_log_view_font_changed(GmColorTable *color_table,
gchar *font_description, GmLogView *view);
void on_gm_log_view_filter_toggled(GtkToggleButton *button, GmLogView *view);
G_DEFINE_TYPE_EXTENDED(GmLogView, gm_log_view, GTK_TYPE_VBOX, 0, \
@ -51,9 +49,6 @@ gm_log_view_searchable_get_text_view(GmSearchable *sea) {
static void
gm_log_view_finalize(GObject *object) {
//GmLogView *obj = GM_LOG_VIEW(object);
g_signal_handlers_disconnect_by_func(gm_app_color_table(gm_app_instance()),
on_gm_log_view_font_changed, object);
G_OBJECT_CLASS(gm_log_view_parent_class)->finalize(object);
}
@ -90,18 +85,6 @@ gm_log_view_create_tags(GmLogView *obj) {
gtk_text_buffer_create_tag(buffer, "mcp_status", NULL);
}
void
gm_log_view_update_font(GmLogView *view) {
PangoFontDescription *f = pango_font_description_from_string(
gm_color_table_font_description(gm_app_color_table(
gm_app_instance())));
if (f != NULL) {
gtk_widget_modify_font(GTK_WIDGET(view->priv->text_view), f);
pango_font_description_free(f);
}
}
static void
gm_log_view_create_text_view(GmLogView *obj) {
GtkTextView *text_view = GTK_TEXT_VIEW(gtk_text_view_new());
@ -118,7 +101,6 @@ gm_log_view_create_text_view(GmLogView *obj) {
obj->priv->text_view = text_view;
gm_log_view_create_tags(obj);
gm_log_view_update_font(obj);
}
GtkWidget *
@ -211,8 +193,8 @@ gm_log_view_init(GmLogView *obj) {
gtk_container_add(GTK_CONTAINER(srl), GTK_WIDGET(obj->priv->text_view));
gtk_box_pack_start(GTK_BOX(obj), srl, TRUE, TRUE, 0);
g_signal_connect(gm_app_color_table(gm_app_instance()), "font_changed",
G_CALLBACK(on_gm_log_view_font_changed), obj);
gm_register_schemed(GTK_WIDGET(obj->priv->text_view), gm_app_color_table(
gm_app_instance()), GM_SCHEMED_COLORS | GM_SCHEMED_FONT);
}
GmLogView *
@ -282,13 +264,6 @@ gm_log_view_set_text(GmLogView *view, gchar const *text) {
}
/* Callbacks */
void
on_gm_log_view_font_changed(GmColorTable *color_table,
gchar *font_description, GmLogView *view) {
gm_log_view_update_font(view);
}
void
on_gm_log_view_filter_toggled(GtkToggleButton *button, GmLogView *view) {
gchar *option = (gchar *)g_object_get_data(G_OBJECT(button), "option");

View File

@ -0,0 +1,301 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string.h>
#include "gm-source-style-scheme.h"
#include "gm-color-table.h"
#include "gm-app.h"
#include "gm-support.h"
#include "gm-debug.h"
#define GM_TYPE_SOURCE_STYLE_SCHEME (gm_source_style_scheme_get_type ())
#define GM_SOURCE_STYLE_SCHEME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GM_TYPE_SOURCE_STYLE_SCHEME, GmSourceStyleScheme))
#define GM_SOURCE_STYLE_SCHEME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GM_TYPE_SOURCE_STYLE_SCHEME, GmSourceStyleSchemeClass))
#define GM_IS_SOURCE_STYLE_SCHEME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GM_TYPE_SOURCE_STYLE_SCHEME))
#define GM_IS_SOURCE_STYLE_SCHEME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GM_TYPE_SOURCE_STYLE_SCHEME))
#define GM_SOURCE_STYLE_SCHEME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GM_TYPE_SOURCE_STYLE_SCHEME, GmSourceStyleSchemeClass))
typedef struct _GmSourceStyleScheme GmSourceStyleScheme;
typedef struct _GmSourceStyleSchemeClass GmSourceStyleSchemeClass;
struct _GmSourceStyleScheme {
GObject parent_instance;
GHashTable *mapping;
GHashTable *styles;
};
struct _GmSourceStyleSchemeClass {
GObjectClass parent_class;
};
static GObjectClass *parent_class = NULL;
static GType gm_source_style_scheme_get_type (void);
static void gm_source_style_scheme_class_init(GmSourceStyleSchemeClass *klass);
static void gm_source_style_scheme_IFace_init(GtkSourceStyleSchemeClass *iface);
static void gm_source_style_scheme_init(GmSourceStyleScheme *scheme);
static void gm_source_style_scheme_finalize(GObject *object);
static GtkSourceTagStyle *gm_source_style_scheme_get_tag_style(
GtkSourceStyleScheme *scheme, const gchar *style_name);
static const gchar *gm_source_style_scheme_get_name(GtkSourceStyleScheme *scheme);
static GSList *gm_source_style_scheme_get_style_names(GtkSourceStyleScheme *scheme);
static GType
gm_source_style_scheme_get_type (void)
{
static GType type = 0;
if (!type)
{
static const GTypeInfo info =
{
sizeof (GmSourceStyleSchemeClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) gm_source_style_scheme_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GmSourceStyleScheme),
0, /* n_preallocs */
(GInstanceInitFunc) gm_source_style_scheme_init,
};
static const GInterfaceInfo iface_info =
{
(GInterfaceInitFunc) gm_source_style_scheme_IFace_init, /* interface_init */
NULL, /* interface_finalize */
NULL /* interface_data */
};
type = g_type_register_static (G_TYPE_OBJECT,
"GmSourceStyleScheme",
&info,
0);
g_type_add_interface_static (type,
GTK_TYPE_SOURCE_STYLE_SCHEME,
&iface_info);
}
return type;
}
static void
gm_source_style_scheme_class_init(GmSourceStyleSchemeClass *klass) {
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
parent_class = g_type_class_peek_parent(klass);
gobject_class->finalize = gm_source_style_scheme_finalize;
}
static void
gm_source_style_scheme_IFace_init(GtkSourceStyleSchemeClass *iface) {
iface->get_tag_style = gm_source_style_scheme_get_tag_style;
iface->get_name = gm_source_style_scheme_get_name;
iface->get_style_names = gm_source_style_scheme_get_style_names;
}
static GtkSourceTagStyle *
new_tag_style(gchar const * foreground, gchar const * background, gboolean bold,
gboolean italic) {
GtkSourceTagStyle *ts;
ts = gtk_source_tag_style_new();
gdk_color_parse(foreground, &ts->foreground);
ts->mask |= GTK_SOURCE_TAG_STYLE_USE_FOREGROUND;
if (background != NULL) {
gdk_color_parse (background, &ts->background);
ts->mask |= GTK_SOURCE_TAG_STYLE_USE_BACKGROUND;
}
ts->italic = italic;
ts->bold = bold;
ts->is_default = TRUE;
return ts;
}
typedef struct _GmSourceStyleEntry {
gchar const *name;
gchar const *color_name;
gboolean bold;
gboolean italic;
} GmSourceStyleEntry;
static GmSourceStyleEntry entries[] = {
{"Base-N Integer", "fg_purple_h"},
{"Character", "fg_purple_h"},
{"Comment", "fg_blue_h"},
{"Data Type", "fg_cyan", TRUE},
{"Function", "fg_green"},
{"Decimal", "fg_purple_h"},
{"Floating Point", "fg_purple_h"},
{"Keyword", "fg_red", TRUE},
{"String", "fg_purple_h"},
{NULL, NULL}
};
static GmKeyValuePair mapping[] = {
{"fg_purple_h", "Object@32@Number String"},
{"fg_cyan", "Builtin@32@Variables Types S-Ref Error"},
{"fg_green", "Builtin@32@Functions"},
{"fg_blue_h", "Line@32@Comment"},
{"fg_red", "Keywords"},
{NULL, NULL}
};
static void
gm_source_style_scheme_init_mapping(GmSourceStyleScheme *scheme) {
GmKeyValuePair *entry;
scheme->mapping = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
(GDestroyNotify)g_strfreev);
for (entry = mapping; entry->key; ++entry) {
g_hash_table_insert(scheme->mapping, g_strdup(entry->key),
g_strsplit(entry->value, " ", 0));
}
}
static void
gm_source_style_scheme_init(GmSourceStyleScheme *scheme) {
GtkSourceTagStyle *ts;
GmColorTable *table = gm_app_color_table(gm_app_instance());
GmSourceStyleEntry *entry;
scheme->styles = g_hash_table_new_full((GHashFunc)g_str_hash,
(GEqualFunc)g_str_equal, (GDestroyNotify)g_free,
(GDestroyNotify)gtk_source_tag_style_free);
for (entry = entries; entry->name; ++entry) {
ts = new_tag_style(gm_color_table_get_hex(table, entry->color_name),
NULL, entry->bold, entry->italic);
g_hash_table_insert(scheme->styles, g_strdup(entry->name), ts);
}
gm_source_style_scheme_init_mapping(scheme);
}
static void
gm_source_style_scheme_finalize(GObject *object) {
GmSourceStyleScheme *scheme = GM_SOURCE_STYLE_SCHEME(object);
g_hash_table_destroy(scheme->styles);
g_hash_table_destroy(scheme->mapping);
G_OBJECT_CLASS(parent_class)->finalize (object);
}
static GtkSourceTagStyle *
gm_source_style_scheme_get_tag_style(GtkSourceStyleScheme *scheme,
const gchar *style_name) {
GmSourceStyleScheme *ds;
const gpointer *style;
g_return_val_if_fail(GM_IS_SOURCE_STYLE_SCHEME(scheme), NULL);
g_return_val_if_fail(style_name != NULL, NULL);
ds = GM_SOURCE_STYLE_SCHEME(scheme);
style = g_hash_table_lookup(ds->styles, style_name);
return (style != NULL) ? gtk_source_tag_style_copy((GtkSourceTagStyle *)style) : NULL;
}
static const gchar *
gm_source_style_scheme_get_name(GtkSourceStyleScheme *scheme) {
g_return_val_if_fail(GTK_IS_SOURCE_STYLE_SCHEME(scheme), NULL);
return _("Gnoemoe");
}
static void
add_style_name(gpointer key, gpointer value, gpointer user_data) {
GSList **l = user_data;
*l = g_slist_append(*l, g_strdup(key));
}
static GSList *
gm_source_style_scheme_get_style_names(GtkSourceStyleScheme *scheme) {
GmSourceStyleScheme *ds;
GSList *l = NULL;
g_return_val_if_fail(GTK_IS_SOURCE_STYLE_SCHEME(scheme), NULL);
ds = GM_SOURCE_STYLE_SCHEME(scheme);
g_hash_table_foreach(ds->styles, add_style_name, &l);
return l;
}
/* Default style scheme */
static GtkSourceStyleScheme *gm_style_scheme = NULL;
static void
on_gm_source_style_scheme_color_changed(GmColorTable *table,
gchar const *color) {
gchar **ids;
gchar const *hex = gm_color_table_get_hex(table, color);
GmSourceStyleEntry *entry;
GtkSourceTagStyle *style;
for (entry = entries; entry->name; ++entry) {
if (strcmp(entry->color_name, color) == 0) {
style = g_hash_table_lookup(
GM_SOURCE_STYLE_SCHEME(gm_style_scheme)->styles,
entry->name);
if (style != NULL) {
gdk_color_parse(hex, &(style->foreground));
}
}
}
ids = g_hash_table_lookup(GM_SOURCE_STYLE_SCHEME(gm_style_scheme)->mapping,
color);
if (ids) {
for (; *ids; ++ids) {
g_signal_emit_by_name(gm_style_scheme, "style_changed",
*ids);
}
}
}
void
gm_source_style_weak_destroy(gpointer data, GObject *object) {
g_signal_handlers_disconnect_by_func(gm_app_color_table(gm_app_instance()),
on_gm_source_style_scheme_color_changed, NULL);
gm_style_scheme = NULL;
}
GtkSourceStyleScheme *
gm_source_style_scheme_get_default(void) {
if (gm_style_scheme == NULL) {
gm_style_scheme = g_object_new(GM_TYPE_SOURCE_STYLE_SCHEME,
NULL);
g_object_weak_ref(G_OBJECT(gm_style_scheme),
gm_source_style_weak_destroy, NULL);
g_signal_connect(gm_app_color_table(gm_app_instance()),
"color-changed",
G_CALLBACK(on_gm_source_style_scheme_color_changed), NULL);
} else {
g_object_ref(gm_style_scheme);
}
return gm_style_scheme;
}

View File

@ -0,0 +1,12 @@
#ifndef __GM_SOURCE_STYLE_SCHEME_H__
#define __GM_SOURCE_STYLE_SCHEME_H__
#include <glib-object.h>
#include <gtksourceview/gtksourcestylescheme.h>
/* Default style scheme */
GtkSourceStyleScheme *gm_source_style_scheme_get_default(void);
#endif /* __GM_SOURCE_STYLE_SCHEME_H__ */

View File

@ -11,11 +11,6 @@
#define GM_WORLD_INPUT_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GM_TYPE_WORLD_INPUT_VIEW, GmWorldInputViewPrivate))
void on_gm_world_input_view_color_table_color_changed(GmColorTable *table,
gchar *name, GmWorldInputView *view);
void on_gm_world_input_view_color_table_font_changed(GmColorTable *table,
gchar *font_description, GmWorldInputView *view);
void on_gm_world_input_view_changed(GtkTextBuffer *buffer,
GmWorldInputView *view);
@ -287,74 +282,6 @@ gm_world_input_view_init(GmWorldInputView *view) {
G_CALLBACK(on_gm_world_input_view_changed), view);
}
static void
modify_cursor_color(GtkWidget *textview, GdkColor *color) {
static const char cursor_color_rc[] =
"style \"svs-cc\"\n"
"{\n"
"GtkTextView::cursor-color=\"#%04x%04x%04x\"\n"
"}\n"
"widget \"*.%s\" style : application \"svs-cc\"\n";
const gchar *name;
gchar *rc_temp;
name = gtk_widget_get_name(textview);
if (!name) {
gtk_widget_set_name(textview, "GmWorldInputView");
name = gtk_widget_get_name(textview);
}
g_return_if_fail(name != NULL);
if (color != NULL) {
rc_temp = g_strdup_printf(cursor_color_rc, color->red, color->green,
color->blue, name);
} else {
GtkRcStyle *rc_style;
rc_style = gtk_widget_get_modifier_style(textview);
rc_temp = g_strdup_printf(cursor_color_rc,
rc_style->text[GTK_STATE_NORMAL].red,
rc_style->text[GTK_STATE_NORMAL].green,
rc_style->text[GTK_STATE_NORMAL].blue,
name);
}
gtk_rc_parse_string(rc_temp);
gtk_widget_reset_rc_styles(textview);
g_free(rc_temp);
}
void
gm_world_input_view_update_colors(GmWorldInputView *view) {
GdkColor col;
if (view->priv->color_table != NULL) {
if (gm_color_table_get(view->priv->color_table, "bg_default", &col)) {
gtk_widget_modify_base(GTK_WIDGET(view), GTK_STATE_NORMAL,
&col);
}
if (gm_color_table_get(view->priv->color_table, "fg_default", &col)) {
gtk_widget_modify_text(GTK_WIDGET(view), GTK_STATE_NORMAL,
&col);
modify_cursor_color(GTK_WIDGET(view), &col);
}
}
}
void
gm_world_input_view_update_font(GmWorldInputView *view) {
PangoFontDescription *f = pango_font_description_from_string(
gm_color_table_font_description(view->priv->color_table));
if (f != NULL) {
gtk_widget_modify_font(GTK_WIDGET(view), f);
pango_font_description_free(f);
}
}
/* Public functions */
GtkWidget *
gm_world_input_view_new() {
@ -393,23 +320,17 @@ gm_world_input_view_history(GmWorldInputView *view) {
void
gm_world_input_view_set_color_table(GmWorldInputView *view,
GmColorTable *color_table) {
// This will register the view as being schemed by color_table
gm_register_schemed(GTK_WIDGET(view), color_table,
GM_SCHEMED_COLORS | GM_SCHEMED_FONT);
if (view->priv->color_table != NULL) {
g_signal_handlers_disconnect_by_func(view->priv->color_table,
on_gm_world_input_view_color_table_color_changed, view);
g_signal_handlers_disconnect_by_func(view->priv->color_table,
on_gm_world_input_view_color_table_font_changed, view);
g_object_unref(view->priv->color_table);
}
if (color_table != NULL) {
view->priv->color_table = g_object_ref(color_table);
g_signal_connect(view->priv->color_table, "color_changed",
G_CALLBACK(on_gm_world_input_view_color_table_color_changed), view);
g_signal_connect(view->priv->color_table, "font_changed",
G_CALLBACK(on_gm_world_input_view_color_table_font_changed), view);
gm_world_input_view_update_colors(view);
gm_world_input_view_update_font(view);
} else {
view->priv->color_table = NULL;
}
@ -421,19 +342,6 @@ gm_world_input_view_color_table(GmWorldInputView *view) {
}
/* Callbacks */
void
on_gm_world_input_view_color_table_color_changed(GmColorTable *table,
gchar *name, GmWorldInputView *view) {
if (strcmp(name, "fg_default") == 0 || strcmp(name, "bg_default") == 0) {
gm_world_input_view_update_colors(view);
}
}
void
on_gm_world_input_view_color_table_font_changed(GmColorTable *table,
gchar *font_description, GmWorldInputView *view) {
gm_world_input_view_update_font(view);
}
gboolean
idle_scroll(gpointer user_data) {