metacity r3624 - in trunk: . src/core



Author: tthurman
Date: Thu Mar  6 17:59:20 2008
New Revision: 3624
URL: http://svn.gnome.org/viewvc/metacity?rev=3624&view=rev

Log:
2008-03-06  Thomas Thurman  <tthurman gnome org>

        Part three of the great prefs refactor, this time
        dealing with string preferences.  (This was the most
        complicated part, and has been especially tested and
        valground before committing.  As ever, though, let us
        know if you find a problem.)

        * src/core/prefs.c (MetaStringPreference): new struct.  
        * src/core/prefs.c (update_*): replaced with *_handler  
        * src/core/prefs.c (meta_prefs_init): uses new string prefs
          init; uses array of gconf dirs to monitor rather than 
          repeating code.
        * src/core/prefs.c (handle_preference_init_enum): tidying
        * src/core/prefs.c (change_notify): uses new string prefs  



Modified:
   trunk/ChangeLog
   trunk/src/core/prefs.c

Modified: trunk/src/core/prefs.c
==============================================================================
--- trunk/src/core/prefs.c	(original)
+++ trunk/src/core/prefs.c	Thu Mar  6 17:59:20 2008
@@ -46,17 +46,15 @@
  * not given a name here, because the purpose of the unified handlers
  * is that keys should be referred to exactly once.
  */
-#define KEY_MOUSE_BUTTON_MODS "/apps/metacity/general/mouse_button_modifier"
 #define KEY_AUTO_RAISE_DELAY "/apps/metacity/general/auto_raise_delay"
-#define KEY_THEME "/apps/metacity/general/theme"
 #define KEY_TITLEBAR_FONT "/apps/metacity/general/titlebar_font"
 #define KEY_NUM_WORKSPACES "/apps/metacity/general/num_workspaces"
-#define KEY_BUTTON_LAYOUT "/apps/metacity/general/button_layout"
 #define KEY_GNOME_ACCESSIBILITY "/desktop/gnome/interface/accessibility"
 
 #define KEY_COMMAND_PREFIX "/apps/metacity/keybinding_commands/command_"
 
-#define KEY_TERMINAL_COMMAND "/desktop/gnome/applications/terminal/exec"
+#define KEY_TERMINAL_DIR "/desktop/gnome/applications/terminal"
+#define KEY_TERMINAL_COMMAND KEY_TERMINAL_DIR "/exec"
 
 #define KEY_SCREEN_BINDINGS_PREFIX "/apps/metacity/global_keybindings"
 #define KEY_WINDOW_BINDINGS_PREFIX "/apps/metacity/window_keybindings"
@@ -64,7 +62,6 @@
 
 #define KEY_WORKSPACE_NAME_PREFIX "/apps/metacity/workspace_names/name_"
 
-#define KEY_CURSOR_THEME "/desktop/gnome/peripherals/mouse/cursor_theme"
 #define KEY_CURSOR_SIZE "/desktop/gnome/peripherals/mouse/cursor_size"
 
 #ifdef HAVE_GCONF
@@ -110,12 +107,8 @@
 #ifdef HAVE_GCONF
 static gboolean handle_preference_update_enum (const gchar *key, GConfValue *value);
 
-static gboolean update_titlebar_font      (const char *value);
-static gboolean update_mouse_button_mods  (const char *value);
-static gboolean update_theme              (const char *value);
 static gboolean update_num_workspaces     (int         value);
 static gboolean update_auto_raise_delay    (int        value);
-static gboolean update_button_layout      (const char *value);
 static gboolean update_window_binding     (const char *name,
                                            const char *value);
 static gboolean update_screen_binding     (const char *name,
@@ -129,10 +122,8 @@
                                             GSList      *value);
 static gboolean update_command            (const char  *name,
                                            const char  *value);
-static gboolean update_terminal_command   (const char *value);
 static gboolean update_workspace_name     (const char  *name,
                                            const char  *value);
