[gnome-panel] make it possible to get applet widget



commit 408bab094d1fad471b342548dabc58410a3dc327
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Thu Nov 6 20:25:29 2014 +0200

    make it possible to get applet widget
    
    We will use this to get applet widget from factory. This will
    allow to bypass GtkPlug/GtkSocket.

 .../panel-applets-manager-dbus.c                   |   29 ++++++++++++++++++++
 gnome-panel/panel-applets-manager.c                |   20 +++++++++++++
 gnome-panel/panel-applets-manager.h                |    7 +++++
 libpanel-applet/panel-applet-private.h             |    2 +
 libpanel-applet/panel-applet.c                     |    7 +++++
 5 files changed, 65 insertions(+), 0 deletions(-)
---
diff --git a/gnome-panel/libpanel-applet-private/panel-applets-manager-dbus.c 
b/gnome-panel/libpanel-applet-private/panel-applets-manager-dbus.c
index 518aa3a..0b25ba8 100644
--- a/gnome-panel/libpanel-applet-private/panel-applets-manager-dbus.c
+++ b/gnome-panel/libpanel-applet-private/panel-applets-manager-dbus.c
@@ -45,6 +45,8 @@ struct _PanelAppletsManagerDBusPrivate
 };
 
 typedef gint (* ActivateAppletFunc) (void);
