[gnome-panel] make it possible to get applet widget
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-panel] make it possible to get applet widget
- Date: Thu, 6 Nov 2014 22:02:13 +0000 (UTC)
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]