-static gboolean update_cursor_theme       (const char *value);
 static gboolean update_cursor_size        (int size);
 
 static void change_notify (GConfClient    *client,
@@ -158,6 +149,11 @@
 static gboolean get_bool                  (const char *key, gboolean *val);
 static void maybe_give_disable_workarounds_warning (void);
 
+static void titlebar_handler (MetaPreference, const gchar*, gboolean*);
+static void theme_name_handler (MetaPreference, const gchar*, gboolean*);
+static void mouse_button_mods_handler (MetaPreference, const gchar*, gboolean*);
+static void button_layout_handler (MetaPreference, const gchar*, gboolean*);
+
 #endif /* HAVE_GCONF */
 
 static gboolean update_binding            (MetaKeyPref *binding,
@@ -173,6 +169,12 @@
 
 #ifdef HAVE_GCONF
 
+typedef struct
+{
+  MetaPrefsChangedFunc func;
+  gpointer data;
+} MetaPrefsListener;
+
 static GConfEnumStringPair symtab_focus_mode[] =
   {
     { META_FOCUS_MODE_CLICK,  "click" },
@@ -237,9 +239,9 @@
  *     with a macro.  (This would reduce clarity, however, and is
  *     probably a bad thing.)
  *
- *   - these types all begin with a gchar*, and we can factor out the
- *     repeated code in the handlers by taking advantage of this
- *     (it is effectively a superclass field).
+ *   - these types all begin with a gchar* (and contain a MetaPreference)
+ *     and we can factor out the repeated code in the handlers by taking
+ *     advantage of this using some kind of union arrangement.
  */
 typedef struct
 {
@@ -257,6 +259,39 @@
   gboolean becomes_true_on_destruction;
 } MetaBoolPreference;
 
+typedef struct
+{
+  gchar *key;
+  MetaPreference pref;
+
+  /**
+   * A handler.  Many of the string preferences aren't stored as
+   * strings and need parsing; others of them have default values
+   * which can't be solved in the general case.  If you include a
+   * function pointer here, it will be called before the string
+   * value is written out to the target variable.
+   *
+   * The function is passed two arguments: the preference, and
+   * the new string as a gchar*.  It returns a gboolean;
+   * only if this is true, the listeners will be informed that
+   * the preference has changed.
+   *
+   * This may be NULL.  If it is, see "target", below.
+   */
+  void (*handler) (MetaPreference pref,
+                     const gchar *string_value,
+                     gboolean *inform_listeners);
+
+  /**
+   * Where to write the incoming string.
+   *
+   * If the incoming string is NULL, no change will be made.
+   * This is ignored if the handler is non-NULL.
+   */
+  gchar **target;
+
+} MetaStringPreference;
+
 static MetaEnumPreference preferences_enum[] =
   {
     { "/apps/metacity/general/focus_new_windows",
@@ -347,6 +382,41 @@
     { NULL, NULL, 0, FALSE },
   };
 
+static MetaStringPreference preferences_string[] =
+  {
+    { "/apps/metacity/general/mouse_button_modifier",
+      META_PREF_MOUSE_BUTTON_MODS,
+      mouse_button_mods_handler,
+      NULL,
+    },
+    { "/apps/metacity/general/theme",
+      META_PREF_THEME,
+      theme_name_handler,
+      NULL,
+    },
+    { KEY_TITLEBAR_FONT,
+      META_PREF_TITLEBAR_FONT,
+      titlebar_handler,
+      NULL,
+    },
+    { KEY_TERMINAL_COMMAND,
+      META_PREF_TERMINAL_COMMAND,
+      NULL,
+      &terminal_command,
+    },
+    { "/apps/metacity/general/button_layout",
+      META_PREF_BUTTON_LAYOUT,
+      button_layout_handler,
+      NULL,
+    },
+    { "/desktop/gnome/peripherals/mouse/cursor_theme",
+      META_PREF_CURSOR_THEME,
+      NULL,
+      &cursor_theme,
+    },
+    { NULL, 0, NULL, NULL },
+  };
+
 static void
 handle_preference_init_enum (void)
 {
@@ -357,16 +427,22 @@
       char *value;
       GError *error = NULL;
 
+      if (cursor->target==NULL)
+        {
+          ++cursor;
+          continue;
+        }
+
       value = gconf_client_get_string (default_client,
-                                         cursor->key,
-                                         &error);
+                                       cursor->key,
+                                       &error);
       cleanup_error (&error);
 
-      /* If the value's NULL, we found it and there's nothing we
-       * can do with it.  So just return.
-       */
       if (value==NULL)
-        return;
+        {
+          ++cursor;
+          continue;
+        }
 
       if (!gconf_string_to_enum (cursor->symtab,
                                  value,
@@ -396,6 +472,44 @@
   maybe_give_disable_workarounds_warning ();
 }
 
+static void
+handle_preference_init_string (void)
+{
+  MetaStringPreference *cursor = preferences_string;
+
+  while (cursor->key!=NULL)
+    {
+      char *value;
+      GError *error = NULL;
+      gboolean dummy = TRUE;
+
+      /* the string "value" will be newly allocated */
+      value = gconf_client_get_string (default_client,
+                                       cursor->key,
+                                       &error);
+      cleanup_error (&error);
+
+      if (cursor->handler)
+        {
+          if (cursor->target)
+            meta_bug ("%s has both a target and a handler\n", cursor->key);
+
+          cursor->handler (cursor->pref, value, &dummy);
+
+          g_free (value);
+        }
+      else if (cursor->target)
+        {
+          if (*(cursor->target))
+            g_free (*(cursor->target));
+
+          *(cursor->target) = value;
+        }
+
+      ++cursor;
+    }
+}
+
 static gboolean
 handle_preference_update_enum (const gchar *key, GConfValue *value)
 {
@@ -517,13 +631,63 @@
   return TRUE;
 }
 
+static gboolean
+handle_preference_update_string (const gchar *key, GConfValue *value)
+{
+  MetaStringPreference *cursor = preferences_string;
+  const gchar *value_as_string;
+  gboolean inform_listeners = TRUE;
+
+  while (cursor->key!=NULL && strcmp (key, cursor->key)!=0)
+    ++cursor;
+
+  if (cursor->key==NULL)
+    /* Didn't recognise that key. */
+    return FALSE;
+
+  if (value==NULL)
+    return TRUE;
+
+  /* Check the type. */
+
+  if (value->type != GCONF_VALUE_STRING)
+    {
+      meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
+                    key);
+      /* But we did recognise it. */
+      return TRUE;
+    }
+
+  /* Docs: "The returned string is not a copy, don't try to free it." */
+  value_as_string = gconf_value_get_string (value);
+
+  if (cursor->handler)
+    cursor->handler (cursor->pref, value_as_string, &inform_listeners);
+  else if (cursor->target)
+    {
+      if (*(cursor->target))
+        g_free(*(cursor->target));
+
+      if (value_as_string!=NULL)
+        *(cursor->target) = g_strdup (value_as_string);
+      else
+        *(cursor->target) = NULL;
+
+      inform_listeners =
+        (value_as_string==NULL && *(cursor->target)==NULL) ||
+        (value_as_string!=NULL && *(cursor->target)!=NULL &&
+         strcmp (value_as_string, *(cursor->target))==0);
+    }
+
+  if (inform_listeners)
+    queue_changed (cursor->pref);
+
+  return TRUE;
+}
+
 #endif /* HAVE_GCONF */
 
-typedef struct
-{
-  MetaPrefsChangedFunc func;
-  gpointer data;
-} MetaPrefsListener;
+/* FIXME: Ultimately these should be no-ops if !HAVE_GCONF. */
 
 void
 meta_prefs_add_listener (MetaPrefsChangedFunc func,
@@ -577,20 +741,19 @@
   copy = g_list_copy (listeners);
   
   tmp = copy;
+
   while (tmp != NULL)
     {
       MetaPrefsListener *l = tmp->data;
 
       (* l->func) (pref, l->data);
-      
+
       tmp = tmp->next;
     }
 
   g_list_free (copy);
 }
-#endif /* HAVE_GCONF */
 
-#ifdef HAVE_GCONF
 static gboolean
 changed_idle_handler (gpointer data)
 {
@@ -618,15 +781,13 @@
   
   return FALSE;
 }
-#endif /* HAVE_GCONF */
 
-#ifdef HAVE_GCONF
 static void
 queue_changed (MetaPreference pref)
 {
   meta_topic (META_DEBUG_PREFS, "Queueing change of pref %s\n",
               meta_preference_to_string (pref));  
-  
+
   if (g_list_find (changes, GINT_TO_POINTER (pref)) == NULL)
     changes = g_list_prepend (changes, GINT_TO_POINTER (pref));
   else
@@ -640,14 +801,22 @@
 }
 #endif /* HAVE_GCONF */
 
+static gchar *gconf_dirs_we_are_interested_in[] = {
+  "/apps/metacity",
+  KEY_TERMINAL_DIR,
+  KEY_GNOME_ACCESSIBILITY,
+  "/desktop/gnome/peripherals/mouse",
+  NULL,
+};
+
 void
 meta_prefs_init (void)
 {
 #ifdef HAVE_GCONF
   GError *err = NULL;
-  char *str_val;
   int int_val;
   GConfValue *gconf_val;
+  gchar **gconf_dir_cursor;
   
   if (default_client != NULL)
     return;
@@ -655,41 +824,27 @@
   /* returns a reference which we hold forever */
   default_client = gconf_client_get_default ();
 
-  gconf_client_add_dir (default_client, "/apps/metacity",
-                        GCONF_CLIENT_PRELOAD_RECURSIVE,
-                        &err);
-  cleanup_error (&err);
-
-  gconf_client_add_dir (default_client, "/desktop/gnome/applications/terminal",
-                        GCONF_CLIENT_PRELOAD_RECURSIVE,
-                        &err);
-  cleanup_error (&err);
-
-  gconf_client_add_dir (default_client, KEY_GNOME_ACCESSIBILITY,
-                        GCONF_CLIENT_PRELOAD_RECURSIVE,
-                        &err);
-  cleanup_error (&err);
-
-  gconf_client_add_dir (default_client, "/desktop/gnome/peripherals/mouse",
-                        GCONF_CLIENT_PRELOAD_RECURSIVE,
-                        &err);
-  cleanup_error (&err);
+  for (gconf_dir_cursor=gconf_dirs_we_are_interested_in;
+       *gconf_dir_cursor!=NULL;
+       gconf_dir_cursor++)
+    {
+      gconf_client_add_dir (default_client,
+                            *gconf_dir_cursor,
+                            GCONF_CLIENT_PRELOAD_RECURSIVE,
+                            &err);
+      cleanup_error (&err);
+    }
 
   /* Pick up initial values. */
 
   handle_preference_init_enum ();
   handle_preference_init_bool ();
+  handle_preference_init_string ();
 
-  /* To follow: initialisation with ordinary strings, ints, and bools. */
+  /* To follow: initialisation with ordinary ints. */
 
   /* Pick up initial values using the legacy system. */
 
-  str_val = gconf_client_get_string (default_client, KEY_MOUSE_BUTTON_MODS,
-                                     &err);
-  cleanup_error (&err);
-  update_mouse_button_mods (str_val);
-  g_free (str_val);
-
   gconf_val = gconf_client_get (default_client, KEY_AUTO_RAISE_DELAY,
 				  &err);
   cleanup_error (&err);
@@ -704,51 +859,36 @@
     }
   
 
-  str_val = gconf_client_get_string (default_client, KEY_THEME,
-                                     &err);
-  cleanup_error (&err);
-  update_theme (str_val);
-  g_free (str_val);
-  
   /* If the keys aren't set in the database, we use essentially
    * bogus values instead of any kind of default. This is
    * just lazy. But they keys ought to be set, anyhow.
    */
   
-  str_val = gconf_client_get_string (default_client, KEY_TITLEBAR_FONT,
-                                     &err);
-  cleanup_error (&err);
-  update_titlebar_font (str_val);
-  g_free (str_val);
-
   int_val = gconf_client_get_int (default_client, KEY_NUM_WORKSPACES,
                                   &err);
   cleanup_error (&err);
   update_num_workspaces (int_val);
 
-  str_val = gconf_client_get_string (default_client, KEY_BUTTON_LAYOUT,
-                                     &err);
-  cleanup_error (&err);
-  update_button_layout (str_val);
-  g_free (str_val);
-
-  str_val = gconf_client_get_string (default_client, KEY_TERMINAL_COMMAND,
-                                     &err);
-  cleanup_error (&err);
-  update_terminal_command (str_val);
-  g_free (str_val);
-
-  str_val = gconf_client_get_string (default_client, KEY_CURSOR_THEME,
-                                     &err);
-  cleanup_error (&err);
-  update_cursor_theme (str_val);
-  g_free (str_val);
-
   int_val = gconf_client_get_int (default_client, KEY_CURSOR_SIZE,
                                   &err);
   cleanup_error (&err);
   update_cursor_size (int_val);
+
+  for (gconf_dir_cursor=gconf_dirs_we_are_interested_in;
+       *gconf_dir_cursor!=NULL;
+       gconf_dir_cursor++)
+    {
+      gconf_client_notify_add (default_client,
+                               *gconf_dir_cursor,
+                               change_notify,
+                               NULL,
+                               NULL,
+                               &err);
+      cleanup_error (&err);
+    }
+
 #else  /* HAVE_GCONF */
+
   /* Set defaults for some values that can't be set at initialization time of
    * the static globals.  In the case of the theme, note that there is code
    * elsewhere that will do everything possible to fallback to an existing theme
@@ -769,30 +909,6 @@
   /* workspace names */
   init_workspace_names ();
 
-#ifdef HAVE_GCONF
-  gconf_client_notify_add (default_client, "/apps/metacity",
-                           change_notify,
-                           NULL,
-                           NULL,
-                           &err);
-  gconf_client_notify_add (default_client, KEY_TERMINAL_COMMAND,
-                           change_notify,
-                           NULL,
-                           NULL,
-                           &err);
-  gconf_client_notify_add (default_client, KEY_GNOME_ACCESSIBILITY,
-                           change_notify,
-                           NULL,
-                           NULL,
-                           &err);
-  gconf_client_notify_add (default_client, "/desktop/gnome/peripherals/mouse",
-                           change_notify,
-                           NULL,
-                           NULL,
-                           &err);
-
-  cleanup_error (&err);  
-#endif /* HAVE_GCONF */
 }
 
 #ifdef HAVE_GCONF
@@ -800,6 +916,7 @@
 gboolean (*preference_update_handler[]) (const gchar*, GConfValue*) = {
   handle_preference_update_enum,
   handle_preference_update_bool,
+  handle_preference_update_string,
   NULL
 };
 
@@ -835,55 +952,7 @@
    * out of here as it becomes possible to deal with them in a
    * more general way. */
 
-  if (strcmp (key, KEY_MOUSE_BUTTON_MODS) == 0)
-    {
-      const char *str;
-
-      if (value && value->type != GCONF_VALUE_STRING)
-        {
-          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
-                        KEY_MOUSE_BUTTON_MODS);
-          goto out;
-        }
-      
-      str = value ? gconf_value_get_string (value) : NULL;
-
-      if (update_mouse_button_mods (str))
-        queue_changed (META_PREF_MOUSE_BUTTON_MODS);
-    }
-  else if (strcmp (key, KEY_THEME) == 0)
-    {
-      const char *str;
-
-      if (value && value->type != GCONF_VALUE_STRING)
-        {
-          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
-                        KEY_THEME);
-          goto out;
-        }
-      
-      str = value ? gconf_value_get_string (value) : NULL;
-
-      if (update_theme (str))
-        queue_changed (META_PREF_THEME);
-    }
-  else if (strcmp (key, KEY_TITLEBAR_FONT) == 0)
-    {
-      const char *str;
-
-      if (value && value->type != GCONF_VALUE_STRING)
-        {
-          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
-                        KEY_TITLEBAR_FONT);
-          goto out;
-        }
-      
-      str = value ? gconf_value_get_string (value) : NULL;
-
-      if (update_titlebar_font (str))
-        queue_changed (META_PREF_TITLEBAR_FONT);
-    }
-  else if (strcmp (key, KEY_NUM_WORKSPACES) == 0)
+  if (strcmp (key, KEY_NUM_WORKSPACES) == 0)
     {
       int d;
 
@@ -1002,22 +1071,6 @@
       if (update_command (key, str))
         queue_changed (META_PREF_COMMANDS);
     }
