[gnome-terminal/gsettings] Use GSettings for some settings



commit 22c08849057de3fe7372aadf48b8441cc13ee423
Author: Christian Persch <chpe gnome org>
Date:   Sat Oct 30 20:53:38 2010 +0200

    Use GSettings for some settings
    
    Start the GSettings port.

 Makefile.am                   |    2 +
 configure.ac                  |    8 ++
 po/POTFILES.in                |    1 +
 src/Makefile.am               |    7 +
 src/gnome-terminal.schemas.in |   34 ------
 src/terminal-app.c            |  265 ++++++++++++++---------------------------
 src/terminal-app.h            |    4 +
 src/terminal-util.c           |  228 ++++++++++++++----------------------
 src/terminal-util.h           |    3 -
 9 files changed, 202 insertions(+), 350 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 27547fd..abfc4c9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,6 +2,8 @@ SUBDIRS = src po help
 
 NULL =
 
+ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
+
 DISTCHECK_CONFIGURE_FLAGS = \
 	--disable-scrollkeeper \
 	--disable-schemas-install \
diff --git a/configure.ac b/configure.ac
index ae940f7..3803a0f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -42,6 +42,7 @@ AM_GLIB_GNU_GETTEXT
 GLIB_REQUIRED=2.25.0
 GIO_REQUIRED=2.25.12
 GCONF_REQUIRED=2.31.3
+GSETTINGS_DESKTOP_SCHEMAS_REQUIRED=0.1.0
 
 AC_MSG_CHECKING([which gtk+ version to compile against])
 AC_ARG_WITH([gtk],
@@ -80,8 +81,15 @@ PKG_CHECK_MODULES([TERM],
    gio-2.0 >= $GIO_REQUIRED
    gtk+-$GTK_API_VERSION >= $GTK_REQUIRED
    gconf-2.0 >= $GCONF_REQUIRED
+   gsettings-desktop-schemas >= $GSETTINGS_DESKTOP_SCHEMAS_REQUIRED
    $PLATFORM_DEPS])
 
+# *********
+# GSettings
+# *********
+
+GLIB_GSETTINGS
+
 # ********
 # smclient
 # ********
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 28708dc..4e41d9f 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -26,3 +26,4 @@ src/terminal-tabs-menu.c
 src/terminal-util.c
 src/terminal-window.c
 src/extra-strings.c
+src/org.gnome.Terminal.Preferences.gschema.xml.in
diff --git a/src/Makefile.am b/src/Makefile.am
index af271e6..e9367bb 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -174,11 +174,15 @@ builder_in_files = \
 builderdir = $(pkgdatadir)
 builder_DATA =  $(builder_in_files:.glade=.ui)
 
+gsettingsschema_in_files = org.gnome.Terminal.Preferences.gschema.xml.in
+gsettings_SCHEMAS = $(gsettingsschema_in_files:.gschema.xml.in=.gschema.xml)
+
 CLEANFILES = \
 	stamp-terminal-type-builtins.h \
 	gnome-terminal.schemas \
 	stamp-terminal-type-builtins.h \
 	$(builder_DATA) \
+	$(gsettings_SCHEMAS) \
 	$(BUILT_SOURCES)
 
 EXTRA_DIST = \
@@ -190,9 +194,12 @@ EXTRA_DIST = \
 	$(schema_in_files) \
 	$(uimanager_DATA) \
 	$(builder_in_files) \
+	$(gsettingsschema_in_files) \
 	$(NULL)
 
 @INTLTOOL_SCHEMAS_RULE@
+ INTLTOOL_XML_NOMERGE_RULE@
+ GSETTINGS_RULES@
 
 if GCONF_SCHEMAS_INSTALL
 install-data-local:
diff --git a/src/gnome-terminal.schemas.in b/src/gnome-terminal.schemas.in
index 587e8d0..a7a4ab3 100644
--- a/src/gnome-terminal.schemas.in
+++ b/src/gnome-terminal.schemas.in
@@ -40,40 +40,6 @@
     </schema>
 
     <schema>
