Always store gtk-color-scheme values from all sources in the
authorMatthias Clasen <mclasen@redhat.com>
Thu, 1 Mar 2007 06:44:00 +0000 (06:44 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Thu, 1 Mar 2007 06:44:00 +0000 (06:44 +0000)
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

ChangeLog
gtk/gtksettings.c

index b8d870d8880b0e2cf5699bd4d330e0ef0fc1714f..df6ef750ee97cfb6503c08214fe8f5020a6c51a2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
        * gtk/gtksettings.c: Make color scheme update properly
index c5eaadd19a90bc6b3b9501cd4bc1ef38d1cb5b07..8fc2bb0d50d06a5cbe48986982dab79d5a9fb63a 100644 (file)
@@ -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) 
-       {
-         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)
+      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
 
+typedef struct {
+  GHashTable *color_hash;
+  GHashTable *tables[GTK_SETTINGS_SOURCE_APPLICATION + 1];
+  gchar *lastentry[GTK_SETTINGS_SOURCE_APPLICATION + 1];
+} ColorSchemeData;
+
 static void
-settings_update_color_scheme (GtkSettings *settings)
+color_scheme_data_free (ColorSchemeData *data)
 {
-  gchar *dummy;
+  gint i;
 
-  g_object_get (settings, "gtk-color-scheme", &dummy, NULL);
+  g_hash_table_unref (data->color_hash);
 
-  /* nothing to do here, the color hash is updated as a
-   * side effect of getting the color scheme
-   */
+  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 (dummy);  
+  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, };
 
-typedef struct {
-  GHashTable *color_hash;
-  GHashTable *tables[GTK_SETTINGS_SOURCE_APPLICATION + 1];
-  gchar *lastentry[GTK_SETTINGS_SOURCE_APPLICATION + 1];
-} ColorSchemeData;
+      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");