gnome-session r4843 - in branches/dbus_based: . gnome-session



Author: mccann
Date: Fri Jul 25 02:46:24 2008
New Revision: 4843
URL: http://svn.gnome.org/viewvc/gnome-session?rev=4843&view=rev

Log:
2008-07-24  William Jon McCann  <jmccann redhat com>

	* gnome-session/gsm-client-store.c (gsm_client_store_remove),
	(foreach_remove_wrapper), (gsm_client_store_foreach_remove),
	(_remove_all), (gsm_client_store_clear):
	* gnome-session/gsm-inhibitor-store.c (gsm_inhibitor_store_remove):
	Make sure client-removed signals are emitted.



Modified:
   branches/dbus_based/ChangeLog
   branches/dbus_based/gnome-session/gsm-client-store.c
   branches/dbus_based/gnome-session/gsm-inhibitor-store.c

Modified: branches/dbus_based/gnome-session/gsm-client-store.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-client-store.c	(original)
+++ branches/dbus_based/gnome-session/gsm-client-store.c	Fri Jul 25 02:46:24 2008
@@ -77,35 +77,32 @@
         return g_hash_table_size (store->priv->clients);
 }
 
-void
-gsm_client_store_clear (GsmClientStore    *store)
-{
-        g_return_if_fail (store != NULL);
-        g_debug ("GsmClientStore: Clearing client store");
-        g_hash_table_remove_all (store->priv->clients);
-}
-
-static gboolean
-remove_client (char              *id,
-                GsmClient        *client,
-                GsmClient        *client_to_remove)
-{
-        if (client == client_to_remove) {
-                return TRUE;
-        }
-        return FALSE;
-}
-
 gboolean
 gsm_client_store_remove (GsmClientStore    *store,
                          GsmClient         *client)
 {
+        GsmClient  *found;
+        gboolean    removed;
+        const char *id;
+
         g_return_val_if_fail (store != NULL, FALSE);
 
-        gsm_client_store_foreach_remove (store,
-                                          (GsmClientStoreFunc)remove_client,
-                                          client);
-        return FALSE;
+        id = gsm_client_get_id (client);
+        if (id == NULL) {
+                return FALSE;
+        }
+
+        found = g_hash_table_lookup (store->priv->clients, id);
+        if (found == NULL) {
+                return FALSE;
+        }
+
+        g_signal_emit (store, signals [CLIENT_REMOVED], 0, id);
+
+        removed = g_hash_table_remove (store->priv->clients, id);
+        g_assert (removed);
+
+        return TRUE;
 }
 
 void
@@ -152,23 +149,71 @@
         return client;
 }
 
+
+typedef struct
+{
+        GsmClientStoreFunc func;
+        gpointer           user_data;
+        GsmClientStore    *store;
+} WrapperData;
+
+static gboolean
+foreach_remove_wrapper (const char   *id,
+                        GsmClient    *client,
+                        WrapperData  *data)
+{
+        gboolean res;
+
+        res = (data->func) (id, client, data->user_data);
+        if (res) {
+                g_signal_emit (data->store, signals [CLIENT_REMOVED], 0, gsm_client_get_id (client));
+        }
+
+        return res;
+}
+
 guint
 gsm_client_store_foreach_remove (GsmClientStore    *store,
                                  GsmClientStoreFunc func,
                                  gpointer           user_data)
 {
-        guint ret;
+        guint       ret;
+        WrapperData data;
 
         g_return_val_if_fail (store != NULL, 0);
         g_return_val_if_fail (func != NULL, 0);
 
+        data.store = store;
+        data.user_data = user_data;
+        data.func = func;
+
         ret = g_hash_table_foreach_remove (store->priv->clients,
-                                           (GHRFunc)func,
-                                           user_data);
+                                           (GHRFunc)foreach_remove_wrapper,
+                                           &data);
 
         return ret;
 }
 
+static gboolean
+_remove_all (guint     *cookie,
+             GsmClient *client,
+             gpointer   data)
+{
+        return TRUE;
+}
+
+void
+gsm_client_store_clear (GsmClientStore *store)
+{
+        g_return_if_fail (store != NULL);
+
+        g_debug ("GsmClientStore: Clearing client store");
+
+        gsm_client_store_foreach_remove (store,
+                                         _remove_all,
+                                         NULL);
+}
+
 gboolean
 gsm_client_store_add (GsmClientStore *store,
                       GsmClient      *client)

Modified: branches/dbus_based/gnome-session/gsm-inhibitor-store.c
==============================================================================
--- branches/dbus_based/gnome-session/gsm-inhibitor-store.c	(original)
+++ branches/dbus_based/gnome-session/gsm-inhibitor-store.c	Fri Jul 25 02:46:24 2008
@@ -98,7 +98,7 @@
                                        GUINT_TO_POINTER (cookie));
         g_assert (removed);
 
-        return FALSE;
+        return TRUE;
 }
 
 void



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