diff options
author | Koen Kooi <koen@openembedded.org> | 2005-06-30 08:19:37 +0000 |
---|---|---|
committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2005-06-30 08:19:37 +0000 |
commit | c8e5702127e507e82e6f68a4b8c546803accea9d (patch) | |
tree | 00583491f40ecc640f2b28452af995e3a63a09d7 /packages/gtk+/gtk+-2.6.4-1.osso7/gtkrc.c.diff | |
parent | 87ec8ca4d2e2eb4d1c1e1e1a6b46a395d56805b9 (diff) |
import clean BK tree at cset 1.3670
Diffstat (limited to 'packages/gtk+/gtk+-2.6.4-1.osso7/gtkrc.c.diff')
-rw-r--r-- | packages/gtk+/gtk+-2.6.4-1.osso7/gtkrc.c.diff | 581 |
1 files changed, 581 insertions, 0 deletions
diff --git a/packages/gtk+/gtk+-2.6.4-1.osso7/gtkrc.c.diff b/packages/gtk+/gtk+-2.6.4-1.osso7/gtkrc.c.diff index e69de29bb2..a6b4f999ac 100644 --- a/packages/gtk+/gtk+-2.6.4-1.osso7/gtkrc.c.diff +++ b/packages/gtk+/gtk+-2.6.4-1.osso7/gtkrc.c.diff @@ -0,0 +1,581 @@ +--- gtk+-2.6.4/gtk/gtkrc.c 2005-02-01 20:07:40.000000000 +0200 ++++ gtk+-2.6.4/gtk/gtkrc.c 2005-04-06 16:19:37.848784472 +0300 +@@ -56,6 +56,7 @@ + #include "gtkprivate.h" + #include "gtksettings.h" + #include "gtkwindow.h" ++#include "gtkhashtable.h" + + #ifdef G_OS_WIN32 + #include <io.h> +@@ -105,6 +106,14 @@ + GtkStyle *default_style; + }; + ++#define GTK_RC_STYLE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_RC_STYLE, GtkRcStylePrivate)) ++ ++typedef struct _GtkRcStylePrivate GtkRcStylePrivate; ++ ++struct _GtkRcStylePrivate { ++ GSList *logical_color_hashes; ++}; ++ + static GtkRcContext *gtk_rc_context_get (GtkSettings *settings); + + static guint gtk_rc_style_hash (const gchar *name); +@@ -179,6 +188,13 @@ + GScanner *scanner, + GtkRcStyle *rc_style, + GtkIconFactory *factory); ++static guint gtk_rc_parse_logical_color (GScanner *scanner, ++ GtkRcStyle *rc_style, ++ GtkHashTable *hash); ++static guint gtk_rc_parse_color_full (GScanner *scanner, ++ GdkColor *color, ++ GtkRcStyle *style); ++ + static void gtk_rc_clear_hash_node (gpointer key, + gpointer data, + gpointer user_data); +@@ -277,7 +293,8 @@ + { "stock", GTK_RC_TOKEN_STOCK }, + { "im_module_file", GTK_RC_TOKEN_IM_MODULE_FILE }, + { "LTR", GTK_RC_TOKEN_LTR }, +- { "RTL", GTK_RC_TOKEN_RTL } ++ { "RTL", GTK_RC_TOKEN_RTL }, ++ { "logical_color", GTK_RC_TOKEN_LOGICAL_COLOR } + }; + + static GHashTable *realized_style_ht = NULL; +@@ -954,6 +971,7 @@ + static void + gtk_rc_style_init (GtkRcStyle *style) + { ++ GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (style); + guint i; + + style->name = NULL; +@@ -976,6 +994,7 @@ + + style->rc_style_lists = NULL; + style->icon_factories = NULL; ++ priv->logical_color_hashes = NULL; + } + + static void +@@ -991,6 +1010,21 @@ + klass->create_rc_style = gtk_rc_style_real_create_rc_style; + klass->merge = gtk_rc_style_real_merge; + klass->create_style = gtk_rc_style_real_create_style; ++ ++ g_type_class_add_private (object_class, sizeof (GtkRcStylePrivate)); ++} ++ ++static void ++free_object_list (GSList *list) ++{ ++ GSList *tmp_list = list; ++ while (tmp_list) ++ { ++ g_object_unref (tmp_list->data); ++ tmp_list = tmp_list->next; ++ } ++ g_slist_free (list); ++ + } + + static void +@@ -998,9 +1032,11 @@ + { + GSList *tmp_list1, *tmp_list2; + GtkRcStyle *rc_style; ++ GtkRcStylePrivate *rc_priv; + gint i; + + rc_style = GTK_RC_STYLE (object); ++ rc_priv = GTK_RC_STYLE_GET_PRIVATE (rc_style); + + if (rc_style->name) + g_free (rc_style->name); +@@ -1059,13 +1095,8 @@ + rc_style->rc_properties = NULL; + } + +- tmp_list1 = rc_style->icon_factories; +- while (tmp_list1) +- { +- g_object_unref (tmp_list1->data); +- tmp_list1 = tmp_list1->next; +- } +- g_slist_free (rc_style->icon_factories); ++ free_object_list (rc_style->icon_factories); ++ free_object_list (rc_priv->logical_color_hashes); + + G_OBJECT_CLASS (parent_class)->finalize (object); + } +@@ -1125,6 +1156,14 @@ + return g_object_new (G_OBJECT_TYPE (style), NULL); + } + ++GSList * ++_gtk_rc_style_get_logical_color_hashes (GtkRcStyle *rc_style) ++{ ++ GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style); ++ ++ return priv->logical_color_hashes; ++} ++ + static gint + gtk_rc_properties_cmp (gconstpointer bsearch_node1, + gconstpointer bsearch_node2) +@@ -1499,6 +1538,22 @@ + context->rc_files = NULL; + + gtk_rc_parse_default_files (context); ++/*Hildon- Swapped these sections of code, so the styles from the ++ XSettings theme are available when parsing with gtk_rc_context_parse_string*/ ++ g_free (context->theme_name); ++ g_free (context->key_theme_name); ++ ++ g_object_get (context->settings, ++ "gtk-theme-name", &context->theme_name, ++ "gtk-key-theme-name", &context->key_theme_name, ++ NULL); ++ ++ if (context->theme_name && context->theme_name[0]) ++ gtk_rc_parse_named (context, context->theme_name, NULL); ++ if (context->key_theme_name && context->key_theme_name[0]) ++ gtk_rc_parse_named (context, context->key_theme_name, "key"); ++ ++/*****/ + + tmp_list = global_rc_files; + while (tmp_list) +@@ -1512,19 +1567,6 @@ + + tmp_list = tmp_list->next; + } +- +- g_free (context->theme_name); +- g_free (context->key_theme_name); +- +- g_object_get (context->settings, +- "gtk-theme-name", &context->theme_name, +- "gtk-key-theme-name", &context->key_theme_name, +- NULL); +- +- if (context->theme_name && context->theme_name[0]) +- gtk_rc_parse_named (context, context->theme_name, NULL); +- if (context->key_theme_name && context->key_theme_name[0]) +- gtk_rc_parse_named (context, context->key_theme_name, "key"); + + g_object_thaw_notify (G_OBJECT (context->settings)); + +@@ -1905,10 +1947,19 @@ + { + GScanner *scanner; + guint i; ++ gchar *name_str; + gboolean done; + + scanner = gtk_rc_scanner_new (); + ++ if (input_name != NULL) ++ { ++ name_str = (gchar *) g_malloc(strlen(input_name) + 7); ++ sprintf(name_str, "%s.cache", input_name); ++ /*osso_g_scanner_cache_open (scanner, name_str);*/ ++ g_free(name_str); ++ } ++ + if (input_fd >= 0) + { + g_assert (input_string == NULL); +@@ -2062,6 +2113,29 @@ + return style; + } + ++static GSList * ++concat_object_lists (GSList *list_a, GSList *list_b) ++{ ++ GSList *copy; ++ ++ copy = g_slist_copy (list_b); ++ if (copy) ++ { ++ GSList *iter; ++ ++ iter = copy; ++ while (iter != NULL) ++ { ++ g_object_ref (iter->data); ++ iter = g_slist_next (iter); ++ } ++ ++ return g_slist_concat (list_a, copy); ++ } ++ else ++ return list_a; ++} ++ + /* Reuses or frees rc_styles */ + static GtkStyle * + gtk_rc_init_style (GtkRcContext *context, +@@ -2083,6 +2157,7 @@ + GtkRcStyle *base_style = NULL; + GtkRcStyle *proto_style; + GtkRcStyleClass *proto_style_class; ++ GtkRcStylePrivate *proto_priv; + GSList *tmp_styles; + GType rc_style_type = GTK_TYPE_RC_STYLE; + +@@ -2109,12 +2184,13 @@ + + proto_style_class = GTK_RC_STYLE_GET_CLASS (base_style); + proto_style = proto_style_class->create_rc_style (base_style); ++ proto_priv = GTK_RC_STYLE_GET_PRIVATE (proto_style); + + tmp_styles = rc_styles; + while (tmp_styles) + { + GtkRcStyle *rc_style = tmp_styles->data; +- GSList *factories; ++ GtkRcStylePrivate *rc_priv = GTK_RC_STYLE_GET_PRIVATE (rc_style); + + proto_style_class->merge (proto_style, rc_style); + +@@ -2122,22 +2198,12 @@ + if (!g_slist_find (rc_style->rc_style_lists, rc_styles)) + rc_style->rc_style_lists = g_slist_prepend (rc_style->rc_style_lists, rc_styles); + +- factories = g_slist_copy (rc_style->icon_factories); +- if (factories) +- { +- GSList *iter; +- +- iter = factories; +- while (iter != NULL) +- { +- g_object_ref (iter->data); +- iter = g_slist_next (iter); +- } +- +- proto_style->icon_factories = g_slist_concat (proto_style->icon_factories, +- factories); +- +- } ++ proto_style->icon_factories = ++ concat_object_lists (proto_style->icon_factories, ++ rc_style->icon_factories); ++ proto_priv->logical_color_hashes = ++ concat_object_lists (proto_priv->logical_color_hashes, ++ rc_priv->logical_color_hashes); + + tmp_styles = tmp_styles->next; + } +@@ -2515,9 +2581,11 @@ + GtkRcStyle *rc_style; + GtkRcStyle *orig_style; + GtkRcStyle *parent_style; ++ GtkRcStylePrivate *rc_priv = NULL; + guint token; + gint i; + GtkIconFactory *our_factory = NULL; ++ GtkHashTable *our_hash = NULL; + + token = g_scanner_get_next_token (scanner); + if (token != GTK_RC_TOKEN_STYLE) +@@ -2533,12 +2601,6 @@ + else + orig_style = NULL; + +- /* If there's a list, its first member is always the factory belonging +- * to this RcStyle +- */ +- if (rc_style && rc_style->icon_factories) +- our_factory = rc_style->icon_factories->data; +- + if (!rc_style) + { + rc_style = gtk_rc_style_new (); +@@ -2550,6 +2612,16 @@ + for (i = 0; i < 5; i++) + rc_style->color_flags[i] = 0; + } ++ ++ rc_priv = GTK_RC_STYLE_GET_PRIVATE (rc_style); ++ ++ /* If there's a list, its first member is always the factory belonging ++ * to this RcStyle ++ */ ++ if (rc_style->icon_factories) ++ our_factory = rc_style->icon_factories->data; ++ if (rc_priv->logical_color_hashes) ++ our_hash = rc_priv->logical_color_hashes->data; + + token = g_scanner_peek_next_token (scanner); + if (token == G_TOKEN_EQUAL_SIGN) +@@ -2566,8 +2638,8 @@ + parent_style = gtk_rc_style_find (context, scanner->value.v_string); + if (parent_style) + { +- GSList *factories; +- ++ GtkRcStylePrivate *parent_priv = GTK_RC_STYLE_GET_PRIVATE (parent_style); ++ + for (i = 0; i < 5; i++) + { + rc_style->color_flags[i] = parent_style->color_flags[i]; +@@ -2621,17 +2693,24 @@ + rc_style->icon_factories = g_slist_prepend (rc_style->icon_factories, + our_factory); + } +- +- rc_style->icon_factories = g_slist_concat (rc_style->icon_factories, +- g_slist_copy (parent_style->icon_factories)); +- +- factories = parent_style->icon_factories; +- while (factories != NULL) ++ rc_style->icon_factories = concat_object_lists (rc_style->icon_factories, ++ parent_style->icon_factories); ++ } ++ ++ /* Also append parent's color hashes, adding a ref to them */ ++ if (parent_priv->logical_color_hashes != NULL) ++ { ++ /* See comment above .. */ ++ if (our_hash == NULL) + { +- g_object_ref (factories->data); +- factories = factories->next; ++ our_hash = _gtk_hash_table_new (); ++ rc_priv->logical_color_hashes = g_slist_prepend (rc_priv->logical_color_hashes, ++ our_hash); + } +- } ++ ++ rc_priv->logical_color_hashes = concat_object_lists (rc_priv->logical_color_hashes, ++ parent_priv->logical_color_hashes); ++ } + } + } + +@@ -2689,12 +2768,22 @@ + } + token = gtk_rc_parse_stock (context, scanner, rc_style, our_factory); + break; ++ case GTK_RC_TOKEN_LOGICAL_COLOR: ++ if (our_hash == NULL) ++ { ++ our_hash = _gtk_hash_table_new (); ++ rc_priv->logical_color_hashes = g_slist_prepend (rc_priv->logical_color_hashes, ++ our_hash); ++ } ++ token = gtk_rc_parse_logical_color (scanner, rc_style, our_hash); ++ break; + case G_TOKEN_IDENTIFIER: + if (is_c_identifier (scanner->next_value.v_identifier) && + scanner->next_value.v_identifier[0] >= 'A' && + scanner->next_value.v_identifier[0] <= 'Z') /* match namespaced type names */ + { + GtkRcProperty prop = { 0, 0, NULL, { 0, }, }; ++ gchar *name; + + g_scanner_get_next_token (scanner); /* eat type name */ + prop.type_name = g_quark_from_string (scanner->value.v_identifier); +@@ -2712,8 +2801,10 @@ + } + + /* it's important that we do the same canonification as GParamSpecPool here */ +- g_strcanon (scanner->value.v_identifier, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-", '-'); +- prop.property_name = g_quark_from_string (scanner->value.v_identifier); ++ name = g_strdup (scanner->value.v_identifier); ++ g_strcanon (name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-", '-'); ++ prop.property_name = g_quark_from_string (name); ++ g_free (name); + + token = gtk_rc_parse_assignment (scanner, &prop); + if (token == G_TOKEN_NONE) +@@ -2825,7 +2916,7 @@ + return G_TOKEN_EQUAL_SIGN; + + style->color_flags[state] |= GTK_RC_BG; +- return gtk_rc_parse_color (scanner, &style->bg[state]); ++ return gtk_rc_parse_color_full (scanner, &style->bg[state], style); + } + + static guint +@@ -2848,7 +2939,7 @@ + return G_TOKEN_EQUAL_SIGN; + + style->color_flags[state] |= GTK_RC_FG; +- return gtk_rc_parse_color (scanner, &style->fg[state]); ++ return gtk_rc_parse_color_full (scanner, &style->fg[state], style); + } + + static guint +@@ -2871,7 +2962,7 @@ + return G_TOKEN_EQUAL_SIGN; + + style->color_flags[state] |= GTK_RC_TEXT; +- return gtk_rc_parse_color (scanner, &style->text[state]); ++ return gtk_rc_parse_color_full (scanner, &style->text[state], style); + } + + static guint +@@ -2894,7 +2985,7 @@ + return G_TOKEN_EQUAL_SIGN; + + style->color_flags[state] |= GTK_RC_BASE; +- return gtk_rc_parse_color (scanner, &style->base[state]); ++ return gtk_rc_parse_color_full (scanner, &style->base[state], style); + } + + static guint +@@ -3345,11 +3436,45 @@ + + return G_TOKEN_NONE; + } ++static gboolean ++lookup_logical_color (GtkRcStyle *style, ++ const char *color_name, ++ GdkColor *color) ++{ ++ GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (style); ++ GSList *iter; ++ ++ iter = priv->logical_color_hashes; ++ while (iter != NULL) ++ { ++ GdkColor *match = g_hash_table_lookup (GTK_HASH_TABLE (iter->data)->hash, ++ color_name); ++ if (match) ++ { ++ color->red = match->red; ++ color->green = match->green; ++ color->blue = match->blue; ++ return TRUE; ++ } ++ ++ iter = g_slist_next (iter); ++ } ++ ++ return FALSE; ++} + + guint + gtk_rc_parse_color (GScanner *scanner, + GdkColor *color) + { ++ return gtk_rc_parse_color_full (scanner, color, NULL); ++} ++ ++static guint ++gtk_rc_parse_color_full (GScanner *scanner, ++ GdkColor *color, ++ GtkRcStyle *style) ++{ + guint token; + + g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR); +@@ -3407,11 +3532,14 @@ + case G_TOKEN_STRING: + if (!gdk_color_parse (scanner->value.v_string, color)) + { +- g_scanner_warn (scanner, "Invalid color constant '%s'", +- scanner->value.v_string); +- return G_TOKEN_STRING; ++ if (!(style && lookup_logical_color (style, scanner->value.v_string, color))) ++ { ++ g_scanner_warn (scanner, "Invalid color constant '%s'", ++ scanner->value.v_string); ++ return G_TOKEN_STRING; ++ } + } +- else ++ + return G_TOKEN_NONE; + + default: +@@ -3625,8 +3753,8 @@ + } + + static guint +-gtk_rc_parse_stock_id (GScanner *scanner, +- gchar **stock_id) ++gtk_rc_parse_hash_key (GScanner *scanner, ++ gchar **hash_key) + { + guint token; + +@@ -3639,12 +3767,12 @@ + if (token != G_TOKEN_STRING) + return G_TOKEN_STRING; + +- *stock_id = g_strdup (scanner->value.v_string); ++ *hash_key = g_strdup (scanner->value.v_string); + + token = g_scanner_get_next_token (scanner); + if (token != G_TOKEN_RIGHT_BRACE) + { +- g_free (*stock_id); ++ g_free (*hash_key); + return G_TOKEN_RIGHT_BRACE; + } + +@@ -3854,7 +3982,7 @@ + if (token != GTK_RC_TOKEN_STOCK) + return GTK_RC_TOKEN_STOCK; + +- token = gtk_rc_parse_stock_id (scanner, &stock_id); ++ token = gtk_rc_parse_hash_key (scanner, &stock_id); + if (token != G_TOKEN_NONE) + return token; + +@@ -3965,3 +4093,46 @@ + } + + #endif ++ ++static guint ++gtk_rc_parse_logical_color (GScanner *scanner, ++ GtkRcStyle *rc_style, ++ GtkHashTable *hash) ++{ ++ gchar *color_id = NULL; ++ guint token; ++ GdkColor *color; ++ ++ token = g_scanner_get_next_token (scanner); ++ if (token != GTK_RC_TOKEN_LOGICAL_COLOR) ++ return GTK_RC_TOKEN_LOGICAL_COLOR; ++ ++ token = gtk_rc_parse_hash_key (scanner, &color_id); ++ if (token != G_TOKEN_NONE) ++ return token; ++ ++ token = g_scanner_get_next_token (scanner); ++ if (token != G_TOKEN_EQUAL_SIGN) ++ { ++ g_free (color_id); ++ return G_TOKEN_EQUAL_SIGN; ++ } ++ ++ color = g_new (GdkColor, 1); ++ token = gtk_rc_parse_color_full (scanner, color, rc_style); ++ if (token != G_TOKEN_NONE) ++ { ++ g_free (color_id); ++ g_free (color); ++ return token; ++ } ++ ++ /* Because the hash is created with destroy functions, ++ * g_hash_table_insert will free any old values for us, ++ * if a mapping with the specified key already exists. */ ++ g_hash_table_insert (hash->hash, color_id, color); ++ ++ return G_TOKEN_NONE; ++} ++ ++ |