diff --git a/ChangeLog b/ChangeLog index b8d870d888..df6ef750ee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-03-01 Matthias Clasen + + * gtk/gtksettings.c: Always store gtk-color-scheme + values from all sources in the ColorSchemeData struct + and ignore the property_value for gtk-color-scheme. + This fixes #412596, reported by Thomas Wood. + 2007-02-28 Matthias Clasen * gtk/gtksettings.c: Make color scheme update properly diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index c5eaadd19a..8fc2bb0d50 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -135,7 +135,7 @@ static void settings_update_font_options (GtkSettings *setting static void settings_update_color_scheme (GtkSettings *settings); static void merge_color_scheme (GtkSettings *settings, - GValue *value, + const GValue *value, GtkSettingsSource source); static gchar *get_color_scheme (GtkSettings *settings); static GHashTable *get_color_hash (GtkSettings *settings); @@ -871,6 +871,9 @@ gtk_settings_set_property (GObject *object, g_value_copy (value, &settings->property_values[property_id - 1].value); settings->property_values[property_id - 1].source = GTK_SETTINGS_SOURCE_APPLICATION; + + if (pspec->param_id == PROP_COLOR_SCHEME) + merge_color_scheme (settings, value, GTK_SETTINGS_SOURCE_APPLICATION); } static void @@ -889,6 +892,10 @@ gtk_settings_get_property (GObject *object, case PROP_COLOR_HASH: g_value_set_boxed (value, get_color_hash (settings)); return; + case PROP_COLOR_SCHEME: + g_value_take_string (value, get_color_scheme (settings)); + return; + default: ; } /* For enums and strings, we need to get the value as a string, @@ -904,15 +911,7 @@ gtk_settings_get_property (GObject *object, !gdk_screen_get_setting (settings->screen, pspec->name, value)) g_value_copy (&settings->property_values[property_id - 1].value, value); else - { - if (pspec->param_id == PROP_COLOR_SCHEME) - { - merge_color_scheme (settings, value, GTK_SETTINGS_SOURCE_XSETTING); - g_value_take_string (value, get_color_scheme (settings)); - } - - g_param_value_validate (pspec, value); - } + g_param_value_validate (pspec, value); } else { @@ -1083,18 +1082,15 @@ apply_queued_setting (GtkSettings *data, if (_gtk_settings_parse_convert (parser, &qvalue->public.value, pspec, &tmp_value)) { - if (pspec->param_id == PROP_COLOR_SCHEME) + if (data->property_values[pspec->param_id - 1].source <= qvalue->source) { - merge_color_scheme (data, &tmp_value, qvalue->source); - g_object_set_property (G_OBJECT (data), pspec->name, &tmp_value); - data->property_values[pspec->param_id - 1].source = GTK_SETTINGS_SOURCE_DEFAULT; - } - - else if (data->property_values[pspec->param_id - 1].source <= qvalue->source) - { - g_object_set_property (G_OBJECT (data), pspec->name, &tmp_value); + g_value_copy (&tmp_value, &data->property_values[pspec->param_id - 1].value); data->property_values[pspec->param_id - 1].source = qvalue->source; + g_object_notify (G_OBJECT (data), g_param_spec_get_name (pspec)); } + + if (pspec->param_id == PROP_COLOR_SCHEME) + merge_color_scheme (data, &tmp_value, qvalue->source); } else { @@ -1692,10 +1688,31 @@ gtk_rc_property_parse_border (const GParamSpec *pspec, void _gtk_settings_handle_event (GdkEventSetting *event) { - GtkSettings *settings = gtk_settings_get_for_screen (gdk_drawable_get_screen (event->window)); - - if (g_object_class_find_property (G_OBJECT_GET_CLASS (settings), event->name)) - g_object_notify (G_OBJECT (settings), event->name); + GtkSettings *settings; + GParamSpec *pspec; + guint property_id; + + settings = gtk_settings_get_for_screen (gdk_drawable_get_screen (event->window)); + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (settings), event->name); + + if (pspec) + { + property_id = pspec->param_id; + + if (property_id == PROP_COLOR_SCHEME) + { + GValue value = { 0, }; + + g_value_init (&value, G_TYPE_STRING); + if (gdk_screen_get_setting (settings->screen, pspec->name, &value)) + { + merge_color_scheme (settings, &value, GTK_SETTINGS_SOURCE_XSETTING); + g_value_unset (&value); + } + } + + g_object_notify (G_OBJECT (settings), pspec->name); + } } static void @@ -1899,27 +1916,49 @@ settings_update_resolution (GtkSettings *settings) } #endif -static void -settings_update_color_scheme (GtkSettings *settings) -{ - gchar *dummy; - - g_object_get (settings, "gtk-color-scheme", &dummy, NULL); - - /* nothing to do here, the color hash is updated as a - * side effect of getting the color scheme - */ - - g_free (dummy); -} - - typedef struct { GHashTable *color_hash; GHashTable *tables[GTK_SETTINGS_SOURCE_APPLICATION + 1]; gchar *lastentry[GTK_SETTINGS_SOURCE_APPLICATION + 1]; } ColorSchemeData; +static void +color_scheme_data_free (ColorSchemeData *data) +{ + gint i; + + g_hash_table_unref (data->color_hash); + + for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++) + { + if (data->tables[i]) + g_hash_table_unref (data->tables[i]); + g_free (data->lastentry[i]); + } + + g_free (data); +} + +static void +settings_update_color_scheme (GtkSettings *settings) +{ + if (!g_object_get_data (G_OBJECT (settings), "gtk-color-scheme")) + { + ColorSchemeData *data; + GValue value = { 0, }; + + data = g_new0 (ColorSchemeData, 1); + g_object_set_data_full (G_OBJECT (settings), "gtk-color-scheme", + data, (GDestroyNotify) color_scheme_data_free); + + g_value_init (&value, G_TYPE_STRING); + if (gdk_screen_get_setting (settings->screen, "gtk-color-scheme", &value)) + { + merge_color_scheme (settings, &value, GTK_SETTINGS_SOURCE_XSETTING); + g_value_unset (&value); + } + } +} static gboolean add_color_to_hash (gchar *name, @@ -2026,7 +2065,8 @@ update_color_hash (ColorSchemeData *data, return FALSE; /* Rebuild the merged hash table. */ - g_hash_table_unref (data->color_hash); + if (data->color_hash) + g_hash_table_unref (data->color_hash); data->color_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) gdk_color_free); for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++) @@ -2039,26 +2079,34 @@ update_color_hash (ColorSchemeData *data, return TRUE; } -static void -color_scheme_data_free (ColorSchemeData *data) +struct _GtkRcContext { - gint i; + GHashTable *rc_style_ht; + GtkSettings *settings; + GSList *rc_sets_widget; + GSList *rc_sets_widget_class; + GSList *rc_sets_class; - g_hash_table_unref (data->color_hash); + /* The files we have parsed, to reread later if necessary */ + GSList *rc_files; - for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++) - { - if (data->tables[i]) - g_hash_table_unref (data->tables[i]); - g_free (data->lastentry[i]); - } + gchar *theme_name; + gchar *key_theme_name; + gchar *font_name; - g_free (data); -} + gchar **pixmap_path; + + gint default_priority; + GtkStyle *default_style; + + GHashTable *color_hash; + + guint reloading : 1; +}; static void merge_color_scheme (GtkSettings *settings, - GValue *value, + const GValue *value, GtkSettingsSource source) { ColorSchemeData *data; @@ -2066,16 +2114,10 @@ merge_color_scheme (GtkSettings *settings, colors = g_value_get_string (value); + settings_update_color_scheme (settings); + data = (ColorSchemeData *) g_object_get_data (G_OBJECT (settings), "gtk-color-scheme"); - if (!data) - { - data = g_new0 (ColorSchemeData, 1); - data->color_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - (GDestroyNotify) gdk_color_free); - g_object_set_data_full (G_OBJECT (settings), "gtk-color-scheme", - data, (GDestroyNotify) color_scheme_data_free); - } if (update_color_hash (data, colors, source)) g_object_notify (G_OBJECT (settings), "color-hash"); @@ -2086,15 +2128,11 @@ get_color_hash (GtkSettings *settings) { ColorSchemeData *data; - if (!g_object_get_data (G_OBJECT (settings), "gtk-color-scheme")) - settings_update_color_scheme (settings); + settings_update_color_scheme (settings); data = (ColorSchemeData *)g_object_get_data (G_OBJECT (settings), "gtk-color-scheme"); - if (!data) - return NULL; - return data->color_hash; } @@ -2117,6 +2155,8 @@ get_color_scheme (GtkSettings *settings) ColorSchemeData *data; GString *string; + settings_update_color_scheme (settings); + data = (ColorSchemeData *) g_object_get_data (G_OBJECT (settings), "gtk-color-scheme");