[gtk+] Break out into a separate function



commit 368a5c8937568495868051528f5aaed0066fa04a
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Jan 26 10:46:40 2011 -0500

    Break out into a separate function
    
    Move key file parsing to gtk_settings_load_from_key_file(), in
    preparation for loading per-theme files. Load key files from both
    /etc and ~/.config, with the latter overriding the former. Support
    parsing enum values.

 gtk/gtksettings.c |  220 ++++++++++++++++++++++++++++++++--------------------
 1 files changed, 135 insertions(+), 85 deletions(-)
---
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index 0cce0bc..6109d8c 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -223,6 +223,9 @@ static void    merge_color_scheme                (GtkSettings           *setting
                                                   GtkSettingsSource      source);
 static gchar  *get_color_scheme                  (GtkSettings           *settings);
 static GHashTable *get_color_hash                (GtkSettings           *settings);
+static void gtk_settings_load_from_key_file      (GtkSettings           *settings,
+                                                  const gchar           *path,
+                                                  GtkSettingsSource      source);
 
 /* the default palette for GtkColorSelelection */
 static const gchar default_color_palette[] =
@@ -246,10 +249,7 @@ gtk_settings_init (GtkSettings *settings)
   GtkSettingsPrivate *priv;
   GParamSpec **pspecs, **p;
   guint i = 0;
-  GKeyFile *keyfile;
-  gchar *dirs[3];
   gchar *path;
-  GError *error;
 
   priv = G_TYPE_INSTANCE_GET_PRIVATE (settings,
                                       GTK_TYPE_SETTINGS,
@@ -271,25 +271,6 @@ gtk_settings_init (GtkSettings *settings)
   i = 0;
   g_object_freeze_notify (G_OBJECT (settings));
 
-  keyfile = g_key_file_new ();
-  dirs[0] = g_build_filename (g_get_user_config_dir (), "gtk-3.0", NULL);
-  dirs[1] = g_build_filename (GTK_SYSCONFDIR, "gtk-3.0", NULL);
-  dirs[2] = NULL;
-  path = NULL;
-
-  error = NULL;
-  if (!g_key_file_load_from_dirs (keyfile, "settings.ini",
-                                  (const gchar**)dirs, &path,
-                                  G_KEY_FILE_NONE,
-                                  &error))
-    {
-      if (!g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND))
-        g_warning ("Failed to parse %s: %s", path ? path : "settings.ini", error->message);
-
-      g_error_free (error);
-      error = NULL;
-    }
-
   for (p = pspecs; *p; p++)
     {
       GParamSpec *pspec = *p;
@@ -300,75 +281,23 @@ gtk_settings_init (GtkSettings *settings)
       g_value_init (&priv->property_values[i].value, value_type);
       g_param_value_set_default (pspec, &priv->property_values[i].value);
 
-      error = NULL;
-      switch (value_type)
-        {
-        case G_TYPE_BOOLEAN:
-          {
-            gboolean b_val;
-
-            b_val = g_key_file_get_boolean (keyfile, "Settings", pspec->name, &error);
-            if (!error)
-              g_value_set_boolean (&priv->property_values[i].value, b_val);
-            break;
-          }
-
-        case G_TYPE_INT:
-          {
-            gint i_val;
-
-            i_val = g_key_file_get_integer (keyfile, "Settings", pspec->name, &error);
-            if (!error)
-              g_value_set_int (&priv->property_values[i].value, i_val);
-            break;
-          }
-
-        case G_TYPE_DOUBLE:
-          {
-            gdouble d_val;
-
-            d_val = g_key_file_get_double (keyfile, "Settings", pspec->name, &error);
-            if (!error)
-              g_value_set_double (&priv->property_values[i].value, d_val);
-            break;
-          }
-
-        case G_TYPE_STRING:
-          {
-            gchar *s_val;
-
-            s_val = g_key_file_get_string (keyfile, "Settings", pspec->name, &error);
-            if (!error)
-              g_value_set_string (&priv->property_values[i].value, s_val);
-            g_free (s_val);
-            break;
-          }
-        default: ;
-          /* FIXME: handle parsing nicks, colors, etc */
-        }
-
-      if (error)
-        {
-          if (!g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND) &&
-              !g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND))
-            g_warning ("Failed to parse %s: %s", path ? path : "settings.ini", error->message);
-
-          g_error_free (error);
-          error = NULL;
-        }
-
       g_object_notify (G_OBJECT (settings), pspec->name);
       priv->property_values[i].source = GTK_SETTINGS_SOURCE_DEFAULT;
       i++;
     }
+  g_free (pspecs);
 
-  g_key_file_free (keyfile);
+  path = g_build_filename (GTK_SYSCONFDIR, "gtk-3.0", "settings.ini", NULL);
+  if (g_file_test (path, G_FILE_TEST_EXISTS))
+    gtk_settings_load_from_key_file (settings, path, GTK_SETTINGS_SOURCE_DEFAULT);
+  g_free (path);
+
+  path = g_build_filename (g_get_user_config_dir (), "gtk-3.0", "settings.ini", NULL);
+  if (g_file_test (path, G_FILE_TEST_EXISTS))
+    gtk_settings_load_from_key_file (settings, path, GTK_SETTINGS_SOURCE_DEFAULT);
   g_free (path);
