diff options
author | William Jon McCann <mccann@src.gnome.org> | 2007-06-11 21:28:05 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2007-06-11 21:28:05 +0000 |
commit | 457c0141f88419c922909e1f00f2c9ceda887b75 (patch) | |
tree | 18af26ff93b74405b703b41fb4b6158e69505c47 /common | |
parent | 7f67e9af40a1868fbb41508976bda111c8092e7e (diff) | |
download | gdm-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.c | 108 | ||||
-rw-r--r-- | common/gdm-settings-client.h | 47 | ||||
-rw-r--r-- | common/gdm-settings-desktop-backend.c | 2 | ||||
-rw-r--r-- | common/gdm-settings-utils.c | 20 | ||||
-rw-r--r-- | common/gdm-settings-utils.h | 4 |
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, |