[arch-commits] Commit in gnome-phone-manager/repos (4 files)

Jan Steffens heftig at archlinux.org
Fri Oct 2 20:55:57 UTC 2020


    Date: Friday, October 2, 2020 @ 20:55:57
  Author: heftig
Revision: 715695

archrelease: copy trunk to community-staging-x86_64

Added:
  gnome-phone-manager/repos/community-staging-x86_64/
  gnome-phone-manager/repos/community-staging-x86_64/0001-Port-to-GSettings.patch
    (from rev 715691, gnome-phone-manager/trunk/0001-Port-to-GSettings.patch)
  gnome-phone-manager/repos/community-staging-x86_64/PKGBUILD
    (from rev 715691, gnome-phone-manager/trunk/PKGBUILD)
  gnome-phone-manager/repos/community-staging-x86_64/gnome-phone-manager-0.68-eds.patch
    (from rev 715691, gnome-phone-manager/trunk/gnome-phone-manager-0.68-eds.patch)

------------------------------------+
 0001-Port-to-GSettings.patch       | 2124 +++++++++++++++++++++++++++++++++++
 PKGBUILD                           |   43 
 gnome-phone-manager-0.68-eds.patch |  470 +++++++
 3 files changed, 2637 insertions(+)

Copied: gnome-phone-manager/repos/community-staging-x86_64/0001-Port-to-GSettings.patch (from rev 715691, gnome-phone-manager/trunk/0001-Port-to-GSettings.patch)
===================================================================
--- community-staging-x86_64/0001-Port-to-GSettings.patch	                        (rev 0)
+++ community-staging-x86_64/0001-Port-to-GSettings.patch	2020-10-02 20:55:57 UTC (rev 715695)
@@ -0,0 +1,2124 @@
+From db12bc35b7242be3cb3574aa3cd9de6b20ed040b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= <ballogyor at gmail.com>
+Date: Sun, 2 Sep 2018 23:16:18 +0200
+Subject: [PATCH] Port to GSettings
+
+---
+ configure.in                             |   16 +-
+ cut-n-paste/Makefile.am                  |    2 +-
+ cut-n-paste/gconf-bridge/Makefile.am     |   13 -
+ cut-n-paste/gconf-bridge/gconf-bridge.c  | 1259 ----------------------
+ cut-n-paste/gconf-bridge/gconf-bridge.h  |  116 --
+ data/Makefile.am                         |   17 +-
+ data/gnome-phone-manager.schemas.in      |  112 --
+ data/org.gnome.phone-manager.gschema.xml |   39 +
+ gnome-bluetooth/phonemgr.c               |   41 +-
+ libgsm/phonemgr-utils.c                  |    2 +-
+ po/POTFILES.in                           |    1 -
+ src/Makefile.am                          |    8 +-
+ src/app.h                                |    3 +-
+ src/connection.c                         |   21 +-
+ src/main.c                               |    8 +-
+ src/phonemgr-conf.h                      |    4 -
+ src/ui.c                                 |   86 +-
+ 17 files changed, 123 insertions(+), 1625 deletions(-)
+ delete mode 100644 cut-n-paste/gconf-bridge/Makefile.am
+ delete mode 100644 cut-n-paste/gconf-bridge/gconf-bridge.c
+ delete mode 100644 cut-n-paste/gconf-bridge/gconf-bridge.h
+ delete mode 100644 data/gnome-phone-manager.schemas.in
+ create mode 100644 data/org.gnome.phone-manager.gschema.xml
+
+diff --git a/configure.in b/configure.in
+index d11a2c5..b6cd958 100644
+--- a/configure.in
++++ b/configure.in
+@@ -35,8 +35,7 @@ AM_GLIB_GNU_GETTEXT
+ 
+ # ****
+ 
+-AC_PATH_PROG(GCONFTOOL, gconftool-2)
+-AM_GCONF_SOURCE_2
++GLIB_GSETTINGS
+ 
+ dnl Evolution address book
+ PKG_CHECK_MODULES(TMP_EVO, libebook-1.2,
+@@ -46,9 +45,9 @@ PKG_CHECK_MODULES(TMP_EVO, libebook-1.2,
+ PKG_CHECK_MODULES(LIBGSM, glib-2.0 gobject-2.0 $GNOKII_REQS gthread-2.0 bluez $evo_pc_file)
+ 
+ PKG_CHECK_MODULES(PHONEMGR, gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+-	libcanberra-gtk3 gconf-2.0
++	libcanberra-gtk3
+ 	$GNOME_BLUETOOTH_REQS $evo_pc_file libedataserverui-3.0
+-	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
++	gmodule-2.0 dbus-glib-1
+ )
+ 
+ DBUSLIBDIR="`$PKG_CONFIG dbus-glib-1 --variable=libdir`"
+@@ -96,7 +95,7 @@ AC_ARG_ENABLE(bluetooth-plugin,
+ 	[ENABLE_BLUETOOTH_PLUGIN=yes]) dnl Default value
+ 
+ if test x$ENABLE_BLUETOOTH_PLUGIN = "xyes" ; then
+-	PKG_CHECK_MODULES(BLUETOOTH_PLUGIN, gnome-bluetooth-1.0 >= 2.27.6 gconf-2.0,
++	PKG_CHECK_MODULES(BLUETOOTH_PLUGIN, gnome-bluetooth-1.0 >= 2.27.6,
+ 			[HAVE_BLUETOOTH_PLUGIN=yes], [HAVE_BLUETOOTH_PLUGIN=no])
+ fi
+ if test x$HAVE_BLUETOOTH_PLUGIN = "xyes"; then
+@@ -107,12 +106,6 @@ AM_CONDITIONAL(HAVE_BLUETOOTH_PLUGIN, test x$HAVE_BLUETOOTH_PLUGIN = "xyes")
+ AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal, no)
+ AC_SUBST(GLIB_GENMARSHAL)
+ 
+-AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
+-
+-if test x"$GCONFTOOL" = xno; then
+-  AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
+-fi
+-
+ dnl ================================================================
+ dnl set up data dir
+ if test "x${datadir}" = 'x${prefix}/share'; then
+@@ -144,7 +137,6 @@ data/icons/24x24/Makefile
+ libgsm/Makefile
+ cut-n-paste/Makefile
+ cut-n-paste/e-contact-entry/Makefile
+-cut-n-paste/gconf-bridge/Makefile
+ src/Makefile
+ gnome-bluetooth/Makefile
+ telepathy/Makefile
+diff --git a/cut-n-paste/Makefile.am b/cut-n-paste/Makefile.am
+index f184896..371725a 100644
+--- a/cut-n-paste/Makefile.am
++++ b/cut-n-paste/Makefile.am
+@@ -1 +1 @@
+-SUBDIRS = e-contact-entry gconf-bridge
++SUBDIRS = e-contact-entry
+diff --git a/cut-n-paste/gconf-bridge/Makefile.am b/cut-n-paste/gconf-bridge/Makefile.am
+deleted file mode 100644
+index 6aecc1f..0000000
+--- a/cut-n-paste/gconf-bridge/Makefile.am
++++ /dev/null
+@@ -1,13 +0,0 @@
+-AM_CPPFLAGS = \
+-	$(PHONEMGR_CFLAGS)
+-
+-noinst_LTLIBRARIES = libgconf-bridge.la
+-
+-libgconf_bridge_la_SOURCES =	\
+-	gconf-bridge.c	\
+-	gconf-bridge.h
+-
+-EGGDIR=$(srcdir)/../../../libgconf-bridge/libgconf-bridge/
+-EGGFILES=gconf-bridge.c gconf-bridge.h
+-regenerate-built-sources:
+-	EGGFILES="$(EGGFILES)" EGGDIR="$(EGGDIR)" $(srcdir)/../update-from-egg.sh || true
+diff --git a/cut-n-paste/gconf-bridge/gconf-bridge.c b/cut-n-paste/gconf-bridge/gconf-bridge.c
+deleted file mode 100644
+index e450425..0000000
+--- a/cut-n-paste/gconf-bridge/gconf-bridge.c
++++ /dev/null
+@@ -1,1259 +0,0 @@
+-/*
+- * (C) 2005 OpenedHand Ltd.
+- *
+- * Author: Jorn Baayen <jorn at openedhand.com>
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Library General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+- * Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU Library General Public
+- * License along with this library; if not, write to the
+- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+- * Boston, MA 02110-1301, USA.
+- */
+-
+-#include <config.h>
+-
+-#include <glib/gi18n-lib.h>
+-#include <gtk/gtk.h>
+-#include <string.h>
+-
+-#include "gconf-bridge.h"
+-
+-struct _GConfBridge {
+-        GConfClient *client;
+-
+-        GHashTable *bindings;
+-};
+-
+-/* The data structures for the different kinds of bindings */
+-typedef enum {
+-        BINDING_PROP,
+-        BINDING_WINDOW,
+-        BINDING_LIST_STORE
+-} BindingType;
+-
+-typedef struct {
+-        BindingType type;
+-        guint id;
+-
+-        gboolean delayed_mode;
+-
+-        char *key;
+-        guint val_notify_id;
+-        GSList *val_changes; /* List of changes made to GConf value,
+-                                that have not received change notification
+-                                yet. */
+-
+-        GObject *object;
+-        GParamSpec *prop;
+-        gulong prop_notify_id;
+-
+-        guint sync_timeout_id; /* Used in delayed mode */
+-} PropBinding;
+-
+-typedef struct {
+-        BindingType type;
+-        guint id;
+-
+-        gboolean bind_size;
+-        gboolean bind_pos;
+-
+-        char *key_prefix;
+-
+-        GtkWindow *window;
+-        gulong configure_event_id;
+-	gulong window_state_event_id;
+-        gulong unmap_id;
+-        guint sync_timeout_id;
+-} WindowBinding;
+-
+-typedef struct {
+-        BindingType type;
+-        guint id;
+-
+-        char *key;
+-        guint val_notify_id;
+-        GSList *val_changes; /* List of changes made to GConf value,
+-                                that have not received change notification
+-                                yet. */
+-
+-        GtkListStore *list_store;
+-        guint row_inserted_id;
+-        guint row_changed_id;
+-        guint row_deleted_id;
+-        guint rows_reordered_id;
+-
+-        guint sync_idle_id;
+-} ListStoreBinding;
+-
+-/* Some trickery to be able to treat the data structures generically */
+-typedef union {
+-        BindingType      type;
+-
+-        PropBinding      prop_binding;
+-        WindowBinding    window_binding;
+-        ListStoreBinding list_store_binding;
+-} Binding;
+-
+-/* Function prototypes */
+-static void
+-unbind (Binding *binding);
+-
+-#if !HAVE_DECL_GCONF_VALUE_COMPARE /* Not in headers in GConf < 2.13 */
+-int gconf_value_compare (const GConfValue *value_a,
+-                         const GConfValue *value_b);
+-#endif
+-
+-static GConfBridge *bridge = NULL; /* Global GConfBridge object */
+-
+-/* Free up all resources allocated by the GConfBridge. Called on exit. */
+-static void
+-destroy_bridge (void)
+-{
+-        g_hash_table_destroy (bridge->bindings);
+-        g_object_unref (bridge->client);
+-
+-        g_free (bridge);
+-}
+-
+-/**
+- * gconf_bridge_get
+- *
+- * Returns the #GConfBridge. This is a singleton object.
+- *
+- * Return value: The #GConfBridge.
+- **/
+-GConfBridge *
+-gconf_bridge_get (void)
+-{
+-        if (bridge)
+-                return bridge;
+-
+-        gconf_bridge_install_default_error_handler ();
+-
+-        bridge = g_new (GConfBridge, 1);
+-
+-        bridge->client = gconf_client_get_default ();
+-        bridge->bindings = g_hash_table_new_full (NULL, NULL, NULL,
+-                                                  (GDestroyNotify) unbind);
+-
+-        g_atexit (destroy_bridge);
+-
+-        return bridge;
+-}
+-
+-/**
+- * gconf_bridge_get_client
+- * @bridge: A #GConfBridge
+- *
+- * Returns the #GConfClient used by @bridge. This is the same #GConfClient
+- * as returned by gconf_client_get_default().
+- *
+- * Return value: A #GConfClient.
+- **/
+-GConfClient *
+-gconf_bridge_get_client (GConfBridge *bridge)
+-{
+-        g_return_val_if_fail (bridge != NULL, NULL);
+-
+-        return bridge->client;
+-}
+-
+-/* Generate an ID for a new binding */
+-static guint
+-new_id (void)
+-{
+-        static guint id_counter = 0;
+-
+-        id_counter++;
+-
+-        return id_counter;
+-}
+-
+-/*
+- * Property bindings
+- */
+-
+-/* Syncs a value from GConf to an object property */
+-static void
+-prop_binding_sync_pref_to_prop (PropBinding *binding,
+-                                GConfValue  *pref_value)
+-{
+-        GValue src_value, value;
+-
+-        /* Make sure we don't enter an infinite synchronizing loop */
+-        g_signal_handler_block (binding->object, binding->prop_notify_id);
+-
+-        memset (&src_value, 0, sizeof (GValue));
+-
+-        /* First, convert GConfValue to GValue */
+-        switch (pref_value->type) {
+-        case GCONF_VALUE_STRING:
+-                g_value_init (&src_value, G_TYPE_STRING);
+-                g_value_set_string (&src_value,
+-                                    gconf_value_get_string (pref_value));
+-                break;
+-        case GCONF_VALUE_INT:
+-                g_value_init (&src_value, G_TYPE_INT);
+-                g_value_set_int (&src_value,
+-                                 gconf_value_get_int (pref_value));
+-                break;
+-        case GCONF_VALUE_BOOL:
+-                g_value_init (&src_value, G_TYPE_BOOLEAN);
+-                g_value_set_boolean (&src_value,
+-                                     gconf_value_get_bool (pref_value));
+-                break;
+-        case GCONF_VALUE_FLOAT:
+-                g_value_init (&src_value, G_TYPE_FLOAT);
+-                g_value_set_float (&src_value,
+-                                   gconf_value_get_float (pref_value));
+-                break;
+-        default:
+-                g_warning ("prop_binding_sync_pref_to_prop: Unhandled value "
+-                           "type '%d'.\n", pref_value->type);
+-
+-                return;
+-        }
+-
+-        /* Then convert to the type expected by the object, if necessary */
+-        memset (&value, 0, sizeof (GValue));
+-        g_value_init (&value,
+-                      G_PARAM_SPEC_VALUE_TYPE (binding->prop));
+-
+-        if (src_value.g_type != value.g_type) {
+-                if (!g_value_transform (&src_value, &value)) {
+-                        g_warning ("prop_binding_sync_pref_to_prop: Failed to "
+-                                   "transform a \"%s\" to a \"%s\".",
+-                                   g_type_name (src_value.g_type),
+-                                   g_type_name (value.g_type));
+-
+-                        goto done;
+-                }
+-
+-                g_object_set_property (binding->object,
+-                                       binding->prop->name, &value);
+-        } else {
+-                g_object_set_property (binding->object,
+-                                       binding->prop->name, &src_value);
+-        }
+-
+-done:
+-        g_value_unset (&src_value);
+-        g_value_unset (&value);
+-
+-        g_signal_handler_unblock (binding->object, binding->prop_notify_id);
+-}
+-
+-/* Syncs an object property to GConf */
+-static void
+-prop_binding_sync_prop_to_pref (PropBinding *binding)
+-{
+-        GValue value;
+-        GConfValue *gconf_value;
+-
+-        memset (&value, 0, sizeof (GValue));
+-
+-        g_value_init (&value,
+-                      G_PARAM_SPEC_VALUE_TYPE (binding->prop));
+-        g_object_get_property (binding->object,
+-                               binding->prop->name,
+-                               &value);
+-
+-        switch (value.g_type) {
+-        case G_TYPE_STRING:
+-                gconf_value = gconf_value_new (GCONF_VALUE_STRING);
+-                gconf_value_set_string (gconf_value,
+-                                        g_value_get_string (&value));
+-                break;
+-        case G_TYPE_INT:
+-                gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                gconf_value_set_int (gconf_value,
+-                                     g_value_get_int (&value));
+-                break;
+-        case G_TYPE_UINT:
+-                gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                gconf_value_set_int (gconf_value,
+-                                     g_value_get_uint (&value));
+-                break;
+-        case G_TYPE_LONG:
+-                gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                gconf_value_set_int (gconf_value,
+-                                     g_value_get_long (&value));
+-                break;
+-        case G_TYPE_ULONG:
+-                gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                gconf_value_set_int (gconf_value,
+-                                     g_value_get_ulong (&value));
+-                break;
+-        case G_TYPE_INT64:
+-                gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                gconf_value_set_int (gconf_value,
+-                                     g_value_get_int64 (&value));
+-                break;
+-        case G_TYPE_UINT64:
+-                gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                gconf_value_set_int (gconf_value,
+-                                     g_value_get_uint64 (&value));
+-                break;
+-        case G_TYPE_CHAR:
+-                gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                gconf_value_set_int (gconf_value,
+-                                     g_value_get_char (&value));
+-                break;
+-        case G_TYPE_UCHAR:
+-                gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                gconf_value_set_int (gconf_value,
+-                                     g_value_get_uchar (&value));
+-                break;
+-        case G_TYPE_ENUM:
+-                gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                gconf_value_set_int (gconf_value,
+-                                     g_value_get_enum (&value));
+-                break;
+-        case G_TYPE_BOOLEAN:
+-                gconf_value = gconf_value_new (GCONF_VALUE_BOOL);
+-                gconf_value_set_bool (gconf_value,
+-                                      g_value_get_boolean (&value));
+-                break;
+-        case G_TYPE_DOUBLE:
+-                gconf_value = gconf_value_new (GCONF_VALUE_FLOAT);
+-#ifdef HAVE_CORBA_GCONF
+-                /* FIXME we cast to a float explicitly as CORBA GConf
+-                 * uses doubles in its API, but treats them as floats
+-                 * when transporting them over CORBA. See #322837 */
+-                gconf_value_set_float (gconf_value,
+-                                       (float) g_value_get_double (&value));
+-#else
+-                gconf_value_set_float (gconf_value,
+-                                       g_value_get_double (&value));
+-#endif
+-                break;
+-        case G_TYPE_FLOAT:
+-                gconf_value = gconf_value_new (GCONF_VALUE_FLOAT);
+-                gconf_value_set_float (gconf_value,
+-                                       g_value_get_float (&value));
+-                break;
+-        default:
+-                if (g_type_is_a (value.g_type, G_TYPE_ENUM)) {
+-                        gconf_value = gconf_value_new (GCONF_VALUE_INT);
+-                        gconf_value_set_int (gconf_value,
+-                                             g_value_get_enum (&value));
+-                } else {
+-                        g_warning ("prop_binding_sync_prop_to_pref: "
+-                                   "Unhandled value type '%s'.\n",
+-                                   g_type_name (value.g_type));
+-
+-                        goto done;
+-                }
+-
+-                break;
+-        }
+-
+-        /* Set to GConf */
+-        gconf_client_set (bridge->client, binding->key, gconf_value, NULL);
+-
+-        /* Store until change notification comes in, so that we are able
+-         * to ignore it */
+-        binding->val_changes = g_slist_append (binding->val_changes,
+-                                               gconf_value);
+-
+-done:
+-        g_value_unset (&value);
+-}
+-
+-/* Called when a GConf value bound to an object property has changed */
+-static void
+-prop_binding_pref_changed (GConfClient *client,
+-                           guint        cnxn_id,
+-                           GConfEntry  *entry,
+-                           gpointer     user_data)
+-{
+-        GConfValue *gconf_value;
+-        PropBinding *binding;
+-        GSList *l;
+-
+-        gconf_value = gconf_entry_get_value (entry);
+-        if (!gconf_value)
+-                return; /* NULL means that the value has been unset */
+-
+-        binding = (PropBinding *) user_data;
+-
+-        /* Check that this notification is not caused by sync_prop_to_pref() */
+-        l = g_slist_find_custom (binding->val_changes,
+-                                 gconf_value,
+-                                 (GCompareFunc) gconf_value_compare);
+-        if (l) {
+-                gconf_value_free (l->data);
+-
+-                binding->val_changes = g_slist_delete_link
+-                        (binding->val_changes, l);
+-
+-                return;
+-        }
+-
+-        prop_binding_sync_pref_to_prop (binding, gconf_value);
+-}
+-
+-/* Performs a scheduled prop-to-pref sync for a prop binding in
+- * delay mode */
+-static gboolean
+-prop_binding_perform_scheduled_sync (PropBinding *binding)
+-{
+-        prop_binding_sync_prop_to_pref (binding);
+-
+-        binding->sync_timeout_id = 0;
+-
+-        g_object_unref (binding->object);
+-
+-        return FALSE;
+-}
+-
+-#define PROP_BINDING_SYNC_DELAY 100 /* Delay for bindings with "delayed"
+-                                       set to TRUE, in ms */
+-
+-/* Called when an object property has changed */
+-static void
+-prop_binding_prop_changed (GObject     *object,
+-                           GParamSpec  *param_spec,
+-                           PropBinding *binding)
+-{
+-        if (binding->delayed_mode) {
+-                /* Just schedule a sync */
+-                if (binding->sync_timeout_id == 0) {
+-                        /* We keep a reference on the object as long as
+-                         * we haven't synced yet to make sure we don't
+-                         * lose any data */
+-                        g_object_ref (binding->object);
+-
+-                        binding->sync_timeout_id =
+-                                g_timeout_add
+-                                        (PROP_BINDING_SYNC_DELAY,
+-                                         (GSourceFunc)
+-                                            prop_binding_perform_scheduled_sync,
+-                                         binding);
+-                }
+-        } else {
+-                /* Directly sync */
+-                prop_binding_sync_prop_to_pref (binding);
+-        }
+-}
+-
+-/* Called when an object is destroyed */
+-static void
+-prop_binding_object_destroyed (gpointer user_data,
+-                               GObject *where_the_object_was)
+-{
+-        PropBinding *binding;
+-
+-        binding = (PropBinding *) user_data;
+-        binding->object = NULL; /* Don't do anything with the object
+-                                   at unbind() */
+-
+-        g_hash_table_remove (bridge->bindings,
+-                             GUINT_TO_POINTER (binding->id));
+-}
+-
+-/**
+- * gconf_bridge_bind_property_full
+- * @bridge: A #GConfBridge
+- * @key: A GConf key to be bound
+- * @object: A #GObject
+- * @prop: The property of @object to be bound
+- * @delayed_sync: TRUE if there should be a delay between property changes
+- * and syncs to GConf. Set to TRUE when binding to a rapidly-changing
+- * property, for example the "value" property on a #GtkAdjustment.
+- *
+- * Binds @key to @prop, causing them to have the same value at all times.
+- *
+- * The types of @key and @prop should be compatible. Floats and doubles, and
+- * ints, uints, longs, unlongs, int64s, uint64s, chars, uchars and enums
+- * can be matched up. Booleans and strings can only be matched to their
+- * respective types.
+- *
+- * On calling this function the current value of @key will be set to @prop.
+- *
+- * Return value: The ID of the new binding.
+- **/
+-guint
+-gconf_bridge_bind_property_full (GConfBridge *bridge,
+-                                 const char  *key,
+-                                 GObject     *object,
+-                                 const char  *prop,
+-                                 gboolean     delayed_sync)
+-{
+-        GParamSpec *pspec;
+-        PropBinding *binding;
+-        char *signal;
+-        GConfValue *val;
+-
+-        g_return_val_if_fail (bridge != NULL, 0);
+-        g_return_val_if_fail (key != NULL, 0);
+-        g_return_val_if_fail (G_IS_OBJECT (object), 0);
+-        g_return_val_if_fail (prop != NULL, 0);
+-
+-        /* First, try to fetch the propertys GParamSpec off the object */
+-        pspec = g_object_class_find_property
+-                                (G_OBJECT_GET_CLASS (object), prop);
+-        if (G_UNLIKELY (pspec == NULL)) {
+-                g_warning ("gconf_bridge_bind_property_full: A property \"%s\" "
+-                           "was not found. Please make sure you are passing "
+-                           "the right property name.", prop);
+-
+-                return 0;
+-        }
+-
+-        /* GParamSpec found: All good, create new binding. */
+-        binding = g_new (PropBinding, 1);
+-
+-        binding->type = BINDING_PROP;
+-        binding->id = new_id ();
+-        binding->delayed_mode = delayed_sync;
+-        binding->val_changes = NULL;
+-        binding->key = g_strdup (key);
+-        binding->object = object;
+-        binding->prop = pspec;
+-        binding->sync_timeout_id = 0;
+-
+-        /* Watch GConf key */
+-        binding->val_notify_id =
+-                gconf_client_notify_add (bridge->client, key,
+-                                         prop_binding_pref_changed,
+-                                         binding, NULL, NULL);
+-
+-        /* Connect to property change notifications */
+-        signal = g_strconcat ("notify::", prop, NULL);
+-        binding->prop_notify_id =
+-                g_signal_connect (object, signal,
+-                                  G_CALLBACK (prop_binding_prop_changed),
+-                                  binding);
+-        g_free (signal);
+-
+-        /* Sync object to value from GConf, if set */
+-        val = gconf_client_get (bridge->client, key, NULL);
+-        if (val) {
+-                prop_binding_sync_pref_to_prop (binding, val);
+-                gconf_value_free (val);
+-        }
+-
+-        /* Handle case where watched object gets destroyed */
+-        g_object_weak_ref (object,
+-                           prop_binding_object_destroyed, binding);
+-
+-        /* Insert binding */
+-        g_hash_table_insert (bridge->bindings,
+-                             GUINT_TO_POINTER (binding->id), binding);
+-
+-        /* Done */
+-        return binding->id;
+-}
+-
+-/* Unbinds a property binding */
+-static void
+-prop_binding_unbind (PropBinding *binding)
+-{
+-        if (binding->delayed_mode && binding->sync_timeout_id > 0) {
+-                /* Perform any scheduled syncs */
+-                g_source_remove (binding->sync_timeout_id);
+-
+-                /* The object will still be around as we have
+-                 * a reference */
+-                prop_binding_perform_scheduled_sync (binding);
+-        }
+-
+-        gconf_client_notify_remove (bridge->client,
+-                                    binding->val_notify_id);
+-        g_free (binding->key);
+-
+-        while (binding->val_changes) {
+-                gconf_value_free (binding->val_changes->data);
+-
+-                binding->val_changes = g_slist_delete_link
+-                        (binding->val_changes, binding->val_changes);
+-        }
+-
+-        /* The object might have been destroyed .. */
+-        if (binding->object) {
+-                g_signal_handler_disconnect (binding->object,
+-                                             binding->prop_notify_id);
+-
+-                g_object_weak_unref (binding->object,
+-                                     prop_binding_object_destroyed, binding);
+-        }
+-}
+-
+-/*
+- * Window bindings
+- */
+-
+-/* Performs a scheduled dimensions-to-prefs sync for a window binding */
+-static gboolean
+-window_binding_perform_scheduled_sync (WindowBinding *binding)
+-{
+-        if (binding->bind_size) {
+-                int width, height;
+-                char *key;
+-                GdkWindowState state;
+-
+-#if GTK_CHECK_VERSION (2,14,0)
+-                state = gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (binding->window)));
+-#else
+-                state = gdk_window_get_state (GTK_WIDGET (binding->window)->window);
+-#endif
+-
+-                if (state & GDK_WINDOW_STATE_MAXIMIZED) {
+-                        key = g_strconcat (binding->key_prefix, "_maximized", NULL);
+-                        gconf_client_set_bool (bridge->client, key, TRUE, NULL);
+-                        g_free (key);
+-                } else {
+-                        gtk_window_get_size (binding->window, &width, &height);
+-
+-                        key = g_strconcat (binding->key_prefix, "_width", NULL);
+-                        gconf_client_set_int (bridge->client, key, width, NULL);
+-                        g_free (key);
+-
+-                        key = g_strconcat (binding->key_prefix, "_height", NULL);
+-                        gconf_client_set_int (bridge->client, key, height, NULL);
+-                        g_free (key);
+-
+-                        key = g_strconcat (binding->key_prefix, "_maximized", NULL);
+-                        gconf_client_set_bool (bridge->client, key, FALSE, NULL);
+-                        g_free (key);
+-                }
+-        }
+-
+-        if (binding->bind_pos) {
+-                int x, y;
+-                char *key;
+-
+-                gtk_window_get_position (binding->window, &x, &y);
+-
+-                key = g_strconcat (binding->key_prefix, "_x", NULL);
+-                gconf_client_set_int (bridge->client, key, x, NULL);
+-                g_free (key);
+-
+-                key = g_strconcat (binding->key_prefix, "_y", NULL);
+-                gconf_client_set_int (bridge->client, key, y, NULL);
+-                g_free (key);
+-        }
+-
+-        binding->sync_timeout_id = 0;
+-
+-        return FALSE;
+-}
+-
+-#define WINDOW_BINDING_SYNC_DELAY 1000 /* Delay before syncing new window
+-                                          dimensions to GConf, in ms */
+-
+-/* Called when the window han been resized or moved */
+-static gboolean
+-window_binding_configure_event_cb (GtkWindow         *window,
+-                                   GdkEventConfigure *event,
+-                                   WindowBinding     *binding)
+-{
+-	/* Re-postpone by cancel of the previous request */
+-	if (binding->sync_timeout_id > 0)
+-		g_source_remove (binding->sync_timeout_id);
+-
+-        /* Schedule a sync */
+-        binding->sync_timeout_id = g_timeout_add (WINDOW_BINDING_SYNC_DELAY,
+-						  (GSourceFunc)window_binding_perform_scheduled_sync,
+-						  binding);
+-
+-        return FALSE;
+-}
+-
+-/* Called when the window state is being changed */
+-static gboolean
+-window_binding_state_event_cb (GtkWindow           *window,
+-                               GdkEventWindowState *event,
+-                               WindowBinding       *binding)
+-{
+-        if (binding->sync_timeout_id > 0)
+-                g_source_remove (binding->sync_timeout_id);
+-
+-        window_binding_perform_scheduled_sync (binding);
+-
+-        return FALSE;
+-}
+-
+-/* Called when the window is being unmapped */
+-static gboolean
+-window_binding_unmap_cb (GtkWindow     *window,
+-                         WindowBinding *binding)
+-{
+-        /* Force sync */
+-        if (binding->sync_timeout_id > 0)
+-                g_source_remove (binding->sync_timeout_id);
+-
+-        window_binding_perform_scheduled_sync (binding);
+-
+-        return FALSE;
+-}
+-
+-/* Called when a window is destroyed */
+-static void
+-window_binding_window_destroyed (gpointer user_data,
+-                                 GObject *where_the_object_was)
+-{
+-        WindowBinding *binding;
+-
+-        binding = (WindowBinding *) user_data;
+-        binding->window = NULL; /* Don't do anything with the window
+-                                   at unbind() */
+-
+-        if (binding->sync_timeout_id > 0)
+-                g_source_remove (binding->sync_timeout_id);
+-
+-        g_hash_table_remove (bridge->bindings,
+-                             GUINT_TO_POINTER (binding->id));
+-}
+-
+-/**
+- * gconf_bridge_bind_window
+- * @bridge: A #GConfBridge
+- * @key_prefix: The prefix of the GConf keys
+- * @window: A #GtkWindow
+- * @bind_size: TRUE to bind the size of @window
+- * @bind_pos: TRUE to bind the position of @window
+- *
+- * On calling this function @window will be resized to the values
+- * specified by "@key_prefix<!-- -->_width" and "@key_prefix<!-- -->_height"
+- * and maximixed if "@key_prefix<!-- -->_maximized is TRUE if
+- * @bind_size is TRUE, and moved to the values specified by
+- * "@key_prefix<!-- -->_x" and "@key_prefix<!-- -->_y" if @bind_pos is TRUE.
+- * The respective GConf values will be updated when the window is resized
+- * and/or moved.
+- *
+- * Return value: The ID of the new binding.
+- **/
+-guint
+-gconf_bridge_bind_window (GConfBridge *bridge,
+-                          const char  *key_prefix,
+-                          GtkWindow   *window,
+-                          gboolean     bind_size,
+-                          gboolean     bind_pos)
+-{
+-        WindowBinding *binding;
+-
+-        g_return_val_if_fail (bridge != NULL, 0);
+-        g_return_val_if_fail (key_prefix != NULL, 0);
+-        g_return_val_if_fail (GTK_IS_WINDOW (window), 0);
+-
+-        /* Create new binding. */
+-        binding = g_new (WindowBinding, 1);
+-
+-        binding->type = BINDING_WINDOW;
+-        binding->id = new_id ();
+-        binding->bind_size = bind_size;
+-        binding->bind_pos = bind_pos;
+-        binding->key_prefix = g_strdup (key_prefix);
+-        binding->window = window;
+-        binding->sync_timeout_id = 0;
+-
+-        /* Set up GConf keys & sync window to GConf values */
+-        if (bind_size) {
+-                char *key;
+-                GConfValue *width_val, *height_val, *maximized_val;
+-
+-                key = g_strconcat (key_prefix, "_width", NULL);
+-                width_val = gconf_client_get (bridge->client, key, NULL);
+-                g_free (key);
+-
+-                key = g_strconcat (key_prefix, "_height", NULL);
+-                height_val = gconf_client_get (bridge->client, key, NULL);
+-                g_free (key);
+-
+-                key = g_strconcat (key_prefix, "_maximized", NULL);
+-                maximized_val = gconf_client_get (bridge->client, key, NULL);
+-                g_free (key);
+-
+-                if (width_val && height_val) {
+-                        gtk_window_resize (window,
+-                                           gconf_value_get_int (width_val),
+-                                           gconf_value_get_int (height_val));
+-
+-                        gconf_value_free (width_val);
+-                        gconf_value_free (height_val);
+-                } else if (width_val) {
+-                        gconf_value_free (width_val);
+-                } else if (height_val) {
+-                        gconf_value_free (height_val);
+-                }
+-
+-                if (maximized_val) {
+-                        if (gconf_value_get_bool (maximized_val)) {
+-                                gtk_window_maximize (window);
+-                        }
+-                        gconf_value_free (maximized_val);
+-                }
+-        }
+-
+-        if (bind_pos) {
+-                char *key;
+-                GConfValue *x_val, *y_val;
+-
+-                key = g_strconcat (key_prefix, "_x", NULL);
+-                x_val = gconf_client_get (bridge->client, key, NULL);
+-                g_free (key);
+-
+-                key = g_strconcat (key_prefix, "_y", NULL);
+-                y_val = gconf_client_get (bridge->client, key, NULL);
+-                g_free (key);
+-
+-                if (x_val && y_val) {
+-                        gtk_window_move (window,
+-                                         gconf_value_get_int (x_val),
+-                                         gconf_value_get_int (y_val));
+-
+-                        gconf_value_free (x_val);
+-                        gconf_value_free (y_val);
+-                } else if (x_val) {
+-                        gconf_value_free (x_val);
+-                } else if (y_val) {
+-                        gconf_value_free (y_val);
+-                }
+-        }
+-
+-        /* Connect to window size change notifications */
+-        binding->configure_event_id =
+-                g_signal_connect (window,
+-                                  "configure-event",
+-                                  G_CALLBACK
+-                                        (window_binding_configure_event_cb),
+-                                  binding);
+-
+-        binding->window_state_event_id =
+-                g_signal_connect (window,
+-                                  "window_state_event",
+-                                  G_CALLBACK
+-                                        (window_binding_state_event_cb),
+-                                  binding);
+-        binding->unmap_id =
+-                g_signal_connect (window,
+-                                  "unmap",
+-                                  G_CALLBACK (window_binding_unmap_cb),
+-                                  binding);
+-
+-        /* Handle case where window gets destroyed */
+-        g_object_weak_ref (G_OBJECT (window),
+-                           window_binding_window_destroyed, binding);
+-
+-        /* Insert binding */
+-        g_hash_table_insert (bridge->bindings,
+-                             GUINT_TO_POINTER (binding->id), binding);
+-
+-        /* Done */
+-        return binding->id;
+-}
+-
+-/* Unbinds a window binding */
+-static void
+-window_binding_unbind (WindowBinding *binding)
+-{
+-        if (binding->sync_timeout_id > 0)
+-                g_source_remove (binding->sync_timeout_id);
+-
+-        g_free (binding->key_prefix);
+-
+-        /* The window might have been destroyed .. */
+-        if (binding->window) {
+-                g_signal_handler_disconnect (binding->window,
+-                                             binding->configure_event_id);
+-                g_signal_handler_disconnect (binding->window,
+-					     binding->window_state_event_id);
+-                g_signal_handler_disconnect (binding->window,
+-                                             binding->unmap_id);
+-
+-                g_object_weak_unref (G_OBJECT (binding->window),
+-                                     window_binding_window_destroyed, binding);
+-        }
+-}
+-
+-/*
+- * List store bindings
+- */
+-
+-/* Fills a GtkListStore with the string list from @value */
+-static void
+-list_store_binding_sync_pref_to_store (ListStoreBinding *binding,
+-                                       GConfValue       *value)
+-{
+-        GSList *list, *l;
+-        GtkTreeIter iter;
+-
+-        /* Make sure we don't enter an infinite synchronizing loop */
+-        g_signal_handler_block (binding->list_store,
+-                                binding->row_inserted_id);
+-        g_signal_handler_block (binding->list_store,
+-                                binding->row_deleted_id);
+-
+-        gtk_list_store_clear (binding->list_store);
+-
+-        list = gconf_value_get_list (value);
+-        for (l = list; l; l = l->next) {
+-                GConfValue *l_value;
+-                const char *string;
+-
+-                l_value = (GConfValue *) l->data;
+-                string = gconf_value_get_string (l_value);
+-
+-                gtk_list_store_insert_with_values (binding->list_store,
+-                                                   &iter, -1,
+-                                                   0, string,
+-                                                   -1);
+-        }
+-
+-        g_signal_handler_unblock (binding->list_store,
+-                                  binding->row_inserted_id);
+-        g_signal_handler_unblock (binding->list_store,
+-                                  binding->row_deleted_id);
+-}
+-
+-/* Sets a GConf value to the contents of a GtkListStore */
+-static gboolean
+-list_store_binding_sync_store_to_pref (ListStoreBinding *binding)
+-{
+-        GtkTreeModel *tree_model;
+-        GtkTreeIter iter;
+-        GSList *list;
+-        int res;
+-        GConfValue *gconf_value;
+-
+-        tree_model = GTK_TREE_MODEL (binding->list_store);
+-
+-        /* Build list */
+-        list = NULL;
+-        res = gtk_tree_model_get_iter_first (tree_model, &iter);
+-        while (res) {
+-                char *string;
+-                GConfValue *tmp_value;
+-
+-                gtk_tree_model_get (tree_model, &iter,
+-                                    0, &string, -1);
+-
+-                tmp_value = gconf_value_new (GCONF_VALUE_STRING);
+-                gconf_value_set_string (tmp_value, string);
+-
+-                list = g_slist_append (list, tmp_value);
+-
+-                res = gtk_tree_model_iter_next (tree_model, &iter);
+-        }
+-
+-        /* Create value */
+-        gconf_value = gconf_value_new (GCONF_VALUE_LIST);
+-        gconf_value_set_list_type (gconf_value, GCONF_VALUE_STRING);
+-        gconf_value_set_list_nocopy (gconf_value, list);
+-
+-        /* Set */
+-        gconf_client_set (bridge->client, binding->key, gconf_value, NULL);
+-
+-        /* Store until change notification comes in, so that we are able
+-         * to ignore it */
+-        binding->val_changes = g_slist_append (binding->val_changes,
+-                                               gconf_value);
+-
+-        binding->sync_idle_id = 0;
+-
+-        g_object_unref (binding->list_store);
+-
+-        return FALSE;
+-}
+-
+-/* Pref changed: sync */
+-static void
+-list_store_binding_pref_changed (GConfClient *client,
+-                                 guint        cnxn_id,
+-                                 GConfEntry  *entry,
+-                                 gpointer     user_data)
+-{
+-        GConfValue *gconf_value;
+-        ListStoreBinding *binding;
+-        GSList *l;
+-
+-        gconf_value = gconf_entry_get_value (entry);
+-        if (!gconf_value)
+-                return; /* NULL means that the value has been unset */
+-
+-        binding = (ListStoreBinding *) user_data;
+-
+-        /* Check that this notification is not caused by
+-         * sync_store_to_pref() */
+-        l = g_slist_find_custom (binding->val_changes,
+-                                 gconf_value,
+-                                 (GCompareFunc) gconf_value_compare);
+-        if (l) {
+-                gconf_value_free (l->data);
+-
+-                binding->val_changes = g_slist_delete_link
+-                        (binding->val_changes, l);
+-
+-                return;
+-        }
+-
+-        list_store_binding_sync_pref_to_store (binding, gconf_value);
+-}
+-
+-/* Called when an object is destroyed */
+-static void
+-list_store_binding_store_destroyed (gpointer user_data,
+-                                    GObject *where_the_object_was)
+-{
+-        ListStoreBinding *binding;
+-
+-        binding = (ListStoreBinding *) user_data;
+-        binding->list_store = NULL; /* Don't do anything with the store
+-                                       at unbind() */
+-
+-        g_hash_table_remove (bridge->bindings,
+-                             GUINT_TO_POINTER (binding->id));
+-}
+-
+-/* List store changed: Sync */
+-static void
+-list_store_binding_store_changed_cb (ListStoreBinding *binding)
+-{
+-        if (binding->sync_idle_id == 0) {
+-                g_object_ref (binding->list_store);
+-
+-                binding->sync_idle_id = g_idle_add
+-                        ((GSourceFunc) list_store_binding_sync_store_to_pref,
+-                         binding);
+-        }
+-}
+-
+-/**
+- * gconf_bridge_bind_string_list_store
+- * @bridge: A #GConfBridge
+- * @key: A GConf key to be bound
+- * @list_store: A #GtkListStore
+- *
+- * On calling this function single string column #GtkListStore @list_store
+- * will be kept synchronized with the GConf string list value pointed to by
+- * @key. On calling this function @list_store will be populated with the
+- * strings specified by the value of @key.
+- *
+- * Return value: The ID of the new binding.
+- **/
+-guint
+-gconf_bridge_bind_string_list_store (GConfBridge  *bridge,
+-                                     const char   *key,
+-                                     GtkListStore *list_store)
+-{
+-        GtkTreeModel *tree_model;
+-        gboolean have_one_column, is_string_column;
+-        ListStoreBinding *binding;
+-        GConfValue *val;
+-
+-        g_return_val_if_fail (bridge != NULL, 0);
+-        g_return_val_if_fail (key != NULL, 0);
+-        g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), 0);
+-
+-        /* Check list store suitability */
+-        tree_model = GTK_TREE_MODEL (list_store);
+-        have_one_column = (gtk_tree_model_get_n_columns (tree_model) == 1);
+-        is_string_column = (gtk_tree_model_get_column_type
+-                                        (tree_model, 0) == G_TYPE_STRING);
+-        if (G_UNLIKELY (!have_one_column || !is_string_column)) {
+-                g_warning ("gconf_bridge_bind_string_list_store: Only "
+-                           "GtkListStores with exactly one string column are "
+-                           "supported.");
+-
+-                return 0;
+-        }
+-
+-        /* Create new binding. */
+-        binding = g_new (ListStoreBinding, 1);
+-
+-        binding->type = BINDING_LIST_STORE;
+-        binding->id = new_id ();
+-        binding->key = g_strdup (key);
+-        binding->val_changes = NULL;
+-        binding->list_store = list_store;
+-        binding->sync_idle_id = 0;
+-
+-        /* Watch GConf key */
+-        binding->val_notify_id =
+-                gconf_client_notify_add (bridge->client, key,
+-                                         list_store_binding_pref_changed,
+-                                         binding, NULL, NULL);
+-
+-        /* Connect to ListStore change notifications */
+-        binding->row_inserted_id =
+-                g_signal_connect_swapped (list_store, "row-inserted",
+-                                          G_CALLBACK
+-                                          (list_store_binding_store_changed_cb),
+-                                          binding);
+-        binding->row_changed_id =
+-                g_signal_connect_swapped (list_store, "row-changed",
+-                                          G_CALLBACK
+-                                          (list_store_binding_store_changed_cb),
+-                                          binding);
+-        binding->row_deleted_id =
+-                g_signal_connect_swapped (list_store, "row-deleted",
+-                                          G_CALLBACK
+-                                          (list_store_binding_store_changed_cb),
+-                                          binding);
+-        binding->rows_reordered_id =
+-                g_signal_connect_swapped (list_store, "rows-reordered",
+-                                          G_CALLBACK
+-                                          (list_store_binding_store_changed_cb),
+-                                          binding);
+-
+-        /* Sync object to value from GConf, if set */
+-        val = gconf_client_get (bridge->client, key, NULL);
+-        if (val) {
+-                list_store_binding_sync_pref_to_store (binding, val);
+-                gconf_value_free (val);
+-        }
+-
+-        /* Handle case where watched object gets destroyed */
+-        g_object_weak_ref (G_OBJECT (list_store),
+-                           list_store_binding_store_destroyed, binding);
+-
+-        /* Insert binding */
+-        g_hash_table_insert (bridge->bindings,
+-                             GUINT_TO_POINTER (binding->id), binding);
+-
+-        /* Done */
+-        return binding->id;
+-}
+-
+-/* Unbinds a list store binding */
+-static void
+-list_store_binding_unbind (ListStoreBinding *binding)
+-{
+-        /* Perform any scheduled syncs */
+-        if (binding->sync_idle_id > 0) {
+-                g_source_remove (binding->sync_idle_id);
+-
+-                /* The store will still be around as we added a reference */
+-                list_store_binding_sync_store_to_pref (binding);
+-        }
+-
+-        g_free (binding->key);
+-
+-        while (binding->val_changes) {
+-                gconf_value_free (binding->val_changes->data);
+-
+-                binding->val_changes = g_slist_delete_link
+-                        (binding->val_changes, binding->val_changes);
+-        }
+-
+-        /* The store might have been destroyed .. */
+-        if (binding->list_store) {
+-                g_signal_handler_disconnect (binding->list_store,
+-                                             binding->row_inserted_id);
+-                g_signal_handler_disconnect (binding->list_store,
+-                                             binding->row_changed_id);
+-                g_signal_handler_disconnect (binding->list_store,
+-                                             binding->row_deleted_id);
+-                g_signal_handler_disconnect (binding->list_store,
+-                                             binding->rows_reordered_id);
+-
+-                g_object_weak_unref (G_OBJECT (binding->list_store),
+-                                     list_store_binding_store_destroyed,
+-                                     binding);
+-        }
+-}
+-
+-/*
+- * Generic unbinding
+- */
+-
+-/* Unbinds a binding */
+-static void
+-unbind (Binding *binding)
+-{
+-        /* Call specialized unbinding function */
+-        switch (binding->type) {
+-        case BINDING_PROP:
+-                prop_binding_unbind ((PropBinding *) binding);
+-                break;
+-        case BINDING_WINDOW:
+-                window_binding_unbind ((WindowBinding *) binding);
+-                break;
+-        case BINDING_LIST_STORE:
+-                list_store_binding_unbind ((ListStoreBinding *) binding);
+-                break;
+-        default:
+-                g_warning ("Unknown binding type '%d'\n", binding->type);
+-                break;
+-        }
+-
+-        g_free (binding);
+-}
+-
+-/**
+- * gconf_bridge_unbind
+- * @bridge: A #GConfBridge
+- * @binding_id: The ID of the binding to be removed
+- *
+- * Removes the binding with ID @binding_id.
+- **/
+-void
+-gconf_bridge_unbind (GConfBridge *bridge,
+-                     guint        binding_id)
+-{
+-        g_return_if_fail (bridge != NULL);
+-        g_return_if_fail (binding_id > 0);
+-
+-        /* This will trigger the hash tables value destruction
+-         * function, which will take care of further cleanup */
+-        g_hash_table_remove (bridge->bindings,
+-                             GUINT_TO_POINTER (binding_id));
+-}
+-
+-/*
+- * Error handling
+- */
+-
+-/* This is the same dialog as used in eel */
+-static void
+-error_handler (GConfClient *client,
+-               GError      *error)
+-{
+-        static gboolean shown_dialog = FALSE;
+-
+-        g_warning ("GConf error:\n  %s", error->message);
+-
+-        if (!shown_dialog) {
+-                GtkWidget *dlg;
+-
+-                dlg = gtk_message_dialog_new (NULL, 0,
+-                                              GTK_MESSAGE_ERROR,
+-                                              GTK_BUTTONS_OK,
+-                                              _("GConf error: %s"),
+-                                              error->message);
+-
+-                gtk_message_dialog_format_secondary_text
+-                        (GTK_MESSAGE_DIALOG (dlg),
+-                         _("All further errors shown only on terminal."));
+-                gtk_window_set_title (GTK_WINDOW (dlg), "");
+-
+-                gtk_dialog_run (GTK_DIALOG (dlg));
+-
+-                gtk_widget_destroy (dlg);
+-
+-                shown_dialog = TRUE;
+-	}
+-}
+-
+-/**
+- * gconf_bridge_install_default_error_handler
+- *
+- * Sets up the default error handler. Any unhandled GConf errors will
+- * automatically be handled by presenting the user an error dialog.
+- **/
+-void
+-gconf_bridge_install_default_error_handler (void)
+-{
+-        gconf_client_set_global_default_error_handler (error_handler);
+-}
+diff --git a/cut-n-paste/gconf-bridge/gconf-bridge.h b/cut-n-paste/gconf-bridge/gconf-bridge.h
+deleted file mode 100644
+index 6026389..0000000
+--- a/cut-n-paste/gconf-bridge/gconf-bridge.h
++++ /dev/null
+@@ -1,116 +0,0 @@
+-/*
+- * (C) 2005 OpenedHand Ltd.
+- *
+- * Author: Jorn Baayen <jorn at openedhand.com>
+- *
+- * This library is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU Library General Public
+- * License as published by the Free Software Foundation; either
+- * version 2 of the License, or (at your option) any later version.
+- *
+- * This library is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+- * Library General Public License for more details.
+- *
+- * You should have received a copy of the GNU Library General Public
+- * License along with this library; if not, write to the
+- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+- * Boston, MA 02110-1301, USA.
+- */
+-
+-#ifndef __GCONF_BRIDGE_H__
+-#define __GCONF_BRIDGE_H__
+-
+-#include <gconf/gconf-client.h>
+-#include <gtk/gtk.h>
+-
+-G_BEGIN_DECLS
+-
+-void gconf_bridge_install_default_error_handler (void);
+-
+-typedef struct _GConfBridge GConfBridge;
+-
+-GConfBridge *gconf_bridge_get                    (void);
+-
+-GConfClient *gconf_bridge_get_client             (GConfBridge  *bridge);
+-
+-guint        gconf_bridge_bind_property_full     (GConfBridge  *bridge,
+-                                                  const char   *key,
+-                                                  GObject      *object,
+-                                                  const char   *prop,
+-                                                  gboolean      delayed_sync);
+-
+-/**
+- * gconf_bridge_bind_property
+- * @bridge: A #GConfBridge
+- * @key: A GConf key to be bound
+- * @object: A #GObject
+- * @prop: The property of @object to be bound
+- *
+- * Binds @key to @prop without delays, causing them to have the same value at all times. See
+- * #gconf_bridge_bind_property_full for more details.
+- *
+- **/
+-#define gconf_bridge_bind_property(bridge, key, object, prop) \
+-        gconf_bridge_bind_property_full ((bridge), (key), \
+-                                         (object), (prop), FALSE)
+-
+-/**
+- * gconf_bridge_bind_property_delayed
+- * @bridge: A #GConfBridge
+- * @key: A GConf key to be bound
+- * @object: A #GObject
+- * @prop: The property of @object to be bound
+- *
+- * Binds @key to @prop with a delay, causing them to have the same value at all
+- * times. See #gconf_bridge_bind_property_full for more details.
+- **/
+-#define gconf_bridge_bind_property_delayed(bridge, key, object, prop) \
+-        gconf_bridge_bind_property_full ((bridge), (key), \
+-                                         (object), (prop), TRUE)
+-
+-guint        gconf_bridge_bind_window            (GConfBridge  *bridge,
+-                                                  const char   *key_prefix,
+-                                                  GtkWindow    *window,
+-                                                  gboolean      bind_size,
+-                                                  gboolean      bind_pos);
+-
+-/**
+- * gconf_bridge_bind_window_size
+- * @bridge: A #GConfBridge
+- * @key_prefix: The prefix of the GConf keys
+- * @window: A #GtkWindow
+- *
+- * On calling this function @window will be resized to the values specified by
+- * "@key_prefix<!-- -->_width" and "@key_prefix<!-- -->_height".  The respective
+- * GConf values will be updated when the window is resized. See
+- * #gconf_bridge_bind_window for more details.
+- **/
+-#define gconf_bridge_bind_window_size(bridge, key_prefix, window) \
+-        gconf_bridge_bind_window ((bridge), (key_prefix), (window), TRUE, FALSE)
+-
+-/**
+- * gconf_bridge_bind_window_pos
+- * @bridge: A #GConfBridge
+- * @key_prefix: The prefix of the GConf keys
+- * @window: A #GtkWindow
+- *
+- * On calling this function @window will be moved to the values specified by
+- * "@key_prefix<!-- -->_x" and "@key_prefix<!-- -->_y". The respective GConf
+- * values will be updated when the window is moved. See
+- * #gconf_bridge_bind_window for more details.
+- **/
+-#define gconf_bridge_bind_window_pos(bridge, key_prefix, window) \
+-        gconf_bridge_bind_window ((bridge), (key_prefix), (window), FALSE, TRUE)
+-
+-guint        gconf_bridge_bind_string_list_store (GConfBridge  *bridge,
+-                                                  const char   *key,
+-                                                  GtkListStore *list_store);
+-
+-void         gconf_bridge_unbind                 (GConfBridge  *bridge,
+-                                                  guint         binding_id);
+-
+-G_END_DECLS
+-
+-#endif /* __GCONF_BRIDGE_H__ */
+diff --git a/data/Makefile.am b/data/Makefile.am
+index 87d3043..edf7a00 100644
+--- a/data/Makefile.am
++++ b/data/Makefile.am
+@@ -6,19 +6,8 @@ man_MANS = gnome-phone-manager.1
+ uidir = $(pkgdatadir)
+ ui_DATA = phonemgr.ui
+ 
+-schema_in_files = gnome-phone-manager.schemas.in
+-schemadir = $(GCONF_SCHEMA_FILE_DIR)
+-schema_DATA = $(schema_in_files:.schemas.in=.schemas)
+- at INTLTOOL_SCHEMAS_RULE@
+-
+-install-data-local: $(schema_DATA)
+-if GCONF_SCHEMAS_INSTALL
+-	if test -z "$(DESTDIR)" ; then \
+-	for p in $^ ; do \
+-		GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $$p 2>&1 > /dev/null; \
+-	done \
+-	fi
+-endif
++gsettings_SCHEMAS = org.gnome.phone-manager.gschema.xml
++ at GSETTINGS_RULES@
+ 
+ gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
+ 
+@@ -34,5 +23,5 @@ update-icon-cache:
+ 	fi
+ 
+ CLEANFILES = $(schema_DATA)
+-EXTRA_DIST = $(ui_DATA) $(schema_in_files) $(man_MANS)
++EXTRA_DIST = $(ui_DATA) $(gsettings_SCHEMAS) $(man_MANS)
+ 
+diff --git a/data/gnome-phone-manager.schemas.in b/data/gnome-phone-manager.schemas.in
+deleted file mode 100644
+index 7345b7e..0000000
+--- a/data/gnome-phone-manager.schemas.in
++++ /dev/null
+@@ -1,112 +0,0 @@
+-<gconfschemafile>
+-    <schemalist>    
+-
+-      <schema>
+-        <key>/schemas/apps/gnome-phone-manager/connection_type</key>
+-	<applyto>/apps/gnome-phone-manager/connection_type</applyto>
+-	<owner>gnome-phone-manager</owner>
+-	<type>int</type>
+-	<default>0</default>
+-	<locale name="C">
+-	  <short>The connection type used by gnome-phone-manager</short>
+-	  <long>
+-	    The connection type used by gnome-phone-manager:
+-	    Bluetooth is 0
+-	    Serial 1 is 1
+-	    Serial 2 is 2
+-	    IrDa is 3
+-	    Other connection types are 4
+-	  </long>
+-	</locale>
+-      </schema>
+-
+-      <schema>
+-        <key>/schemas/apps/gnome-phone-manager/bluetooth_addr</key>
+-	<applyto>/apps/gnome-phone-manager/bluetooth_addr</applyto>
+-	<owner>gnome-phone-manager</owner>
+-	<type>string</type>
+-	<default></default>
+-	<locale name="C">
+-	  <short>Bluetooth address of the device to connect to</short>
+-	  <long>
+-	    Bluetooth address of the device to connect to. Requires
+-	    connection_type to be 1 to be used.
+-	  </long>
+-	</locale>
+-      </schema>
+-
+-      <schema>
+-        <key>/schemas/apps/gnome-phone-manager/other_serial</key>
+-	<applyto>/apps/gnome-phone-manager/other_serial</applyto>
+-	<owner>gnome-phone-manager</owner>
+-	<type>string</type>
+-	<default></default>
+-	<locale name="C">
+-	  <short>The device node for the serial device to connect to</short>
+-	  <long>
+-	    The device node for the serial device to connect to. Requires
+-	    connection_type to be 4 to be used.
+-	  </long>
+-	</locale>
+-      </schema>
+-
+-      <schema>
+-        <key>/schemas/apps/gnome-phone-manager/auto_retry</key>
+-	<applyto>/apps/gnome-phone-manager/auto_retry</applyto>
+-	<owner>gnome-phone-manager</owner>
+-	<type>bool</type>
+-	<default>true</default>
+-	<locale name="C">
+-	  <short>Whether to retry connecting to the mobile phone</short>
+-	  <long>
+-	    Whether to retry connecting to the mobile phone if the connection
+-	    fails at some point.
+-	  </long>
+-	</locale>
+-      </schema>
+-
+-      <schema>
+-        <key>/schemas/apps/gnome-phone-manager/sync_clock</key>
+-	<applyto>/apps/gnome-phone-manager/sync_clock</applyto>
+-	<owner>gnome-phone-manager</owner>
+-	<type>bool</type>
+-	<default>true</default>
+-	<locale name="C">
+-	  <short>Whether to synchronise the phone clock with the computer's</short>
+-	  <long>
+-	    Whether to synchronise the phone clock with the computer's.
+-	  </long>
+-	</locale>
+-      </schema>
+-
+-      <schema>
+-        <key>/schemas/apps/gnome-phone-manager/popup_messages</key>
+-	<applyto>/apps/gnome-phone-manager/popup_messages</applyto>
+-	<owner>gnome-phone-manager</owner>
+-	<type>bool</type>
+-	<default>false</default>
+-	<locale name="C">
+-	  <short>Whether to popup new messages on the desktop</short>
+-	  <long>
+-	    Whether to popup new messages on the desktop as soon as they're
+-	    received, as opposed to showing them when clicking on the tray icon.
+-	  </long>
+-	</locale>
+-      </schema>
+-
+-      <schema>
+-        <key>/schemas/apps/gnome-phone-manager/sound_alert</key>
+-	<applyto>/apps/gnome-phone-manager/sound_alert</applyto>
+-	<owner>gnome-phone-manager</owner>
+-	<type>bool</type>
+-	<default>true</default>
+-	<locale name="C">
+-	  <short>Whether to play a sound alert when a new message comes in</short>
+-	  <long>
+-	    Whether to play a sound alert when a new message comes in.
+-	  </long>
+-	</locale>
+-      </schema>
+-
+-  </schemalist>
+-</gconfschemafile>
+diff --git a/data/org.gnome.phone-manager.gschema.xml b/data/org.gnome.phone-manager.gschema.xml
+new file mode 100644
+index 0000000..826bd2c
+--- /dev/null
++++ b/data/org.gnome.phone-manager.gschema.xml
+@@ -0,0 +1,39 @@
++<schemalist>
++  <schema id="org.gnome.phone-manager" path="/org/gnome/phone-manager/">
++    <key name="connection-type" type="i">
++      <default>0</default>
++      <summary>The connection type used by gnome-phone-manager</summary>
++      <description>The connection type used by gnome-phone-manager: Bluetooth is 0 Serial 1 is 1 Serial 2 is 2 IrDa is 3 Other connection types are 4</description>
++    </key>
++    <key name="bluetooth-addr" type="s">
++      <default>''</default>
++      <summary>Bluetooth address of the device to connect to</summary>
++      <description>Bluetooth address of the device to connect to. Requires connection_type to be 1 to be used.</description>
++    </key>
++    <key name="other-serial" type="s">
++      <default>''</default>
++      <summary>The device node for the serial device to connect to</summary>
++      <description>The device node for the serial device to connect to. Requires connection_type to be 4 to be used.</description>
++    </key>
++    <key name="auto-retry" type="b">
++      <default>true</default>
++      <summary>Whether to retry connecting to the mobile phone</summary>
++      <description>Whether to retry connecting to the mobile phone if the connection fails at some point.</description>
++    </key>
++    <key name="sync-clock" type="b">
++      <default>true</default>
++      <summary>Whether to synchronise the phone clock with the computer's</summary>
++      <description>Whether to synchronise the phone clock with the computer's.</description>
++    </key>
++    <key name="popup-messages" type="b">
++      <default>false</default>
++      <summary>Whether to popup new messages on the desktop</summary>
++      <description>Whether to popup new messages on the desktop as soon as they're received, as opposed to showing them when clicking on the tray icon.</description>
++    </key>
++    <key name="sound-alert" type="b">
++      <default>true</default>
++      <summary>Whether to play a sound alert when a new message comes in</summary>
++      <description>Whether to play a sound alert when a new message comes in.</description>
++    </key>
++  </schema>
++</schemalist>
+diff --git a/gnome-bluetooth/phonemgr.c b/gnome-bluetooth/phonemgr.c
+index fecc367..5ce4113 100644
+--- a/gnome-bluetooth/phonemgr.c
++++ b/gnome-bluetooth/phonemgr.c
+@@ -27,7 +27,6 @@
+ #endif
+ 
+ #include <glib/gi18n-lib.h>
+-#include <gconf/gconf-client.h>
+ 
+ #include <bluetooth-plugin.h>
+ #include <bluetooth-client.h>
+@@ -101,19 +100,19 @@ static void
+ toggle_button (GtkToggleButton *button, gpointer user_data)
+ {
+ 	gboolean state;
+-	GConfClient *client;
++	GSettings *settings;
+ 	const char *bdaddr;
+ 
+-	client = g_object_get_data (G_OBJECT (button), "client");
++	settings = g_object_get_data (G_OBJECT (button), "settings");
+ 	bdaddr = g_object_get_data (G_OBJECT (button), "bdaddr");
+ 
+ 	state = gtk_toggle_button_get_active (button);
+ 	if (state == FALSE) {
+-		gconf_client_set_string (client, CONFBASE"/bluetooth_addr", "", NULL);
+-		gconf_client_set_int (client, CONFBASE"/connection_type", CONNECTION_NONE, NULL);
++		g_settings_set_string (settings, "bluetooth-addr", "");
++		g_settings_set_int (settings, "connection-type", CONNECTION_NONE);
+ 	} else {
+-		gconf_client_set_string (client, CONFBASE"/bluetooth_addr", bdaddr, NULL);
+-		gconf_client_set_int (client, CONFBASE"/connection_type", CONNECTION_BLUETOOTH, NULL);
++		g_settings_set_string (settings, "bluetooth-addr", bdaddr);
++		g_settings_set_int (settings, "connection-type", CONNECTION_BLUETOOTH);
+ 	}
+ }
+ 
+@@ -121,22 +120,20 @@ static GtkWidget *
+ get_config_widgets (const char *bdaddr, const char **uuids)
+ {
+ 	GtkWidget *button;
+-	GConfClient *client;
++	GSettings *settings;
+ 	char *old_bdaddr;
+ 	int connection_type;
+ 
+-	client = gconf_client_get_default ();
+-	if (client == NULL)
+-		return NULL;
++	settings = g_settings_new("org.gnome.phone-manager");
+ 
+ 	/* Translators: "device" is a phone or a modem */
+ 	button = gtk_check_button_new_with_label (_("Use this device with Phone Manager"));
+ 	g_object_set_data_full (G_OBJECT (button), "bdaddr", g_strdup (bdaddr), g_free);
+-	g_object_set_data_full (G_OBJECT (button), "client", client, g_object_unref);
++	g_object_set_data_full (G_OBJECT (button), "settings", settings, g_object_unref);
+ 
+ 	/* Is it already setup? */
+-	old_bdaddr = gconf_client_get_string (client, CONFBASE"/bluetooth_addr", NULL);
+-	connection_type = gconf_client_get_int (client, CONFBASE"/connection_type", NULL);
++	old_bdaddr = g_settings_get_string (settings, "bluetooth-addr");
++	connection_type = g_settings_get_int (settings, "connection-type");
+ 	if (connection_type == CONNECTION_BLUETOOTH && old_bdaddr && g_strcmp0 (old_bdaddr, bdaddr) == 0) {
+ 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
+ 		g_object_set_data (G_OBJECT (button), "bdaddr", old_bdaddr);
+@@ -154,24 +151,22 @@ get_config_widgets (const char *bdaddr, const char **uuids)
+ static void
+ device_removed (const char *bdaddr)
+ {
+-	GConfClient *client;
++	GSettings *settings;
+ 	char *str;
+ 
+-	client = gconf_client_get_default ();
+-	if (client == NULL)
+-		return;
++	settings = g_settings_new("org.gnome.phone-manager");
+ 
+-	str = gconf_client_get_string (client, CONFBASE"/bluetooth_addr", NULL);
++	str = g_settings_get_string (settings, "bluetooth-addr");
+ 	if (g_strcmp0 (str, bdaddr) == 0) {
+-		gconf_client_set_string (client, CONFBASE"/bluetooth_addr", "", NULL);
+-		if (gconf_client_get_int (client, CONFBASE"/connection_type", NULL) == CONNECTION_BLUETOOTH) {
+-			gconf_client_set_int (client, CONFBASE"/connection_type", CONNECTION_NONE, NULL);
++		g_settings_set_string (settings, "bluetooth-addr", "");
++		if (g_settings_get_int (settings, "connection-type") == CONNECTION_BLUETOOTH) {
++			g_settings_set_int (settings, "connection-type", CONNECTION_NONE);
+ 		}
+ 		g_debug ("Device '%s' got disabled for use with Phone Manager", bdaddr);
+ 	}
+ 
+ 	g_free (str);
+-	g_object_unref (client);
++	g_object_unref (settings);
+ }
+ 
+ static GbtPluginInfo plugin_info = {
+diff --git a/libgsm/phonemgr-utils.c b/libgsm/phonemgr-utils.c
+index 4e62e10..3ccdcd5 100644
+--- a/libgsm/phonemgr-utils.c
++++ b/libgsm/phonemgr-utils.c
+@@ -331,7 +331,7 @@ phonemgr_utils_driver_for_model (const char *model, const char *device)
+ 	} else {
+ 		driver = g_strdup (driver);
+ 		/* Add it to the list if it's a bluetooth device */
+-		//FIXME this should also go in GConf
++		//FIXME this should also go in GSettings
+ 		if (phonemgr_utils_address_is (device) == PHONEMGR_CONNECTION_BLUETOOTH)
+ 			g_hash_table_insert (driver_device, g_strdup (device), g_strdup (driver));
+ 	}
+diff --git a/po/POTFILES.in b/po/POTFILES.in
+index d8e8c0d..c2e8fd8 100644
+--- a/po/POTFILES.in
++++ b/po/POTFILES.in
+@@ -1,7 +1,6 @@
+ # List of source files containing translatable strings.
+ # Please keep this file sorted alphabetically.
+ cut-n-paste/e-contact-entry/e-contact-entry.c
+-cut-n-paste/gconf-bridge/gconf-bridge.c
+ data/gnome-phone-manager.schemas.in
+ [type: gettext/glade]data/phonemgr.ui
+ gnome-bluetooth/phonemgr.c
+diff --git a/src/Makefile.am b/src/Makefile.am
+index b83e2d2..b4aaab7 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -9,8 +9,6 @@ AM_CPPFLAGS = \
+ 	-I$(builddir)/../libgsm \
+ 	-I$(srcdir)/../cut-n-paste/e-contact-entry      \
+ 	-I$(builddir)/../cut-n-paste/e-contact-entry    \
+-	-I$(srcdir)/../cut-n-paste/gconf-bridge         \
+-	-I$(builddir)/../cut-n-paste/gconf-bridge       \
+ 	-I$(builddir)/src				\
+ 	$(WARN_CFLAGS)
+ 
+@@ -33,8 +31,7 @@ gnome_phone_manager_SOURCES =		\
+ gnome_phone_manager_LDADD = \
+ 	../cut-n-paste/e-contact-entry/libecontact-entry.la	\
+ 	$(PHONEMGR_LIBS) \
+-	../libgsm/libgsmwrap.la		\
+-	../cut-n-paste/gconf-bridge/libgconf-bridge.la
++	../libgsm/libgsmwrap.la
+ 
+ BUILT_SOURCES = phone-manager-interface.h
+ 
+@@ -51,8 +48,7 @@ noinst_PROGRAMS = test-entry
+ test_entry_SOURCES = test-entry.c e-phone-entry.c e-phone-entry.h 
+ test_entry_LDADD = \
+ 		   ../cut-n-paste/e-contact-entry/libecontact-entry.la	\
+-		   $(PHONEMGR_LIBS) \
+-		   ../cut-n-paste/gconf-bridge/libgconf-bridge.la
++		   $(PHONEMGR_LIBS)
+ 
+ BUILT_SOURCES += $(MARSHALFILES)
+ 
+diff --git a/src/app.h b/src/app.h
+index 74a8ebd..422232c 100644
+--- a/src/app.h
++++ b/src/app.h
+@@ -22,7 +22,6 @@
+ #define _APP_H
+ 
+ #include <gtk/gtk.h>
+-#include <gconf/gconf-client.h>
+ 
+ #include "phonemgr-listener.h"
+ #include "phonemgr-object.h"
+@@ -38,7 +37,7 @@ typedef struct _appinfo {
+ 	gboolean flashon;
+ 
+ 	/* auxilliary controllers */
+-	GConfClient *client;
++	GSettings *settings;
+ 	PhonemgrListener    *listener;
+ 	PhonemgrObject      *object;
+ 
+diff --git a/src/connection.c b/src/connection.c
+index 692f1b9..e048ea9 100644
+--- a/src/connection.c
++++ b/src/connection.c
+@@ -32,15 +32,14 @@ set_connection_device (MyApp *app)
+ 	char *dev = NULL;
+ 	gboolean changed;
+ 
+-	ctype = gconf_client_get_int (app->client,
+-				      CONFBASE"/connection_type", NULL);
++	ctype = g_settings_get_int (app->settings,
++				      "connection-type");
+ 	changed = FALSE;
+ 
+ 	switch (ctype) {
+ 		case CONNECTION_BLUETOOTH:
+-			dev = gconf_client_get_string (app->client,
+-						       CONFBASE"/bluetooth_addr",
+-						       NULL);
++			dev = g_settings_get_string (app->settings,
++						       "bluetooth-addr");
+ 			if (!dev || strlen (dev) != 17) {
+ 				g_free (dev);
+ 				dev = NULL;
+@@ -56,8 +55,8 @@ set_connection_device (MyApp *app)
+ 			dev = g_strdup ("/dev/ircomm0");
+ 			break;
+ 		case CONNECTION_OTHER:
+-			dev = gconf_client_get_string (app->client,
+-					CONFBASE"/other_serial", NULL);
++			dev = g_settings_get_string (app->settings,
++					"other-serial");
+ 			break;
+ 	}
+ 
+@@ -81,8 +80,8 @@ set_connection_device (MyApp *app)
+ static gboolean
+ attempt_reconnect (MyApp *app)
+ {
+-	if (gconf_client_get_bool (app->client,
+-				CONFBASE"/auto_retry", NULL) &&
++	if (g_settings_get_boolean (app->settings,
++				"auto-retry") &&
+ 			phonemgr_listener_connected (app->listener) == FALSE &&
+ 			app->connecting == FALSE) {
+ 		g_message ("Auto-retrying the connection");
+@@ -94,8 +93,8 @@ attempt_reconnect (MyApp *app)
+ static gboolean
+ sync_clock (MyApp *app)
+ {
+-	if (gconf_client_get_bool (app->client,
+-				CONFBASE"/sync_clock", NULL)) {
++	if (g_settings_get_boolean (app->settings,
++				"sync-clock")) {
+ 		g_message ("Syncing phone clock");
+ 		phonemgr_listener_set_time (app->listener,
+ 					    time(NULL));
+diff --git a/src/main.c b/src/main.c
+index 8e4c6ae..673d0b6 100644
+--- a/src/main.c
++++ b/src/main.c
+@@ -79,16 +79,12 @@ main (int argc, char **argv)
+ 		return 0;
+ 	}
+ 
+-	gconf_init (argc, argv, NULL);
+-
+ 	app = g_new0 (MyApp, 1);
+ 
+ 	/* Setup the D-Bus object */
+ 	app->object = g_object_new (phonemgr_object_get_type (), NULL);
+ 
+-	app->client = gconf_client_get_default ();
+-	gconf_client_add_dir (app->client, CONFBASE,
+-			      GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
++	app->settings = g_settings_new("org.gnome.phone-manager");
+ 
+ 	/* Setup the listener */
+ 	app->listener = phonemgr_listener_new (debug);
+@@ -106,7 +102,7 @@ main (int argc, char **argv)
+ 	ui_hide (app);
+ 	free_connection (app);
+ 	g_object_unref (app->listener);
+-	g_object_unref (app->client);
++	g_object_unref (app->settings);
+ 	g_object_unref (app->object);
+ 	g_free (app);
+ 
+diff --git a/src/phonemgr-conf.h b/src/phonemgr-conf.h
+index 6417cc3..c4bb92e 100644
+--- a/src/phonemgr-conf.h
++++ b/src/phonemgr-conf.h
+@@ -21,10 +21,6 @@
+ #ifndef _PHONEMGR_CONF_H
+ #define _PHONEMGR_CONF_H
+ 
+-#include <gconf/gconf-client.h>
+-
+-#define CONFBASE "/apps/gnome-phone-manager"
+-
+ enum {
+ 	CONNECTION_BLUETOOTH,
+ 	CONNECTION_SERIAL1,
+diff --git a/src/ui.c b/src/ui.c
+index 6d924a5..928afe2 100644
+--- a/src/ui.c
++++ b/src/ui.c
+@@ -29,7 +29,6 @@
+ 
+ #include "app.h"
+ #include "e-phone-entry.h"
+-#include "gconf-bridge.h"
+ #include "phonemgr-utils.h"
+ 
+ #define MAX_MESSAGE_LENGTH 160
+@@ -101,7 +100,7 @@ get_ui (MyApp *app, char *widget)
+ static gboolean
+ idle_play_alert (MyApp *app)
+ {
+-	if (gconf_client_get_bool (app->client, CONFBASE"/sound_alert", NULL)) {
++	if (g_settings_get_boolean (app->settings, "sound-alert")) {
+ 		ca_context *ctx;
+ 		ctx = ca_gtk_context_get ();
+ 		ca_context_play (ctx, 0,
+@@ -161,9 +160,9 @@ on_conn_port_change (GtkWidget *widget, MyApp *app)
+ 
+ 	widget_set_dependent_sensitive (widget, port, active);
+ 	if (active) {
+-		gconf_client_set_int (app->client,
+-				      CONFBASE"/connection_type",
+-				      port, NULL);
++		g_settings_set_int (app->settings,
++				    "connection-type",
++				    port);
+ 	}
+ }
+ 
+@@ -207,8 +206,8 @@ populate_prefs (MyApp *app)
+ 	char *widgetname;
+ 	int ctype;
+ 
+-	ctype = gconf_client_get_int (app->client,
+-				      CONFBASE"/connection_type", NULL);
++	ctype = g_settings_get_int (app->settings,
++				    "connection-type");
+ 	switch (ctype) {
+ 	case CONNECTION_BLUETOOTH:
+ 		widgetname = "btdevice";
+@@ -384,11 +383,10 @@ create_send_dialog (MyApp *app, GtkDialog *parent, const char *recip)
+ }
+ 
+ static void
+-initialise_dequeuer (GConfClient *client, guint cnxn_id,
+-		GConfEntry *entry, MyApp *app)
++initialise_dequeuer (GSettings *settings, char *key, MyApp *app)
+ {
+-	if (gconf_client_get_bool (app->client,
+-				CONFBASE"/popup_messages", NULL)) {
++	if (g_settings_get_boolean (app->settings,
++				"popup-messages")) {
+ 		app->popup_cb = g_timeout_add (250,
+ 				(GSourceFunc) dequeue_message, (gpointer) app);
+ 	} else if (app->popup_cb) {
+@@ -401,7 +399,6 @@ void
+ ui_init (MyApp *app)
+ {
+ 	GtkWidget *btchooser, *btdevice;
+-	GConfBridge *bridge;
+ 	GtkWidget *ep = e_phone_entry_new ();
+ 
+ 	app->ui = get_ui (app, NULL);
+@@ -439,44 +436,45 @@ ui_init (MyApp *app)
+ 	s_connect (app, "otherport", "otherportentry", CONNECTION_OTHER);
+ 
+ 	/* Connect a few toggle buttons */
+-	bridge = gconf_bridge_get ();
+-
+-	gconf_bridge_bind_property (bridge,
+-				    CONFBASE"/auto_retry",
+-				    G_OBJECT (gtk_builder_get_object (app->ui, "auto_retry")),
+-				    "active");
+-	gconf_bridge_bind_property (bridge,
+-				    CONFBASE"/sync_clock",
+-				    G_OBJECT (gtk_builder_get_object (app->ui, "sync_clock")),
+-				    "active");
+-	gconf_bridge_bind_property (bridge,
+-				    CONFBASE"/popup_messages",
+-				    G_OBJECT (gtk_builder_get_object (app->ui, "prefs_popup")),
+-				    "active");
+-	gconf_bridge_bind_property (bridge,
+-				    CONFBASE"/sound_alert",
+-				    G_OBJECT (gtk_builder_get_object (app->ui, "prefs_sound")),
+-				    "active");
++	g_settings_bind (app->settings,
++			 "auto-retry",
++			 G_OBJECT (gtk_builder_get_object (app->ui, "auto_retry")),
++			 "active",
++			 G_SETTINGS_BIND_DEFAULT);
++	g_settings_bind (app->settings,
++			 "sync-clock",
++			 gtk_builder_get_object (app->ui, "sync_clock"),
++			 "active",
++			 G_SETTINGS_BIND_DEFAULT);
++	g_settings_bind (app->settings,
++			 "popup-messages",
++			 gtk_builder_get_object (app->ui, "prefs_popup"),
++			 "active",
++			 G_SETTINGS_BIND_DEFAULT);
++	g_settings_bind (app->settings,
++			 "sound-alert",
++			 gtk_builder_get_object (app->ui, "prefs_sound"),
++			 "active",
++			 G_SETTINGS_BIND_DEFAULT);
+ 
+ 	/* The other port address */
+-	gconf_bridge_bind_property_delayed (bridge,
+-				    CONFBASE"/other_serial",
+-				    G_OBJECT (gtk_builder_get_object (app->ui, "otherportentry")),
+-				    "text");
++	g_settings_bind (app->settings,
++			 "other-serial",
++			 gtk_builder_get_object (app->ui, "otherportentry"),
++			 "text",
++			 G_SETTINGS_BIND_DEFAULT);
+ 
+ 	/* And the address chooser */
+-	gconf_bridge_bind_property (bridge,
+-				    CONFBASE"/bluetooth_addr",
+-				    G_OBJECT (btchooser),
+-				    "device");
++	g_settings_bind (app->settings,
++			 "bluetooth-addr",
++			 btchooser,
++			 "device",
++			 G_SETTINGS_BIND_DEFAULT);
+ 
+ 	/* set up popup on message */
+-	initialise_dequeuer (NULL, 0, NULL, app);
+-	gconf_client_notify_add (app->client,
+-			CONFBASE"/popup_messages",
+-			(GConfClientNotifyFunc) initialise_dequeuer,
+-			(gpointer) app,
+-			NULL, NULL);
++	initialise_dequeuer (NULL, NULL, app);
++	g_signal_connect (G_OBJECT (app->settings), "changed::popup-messages",
++			  G_CALLBACK (initialise_dequeuer), app);
+ }
+ 
+ void
+-- 
+2.18.0
+

Copied: gnome-phone-manager/repos/community-staging-x86_64/PKGBUILD (from rev 715691, gnome-phone-manager/trunk/PKGBUILD)
===================================================================
--- community-staging-x86_64/PKGBUILD	                        (rev 0)
+++ community-staging-x86_64/PKGBUILD	2020-10-02 20:55:57 UTC (rev 715695)
@@ -0,0 +1,43 @@
+# Maintainer: Balló György <ballogyor+arch at gmail dot com>
+# Contributor: Roman Kyrylych <roman at archlinux.org>
+
+pkgname=gnome-phone-manager
+pkgver=0.69
+pkgrel=15
+pkgdesc="Control your mobile phone from your GNOME desktop"
+arch=('x86_64')
+url="https://wiki.gnome.org/PhoneManager"
+license=('GPL')
+depends=('evolution-data-server' 'gnokii' 'gnome-bluetooth' 'libcanberra' 'telepathy-glib')
+makedepends=('intltool' 'gnome-common' 'python')
+source=(https://download.gnome.org/sources/$pkgname/$pkgver/$pkgname-$pkgver.tar.xz
+        gnome-phone-manager-0.68-eds.patch
+        0001-Port-to-GSettings.patch)
+sha256sums=('35e038ea3afaacdf451046e87af876096cf1520efc04fc3f5b63ea22e0297175'
+            '232a72108836ddd46d329993d166c38550e2923f161b4dc814d75af4ed5ccc79'
+            '7b0e07af7c534bd888609b2af0c02a913c7bb25d45039cab05e00b9eeb2d22ba')
+
+prepare() {
+  cd $pkgname-$pkgver
+
+  # Port to evolution-data-server 3.8
+  patch -p1 -i ../gnome-phone-manager-0.68-eds.patch
+
+  # Port to GSettings
+  sed -i 's/ libedataserverui-3.0//' ../0001-Port-to-GSettings.patch
+  patch -Np1 -i ../0001-Port-to-GSettings.patch
+
+  autoreconf -fi
+}
+
+build() {
+  cd $pkgname-$pkgver
+  ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libexecdir=/usr/lib/$pkgname \
+              --disable-schemas-compile --disable-bluetooth-plugin --enable-compile-warnings=minimum
+  make
+}
+
+package() {
+  cd $pkgname-$pkgver
+  make DESTDIR="$pkgdir" install
+}

Copied: gnome-phone-manager/repos/community-staging-x86_64/gnome-phone-manager-0.68-eds.patch (from rev 715691, gnome-phone-manager/trunk/gnome-phone-manager-0.68-eds.patch)
===================================================================
--- community-staging-x86_64/gnome-phone-manager-0.68-eds.patch	                        (rev 0)
+++ community-staging-x86_64/gnome-phone-manager-0.68-eds.patch	2020-10-02 20:55:57 UTC (rev 715695)
@@ -0,0 +1,470 @@
+diff -up gnome-phone-manager-0.68/configure.eds gnome-phone-manager-0.68/configure
+--- gnome-phone-manager-0.68/configure.eds	2012-10-30 15:03:19.515929969 -0400
++++ gnome-phone-manager-0.68/configure	2012-10-30 15:03:54.979862209 -0400
+@@ -13939,12 +13939,12 @@ if test -n "$PHONEMGR_CFLAGS"; then
+     if test -n "$PKG_CONFIG" && \
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	\$GNOME_BLUETOOTH_REQS \$evo_pc_file libedataserverui-3.0
++	\$GNOME_BLUETOOTH_REQS \$evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ \""; } >&5
+   ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	$GNOME_BLUETOOTH_REQS $evo_pc_file libedataserverui-3.0
++	$GNOME_BLUETOOTH_REQS $evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ ") 2>&5
+   ac_status=$?
+@@ -13952,7 +13952,7 @@ if test -n "$PHONEMGR_CFLAGS"; then
+   test $ac_status = 0; }; then
+   pkg_cv_PHONEMGR_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	$GNOME_BLUETOOTH_REQS $evo_pc_file libedataserverui-3.0
++	$GNOME_BLUETOOTH_REQS $evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ " 2>/dev/null`
+ else
+@@ -13967,12 +13967,12 @@ if test -n "$PHONEMGR_LIBS"; then
+     if test -n "$PKG_CONFIG" && \
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	\$GNOME_BLUETOOTH_REQS \$evo_pc_file libedataserverui-3.0
++	\$GNOME_BLUETOOTH_REQS \$evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ \""; } >&5
+   ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	$GNOME_BLUETOOTH_REQS $evo_pc_file libedataserverui-3.0
++	$GNOME_BLUETOOTH_REQS $evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ ") 2>&5
+   ac_status=$?
+@@ -13980,7 +13980,7 @@ if test -n "$PHONEMGR_LIBS"; then
+   test $ac_status = 0; }; then
+   pkg_cv_PHONEMGR_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	$GNOME_BLUETOOTH_REQS $evo_pc_file libedataserverui-3.0
++	$GNOME_BLUETOOTH_REQS $evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ " 2>/dev/null`
+ else
+@@ -14004,13 +14004,13 @@ fi
+         if test $_pkg_short_errors_supported = yes; then
+ 	        PHONEMGR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	$GNOME_BLUETOOTH_REQS $evo_pc_file libedataserverui-3.0
++	$GNOME_BLUETOOTH_REQS $evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ " 2>&1`
+         else
+ 	        PHONEMGR_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	$GNOME_BLUETOOTH_REQS $evo_pc_file libedataserverui-3.0
++	$GNOME_BLUETOOTH_REQS $evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ " 2>&1`
+         fi
+@@ -14019,7 +14019,7 @@ fi
+ 
+ 	as_fn_error $? "Package requirements (gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	$GNOME_BLUETOOTH_REQS $evo_pc_file libedataserverui-3.0
++	$GNOME_BLUETOOTH_REQS $evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ ) were not met:
+ 
+diff -up gnome-phone-manager-0.68/configure.in.eds gnome-phone-manager-0.68/configure.in
+--- gnome-phone-manager-0.68/configure.in.eds	2012-10-30 15:03:24.151921087 -0400
++++ gnome-phone-manager-0.68/configure.in	2012-10-30 15:03:33.865897797 -0400
+@@ -47,7 +47,7 @@ PKG_CHECK_MODULES(LIBGSM, glib-2.0 gobje
+ 
+ PKG_CHECK_MODULES(PHONEMGR, gtk+-3.0 >= 3.0 glib-2.0 >= 2.31.0
+ 	libcanberra-gtk3 gconf-2.0
+-	$GNOME_BLUETOOTH_REQS $evo_pc_file libedataserverui-3.0
++	$GNOME_BLUETOOTH_REQS $evo_pc_file
+ 	gmodule-2.0 dbus-glib-1 gnome-icon-theme >= 2.19.1
+ )
+ 
+diff -up gnome-phone-manager-0.68/cut-n-paste/e-contact-entry/e-contact-entry.c.eds gnome-phone-manager-0.68/cut-n-paste/e-contact-entry/e-contact-entry.c
+--- gnome-phone-manager-0.68/cut-n-paste/e-contact-entry/e-contact-entry.c.eds	2012-07-29 22:06:12.000000000 -0400
++++ gnome-phone-manager-0.68/cut-n-paste/e-contact-entry/e-contact-entry.c	2012-10-30 15:02:47.177996584 -0400
+@@ -38,11 +38,6 @@
+ #include <glib.h>
+ #include <glib/gi18n.h>
+ 
+-#include <libedataserver/e-source.h>
+-#include <libebook/e-book.h>
+-#include <libebook/e-book-view.h>
+-#include <libebook/e-contact.h>
+-
+ #include "e-contact-entry.h"
+ #include "econtactentry-marshal.h"
+ 
+@@ -59,7 +54,7 @@ static int signals[LAST_SIGNAL] = { 0 };
+ /* Properties */
+ enum {
+   PROP_0, /* TODO: why? */
+-  PROP_SOURCE_LIST,
++  PROP_REGISTRY,
+   PROP_COMPLETE_LENGTH,
+ };
+ 
+@@ -70,7 +65,7 @@ enum {
+ struct EContactEntryPriv {
+   GtkEntryCompletion *completion;
+   GtkListStore *store;
+-  ESourceList *source_list;
++  ESourceRegistry *registry;
+   /* A list of EntryLookup structs we are searching */
+   GList *lookup_entries;
+   /* Number of characters to start searching at */
+@@ -227,7 +222,7 @@ e_contact_entry_display_func (EContact *
+   emails = e_contact_get (contact, E_CONTACT_EMAIL);
+   for (l = emails; l != NULL; l = l->next) {
+     item = g_new0 (EContactEntyItem, 1);
+-    item->identifier = item->identifier = g_strdup (l->data);
++    item->identifier = g_strdup (l->data);
+     item->display_string = g_strdup_printf ("%s <%s>", (char*)e_contact_get_const (contact, E_CONTACT_NAME_OR_ORG), item->identifier);
+ 
+     items = g_list_prepend (items, item);
+@@ -276,22 +271,13 @@ view_contacts_added_cb (EBook *book, GLi
+       return;
+ 
+     photo = e_contact_get (contact, E_CONTACT_PHOTO);
+-#ifndef HAVE_ECONTACTPHOTOTYPE
+-    if (photo) {
+-#else
+     if (photo && photo->type == E_CONTACT_PHOTO_TYPE_INLINED) {
+-#endif
+       GdkPixbufLoader *loader;
+ 
+       loader = gdk_pixbuf_loader_new ();
+ 
+-#ifndef HAVE_ECONTACTPHOTOTYPE
+-      if (gdk_pixbuf_loader_write (loader, (guchar *)photo->data,
+-			      photo->length, NULL))
+-#else
+       if (gdk_pixbuf_loader_write (loader, (guchar *)photo->data.inlined.data,
+ 			      photo->data.inlined.length, NULL))
+-#endif
+         pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+ 
+       if (pixbuf) {
+@@ -339,16 +325,15 @@ view_contacts_added_cb (EBook *book, GLi
+  * The query on the EBookView has completed.
+  */
+ static void
+-view_completed_cb (EBookView *book_view, EBookViewStatus status, gpointer user_data)
++view_completed_cb (EBookView *book_view, EBookViewStatus status, const gchar *message, gpointer user_data)
+ {
+   EntryLookup *lookup;
+   g_return_if_fail (user_data != NULL);
+-  /* TODO: handle status != OK */
+-  g_return_if_fail (status == E_BOOK_ERROR_OK);
+   g_return_if_fail (book_view != NULL);
+ 
+   lookup = (EntryLookup*)user_data;
+   g_object_unref (lookup->bookview);
++  lookup->bookview = NULL;
+ }
+ 
+ /**
+@@ -373,8 +358,8 @@ bookview_cb (EBook *book, EBookStatus st
+   lookup->bookview = book_view;
+   g_object_add_weak_pointer ((GObject*)book_view, (gpointer*)&lookup->bookview);
+   
+-  g_signal_connect (book_view, "contacts_added", (GCallback)view_contacts_added_cb, lookup);
+-  g_signal_connect (book_view, "sequence_complete", (GCallback)view_completed_cb, lookup);
++  g_signal_connect (book_view, "contacts-added", (GCallback)view_contacts_added_cb, lookup);
++  g_signal_connect (book_view, "view_complete", (GCallback)view_completed_cb, lookup);
+   
+   e_book_view_start (book_view);
+ }
+@@ -396,6 +381,7 @@ entry_changed_cb (GtkEditable *editable,
+       if (lookup->bookview) {
+         e_book_view_stop (lookup->bookview);
+         g_object_unref (lookup->bookview);
++        lookup->bookview = NULL;
+       }
+     }
+     
+@@ -410,7 +396,7 @@ entry_changed_cb (GtkEditable *editable,
+       if (!lookup->open)
+         continue;
+       
+-      if (e_book_async_get_book_view (lookup->book, query, NULL, 11, (EBookBookViewCallback)bookview_cb, lookup) != 0) {
++      if (e_book_async_get_book_view (lookup->book, query, NULL, MAX_ENTRIES, (EBookBookViewCallback)bookview_cb, lookup) == FALSE) {
+         g_signal_emit (entry, signals[ERROR], 0, _("Cannot create searchable view."));
+       }
+     }
+@@ -458,11 +444,12 @@ book_opened_cb (EBook *book, EBookStatus
+  */
+ 
+ void
+-e_contact_entry_set_source_list (EContactEntry *entry,
+-    				  ESourceList *source_list)
++e_contact_entry_set_registry (EContactEntry *entry,
++    			      ESourceRegistry *registry)
+ {
++  GList *list, *link;
++  const gchar *extension_name;
+   GError *error = NULL;
+-  GSList *list, *l;
+ 
+   g_return_if_fail (E_IS_CONTACT_ENTRY (entry));
+ 
+@@ -471,58 +458,48 @@ e_contact_entry_set_source_list (EContac
+     g_list_foreach (entry->priv->lookup_entries, (GFunc)lookup_entry_free, NULL);
+     g_list_free (entry->priv->lookup_entries);
+   }
+-  if (entry->priv->source_list) {
+-    g_object_unref (entry->priv->source_list);
++  if (entry->priv->registry) {
++    g_object_unref (entry->priv->registry);
+   }
+ 
+   /* If we have no new sources, disable and return here */
+-  if (source_list == NULL) {
++  if (registry == NULL) {
+     g_signal_emit (entry, signals[STATE_CHANGE], 0, FALSE);
+-    entry->priv->source_list = NULL;
++    entry->priv->registry = NULL;
+     entry->priv->lookup_entries = NULL;
+     return;
+   }
+ 
+-  entry->priv->source_list = source_list;
+-  /* So that the list isn't going away underneath us */
+-  g_object_ref (entry->priv->source_list);
++  entry->priv->registry = registry;
++  /* So that the registry isn't going away underneath us */
++  g_object_ref (entry->priv->registry);
+ 
+-  /* That gets us a list of ESourceGroup */
+-  list = e_source_list_peek_groups (source_list);
+   entry->priv->lookup_entries = NULL;
+ 
+-  for (l = list; l != NULL; l = l->next) {
+-    ESourceGroup *group = l->data;
+-    GSList *sources = NULL, *m;
+-    /* That should give us a list of ESource */
+-    sources = e_source_group_peek_sources (group);
+-    for (m = sources; m != NULL; m = m->next) {
+-      ESource *source = m->data;
+-      ESource *s = e_source_copy (source);
+-      EntryLookup *lookup;
+-      char *uri;
++  extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK;
++  list = e_source_registry_list_sources (registry, extension_name);
+ 
+-      uri = g_strdup_printf("%s/%s", e_source_group_peek_base_uri (group), e_source_peek_relative_uri (source));
+-      e_source_set_absolute_uri (s, uri);
+-      g_free (uri);
+-
+-      /* Now add those to the lookup entries list */
+-      lookup = g_new0 (EntryLookup, 1);
+-      lookup->entry = entry;
+-      lookup->status = E_BOOK_ERROR_OK;
+-      lookup->open = FALSE;
++  for (link = list; link != NULL; link = g_list_next (link)) {
++    ESource *source = E_SOURCE (link->data);
++    EntryLookup *lookup;
+ 
+-      if ((lookup->book = e_book_new (s, &error)) == NULL) {
+-        /* TODO handle this better, fire the error signal I guess */
++    /* Now add those to the lookup entries list */
++    lookup = g_new0 (EntryLookup, 1);
++    lookup->entry = entry;
++    lookup->status = E_BOOK_ERROR_OK;
++    lookup->open = FALSE;
++
++    if ((lookup->book = e_book_new (source, &error)) == NULL) {
++      /* TODO handle this better, fire the error signal I guess */
++      if (error) {
+         g_warning ("%s", error->message);
+-	g_error_free (error);
+-	g_free (lookup);
+-      } else {
+-        entry->priv->lookup_entries = g_list_append (entry->priv->lookup_entries, lookup);
+-	e_book_async_open(lookup->book, TRUE, (EBookCallback)book_opened_cb, lookup);
++        g_error_free (error);
++        error = NULL;
+       }
+-
+-      g_object_unref (s);
++      g_free (lookup);
++    } else {
++      entry->priv->lookup_entries = g_list_append (entry->priv->lookup_entries, lookup);
++      e_book_async_open(lookup->book, TRUE, (EBookCallback)book_opened_cb, lookup);
+     }
+   }
+ 
+@@ -530,12 +507,12 @@ e_contact_entry_set_source_list (EContac
+     g_signal_emit (entry, signals[STATE_CHANGE], 0, FALSE);
+ }
+ 
+-ESourceList *
+-e_contact_entry_get_source_list (EContactEntry *entry)
++ESourceRegistry *
++e_contact_entry_get_registry (EContactEntry *entry)
+ {
+   g_return_val_if_fail (E_IS_CONTACT_ENTRY (entry), NULL);
+ 
+-  return entry->priv->source_list;
++  return entry->priv->registry;
+ }
+ 
+ void
+@@ -601,8 +578,8 @@ e_contact_entry_set_property (GObject *o
+   entry = E_CONTACT_ENTRY (object);
+   
+   switch (property_id) {
+-  case PROP_SOURCE_LIST:
+-    e_contact_entry_set_source_list (entry, g_value_get_object (value));
++  case PROP_REGISTRY:
++    e_contact_entry_set_registry (entry, g_value_get_object (value));
+     break;
+   case PROP_COMPLETE_LENGTH:
+     e_contact_entry_set_complete_length (entry, g_value_get_int (value));
+@@ -620,8 +597,8 @@ e_contact_entry_get_property (GObject *o
+   entry = E_CONTACT_ENTRY (object);
+   
+   switch (property_id) {
+-  case PROP_SOURCE_LIST:
+-    g_value_set_object (value, e_contact_entry_get_source_list (entry));
++  case PROP_REGISTRY:
++    g_value_set_object (value, e_contact_entry_get_registry (entry));
+     break;
+   case PROP_COMPLETE_LENGTH:
+     g_value_set_int (value, e_contact_entry_get_complete_length (entry));
+@@ -644,7 +621,7 @@ e_contact_entry_finalize (GObject *objec
+     g_list_free (entry->priv->lookup_entries);
+     g_object_unref (entry->priv->completion);
+     g_object_unref (entry->priv->store);
+-    g_object_unref (entry->priv->source_list);
++    g_object_unref (entry->priv->registry);
+ 
+     if (entry->priv->display_destroy) {
+       entry->priv->display_destroy (entry->priv->display_func);
+@@ -657,7 +634,7 @@ e_contact_entry_finalize (GObject *objec
+ static void
+ reset_search_fields (EContactEntry *entry)
+ {
+-  EContactField fields[] = { E_CONTACT_FULL_NAME, E_CONTACT_EMAIL, E_CONTACT_NICKNAME, E_CONTACT_ORG, 0 };
++  EContactField fields[] = { E_CONTACT_FULL_NAME, E_CONTACT_EMAIL, E_CONTACT_NICKNAME, 0 };
+ 
+   g_free (entry->priv->search_fields);
+   entry->priv->search_fields = g_new0 (EContactField, G_N_ELEMENTS (fields));
+@@ -716,9 +693,9 @@ e_contact_entry_class_init (EContactEntr
+   object_class->finalize = e_contact_entry_finalize;
+ 
+   /* Properties */
+-  g_object_class_install_property (object_class, PROP_SOURCE_LIST,
+-                                   g_param_spec_object ("source-list", "Source List", "The source list to search for contacts.",
+-                                                        E_TYPE_SOURCE_LIST, G_PARAM_READWRITE));
++  g_object_class_install_property (object_class, PROP_REGISTRY,
++                                   g_param_spec_object ("registry", "Registry", "Data source registry.",
++                                                        E_TYPE_SOURCE_REGISTRY, G_PARAM_READWRITE));
+   
+   g_object_class_install_property (object_class, PROP_COMPLETE_LENGTH,
+                                    g_param_spec_int ("complete-length", "Complete length", "Number of characters to start a search on.",
+@@ -771,6 +748,7 @@ lookup_entry_free (EntryLookup *lookup)
+   if (lookup->bookview) {
+     g_warning("EBookView still around");
+     g_object_unref (lookup->bookview);
++    lookup->bookview = NULL;
+   }
+   if (lookup->book) {
+     g_object_unref (lookup->book);
+diff -up gnome-phone-manager-0.68/cut-n-paste/e-contact-entry/e-contact-entry.h.eds gnome-phone-manager-0.68/cut-n-paste/e-contact-entry/e-contact-entry.h
+--- gnome-phone-manager-0.68/cut-n-paste/e-contact-entry/e-contact-entry.h.eds	2012-07-29 22:06:12.000000000 -0400
++++ gnome-phone-manager-0.68/cut-n-paste/e-contact-entry/e-contact-entry.h	2012-10-30 15:02:47.177996584 -0400
+@@ -23,10 +23,8 @@
+ #ifndef CONTACT_ENTRY_H
+ #define CONTACT_ENTRY_H
+ 
+-#include <libedataserver/e-source-group.h>
+-#include <libedataserver/e-source-list.h>
+-#include <libebook/e-contact.h>
+ #include <gtk/gtk.h>
++#include <libebook/libebook.h>
+ 
+ G_BEGIN_DECLS
+ 
+@@ -71,8 +69,8 @@ GType e_contact_entry_get_type (void);
+ 
+ GtkWidget *e_contact_entry_new (void);
+ 
+-void e_contact_entry_set_source_list (EContactEntry *entry, ESourceList *list);
+-ESourceList *e_contact_entry_get_source_list (EContactEntry *entry);
++void e_contact_entry_set_registry (EContactEntry *entry, ESourceRegistry *registry);
++ESourceRegistry *e_contact_entry_get_registry (EContactEntry *entry);
+ 
+ void e_contact_entry_set_complete_length(EContactEntry *entry, int length);
+ int e_contact_entry_get_complete_length(EContactEntry *entry);
+diff -up gnome-phone-manager-0.68/libgsm/phonemgr-utils.c.eds gnome-phone-manager-0.68/libgsm/phonemgr-utils.c
+--- gnome-phone-manager-0.68/libgsm/phonemgr-utils.c.eds	2012-07-29 22:06:12.000000000 -0400
++++ gnome-phone-manager-0.68/libgsm/phonemgr-utils.c	2012-10-30 15:02:47.177996584 -0400
+@@ -27,7 +27,7 @@
+ #include <glib.h>
+ #include <glib/gstdio.h>
+ #include <glib-object.h>
+-#include <libebook/e-contact.h>
++#include <libebook/libebook.h>
+ #include <gnokii.h>
+ 
+ #include <bluetooth/bluetooth.h>
+diff -up gnome-phone-manager-0.68/src/e-phone-entry.c.eds gnome-phone-manager-0.68/src/e-phone-entry.c
+--- gnome-phone-manager-0.68/src/e-phone-entry.c.eds	2012-07-29 22:06:12.000000000 -0400
++++ gnome-phone-manager-0.68/src/e-phone-entry.c	2012-10-30 15:04:13.471829767 -0400
+@@ -31,8 +31,6 @@
+ 
+ #include <gtk/gtk.h>
+ #include <string.h>
+-#include <libedataserver/e-source-list.h>
+-#include <libedataserverui/e-client-utils.h>
+ #include "e-phone-entry.h"
+ 
+ #define CONTACT_FORMAT "%s (%s)"
+@@ -181,25 +179,25 @@ e_phone_entry_finalize (GObject *object)
+ }
+ 
+ static void
+-add_sources (EContactEntry *entry)
+-{
+-	ESourceList *source_list;
+-
+-	if (e_client_utils_get_sources (&source_list,
+-					E_CLIENT_SOURCE_TYPE_CONTACTS,
+-					NULL)) {
+-		e_contact_entry_set_source_list (E_CONTACT_ENTRY (entry),
+-						 source_list);
+-		g_object_unref (source_list);
+-	}
+-}
+-
+-static void
+ e_phone_entry_init (EPhoneEntry *entry)
+ {
+ 	EContactField fields[] = { E_CONTACT_FULL_NAME, E_CONTACT_NICKNAME, E_CONTACT_ORG, E_CONTACT_PHONE_MOBILE, 0 };
++	ESourceRegistry *registry;
++	GError *error = NULL;
++
++	/* XXX This call blocks while a D-Bus connection is made, possibly
++	 *     requiring activation.  Might be better to create the registry
++	 *     in main(), pass it to ui_init(), and have e_phone_entry_new()
++	 *     take it as an argument.  Calling this from main() means if it
++	 *     fails you can abort cleanly with a console error message. */
++	registry = e_source_registry_new_sync (NULL, &error);
++	if (registry == NULL) {
++		g_error ("%s: %s", G_STRFUNC, error->message);
++		g_assert_not_reached ();
++	}
++	e_contact_entry_set_registry (E_CONTACT_ENTRY (entry), registry);
++	g_object_unref (registry);
+ 
+-	add_sources (E_CONTACT_ENTRY (entry));
+ 	e_contact_entry_set_search_fields (E_CONTACT_ENTRY (entry), (const EContactField *)fields);
+ 	e_contact_entry_set_display_func (E_CONTACT_ENTRY (entry), test_display_func, NULL, NULL);
+ 	g_signal_connect (G_OBJECT (entry), "contact_selected",



More information about the arch-commits mailing list