-      <key>/schemas/apps/gnome-terminal/global/use_mnemonics</key>
-      <applyto>/apps/gnome-terminal/global/use_mnemonics</applyto>
-      <owner>gnome-terminal</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-         <short>Whether the menubar has access keys</short>
-         <long>
-          Whether to have Alt+letter access keys for the menubar. 
-          They may interfere with some applications run inside the terminal
-          so it's possible to turn them off.
-         </long>
-      </locale>
-    </schema>
-
-    <schema>
-      <key>/schemas/apps/gnome-terminal/global/use_menu_accelerators</key>
-      <applyto>/apps/gnome-terminal/global/use_menu_accelerators</applyto>
-      <owner>gnome-terminal</owner>
-      <type>bool</type>
-      <default>true</default>
-      <locale name="C">
-         <short>Whether the standard GTK shortcut for menubar access is enabled</short>
-         <long>
-          Normally you can access the menubar with F10. This can also
-          be customized via gtkrc (gtk-menu-bar-accel =
-          "whatever"). This option allows the standard menubar
-          accelerator to be disabled.
-         </long>
-      </locale>
-    </schema>
-
-
-    <schema>
       <key>/schemas/apps/gnome-terminal/global/active_encodings</key>
       <applyto>/apps/gnome-terminal/global/active_encodings</applyto>
       <owner>gnome-terminal</owner>
diff --git a/src/terminal-app.c b/src/terminal-app.c
index 3db56d8..0abb02e 100644
--- a/src/terminal-app.c
+++ b/src/terminal-app.c
@@ -50,6 +50,13 @@
 
 #define FALLBACK_PROFILE_ID "Default"
 
+#define GLOBAL_SETTINGS_SCHEMA_ID "org.gnome.Terminal.Preferences"
+
+#define DESKTOP_INTERFACE_SETTINGS_SCHEMA_ID "org.gnome.desktop.interface"
+#define MONOSPACE_FONT_KEY_NAME              "monospace-font-name"
+
+#define SYSTEM_PROXY_SETTINGS_SCHEMA_ID "org.gnome.system.proxy"
+
 /* Settings storage works as follows:
  *   /apps/gnome-terminal/global/
  *   /apps/gnome-terminal/profiles/Foo/
@@ -96,10 +103,7 @@ struct _TerminalApp
   GConfClient *conf;
   guint profile_list_notify_id;
   guint default_profile_notify_id;
-  guint encoding_list_notify_id;
   guint system_font_notify_id;
-  guint enable_mnemonics_notify_id;
-  guint enable_menu_accels_notify_id;
 
   GHashTable *profiles;
   char* default_profile_id;
@@ -112,6 +116,10 @@ struct _TerminalApp
   PangoFontDescription *system_font_desc;
   gboolean enable_mnemonics;
   gboolean enable_menu_accels;
+
+  GSettings *global_settings;
+  GSettings *desktop_interface_settings;
+  GSettings *system_proxy_settings;
 };
 
 enum
@@ -150,21 +158,9 @@ static TerminalApp *global_app = NULL;
 /* Evil hack alert: this is exported from libgconf-2 but not in a public header */
 extern gboolean gconf_spawn_daemon(GError** err);
 
-#define MONOSPACE_FONT_DIR "/desktop/gnome/interface"
-#define MONOSPACE_FONT_KEY MONOSPACE_FONT_DIR "/monospace_font_name"
-#define DEFAULT_MONOSPACE_FONT ("Monospace 10")
-
-#define ENABLE_MNEMONICS_KEY CONF_GLOBAL_PREFIX "/use_mnemonics"
-#define DEFAULT_ENABLE_MNEMONICS (TRUE)
-
-#define ENABLE_MENU_BAR_ACCEL_KEY CONF_GLOBAL_PREFIX"/use_menu_accelerators"
-#define DEFAULT_ENABLE_MENU_BAR_ACCEL (TRUE)
-
 #define PROFILE_LIST_KEY CONF_GLOBAL_PREFIX "/profile_list"
 #define DEFAULT_PROFILE_KEY CONF_GLOBAL_PREFIX "/default_profile"
 
-#define ENCODING_LIST_KEY CONF_GLOBAL_PREFIX "/active_encodings"
-
 /* Helper functions */
 
 static GdkScreen*
@@ -908,18 +904,15 @@ encoding_mark_active (gpointer key,
 }
 
 static void
