Always store gtk-color-scheme values from all sources in the

2007-03-01  Matthias Clasen <mclasen@redhat.com>

        * 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.



svn path=/trunk/; revision=17369
This commit is contained in:
Matthias Clasen 2007-03-01 06:44:00 +00:00 committed by Matthias Clasen
parent c955072b67
commit b30b4ccfa4
2 changed files with 112 additions and 65 deletions

View File

@ -1,3 +1,10 @@
2007-03-01 Matthias Clasen <mclasen@redhat.com>
* 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 <mclasen@redhat.com> 2007-02-28 Matthias Clasen <mclasen@redhat.com>
* gtk/gtksettings.c: Make color scheme update properly * gtk/gtksettings.c: Make color scheme update properly

View File

@ -135,7 +135,7 @@ static void settings_update_font_options (GtkSettings *setting
static void settings_update_color_scheme (GtkSettings *settings); static void settings_update_color_scheme (GtkSettings *settings);
static void merge_color_scheme (GtkSettings *settings, static void merge_color_scheme (GtkSettings *settings,
GValue *value, const GValue *value,
GtkSettingsSource source); GtkSettingsSource source);
static gchar *get_color_scheme (GtkSettings *settings); static gchar *get_color_scheme (GtkSettings *settings);
static GHashTable *get_color_hash (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); g_value_copy (value, &settings->property_values[property_id - 1].value);
settings->property_values[property_id - 1].source = GTK_SETTINGS_SOURCE_APPLICATION; 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 static void
@ -889,6 +892,10 @@ gtk_settings_get_property (GObject *object,
case PROP_COLOR_HASH: case PROP_COLOR_HASH:
g_value_set_boxed (value, get_color_hash (settings)); g_value_set_boxed (value, get_color_hash (settings));
return; 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, /* 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)) !gdk_screen_get_setting (settings->screen, pspec->name, value))
g_value_copy (&settings->property_values[property_id - 1].value, value); g_value_copy (&settings->property_values[property_id - 1].value, value);
else else
{ g_param_value_validate (pspec, value);
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);
}
} }
else else
{ {
@ -1083,18 +1082,15 @@ apply_queued_setting (GtkSettings *data,
if (_gtk_settings_parse_convert (parser, &qvalue->public.value, if (_gtk_settings_parse_convert (parser, &qvalue->public.value,
pspec, &tmp_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_value_copy (&tmp_value, &data->property_values[pspec->param_id - 1].value);
g_object_set_property (G_OBJECT (data), pspec->name, &tmp_value); data->property_values[pspec->param_id - 1].source = qvalue->source;
data->property_values[pspec->param_id - 1].source = GTK_SETTINGS_SOURCE_DEFAULT; g_object_notify (G_OBJECT (data), g_param_spec_get_name (pspec));
} }
else if (data->property_values[pspec->param_id - 1].source <= qvalue->source) if (pspec->param_id == PROP_COLOR_SCHEME)
{ 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 = qvalue->source;
}
} }
else else
{ {
@ -1692,10 +1688,31 @@ gtk_rc_property_parse_border (const GParamSpec *pspec,
void void
_gtk_settings_handle_event (GdkEventSetting *event) _gtk_settings_handle_event (GdkEventSetting *event)
{ {
GtkSettings *settings = gtk_settings_get_for_screen (gdk_drawable_get_screen (event->window)); GtkSettings *settings;
GParamSpec *pspec;
guint property_id;
if (g_object_class_find_property (G_OBJECT_GET_CLASS (settings), event->name)) settings = gtk_settings_get_for_screen (gdk_drawable_get_screen (event->window));
g_object_notify (G_OBJECT (settings), event->name); 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 static void
@ -1899,27 +1916,49 @@ settings_update_resolution (GtkSettings *settings)
} }
#endif #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 { typedef struct {
GHashTable *color_hash; GHashTable *color_hash;
GHashTable *tables[GTK_SETTINGS_SOURCE_APPLICATION + 1]; GHashTable *tables[GTK_SETTINGS_SOURCE_APPLICATION + 1];
gchar *lastentry[GTK_SETTINGS_SOURCE_APPLICATION + 1]; gchar *lastentry[GTK_SETTINGS_SOURCE_APPLICATION + 1];
} ColorSchemeData; } 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 static gboolean
add_color_to_hash (gchar *name, add_color_to_hash (gchar *name,
@ -2026,7 +2065,8 @@ update_color_hash (ColorSchemeData *data,
return FALSE; return FALSE;
/* Rebuild the merged hash table. */ /* 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, data->color_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
(GDestroyNotify) gdk_color_free); (GDestroyNotify) gdk_color_free);
for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++) for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++)
@ -2039,26 +2079,34 @@ update_color_hash (ColorSchemeData *data,
return TRUE; return TRUE;
} }
static void struct _GtkRcContext
color_scheme_data_free (ColorSchemeData *data)
{ {
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++) gchar *theme_name;
{ gchar *key_theme_name;
if (data->tables[i]) gchar *font_name;
g_hash_table_unref (data->tables[i]);
g_free (data->lastentry[i]);
}
g_free (data); gchar **pixmap_path;
}
gint default_priority;
GtkStyle *default_style;
GHashTable *color_hash;
guint reloading : 1;
};
static void static void
merge_color_scheme (GtkSettings *settings, merge_color_scheme (GtkSettings *settings,
GValue *value, const GValue *value,
GtkSettingsSource source) GtkSettingsSource source)
{ {
ColorSchemeData *data; ColorSchemeData *data;
@ -2066,16 +2114,10 @@ merge_color_scheme (GtkSettings *settings,
colors = g_value_get_string (value); colors = g_value_get_string (value);
settings_update_color_scheme (settings);
data = (ColorSchemeData *) g_object_get_data (G_OBJECT (settings), data = (ColorSchemeData *) g_object_get_data (G_OBJECT (settings),
"gtk-color-scheme"); "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)) if (update_color_hash (data, colors, source))
g_object_notify (G_OBJECT (settings), "color-hash"); g_object_notify (G_OBJECT (settings), "color-hash");
@ -2086,15 +2128,11 @@ get_color_hash (GtkSettings *settings)
{ {
ColorSchemeData *data; 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), data = (ColorSchemeData *)g_object_get_data (G_OBJECT (settings),
"gtk-color-scheme"); "gtk-color-scheme");
if (!data)
return NULL;
return data->color_hash; return data->color_hash;
} }
@ -2117,6 +2155,8 @@ get_color_scheme (GtkSettings *settings)
ColorSchemeData *data; ColorSchemeData *data;
GString *string; GString *string;
settings_update_color_scheme (settings);
data = (ColorSchemeData *) g_object_get_data (G_OBJECT (settings), data = (ColorSchemeData *) g_object_get_data (G_OBJECT (settings),
"gtk-color-scheme"); "gtk-color-scheme");