[gnome-panel] libpanel-applet: store applets in hash table



commit 3fe6791d32a415a333bcb7d71d98a6de9929fa27
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Thu Nov 6 19:37:26 2014 +0200

    libpanel-applet: store applets in hash table

 libpanel-applet/panel-applet-factory.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)
---
diff --git a/libpanel-applet/panel-applet-factory.c b/libpanel-applet/panel-applet-factory.c
index 4b32c78..7139261 100644
--- a/libpanel-applet/panel-applet-factory.c
+++ b/libpanel-applet/panel-applet-factory.c
@@ -30,6 +30,9 @@ struct _PanelAppletFactory {
        GType      applet_type;
        GClosure  *closure;
 
+       GHashTable      *applets;
+       guint            next_uid;
+
        GDBusConnection *connection;
        gint             owner_id;
        gint             registration_id;
@@ -73,6 +76,11 @@ panel_applet_factory_finalize (GObject *object)
                factory->factory_id = NULL;
        }
 
+       if (factory->applets) {
+               g_hash_table_unref (factory->applets);
+               factory->applets = NULL;
+       }
+
        if (factory->closure) {
                g_closure_unref (factory->closure);
                factory->closure = NULL;
@@ -84,6 +92,8 @@ panel_applet_factory_finalize (GObject *object)
 static void
 panel_applet_factory_init (PanelAppletFactory *factory)
 {
+       factory->applets = g_hash_table_new (NULL, NULL);
+       factory->next_uid = 1;
 }
 
 static void
@@ -98,6 +108,12 @@ static void
 panel_applet_factory_applet_removed (PanelAppletFactory *factory,
                                     GObject            *applet)
 {
+       guint uid;
+
+       uid = GPOINTER_TO_UINT (g_object_get_data (applet, "uid"));
+
+       g_hash_table_remove (factory->applets, GUINT_TO_POINTER (uid));
+
        factory->n_applets--;
        if (factory->n_applets == 0)
                g_object_unref (factory);
@@ -175,6 +191,7 @@ panel_applet_factory_get_applet (PanelAppletFactory    *factory,
        GVariant    *props;
        GdkScreen   *screen;
        guint32      xid;
+       guint32      uid;
        const gchar *object_path;
 
        g_variant_get (parameters, "(&si a{sv})", &applet_id, &screen_num, &props);
@@ -196,8 +213,12 @@ panel_applet_factory_get_applet (PanelAppletFactory    *factory,
                gdk_screen_get_default ();
 
        xid = panel_applet_get_xid (PANEL_APPLET (applet), screen);
+       uid = factory->next_uid++;
        object_path = panel_applet_get_object_path (PANEL_APPLET (applet));
 
+       g_hash_table_insert (factory->applets, GUINT_TO_POINTER (uid), applet);
+       g_object_set_data (applet, "uid", GUINT_TO_POINTER (uid));
+
        g_dbus_method_invocation_return_value (invocation,
                                               g_variant_new ("(ou)", object_path, xid));
 }


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