-terminal_app_encoding_list_notify_cb (GConfClient *client,
-                                      guint        cnxn_id,
-                                      GConfEntry  *entry,
-                                      gpointer     user_data)
+terminal_app_encoding_list_notify_cb (GSettings   *settings,
+                                      const char  *key,
+                                      TerminalApp *app)
 {
-  TerminalApp *app = TERMINAL_APP (user_data);
-  GConfValue *val;
-  GSList *strings, *tmp;
+  char **encodings;
+  int i;
   TerminalEncoding *encoding;
-  const char *charset;
 
-  app->encodings_locked = !gconf_entry_get_is_writable (entry);
+  app->encodings_locked = !g_settings_is_writable (settings, key);
 
   /* Mark all as non-active, then re-enable the active ones */
   g_hash_table_foreach (app->encodings, (GHFunc) encoding_mark_active, GUINT_TO_POINTER (FALSE));
@@ -936,55 +929,33 @@ terminal_app_encoding_list_notify_cb (GConfClient *client,
   if (terminal_encoding_is_valid (encoding))
     encoding->is_active = TRUE;
 
-  val = gconf_entry_get_value (entry);
-  if (val != NULL &&
-      val->type == GCONF_VALUE_LIST &&
-      gconf_value_get_list_type (val) == GCONF_VALUE_STRING)
-    strings = gconf_value_get_list (val);
-  else
-    strings = NULL;
-
-  for (tmp = strings; tmp != NULL; tmp = tmp->next)
-    {
-      GConfValue *v = (GConfValue *) tmp->data;
-      
-      charset = gconf_value_get_string (v);
-      if (!charset)
-        continue;
-
-      encoding = terminal_app_ensure_encoding (app, charset);
+  g_settings_get (settings, key, "^a&s", &encodings);
+  for (i = 0; encodings[i] != NULL; ++i) {
+      encoding = terminal_app_ensure_encoding (app, encodings[i]);
       if (!terminal_encoding_is_valid (encoding))
         continue;
 
       encoding->is_active = TRUE;
     }
+  g_free (encodings);
 
   g_signal_emit (app, signals[ENCODING_LIST_CHANGED], 0);
 }
 
 static void
-terminal_app_system_font_notify_cb (GConfClient *client,
-                                    guint        cnxn_id,
-                                    GConfEntry  *entry,
-                                    gpointer     user_data)
+terminal_app_system_font_notify_cb (GSettings   *settings,
+                                    const char  *key,
+                                    TerminalApp *app)
 {
-  TerminalApp *app = TERMINAL_APP (user_data);
-  GConfValue *gconf_value;
-  const char *font = NULL;
+  const char *font;
   PangoFontDescription *font_desc;
 
-  if (strcmp (gconf_entry_get_key (entry), MONOSPACE_FONT_KEY) != 0)
-    return;
-
-  gconf_value = gconf_entry_get_value (entry);
-  if (gconf_value &&
-      gconf_value->type == GCONF_VALUE_STRING)
-    font = gconf_value_get_string (gconf_value);
-  if (!font)
-    font = DEFAULT_MONOSPACE_FONT;
-  g_assert (font != NULL);
+  g_settings_get (settings, key, "&s", &font);
 
   font_desc = pango_font_description_from_string (font);
+  if (font_desc == NULL)
+    font_desc = pango_font_description_from_string ("Monospace 10");
+
   if (app->system_font_desc &&
       pango_font_description_equal (app->system_font_desc, font_desc))
     {
@@ -1001,60 +972,6 @@ terminal_app_system_font_notify_cb (GConfClient *client,
 }
 
 static void
-terminal_app_enable_mnemonics_notify_cb (GConfClient *client,
-                                         guint        cnxn_id,
-                                         GConfEntry  *entry,
-                                         gpointer     user_data)
-{
-  TerminalApp *app = TERMINAL_APP (user_data);
-  GConfValue *gconf_value;
-  gboolean enable;
-
-  if (strcmp (gconf_entry_get_key (entry), ENABLE_MNEMONICS_KEY) != 0)
-    return;
-
-  gconf_value = gconf_entry_get_value (entry);
-  if (gconf_value &&
-      gconf_value->type == GCONF_VALUE_BOOL)
-    enable = gconf_value_get_bool (gconf_value);
-  else
-    enable = TRUE;
-
-  if (enable == app->enable_mnemonics)
-    return;
-
-  app->enable_mnemonics = enable;
-  g_object_notify (G_OBJECT (app), TERMINAL_APP_ENABLE_MNEMONICS);
-}
-
-static void
-terminal_app_enable_menu_accels_notify_cb (GConfClient *client,
-                                           guint        cnxn_id,
-                                           GConfEntry  *entry,
-                                           gpointer     user_data)
-{
-  TerminalApp *app = TERMINAL_APP (user_data);
-  GConfValue *gconf_value;
-  gboolean enable;
-
-  if (strcmp (gconf_entry_get_key (entry), ENABLE_MENU_BAR_ACCEL_KEY) != 0)
-    return;
-
-  gconf_value = gconf_entry_get_value (entry);
-  if (gconf_value &&
-      gconf_value->type == GCONF_VALUE_BOOL)
-    enable = gconf_value_get_bool (gconf_value);
-  else
-    enable = TRUE;
-
-  if (enable == app->enable_menu_accels)
-    return;
-
-  app->enable_menu_accels = enable;
-  g_object_notify (G_OBJECT (app), TERMINAL_APP_ENABLE_MENU_BAR_ACCEL);
-}
-
-static void
 new_profile_response_cb (GtkWidget *new_profile_dialog,
                          int        response_id,
                          TerminalApp *app)
@@ -1391,8 +1308,6 @@ terminal_app_init (TerminalApp *app)
   gtk_window_set_default_icon_name (GNOME_TERMINAL_ICON_NAME);
 
   /* Initialise defaults */
-  app->enable_mnemonics = DEFAULT_ENABLE_MNEMONICS;
-  app->enable_menu_accels = DEFAULT_ENABLE_MENU_BAR_ACCEL;
 
   app->profiles = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
 
@@ -1400,19 +1315,6 @@ terminal_app_init (TerminalApp *app)
 
   app->conf = gconf_client_get_default ();
 
-  gconf_client_add_dir (app->conf, CONF_GLOBAL_PREFIX,
-                        GCONF_CLIENT_PRELOAD_ONELEVEL,
-                        NULL);
-  gconf_client_add_dir (app->conf, MONOSPACE_FONT_DIR,
-                        GCONF_CLIENT_PRELOAD_ONELEVEL,
-                        NULL);
-  gconf_client_add_dir (app->conf, CONF_PROXY_PREFIX,
-                        GCONF_CLIENT_PRELOAD_ONELEVEL,
-                        NULL);
-  gconf_client_add_dir (app->conf, CONF_HTTP_PROXY_PREFIX,
-                        GCONF_CLIENT_PRELOAD_ONELEVEL,
-                        NULL);
-
   app->profile_list_notify_id =
     gconf_client_notify_add (app->conf, PROFILE_LIST_KEY,
                              terminal_app_profile_list_notify_cb,
@@ -1424,44 +1326,48 @@ terminal_app_init (TerminalApp *app)
                              terminal_app_default_profile_notify_cb,
                              app, NULL, NULL);
 
-  app->encoding_list_notify_id =
-    gconf_client_notify_add (app->conf,
-                             ENCODING_LIST_KEY,
-                             terminal_app_encoding_list_notify_cb,
-                             app, NULL, NULL);
-
-  app->system_font_notify_id =
-    gconf_client_notify_add (app->conf,
-                             MONOSPACE_FONT_KEY,
-                             terminal_app_system_font_notify_cb,
-                             app, NULL, NULL);
-
-  app->enable_mnemonics_notify_id =
-    gconf_client_notify_add (app->conf,
-                             ENABLE_MNEMONICS_KEY,
-                             terminal_app_enable_mnemonics_notify_cb,
-                             app, NULL, NULL);
-
-  app->enable_menu_accels_notify_id =
-    gconf_client_notify_add (app->conf,
-                             ENABLE_MENU_BAR_ACCEL_KEY,
-                             terminal_app_enable_menu_accels_notify_cb,
-                             app, NULL, NULL);
-
   /* Load the settings */
   gconf_client_notify (app->conf, PROFILE_LIST_KEY);
   gconf_client_notify (app->conf, DEFAULT_PROFILE_KEY);
-  gconf_client_notify (app->conf, ENCODING_LIST_KEY);
-  gconf_client_notify (app->conf, MONOSPACE_FONT_KEY);
-  gconf_client_notify (app->conf, ENABLE_MENU_BAR_ACCEL_KEY);
-  gconf_client_notify (app->conf, ENABLE_MNEMONICS_KEY);
 
   /* Ensure we have valid settings */
   g_assert (app->default_profile_id != NULL);
+
+  /* Desktop proxy settings */
+  app->system_proxy_settings = g_settings_new (SYSTEM_PROXY_SETTINGS_SCHEMA_ID);
+
+  /* Desktop Interface settings */
+  app->desktop_interface_settings = g_settings_new (DESKTOP_INTERFACE_SETTINGS_SCHEMA_ID);
+  terminal_app_system_font_notify_cb (app->desktop_interface_settings, MONOSPACE_FONT_KEY_NAME, app);
   g_assert (app->system_font_desc != NULL);
+  g_signal_connect (app->desktop_interface_settings,
+                    "changed::" MONOSPACE_FONT_KEY_NAME,
+                    G_CALLBACK (terminal_app_system_font_notify_cb),
+                    app);
+
+  /* Terminal global settings */
+  app->global_settings = g_settings_new (GLOBAL_SETTINGS_SCHEMA_ID);
+  g_settings_bind (app->global_settings,
+                   "mnemonics-enabled",
+                   G_OBJECT (app),
+                   TERMINAL_APP_ENABLE_MNEMONICS,
+                   G_SETTINGS_BIND_GET |
+                   G_SETTINGS_BIND_SET);
+  g_settings_bind (app->global_settings,
+                   "menu-accelerator-enabled",
+                   G_OBJECT (app),
+                   TERMINAL_APP_ENABLE_MENU_BAR_ACCEL,
+                   G_SETTINGS_BIND_GET |
+                   G_SETTINGS_BIND_SET);
+
+  terminal_app_encoding_list_notify_cb (app->global_settings, "encodings", app);
+  g_signal_connect (app->global_settings,
+                    "changed::encodings",
+                    G_CALLBACK (terminal_app_encoding_list_notify_cb),
+                    app);
 
   terminal_accels_init ();
-  
+
 #ifdef WITH_SMCLIENT
 {
   EggSMClient *sm_client;
@@ -1498,21 +1404,25 @@ terminal_app_finalize (GObject *object)
                                         0, 0, NULL, NULL, app);
 #endif
 
+  g_signal_handlers_disconnect_by_func (app->global_settings,
+                                        G_CALLBACK (terminal_app_encoding_list_notify_cb),
+                                        app);
+
+  g_object_unref (app->global_settings);
+
+  g_signal_handlers_disconnect_by_func (app->desktop_interface_settings,
+                                        G_CALLBACK (terminal_app_system_font_notify_cb),
+                                        app);
+  g_object_unref (app->desktop_interface_settings);
+
+  g_object_unref (app->system_proxy_settings);
+
   if (app->profile_list_notify_id != 0)
     gconf_client_notify_remove (app->conf, app->profile_list_notify_id);
   if (app->default_profile_notify_id != 0)
     gconf_client_notify_remove (app->conf, app->default_profile_notify_id);
-  if (app->encoding_list_notify_id != 0)
-    gconf_client_notify_remove (app->conf, app->encoding_list_notify_id);
-  if (app->system_font_notify_id != 0)
-    gconf_client_notify_remove (app->conf, app->system_font_notify_id);
-  if (app->enable_menu_accels_notify_id != 0)
-    gconf_client_notify_remove (app->conf, app->enable_menu_accels_notify_id);
-  if (app->enable_mnemonics_notify_id != 0)
-    gconf_client_notify_remove (app->conf, app->enable_mnemonics_notify_id);
 
   gconf_client_remove_dir (app->conf, CONF_GLOBAL_PREFIX, NULL);
-  gconf_client_remove_dir (app->conf, MONOSPACE_FONT_DIR, NULL);
 
   g_object_unref (app->conf);
 
@@ -1542,10 +1452,7 @@ terminal_app_get_property (GObject *object,
   switch (prop_id)
     {
       case PROP_SYSTEM_FONT:
-        if (app->system_font_desc)
-          g_value_set_boxed (value, app->system_font_desc);
-        else
-          g_value_take_boxed (value, pango_font_description_from_string (DEFAULT_MONOSPACE_FONT));
+        g_value_set_boxed (value, app->system_font_desc);
         break;
       case PROP_ENABLE_MENU_BAR_ACCEL:
         g_value_set_boolean (value, app->enable_menu_accels);
@@ -1574,11 +1481,11 @@ terminal_app_set_property (GObject *object,
     {
       case PROP_ENABLE_MENU_BAR_ACCEL:
         app->enable_menu_accels = g_value_get_boolean (value);
-        gconf_client_set_bool (app->conf, ENABLE_MENU_BAR_ACCEL_KEY, app->enable_menu_accels, NULL);
+        g_settings_set_boolean (app->global_settings, "menu-accelerator-enabled", app->enable_menu_accels);
         break;
       case PROP_ENABLE_MNEMONICS:
         app->enable_mnemonics = g_value_get_boolean (value);
-        gconf_client_set_bool (app->conf, ENABLE_MNEMONICS_KEY, app->enable_mnemonics, NULL);
+        g_settings_set_boolean (app->global_settings, "mnemonics-enabled", app->enable_mnemonics);
         break;
       case PROP_DEFAULT_PROFILE:
       case PROP_SYSTEM_FONT:
@@ -1637,14 +1544,14 @@ terminal_app_class_init (TerminalAppClass *klass)
     (object_class,
      PROP_ENABLE_MENU_BAR_ACCEL,
      g_param_spec_boolean (TERMINAL_APP_ENABLE_MENU_BAR_ACCEL, NULL, NULL,
-                           DEFAULT_ENABLE_MENU_BAR_ACCEL,
+                           TRUE,
                            G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
 
   g_object_class_install_property
     (object_class,
      PROP_ENABLE_MNEMONICS,
      g_param_spec_boolean (TERMINAL_APP_ENABLE_MNEMONICS, NULL, NULL,
-                           DEFAULT_ENABLE_MNEMONICS,
+                           TRUE,
                            G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
 
   g_object_class_install_property
@@ -2114,3 +2021,15 @@ terminal_app_save_config_file (TerminalApp *app,
 
   return result;
 }
+
+/**
+ * terminal_app_get_proxy_settings:
+ * @app: a #TerminalApp
+ *
+ * Returns: (tranfer none): the cached #GSettings object for the org.gnome.system.proxy schema
+ */
+GSettings *
+terminal_app_get_proxy_settings (TerminalApp *app)
+{
+  return app->system_proxy_settings;
+}
diff --git a/src/terminal-app.h b/src/terminal-app.h
index 5c489c3..5258127 100644
--- a/src/terminal-app.h
+++ b/src/terminal-app.h
@@ -154,6 +154,10 @@ gboolean terminal_app_save_config_file (TerminalApp *app,
                                         const char *file_name,
                                         GError **error);
 
+/* GSettings */
+
+GSettings *terminal_app_get_proxy_settings (TerminalApp *app);
+
 G_END_DECLS
 
 #endif /* !TERMINAL_APP_H */
diff --git a/src/terminal-util.c b/src/terminal-util.c
index 8870e27..24b5c3b 100644
--- a/src/terminal-util.c
+++ b/src/terminal-util.c
@@ -32,13 +32,13 @@
 #include <gio/gio.h>
 #include <gtk/gtk.h>
 
-#include <gconf/gconf.h>
-
 #ifdef GDK_WINDOWING_X11
 #include <gdk/gdkx.h>
 #include <X11/Xatom.h>
 #endif
 
+#include <gdesktop-enums.h>
+
 #include "terminal-accels.h"
 #include "terminal-app.h"
 #include "terminal-intl.h"
@@ -516,20 +516,6 @@ terminal_util_key_file_get_argv (GKeyFile *key_file,
 
 /* Proxy stuff */
 
-static char *
-conf_get_string (GConfClient *conf,
-                 const char *key)
-{
-  char *value;
-  value = gconf_client_get_string (conf, key, NULL);
-  if (G_UNLIKELY (value && *value == '\0'))
-    {
-      g_free (value);
-      value = NULL;
-    }
-  return value;
-}
-
 /*
  * set_proxy_env:
  * @env_table: a #GHashTable
@@ -542,7 +528,7 @@ conf_get_string (GConfClient *conf,
 static void
 set_proxy_env (GHashTable *env_table,
                const char *key,
-               char *value)
+               char *value /* consumed */)
 {
   char *key1 = NULL, *key2 = NULL;
   char *value1 = NULL, *value2 = NULL;
@@ -579,139 +565,102 @@ set_proxy_env (GHashTable *env_table,
 }
 
 static void
-setup_http_proxy_env (GHashTable *env_table,
-                      GConfClient *conf)
+setup_proxy_env (GSettings  *proxy_settings,
+                 const char *child_schema_id,
+                 const char *proxy_scheme,
+                 const char *env_name,
+                 GHashTable *env_table)
 {
-  gchar *host;
-  gint port;
-  GSList *ignore;
+  GSettings *child_settings;
+  GString *buf;
+  const char *host;
+  int port;
+  gboolean is_http;
 
-  if (!gconf_client_get_bool (conf, CONF_HTTP_PROXY_PREFIX "/use_http_proxy", NULL))
-    return;
+  is_http = (strcmp (child_schema_id, "http") == 0);
 
-  host = conf_get_string (conf, CONF_HTTP_PROXY_PREFIX "/host");
-  port = gconf_client_get_int (conf, CONF_HTTP_PROXY_PREFIX "/port", NULL);
-  if (host && port)
-    {
-      GString *buf = g_string_sized_new (64);
-      g_string_append (buf, "http://";);
+  child_settings = g_settings_get_child (proxy_settings, child_schema_id);
 
-      if (gconf_client_get_bool (conf, CONF_HTTP_PROXY_PREFIX "/use_authentication", NULL))
-	{
-	  char *user, *password;
-	  user = conf_get_string (conf, CONF_HTTP_PROXY_PREFIX "/authentication_user");
-	  if (user)
-	    {
-	      g_string_append_uri_escaped (buf, user, NULL, TRUE);
-	      password = conf_get_string (conf, CONF_HTTP_PROXY_PREFIX "/authentication_password");
-	      if (password)
-		{
-		  g_string_append_c (buf, ':');
-		  g_string_append_uri_escaped (buf, password, NULL, TRUE);
-		  g_free (password);
-		}
-	      g_free (user);
-	      g_string_append_c (buf, '@');
-	    }
-	}
-      g_string_append_printf (buf, "%s:%d/", host, port);
-      set_proxy_env (env_table, "http_proxy", g_string_free (buf, FALSE));
-    }
-  g_free (host);
+  if (is_http && !g_settings_get_boolean (child_settings, "enabled"))
+    goto out;
+
+  g_settings_get (child_settings, "host", "&s", &host);
+  port = g_settings_get_int (child_settings, "host");
+  if (host[0] == '\0' || port == 0)
+    goto out;
 
-  ignore = gconf_client_get_list (conf, CONF_HTTP_PROXY_PREFIX "/ignore_hosts", GCONF_VALUE_STRING, NULL);
-  if (ignore)
+  buf = g_string_sized_new (64);
+
+  g_string_append_printf (buf, "%s://", proxy_scheme);
+
+  if (is_http &&
+      g_settings_get_boolean (child_settings, "use-authentication"))
     {
-      GString *buf = g_string_sized_new (64);
-      while (ignore != NULL)
-	{
-	  GSList *old;
+      const char *user, *password;
 
-	  if (buf->len)
-	    g_string_append_c (buf, ',');
-	  g_string_append (buf, ignore->data);
+      g_settings_get (child_settings, "authentication-user", "&s", &user);
 
-	  old = ignore;
-	  ignore = g_slist_next (ignore);
-	  g_free (old->data);
-	  g_slist_free_1 (old);
-	}
-      set_proxy_env (env_table, "no_proxy", g_string_free (buf, FALSE));
-    }
-}
+      if (user[0])
+        {
+          g_string_append_uri_escaped (buf, user, NULL, TRUE);
 
-static void
-setup_https_proxy_env (GHashTable *env_table,
-                       GConfClient *conf)
-{
-  gchar *host;
-  gint port;
+          g_settings_get (child_settings, "authentication-password", "&s", &password);
 
-  host = conf_get_string (conf, CONF_PROXY_PREFIX "/secure_host");
-  port = gconf_client_get_int (conf, CONF_PROXY_PREFIX "/secure_port", NULL);
-  if (host && port)
-    {
-      char *proxy;
-      /* Even though it's https, the proxy scheme is 'http'. See bug #624440. */
-      proxy = g_strdup_printf ("http://%s:%d/";, host, port);
-      set_proxy_env (env_table, "https_proxy", proxy);
+          if (password[0])
+            {
+              g_string_append_c (buf, ':');
+              g_string_append_uri_escaped (buf, password, NULL, TRUE);
+            }
+          g_string_append_c (buf, '@');
+        }
     }
-  g_free (host);
-}
 
-static void
-setup_ftp_proxy_env (GHashTable *env_table,
-                     GConfClient *conf)
-{
-  gchar *host;
-  gint port;
+  g_string_append_printf (buf, "%s:%d/", host, port);
+  set_proxy_env (env_table, env_name, g_string_free (buf, FALSE));
 
-  host = conf_get_string (conf, CONF_PROXY_PREFIX "/ftp_host");
-  port = gconf_client_get_int (conf, CONF_PROXY_PREFIX "/ftp_port", NULL);
-  if (host && port)
-    {
-      char *proxy;
-      /* Even though it's ftp, the proxy scheme is 'http'. See bug #624440. */
-      proxy = g_strdup_printf ("http://%s:%d/";, host, port);
-      set_proxy_env (env_table, "ftp_proxy", proxy);
-    }
-  g_free (host);
+out:
+  g_object_unref (child_settings);
 }
 
 static void
-setup_socks_proxy_env (GHashTable *env_table,
-                       GConfClient *conf)
+setup_autoconfig_proxy_env (GSettings *proxy_settings,
+                            GHashTable *env_table)
 {
-  gchar *host;
-  gint port;
+  /* XXX  Not sure what to do with this.  See bug #596688.
+  const char *url;
 
-  host = conf_get_string (conf, CONF_PROXY_PREFIX "/socks_host");
-  port = gconf_client_get_int (conf, CONF_PROXY_PREFIX "/socks_port", NULL);
-  if (host && port)
+  g_settings_get (proxy_settings, "autoconfig-url", "&s", &url);
+  if (url[0])
     {
       char *proxy;
-      proxy = g_strdup_printf ("socks://%s:%d/", host, port);
-      set_proxy_env (env_table, "all_proxy", proxy);
+      proxy = g_strdup_printf ("pac+%s", url);
+      set_proxy_env (env_table, "http_proxy", proxy);
     }
-  g_free (host);
+  */
 }
 
 static void
-setup_autoconfig_proxy_env (GHashTable *env_table,
-                            GConfClient *conf)
+setup_ignore_proxy_env (GSettings *proxy_settings,
+                        GHashTable *env_table)
 {
-  /* XXX  Not sure what to do with this.  See bug #596688.
-  gchar *url;
+  GString *buf;
+  char **ignore;
+  int i;
+
+  g_settings_get (proxy_settings, "ignore-hosts", "^a&s", &ignore);
+  if (ignore == NULL)
+    return;
 
-  url = conf_get_string (conf, CONF_PROXY_PREFIX "/autoconfig_url");
-  if (url)
+  buf = g_string_sized_new (64);
+  for (i = 0; ignore[i] != NULL; ++i)
     {
-      char *proxy;
-      proxy = g_strdup_printf ("pac+%s", url);
-      set_proxy_env (env_table, "http_proxy", proxy);
+      if (buf->len)
+        g_string_append_c (buf, ',');
+      g_string_append (buf, ignore[i]);
     }
-  g_free (url);
-  */
+  g_free (ignore);
+
+  set_proxy_env (env_table, "no_proxy", g_string_free (buf, FALSE));
 }
 
 /**
@@ -723,27 +672,26 @@ setup_autoconfig_proxy_env (GHashTable *env_table,
 void
 terminal_util_add_proxy_env (GHashTable *env_table)
 {
-  char *proxymode;
+  GSettings *proxy_settings;
+  GDesktopProxyMode mode;
 
-  GConfClient *conf;
-  conf = gconf_client_get_default ();
+  proxy_settings = terminal_app_get_proxy_settings (terminal_app_get ());
+  mode = g_settings_get_enum (proxy_settings, "mode");
 
-  /* If mode is not manual, nothing to set */
-  proxymode = conf_get_string (conf, CONF_PROXY_PREFIX "/mode");
-  if (proxymode && 0 == strcmp (proxymode, "manual"))
+  if (mode == G_DESKTOP_PROXY_MODE_MANUAL)
     {
-      setup_http_proxy_env (env_table, conf);
-      setup_https_proxy_env (env_table, conf);
-      setup_ftp_proxy_env (env_table, conf);
-      setup_socks_proxy_env (env_table, conf);
+      setup_proxy_env (proxy_settings, "http", "http", "http_proxy", env_table);
+      /* Even though it's https, the proxy scheme is 'http'. See bug #624440. */
+      setup_proxy_env (proxy_settings, "https", "http", "https_proxy", env_table);
+      /* Even though it's ftp, the proxy scheme is 'http'. See bug #624440. */
+      setup_proxy_env (proxy_settings, "ftp", "http", "ftp_proxy", env_table);
+      setup_proxy_env (proxy_settings, "socks", "socks", "all_proxy", env_table);
+      setup_ignore_proxy_env (proxy_settings, env_table);
     }
-  else if (proxymode && 0 == strcmp (proxymode, "auto"))
+  else if (mode == G_DESKTOP_PROXY_MODE_AUTO)
     {
-      setup_autoconfig_proxy_env (env_table, conf);
+      setup_autoconfig_proxy_env (proxy_settings, env_table);
     }
-
-  g_free (proxymode);
-  g_object_unref (conf);
 }
 
 /* Bidirectional object/widget binding */
diff --git a/src/terminal-util.h b/src/terminal-util.h
index a8648af..c461d85 100644
--- a/src/terminal-util.h
+++ b/src/terminal-util.h
@@ -28,9 +28,6 @@
 
 G_BEGIN_DECLS
 
-#define CONF_PROXY_PREFIX      "/system/proxy"
-#define CONF_HTTP_PROXY_PREFIX "/system/http_proxy"
-
 void terminal_util_set_unique_role (GtkWindow *window, const char *prefix);
 
 void terminal_util_show_error_dialog (GtkWindow *transient_parent, 



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