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:
parent
c955072b67
commit
b30b4ccfa4
@ -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
|
||||||
|
@ -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");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user