From 2f5fb35954021ba1fbd71aa3c6304394d2d67bdd Mon Sep 17 00:00:00 2001 From: lukefromdc Date: Fri, 14 Jul 2017 15:25:37 -0400 Subject: make it possible to get applet widget We will use this to get applet widget from factory. This will allow to bypass GtkPlug/GtkSocket. Based on https://github.com/GNOME/gnome-panel/commit/408bab094d1fad471b342548dabc58410a3dc327 --- libmate-panel-applet/mate-panel-applet.c | 7 ++++++ .../panel-applets-manager-dbus.c | 29 ++++++++++++++++++++++ mate-panel/panel-applets-manager.c | 20 +++++++++++++++ mate-panel/panel-applets-manager.h | 7 ++++++ 4 files changed, 63 insertions(+) diff --git a/libmate-panel-applet/mate-panel-applet.c b/libmate-panel-applet/mate-panel-applet.c index c2e0e476..bf7a1f35 100644 --- a/libmate-panel-applet/mate-panel-applet.c +++ b/libmate-panel-applet/mate-panel-applet.c @@ -2454,3 +2454,10 @@ mate_panel_applet_get_object_path (MatePanelApplet *applet) { return applet->priv->object_path; } + +G_MODULE_EXPORT GtkWidget * +mate_panel_applet_get_applet_widget (const gchar *factory_id, + guint uid) +{ + return mate_panel_applet_factory_get_applet_widget (factory_id, uid); +} diff --git a/mate-panel/libmate-panel-applet-private/panel-applets-manager-dbus.c b/mate-panel/libmate-panel-applet-private/panel-applets-manager-dbus.c index 695f66fb..43263dae 100644 --- a/mate-panel/libmate-panel-applet-private/panel-applets-manager-dbus.c +++ b/mate-panel/libmate-panel-applet-private/panel-applets-manager-dbus.c @@ -46,6 +46,8 @@ struct _MatePanelAppletsManagerDBusPrivate }; typedef gint (* ActivateAppletFunc) (void); +typedef GtkWidget * (* GetAppletWidgetFunc) (const gchar *factory_id, + guint uid); typedef struct _MatePanelAppletFactoryInfo { gchar *id; @@ -53,6 +55,7 @@ typedef struct _MatePanelAppletFactoryInfo { gboolean in_process; GModule *module; ActivateAppletFunc activate_applet; + GetAppletWidgetFunc get_applet_widget; guint n_applets; gchar *srcdir; @@ -395,6 +398,7 @@ mate_panel_applets_manager_dbus_factory_activate (MatePanelAppletsManager *manag { MatePanelAppletFactoryInfo *info; ActivateAppletFunc activate_applet; + GetAppletWidgetFunc get_applet_widget; info = get_applet_factory_info (manager, iid); if (!info) @@ -434,6 +438,15 @@ mate_panel_applets_manager_dbus_factory_activate (MatePanelAppletsManager *manag return FALSE; } + if (!g_module_symbol (info->module, "mate_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? */ @@ -444,6 +457,7 @@ mate_panel_applets_manager_dbus_factory_activate (MatePanelAppletsManager *manag return FALSE; } info->activate_applet = activate_applet; + info->get_applet_widget = get_applet_widget; info->n_applets = 1; @@ -550,6 +564,20 @@ mate_panel_applets_manager_dbus_load_applet (MatePanelAppletsManager *ma return mate_panel_applet_frame_dbus_load (iid, frame_act); } +static GtkWidget * +mate_panel_applets_manager_dbus_get_applet_widget (MatePanelAppletsManager *manager, + const gchar *iid, + guint uid) +{ + MatePanelAppletFactoryInfo *info; + + info = get_applet_factory_info (manager, iid); + if (!info) + return NULL; + + return info->get_applet_widget (info->id, uid); +} + static void mate_panel_applets_manager_dbus_finalize (GObject *object) { @@ -598,6 +626,7 @@ mate_panel_applets_manager_dbus_class_init (MatePanelAppletsManagerDBusClass *cl manager_class->get_applet_info = mate_panel_applets_manager_dbus_get_applet_info; manager_class->get_applet_info_from_old_id = mate_panel_applets_manager_dbus_get_applet_info_from_old_id; manager_class->load_applet = mate_panel_applets_manager_dbus_load_applet; + manager_class->get_applet_widget = mate_panel_applets_manager_dbus_get_applet_widget; g_type_class_add_private (class, sizeof (MatePanelAppletsManagerDBusPrivate)); } diff --git a/mate-panel/panel-applets-manager.c b/mate-panel/panel-applets-manager.c index 9568327e..23b43f0c 100644 --- a/mate-panel/panel-applets-manager.c +++ b/mate-panel/panel-applets-manager.c @@ -199,3 +199,23 @@ mate_panel_applets_manager_load_applet (const gchar *iid, return FALSE; } + +GtkWidget * +mate_panel_applets_manager_get_applet_widget (const gchar *iid, + guint uid) +{ + GSList *l; + + _mate_panel_applets_managers_ensure_loaded (); + + for (l = mate_panel_applets_managers; l != NULL; l = l->next) { + MatePanelAppletsManager *manager = MATE_PANEL_APPLETS_MANAGER (l->data); + + if (!MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applet_info (manager, iid)) + continue; + + return MATE_PANEL_APPLETS_MANAGER_GET_CLASS (manager)->get_applet_widget (manager, iid, uid); + } + + return NULL; +} diff --git a/mate-panel/panel-applets-manager.h b/mate-panel/panel-applets-manager.h index 5ea82bf8..d2c5e2e8 100644 --- a/mate-panel/panel-applets-manager.h +++ b/mate-panel/panel-applets-manager.h @@ -68,6 +68,10 @@ struct _MatePanelAppletsManagerClass { gboolean (*load_applet) (MatePanelAppletsManager *manager, const gchar *iid, MatePanelAppletFrameActivating *frame_act); + + GtkWidget * (*get_applet_widget) (MatePanelAppletsManager *manager, + const gchar *iid, + guint uid); }; struct _MatePanelAppletsManager { @@ -87,6 +91,9 @@ MatePanelAppletInfo *mate_panel_applets_manager_get_applet_info_from_old_id (co gboolean mate_panel_applets_manager_load_applet (const gchar *iid, MatePanelAppletFrameActivating *frame_act); +GtkWidget *mate_panel_applets_manager_get_applet_widget (const gchar *iid, + guint uid); + #ifdef __cplusplus } #endif -- cgit v1.2.1