-  else if (strcmp (key, KEY_TERMINAL_COMMAND) == 0)
-    {
-      const char *str;
-
-      if (value && value->type != GCONF_VALUE_STRING)
-        {
-          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
-                        KEY_TERMINAL_COMMAND);
-          goto out;
-        }
-      
-      str = value ? gconf_value_get_string (value) : NULL;
-
-      if (update_terminal_command (str))
-        queue_changed (META_PREF_TERMINAL_COMMAND);
-    }
   else if (g_str_has_prefix (key, KEY_WORKSPACE_NAME_PREFIX))
     {
       const char *str;
@@ -1034,38 +1087,6 @@
       if (update_workspace_name (key, str))
         queue_changed (META_PREF_WORKSPACE_NAMES);
     }
-  else if (strcmp (key, KEY_BUTTON_LAYOUT) == 0)
-    {
-      const char *str;
-      
-      if (value && value->type != GCONF_VALUE_STRING)
-        {
-          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
-                        KEY_BUTTON_LAYOUT);
-          goto out;
-        }
-      
-      str = value ? gconf_value_get_string (value) : NULL;
-
-      if (update_button_layout (str))
-        queue_changed (META_PREF_BUTTON_LAYOUT);
-    }
-  else if (strcmp (key, KEY_CURSOR_THEME) == 0)
-    {
-      const char *str;
-
-      if (value && value->type != GCONF_VALUE_STRING)
-        {
-          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
-                       KEY_CURSOR_THEME);
-          goto out;
-        }
-
-      str = value ? gconf_value_get_string (value) : NULL;
-
-      if (update_cursor_theme (str))
-	queue_changed (META_PREF_CURSOR_THEME);
-    }
   else if (strcmp (key, KEY_CURSOR_SIZE) == 0)
     {
       int d;
@@ -1148,72 +1169,6 @@
 
 #endif /* HAVE_GCONF */
 
-#ifdef HAVE_GCONF
-static gboolean
-update_mouse_button_mods (const char *value)
-{
-  MetaVirtualModifier old_mods = mouse_button_mods;
-  
-  if (value != NULL)
-    {
-      MetaVirtualModifier mods;
-  
-      meta_topic (META_DEBUG_KEYBINDINGS,
-                  "Mouse button modifier has new gconf value \"%s\"\n",
-                  value ? value : "none");
-  
-      if (meta_ui_parse_modifier (value, &mods))
-        {
-          mouse_button_mods = mods;
-        }
-      else
-        {
-          meta_topic (META_DEBUG_KEYBINDINGS,
-                      "Failed to parse new gconf value\n");
-          
-          meta_warning (_("\"%s\" found in configuration database is not a valid value for mouse button modifier\n"),
-                        value);
-        }
-    }
-
-  return old_mods != mouse_button_mods;
-}
-#endif /* HAVE_GCONF */
-
-#ifdef HAVE_GCONF
-static gboolean
-update_theme (const char *value)
-{
-  char *old_theme;
-  gboolean changed;
-  
-  old_theme = current_theme;
-  
-  if (value != NULL && *value)
-    {
-      current_theme = g_strdup (value);
-    }
-
-  changed = TRUE;
-  if ((old_theme && current_theme &&
-       strcmp (old_theme, current_theme) == 0) ||
-      (old_theme == NULL && current_theme == NULL))
-    changed = FALSE;
-
-  if (old_theme != current_theme)
-    g_free (old_theme);
-
-  if (current_theme == NULL)
-    {
-      /* Fallback crackrock */
-      current_theme = g_strdup ("Atlanta");
-      changed = TRUE;
-    }
-  
-  return changed;
-}
-#endif /* HAVE_GCONF */
-
 MetaVirtualModifier
 meta_prefs_get_mouse_button_mods  (void)
 {
@@ -1247,33 +1202,6 @@
   return current_theme;
 }
 
-#ifdef HAVE_GCONF
-static gboolean
-update_cursor_theme (const char *value)
-{
-  char *old_theme;
-  gboolean changed;
-  
-  old_theme = cursor_theme;
-  
-  if (value != NULL && *value)
-    {
-      cursor_theme = g_strdup (value);
-    }
-
-  changed = TRUE;
-  if ((old_theme && cursor_theme &&
-       strcmp (old_theme, cursor_theme) == 0) ||
-      (old_theme == NULL && cursor_theme == NULL))
-    changed = FALSE;
-
-  if (old_theme != cursor_theme)
-    g_free (old_theme);
-
-  return changed;
-}
-#endif /* HAVE_GCONF */
-
 const char*
 meta_prefs_get_cursor_theme (void)
 {
@@ -1303,40 +1231,92 @@
 }
 
 #ifdef HAVE_GCONF
-static gboolean
-update_titlebar_font (const char *value)
+
+static void
+titlebar_handler (MetaPreference pref,
+                  const gchar    *string_value,
+                  gboolean       *inform_listeners)
 {
   PangoFontDescription *new_desc;
 
-  new_desc = NULL;
+  new_desc = pango_font_description_from_string (string_value);
 
-  if (value)
+  if (new_desc == NULL)
     {
-      new_desc = pango_font_description_from_string (value);
-      if (new_desc == NULL)
-        meta_warning (_("Could not parse font description \"%s\" from GConf key %s\n"),
-                      value, KEY_TITLEBAR_FONT);
+      meta_warning (_("Could not parse font description "
+                      "\"%s\" from GConf key %s\n"),
+                    string_value,
+                    KEY_TITLEBAR_FONT);
+
+      *inform_listeners = FALSE;
+
+      return;
     }
 
-  if (new_desc && titlebar_font &&
+  /* Is the new description the same as the old? */
+
+  if (titlebar_font &&
       pango_font_description_equal (new_desc, titlebar_font))
     {
       pango_font_description_free (new_desc);
-      return FALSE;
+      *inform_listeners = FALSE;
+      return;
     }
+
+  /* No, so free the old one and put ours in instead. */
+
+  if (titlebar_font)
+    pango_font_description_free (titlebar_font);
+
+  titlebar_font = new_desc;
+
+}
+
+static void
+theme_name_handler (MetaPreference pref,
+                    const gchar *string_value,
+                    gboolean *inform_listeners)
+{
+  /* Fallback crackrock */
+  if (string_value == NULL)
+    current_theme = g_strdup ("Atlanta");
   else
-    {
-      if (titlebar_font)
-        pango_font_description_free (titlebar_font);
+    current_theme = g_strdup (string_value);
+}
 
-      titlebar_font = new_desc;
+static void
+mouse_button_mods_handler (MetaPreference pref,
+                           const gchar *string_value,
+                           gboolean *inform_listeners)
+{
+  MetaVirtualModifier mods;
 
-      return TRUE;
+  meta_warning("and here we are. SV is %s\n", string_value);
+
+  meta_warning(//topic (META_DEBUG_KEYBINDINGS,
+              "Mouse button modifier has new gconf value \"%s\"\n",
+              string_value);
+  meta_warning("%d\n", __LINE__);
+  if (meta_ui_parse_modifier (string_value, &mods))
+    {
+  meta_warning("%d\n", __LINE__);
+      mouse_button_mods = mods;
+    }
+  else
+    {
+  meta_warning("%d\n", __LINE__);
+      meta_topic (META_DEBUG_KEYBINDINGS,
+                  "Failed to parse new gconf value\n");
+          
+      meta_warning (_("\"%s\" found in configuration database is "
+                      "not a valid value for mouse button modifier\n"),
+                    string_value);
+
+      *inform_listeners = FALSE;
     }
+  meta_warning("%d\n", __LINE__);
 }
-#endif /* HAVE_GCONF */
 
-#ifdef HAVE_GCONF
 static gboolean
 button_layout_equal (const MetaButtonLayout *a,
                      const MetaButtonLayout *b)
@@ -1363,6 +1343,8 @@
 static MetaButtonFunction
 button_function_from_string (const char *str)
 {
+  /* FIXME: gconf_string_to_enum is the obvious way to do this */
+
   if (strcmp (str, "menu") == 0)
     return META_BUTTON_FUNCTION_MENU;
   else if (strcmp (str, "minimize") == 0)
@@ -1407,22 +1389,20 @@
     }
 }
 
-static gboolean
-update_button_layout (const char *value)
+static void
+button_layout_handler (MetaPreference pref,
+                         const gchar *string_value,
+                         gboolean *inform_listeners)
 {
   MetaButtonLayout new_layout;
   char **sides;
   int i;
-  gboolean changed;
-  
-  if (value == NULL)
-    return FALSE;
   
   /* We need to ignore unknown button functions, for
    * compat with future versions
    */
   
-  sides = g_strsplit (value, ":", 2);
+  sides = g_strsplit (string_value, ":", 2);
 
   if (sides[0] != NULL)
     {
@@ -1578,12 +1558,17 @@
     new_layout = rtl_layout;
   }
   
-  changed = !button_layout_equal (&button_layout, &new_layout);
-
-  button_layout = new_layout;
-
-  return changed;
+  if (button_layout_equal (&button_layout, &new_layout))
+    {
+      /* Same as before, so duck out */
+      *inform_listeners = FALSE;
+    }
+  else
+    {
+      button_layout = new_layout;
+    }
 }
+
 #endif /* HAVE_GCONF */
 
 const PangoFontDescription*
@@ -1664,6 +1649,7 @@
 const char*
 meta_preference_to_string (MetaPreference pref)
 {
+  /* FIXME: another case for gconf_string_to_enum */
   switch (pref)
     {
     case META_PREF_MOUSE_BUTTON_MODS:
@@ -2553,30 +2539,6 @@
   return TRUE;
 }
 
-static gboolean
-update_terminal_command (const char *value)
-{
-  char *old_terminal_command;
-  gboolean changed;
-  
-  old_terminal_command = terminal_command;
-  
-  if (value != NULL && *value)
-    {
-      terminal_command = g_strdup (value);
-    }
-
-  changed = TRUE;
-  if ((old_terminal_command && terminal_command &&
-       strcmp (old_terminal_command, terminal_command) == 0) ||
-      (old_terminal_command == NULL && terminal_command == NULL))
-    changed = FALSE;
-
-  if (old_terminal_command != terminal_command)
-    g_free (old_terminal_command);
-
-  return changed;
-}
 #endif /* HAVE_GCONF */
 
 const char*



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