-  g_free (dirs[0]);
-  g_free (dirs[1]);
 
   g_object_thaw_notify (G_OBJECT (settings));
-  g_free (pspecs);
 }
 
 static void
@@ -1736,7 +1665,8 @@ _gtk_settings_parse_convert (GtkRcPropertyParser parser,
         {
           gchar *tstr = g_strescape (g_value_get_string (src_value), NULL);
 
-          gstring = g_string_new ("\"");
+          gstring = g_string_new (NULL);
+          g_string_append_c (gstring, '\"');
           g_string_append (gstring, tstr);
           g_string_append_c (gstring, '\"');
           g_free (tstr);
@@ -1964,7 +1894,7 @@ gtk_settings_set_property_value_internal (GtkSettings            *settings,
       !G_VALUE_HOLDS_STRING (&new_value->value) &&
       !G_VALUE_HOLDS (&new_value->value, G_TYPE_GSTRING))
     {
-      g_warning (G_STRLOC ": value type invalid");
+      g_warning (G_STRLOC ": value type invalid (%s)", g_type_name (G_VALUE_TYPE (&new_value->value)));
       return;
     }
 
@@ -3013,3 +2943,123 @@ _gtk_settings_get_screen (GtkSettings *settings)
 {
   return settings->priv->screen;
 }
+
+
+static void
+gtk_settings_load_from_key_file (GtkSettings       *settings,
+                                 const gchar       *path,
+                                 GtkSettingsSource  source)
+{
+  GError *error;
+  GKeyFile *keyfile;
+  gchar **keys;
+  gsize n_keys;
+  gint i;
+
+  error = NULL;
+  keys = NULL;
+
+  keyfile = g_key_file_new ();
+
+  if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, &error))
+    {
+      g_warning ("Failed to parse %s: %s", path, error->message);
+
+      g_error_free (error);
+
+      goto out;
+    }
+
+  keys = g_key_file_get_keys (keyfile, "Settings", &n_keys, &error);
+  if (error)
+    {
+      g_warning ("Failed to parse %s: %s", path, error->message);
+      g_error_free (error);
+      goto out;
+    }
+
+  for (i = 0; i < n_keys; i++)
+    {
+      gchar *key;
+      GParamSpec *pspec;
+      GType value_type;
+      GtkSettingsValue svalue = { NULL, { 0, }, };
+
+      key = keys[i];
+      pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (settings), key);
+      if (!pspec)
+        {
+          g_warning ("Unknown key %s in %s", key, path);
+          continue;
+        }
+
+      if (pspec->owner_type != G_OBJECT_TYPE (settings))
+        continue;
+
+      value_type = G_PARAM_SPEC_VALUE_TYPE (pspec);
+      switch (value_type)
+        {
+        case G_TYPE_BOOLEAN:
+          {
+            gboolean b_val;
+
+            g_value_init (&svalue.value, G_TYPE_LONG);
+            b_val = g_key_file_get_boolean (keyfile, "Settings", key, &error);
+            if (!error)
+              g_value_set_long (&svalue.value, b_val);
+            break;
+          }
+
+        case G_TYPE_INT:
+          {
+            gint i_val;
+
+            g_value_init (&svalue.value, G_TYPE_LONG);
+            i_val = g_key_file_get_integer (keyfile, "Settings", key, &error);
+            if (!error)
+              g_value_set_long (&svalue.value, i_val);
+            break;
+          }
+
+        case G_TYPE_DOUBLE:
+          {
+            gdouble d_val;
+
+            g_value_init (&svalue.value, G_TYPE_DOUBLE);
+            d_val = g_key_file_get_double (keyfile, "Settings", key, &error);
+            if (!error)
+              g_value_set_double (&svalue.value, d_val);
+            break;
+          }
+
+        default:
+          {
+            gchar *s_val;
+
+            g_value_init (&svalue.value, G_TYPE_GSTRING);
+            s_val = g_key_file_get_string (keyfile, "Settings", key, &error);
+            if (!error)
+              g_value_set_boxed (&svalue.value, g_string_new (s_val));
+            g_free (s_val);
+            break;
+          }
+        }
+      if (error)
+        {
+          g_warning ("Error setting %s in %s: %s", key, path, error->message);
+          g_error_free (error);
+          error = NULL;
+        }
+      else
+        {
+          if (g_getenv ("GTK_DEBUG"))
+            svalue.origin = (gchar *)path;
+          gtk_settings_set_property_value_internal (settings, key, &svalue, source);
+          g_value_unset (&svalue.value);
+        }
+    }
+
+ out:
+  g_strfreev (keys);
+  g_key_file_free (keyfile);
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]