+typedef GtkWidget * (* GetAppletWidgetFunc) (const gchar *factory_id,
+                                             guint        uid);
 
 typedef struct _PanelAppletFactoryInfo {
        gchar              *id;
@@ -52,6 +54,7 @@ typedef struct _PanelAppletFactoryInfo {
        gboolean            in_process;
        GModule            *module;
        ActivateAppletFunc  activate_applet;
+       GetAppletWidgetFunc get_applet_widget;
        guint               n_applets;
 
        gchar              *srcdir;
@@ -394,6 +397,7 @@ panel_applets_manager_dbus_factory_activate (PanelAppletsManager *manager,
 {
        PanelAppletFactoryInfo *info;
        ActivateAppletFunc      activate_applet;
+       GetAppletWidgetFunc     get_applet_widget;
 
        info = get_applet_factory_info (manager, iid);
        if (!info)
@@ -433,6 +437,15 @@ panel_applets_manager_dbus_factory_activate (PanelAppletsManager *manager,
                return FALSE;
        }
 
+       if (!g_module_symbol (info->module, "panel_applet_get_applet_widget", (gpointer *) 
&get_applet_widget)) {
+               /* FIXME: use a GError? */
+               g_warning ("Failed to load applet %s: %s", iid, g_module_error ());
+               g_module_close (info->module);
+               info->module = NULL;
+
+               return FALSE;
+       }
+
        /* Activate the applet */
        if (activate_applet () != 0) {
                /* FIXME: use a GError? */
@@ -443,6 +456,7 @@ panel_applets_manager_dbus_factory_activate (PanelAppletsManager *manager,
                return FALSE;
        }
        info->activate_applet = activate_applet;
+       info->get_applet_widget = get_applet_widget;
 
        info->n_applets = 1;
 
@@ -549,6 +563,20 @@ panel_applets_manager_dbus_load_applet (PanelAppletsManager         *manager,
        return panel_applet_frame_dbus_load (iid, frame_act);
 }
 
+static GtkWidget *
+panel_applets_manager_dbus_get_applet_widget (PanelAppletsManager *manager,
+                                              const gchar         *iid,
+                                              guint                uid)
+{
+       PanelAppletFactoryInfo *info;
+
+       info = get_applet_factory_info (manager, iid);
+       if (!info)
+               return NULL;
+
+       return info->get_applet_widget (info->id, uid);
+}
+
 static void
 panel_applets_manager_dbus_finalize (GObject *object)
 {
@@ -597,6 +625,7 @@ panel_applets_manager_dbus_class_init (PanelAppletsManagerDBusClass *class)
        manager_class->get_applet_info = panel_applets_manager_dbus_get_applet_info;
        manager_class->get_applet_info_from_old_id = panel_applets_manager_dbus_get_applet_info_from_old_id;
        manager_class->load_applet = panel_applets_manager_dbus_load_applet;
+       manager_class->get_applet_widget = panel_applets_manager_dbus_get_applet_widget;
 
        g_type_class_add_private (class, sizeof (PanelAppletsManagerDBusPrivate));
 }
diff --git a/gnome-panel/panel-applets-manager.c b/gnome-panel/panel-applets-manager.c
index 5773767..2597fb3 100644
--- a/gnome-panel/panel-applets-manager.c
+++ b/gnome-panel/panel-applets-manager.c
@@ -197,3 +197,23 @@ panel_applets_manager_load_applet (const gchar                *iid,
 
        return FALSE;
 }
+
+GtkWidget *
+panel_applets_manager_get_applet_widget (const gchar *iid,
+                                         guint        uid)
+{
+       GSList *l;
+
+       _panel_applets_managers_ensure_loaded ();
+
+       for (l = panel_applets_managers; l != NULL; l = l->next) {
+               PanelAppletsManager *manager = PANEL_APPLETS_MANAGER (l->data);
+
+               if (!PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applet_info (manager, iid))
+                       continue;
+
+               return PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applet_widget (manager, iid, uid);
+       }
+
+       return NULL;
+}
diff --git a/gnome-panel/panel-applets-manager.h b/gnome-panel/panel-applets-manager.h
index 79e30cc..8c0649b 100644
--- a/gnome-panel/panel-applets-manager.h
+++ b/gnome-panel/panel-applets-manager.h
@@ -64,6 +64,10 @@ struct _PanelAppletsManagerClass {
        gboolean           (*load_applet)           (PanelAppletsManager         *manager,
                                                     const gchar                 *iid,
                                                     PanelAppletFrameActivating  *frame_act);
+
+       GtkWidget        * (*get_applet_widget)     (PanelAppletsManager         *manager,
+                                                    const gchar                 *iid,
+                                                    guint                        uid);
 };
 
 struct _PanelAppletsManager {
@@ -83,6 +87,9 @@ PanelAppletInfo  *panel_applets_manager_get_applet_info_from_old_id (const gchar
 gboolean          panel_applets_manager_load_applet                 (const gchar                *iid,
                                                                     PanelAppletFrameActivating *frame_act);
 
+GtkWidget        *panel_applets_manager_get_applet_widget           (const gchar     *iid,
+                                                                     guint            uid);
+
 G_END_DECLS
 
 #endif /* __PANEL_APPLETS_MANAGER_H__ */
diff --git a/libpanel-applet/panel-applet-private.h b/libpanel-applet/panel-applet-private.h
index bf0cc14..f531542 100644
--- a/libpanel-applet/panel-applet-private.h
+++ b/libpanel-applet/panel-applet-private.h
@@ -28,6 +28,8 @@ G_BEGIN_DECLS
 guint32      panel_applet_get_xid           (PanelApplet *applet,
                                              GdkScreen   *screen);
 const gchar *panel_applet_get_object_path   (PanelApplet *applet);
+GtkWidget   *panel_applet_get_applet_widget (const gchar *factory_id,
+                                             guint        uid);
 
 G_END_DECLS
 
diff --git a/libpanel-applet/panel-applet.c b/libpanel-applet/panel-applet.c
index 279f8ba..e4e6282 100644
--- a/libpanel-applet/panel-applet.c
+++ b/libpanel-applet/panel-applet.c
@@ -2458,3 +2458,10 @@ panel_applet_get_object_path (PanelApplet *applet)
 {
        return applet->priv->object_path;
 }
+
+G_MODULE_EXPORT GtkWidget *
+panel_applet_get_applet_widget (const gchar *factory_id,
+                                guint        uid)
+{
+       return panel_applet_factory_get_applet_widget (factory_id, uid);
+}


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