summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@src.gnome.org>2007-06-11 21:28:05 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2007-06-11 21:28:05 +0000
commit457c0141f88419c922909e1f00f2c9ceda887b75 (patch)
tree18af26ff93b74405b703b41fb4b6158e69505c47 /common
parent7f67e9af40a1868fbb41508976bda111c8092e7e (diff)
downloadgdm-457c0141f88419c922909e1f00f2c9ceda887b75.tar.gz
Start adding a notification mechanism.
svn path=/branches/mccann-gobject/; revision=4981
Diffstat (limited to 'common')
-rw-r--r--common/gdm-settings-client.c108
-rw-r--r--common/gdm-settings-client.h47
-rw-r--r--common/gdm-settings-desktop-backend.c2
-rw-r--r--common/gdm-settings-utils.c20
-rw-r--r--common/gdm-settings-utils.h4
5 files changed, 159 insertions, 22 deletions
diff --git a/common/gdm-settings-client.c b/common/gdm-settings-client.c
index aaeedf9a..6abe7694 100644
--- a/common/gdm-settings-client.c
+++ b/common/gdm-settings-client.c
@@ -47,9 +47,31 @@
static char *schemas_file = NULL;
static char *schemas_root = NULL;
+static GHashTable *notifiers = NULL;
static GHashTable *schemas = NULL;
static DBusGProxy *settings_proxy = NULL;
static DBusGConnection *connection = NULL;
+static guint32 id_serial = 0;
+
+typedef struct {
+ guint id;
+ char *root;
+ GdmSettingsClientNotifyFunc func;
+ gpointer user_data;
+ GFreeFunc destroy_notify;
+} GdmSettingsClientNotify;
+
+static void
+gdm_settings_client_notify_free (GdmSettingsClientNotify *notify)
+{
+ g_free (notify->root);
+
+ if (notify->destroy_notify != NULL) {
+ notify->destroy_notify (notify->user_data);
+ }
+
+ g_free (notify);
+}
static GdmSettingsEntry *
get_entry_for_key (const char *key)
@@ -110,6 +132,47 @@ assert_signature (GdmSettingsEntry *entry,
g_assert (strcmp (signature, sig) == 0);
}
+static guint32
+get_next_serial (void)
+{
+ guint32 serial;
+
+ serial = id_serial++;
+
+ if ((gint32)id_serial < 0) {
+ id_serial = 1;
+ }
+
+ return serial;
+}
+
+guint
+gdm_settings_client_notify_add (const char *root,
+ GdmSettingsClientNotifyFunc func,
+ gpointer user_data,
+ GFreeFunc destroy_notify)
+{
+ guint32 id;
+ GdmSettingsClientNotify *notify;
+
+ id = get_next_serial ();
+
+ notify = g_new0 (GdmSettingsClientNotify, 1);
+ notify->id = id;
+ notify->root = g_strdup (root);
+ notify->func = func;
+ notify->user_data = user_data;
+ notify->destroy_notify = destroy_notify;
+
+ g_hash_table_insert (notifiers, GINT_TO_POINTER (id), notify);
+}
+
+void
+gdm_settings_client_notify_remove (guint id)
+{
+ g_hash_table_remove (notifiers, GINT_TO_POINTER (id));
+}
+
gboolean
gdm_settings_client_get_string (const char *key,
char **value)
@@ -309,6 +372,42 @@ hashify_list (GdmSettingsEntry *entry,
g_hash_table_insert (schemas, g_strdup (gdm_settings_entry_get_key (entry)), entry);
}
+static void
+send_notification (gpointer key,
+ GdmSettingsClientNotify *notify,
+ GdmSettingsEntry *entry)
+{
+ /* get out if the key is not in the region of interest */
+ if (! g_str_has_prefix (gdm_settings_entry_get_key (entry), notify->root)) {
+ return;
+ }
+
+ notify->func (notify->id, entry, notify->user_data);
+}
+
+static void
+on_value_changed (DBusGProxy *proxy,
+ const char *key,
+ const char *old_value,
+ const char *new_value,
+ gpointer data)
+{
+ GdmSettingsEntry *entry;
+
+ g_debug ("Value Changed key=%s old=%s new=%s", key, old_value, new_value);
+
+ /* lookup entry */
+ entry = get_entry_for_key (key);
+
+ if (entry == NULL) {
+ return;
+ }
+
+ gdm_settings_entry_set_value (entry, new_value);
+
+ g_hash_table_foreach (notifiers, (GHFunc)send_notification, entry);
+}
+
gboolean
gdm_settings_client_init (const char *file,
const char *root)
@@ -346,12 +445,21 @@ gdm_settings_client_init (const char *file,
return FALSE;
}
+ notifiers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)gdm_settings_client_notify_free);
+
schemas = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)gdm_settings_entry_free);
g_slist_foreach (list, (GFunc)hashify_list, NULL);
schemas_file = g_strdup (file);
schemas_root = g_strdup (root);
+ dbus_g_proxy_connect_signal (settings_proxy,
+ "ValueChanged",
+ G_CALLBACK (on_value_changed),
+ NULL,
+ NULL);
+
+
return TRUE;
}
diff --git a/common/gdm-settings-client.h b/common/gdm-settings-client.h
index 8f54ee65..f8cbf16d 100644
--- a/common/gdm-settings-client.h
+++ b/common/gdm-settings-client.h
@@ -23,29 +23,40 @@
#define __GDM_SETTINGS_CLIENT_H
#include <glib-object.h>
+#include "gdm-settings-utils.h"
G_BEGIN_DECLS
-gboolean gdm_settings_client_init (const char *schemas_file,
- const char *root);
+typedef void (*GdmSettingsClientNotifyFunc) (guint id,
+ GdmSettingsEntry *entry,
+ gpointer user_data);
+
+gboolean gdm_settings_client_init (const char *schemas_file,
+ const char *root);
void gdm_settings_client_shutdown (void);
-gboolean gdm_settings_client_get_int (const char *key,
- int *value);
-gboolean gdm_settings_client_get_boolean (const char *key,
- gboolean *value);
-gboolean gdm_settings_client_get_string (const char *key,
- char **value);
-gboolean gdm_settings_client_get_locale_string (const char *key,
- const char *locale,
- char **value);
-
-gboolean gdm_settings_client_set_int (const char *key,
- int value);
-gboolean gdm_settings_client_set_boolean (const char *key,
- gboolean value);
-gboolean gdm_settings_client_set_string (const char *key,
- const char *value);
+gboolean gdm_settings_client_get_int (const char *key,
+ int *value);
+gboolean gdm_settings_client_get_boolean (const char *key,
+ gboolean *value);
+gboolean gdm_settings_client_get_string (const char *key,
+ char **value);
+gboolean gdm_settings_client_get_locale_string (const char *key,
+ const char *locale,
+ char **value);
+
+gboolean gdm_settings_client_set_int (const char *key,
+ int value);
+gboolean gdm_settings_client_set_boolean (const char *key,
+ gboolean value);
+gboolean gdm_settings_client_set_string (const char *key,
+ const char *value);
+
+guint gdm_settings_client_notify_add (const char *namespace_section,
+ GdmSettingsClientNotifyFunc func,
+ gpointer user_data,
+ GFreeFunc destroy_notify);
+void gdm_settings_client_notify_remove (guint id);
G_END_DECLS
diff --git a/common/gdm-settings-desktop-backend.c b/common/gdm-settings-desktop-backend.c
index f69c83a7..9b2c17e8 100644
--- a/common/gdm-settings-desktop-backend.c
+++ b/common/gdm-settings-desktop-backend.c
@@ -49,7 +49,7 @@ struct GdmSettingsDesktopBackendPrivate
static void gdm_settings_desktop_backend_class_init (GdmSettingsDesktopBackendClass *klass);
static void gdm_settings_desktop_backend_init (GdmSettingsDesktopBackend *settings_desktop_backend);
-static void gdm_settings_desktop_backend_finalize (GObject *object);
+static void gdm_settings_desktop_backend_finalize (GObject *object);
G_DEFINE_TYPE (GdmSettingsDesktopBackend, gdm_settings_desktop_backend, GDM_TYPE_SETTINGS_BACKEND)
diff --git a/common/gdm-settings-utils.c b/common/gdm-settings-utils.c
index 82293c98..9fb9ce02 100644
--- a/common/gdm-settings-utils.c
+++ b/common/gdm-settings-utils.c
@@ -42,7 +42,7 @@ struct _GdmSettingsEntry
char *key;
char *signature;
char *default_value;
- GSList *notifiers;
+ char *value;
};
GdmSettingsEntry *
@@ -53,7 +53,7 @@ gdm_settings_entry_new (void)
entry = g_new0 (GdmSettingsEntry, 1);
entry->key = NULL;
entry->signature = NULL;
- entry->notifiers = NULL;
+ entry->value = NULL;
entry->default_value = NULL;
return entry;
@@ -77,13 +77,27 @@ gdm_settings_entry_get_default_value (GdmSettingsEntry *entry)
return entry->default_value;
}
+const char *
+gdm_settings_entry_get_value (GdmSettingsEntry *entry)
+{
+ return entry->value;
+}
+
+void
+gdm_settings_entry_set_value (GdmSettingsEntry *entry,
+ const char *value)
+{
+ g_free (entry->value);
+ entry->value = g_strdup (value);
+}
+
void
gdm_settings_entry_free (GdmSettingsEntry *entry)
{
g_free (entry->key);
g_free (entry->signature);
g_free (entry->default_value);
- g_slist_free (entry->notifiers);
+ g_free (entry->value);
g_free (entry);
}
diff --git a/common/gdm-settings-utils.h b/common/gdm-settings-utils.h
index b6fdec9b..52c1ee82 100644
--- a/common/gdm-settings-utils.h
+++ b/common/gdm-settings-utils.h
@@ -35,6 +35,10 @@ void gdm_settings_entry_free (GdmSettingsEntry
const char * gdm_settings_entry_get_key (GdmSettingsEntry *entry);
const char * gdm_settings_entry_get_signature (GdmSettingsEntry *entry);
const char * gdm_settings_entry_get_default_value (GdmSettingsEntry *entry);
+const char * gdm_settings_entry_get_value (GdmSettingsEntry *entry);
+
+void gdm_settings_entry_set_value (GdmSettingsEntry *entry,
+ const char *value);
gboolean gdm_settings_parse_schemas (const char *file,
const char *root,