[Xfce4-commits] <xfce4-panel:devel> Implement a remote-event signal for plugins.
Nick Schermer
noreply at xfce.org
Thu Nov 19 22:44:01 CET 2009
Updating branch refs/heads/devel
to 698394d9836458f7aeeb6985f070b80a2695d78e (commit)
from 1d725a5eeb756d81b9782f275c073814fdb7eba7 (commit)
commit 698394d9836458f7aeeb6985f070b80a2695d78e
Author: Nick Schermer <nick at xfce.org>
Date: Thu Nov 19 22:28:05 2009 +0100
Implement a remote-event signal for plugins.
This allows to send messages to plugins using the (hidden)
xfce4-panel command line option
--plugin-event=plugin-name:name:type:value. This can for
example be used to popup a plugin menu from a script.
Plugins running in a wrapper don't support the boolean return
value yet.
libxfce4panel/libxfce4panel-marshal.list | 1 +
libxfce4panel/libxfce4panel.symbols | 1 +
libxfce4panel/xfce-panel-plugin-provider.c | 12 +++
libxfce4panel/xfce-panel-plugin-provider.h | 7 ++
libxfce4panel/xfce-panel-plugin.c | 47 ++++++++++++
libxfce4panel/xfce-panel-plugin.h | 3 +
panel/main.c | 16 +++-
panel/panel-dbus-client.c | 105 ++++++++++++++++++++++++++++
panel/panel-dbus-client.h | 3 +
panel/panel-dbus-service-infos.xml | 16 ++++
panel/panel-dbus-service.c | 69 +++++++++++++++----
panel/panel-module-factory.c | 77 +++++++++++---------
panel/panel-module-factory.h | 4 +-
panel/panel-plugin-external.c | 22 ++++++
wrapper/main.c | 2 +-
15 files changed, 330 insertions(+), 55 deletions(-)
diff --git a/libxfce4panel/libxfce4panel-marshal.list b/libxfce4panel/libxfce4panel-marshal.list
index 8ff8506..e5268b6 100644
--- a/libxfce4panel/libxfce4panel-marshal.list
+++ b/libxfce4panel/libxfce4panel-marshal.list
@@ -1 +1,2 @@
BOOLEAN:INT
+BOOLEAN:STRING,BOXED
diff --git a/libxfce4panel/libxfce4panel.symbols b/libxfce4panel/libxfce4panel.symbols
index 17c8978..6c339a2 100644
--- a/libxfce4panel/libxfce4panel.symbols
+++ b/libxfce4panel/libxfce4panel.symbols
@@ -131,5 +131,6 @@ xfce_panel_plugin_provider_show_configure
xfce_panel_plugin_provider_get_show_about
xfce_panel_plugin_provider_show_about
xfce_panel_plugin_provider_remove
+xfce_panel_plugin_provider_remote_event
#endif
#endif
diff --git a/libxfce4panel/xfce-panel-plugin-provider.c b/libxfce4panel/xfce-panel-plugin-provider.c
index 9ab5406..7ed6375 100644
--- a/libxfce4panel/xfce-panel-plugin-provider.c
+++ b/libxfce4panel/xfce-panel-plugin-provider.c
@@ -206,5 +206,17 @@ xfce_panel_plugin_provider_remove (XfcePanelPluginProvider *provider)
+gboolean
+xfce_panel_plugin_provider_remote_event (XfcePanelPluginProvider *provider,
+ const gchar *name,
+ const GValue *value)
+{
+ panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider), TRUE);
+
+ return (*XFCE_PANEL_PLUGIN_PROVIDER_GET_IFACE (provider)->remote_event) (provider, name, value);
+}
+
+
+
#define __XFCE_PANEL_PLUGIN_PROVIDER_C__
#include <libxfce4panel/libxfce4panel-aliasdef.c>
diff --git a/libxfce4panel/xfce-panel-plugin-provider.h b/libxfce4panel/xfce-panel-plugin-provider.h
index c147590..ea413ee 100644
--- a/libxfce4panel/xfce-panel-plugin-provider.h
+++ b/libxfce4panel/xfce-panel-plugin-provider.h
@@ -67,6 +67,9 @@ struct _XfcePanelPluginProviderIface
gboolean (*get_show_about) (XfcePanelPluginProvider *provider);
void (*show_about) (XfcePanelPluginProvider *provider);
void (*remove) (XfcePanelPluginProvider *provider);
+ gboolean (*remote_event) (XfcePanelPluginProvider *provider,
+ const gchar *name,
+ const GValue *value);
};
/* signals send from the plugin to the panel (possibly
@@ -123,6 +126,10 @@ void xfce_panel_plugin_provider_show_about (XfcePanelPluginProv
void xfce_panel_plugin_provider_remove (XfcePanelPluginProvider *provider);
+gboolean xfce_panel_plugin_provider_remote_event (XfcePanelPluginProvider *provider,
+ const gchar *name,
+ const GValue *value);
+
G_END_DECLS
#endif /* !__XFCE_PANEL_PLUGIN_PROVIDER_H__ */
diff --git a/libxfce4panel/xfce-panel-plugin.c b/libxfce4panel/xfce-panel-plugin.c
index 44dbc60..9098817 100644
--- a/libxfce4panel/xfce-panel-plugin.c
+++ b/libxfce4panel/xfce-panel-plugin.c
@@ -79,6 +79,9 @@ static void xfce_panel_plugin_show_configure (XfcePanelPluginPr
static gboolean xfce_panel_plugin_get_show_about (XfcePanelPluginProvider *provider);
static void xfce_panel_plugin_show_about (XfcePanelPluginProvider *provider);
static void xfce_panel_plugin_remove (XfcePanelPluginProvider *provider);
+static gboolean xfce_panel_plugin_remote_event (XfcePanelPluginProvider *provider,
+ const gchar *name,
+ const GValue *value);
static void xfce_panel_plugin_take_window_notify (gpointer data,
GObject *where_the_object_was);
@@ -104,6 +107,7 @@ enum
CONFIGURE_PLUGIN,
FREE_DATA,
ORIENTATION_CHANGED,
+ REMOTE_EVENT,
REMOVED,
SAVE,
SIZE_CHANGED,
@@ -261,6 +265,29 @@ xfce_panel_plugin_class_init (XfcePanelPluginClass *klass)
G_TYPE_NONE, 1, GTK_TYPE_ORIENTATION);
/**
+ * XfcePanelPlugin::remote-event
+ * @plugin : an #XfcePanelPlugin.
+ * @name : name of the signal.
+ * @value : value of the signal.
+ *
+ * This signal is emmitted by the user by running
+ * xfce4-panel --plugin-event=plugin-name:name:type:value. It can be
+ * used for remote communication, like for example to popup a menu.
+ *
+ * Returns: %TRUE to stop signal emission to other plugins, %FALSE
+ * to send the signal also to other plugins with the same
+ * name.
+ **/
+ plugin_signals[REMOTE_EVENT] =
+ g_signal_new (g_intern_static_string ("remote-event"),
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (XfcePanelPluginClass, remote_event),
+ NULL, NULL,
+ _libxfce4panel_marshal_BOOLEAN__STRING_BOXED,
+ G_TYPE_BOOLEAN, 2, G_TYPE_STRING, G_TYPE_VALUE);
+
+ /**
* XfcePanelPlugin::removed
* @plugin : an #XfcePanelPlugin.
*
@@ -517,6 +544,7 @@ xfce_panel_plugin_provider_init (XfcePanelPluginProviderIface *iface)
iface->get_show_about = xfce_panel_plugin_get_show_about;
iface->show_about = xfce_panel_plugin_show_about;
iface->remove = xfce_panel_plugin_remove;
+ iface->remote_event = xfce_panel_plugin_remote_event;
}
@@ -1192,6 +1220,25 @@ xfce_panel_plugin_remove (XfcePanelPluginProvider *provider)
+static gboolean
+xfce_panel_plugin_remote_event (XfcePanelPluginProvider *provider,
+ const gchar *name,
+ const GValue *value)
+{
+ gboolean stop_emission;
+
+ panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN (provider), TRUE);
+ panel_return_val_if_fail (name != NULL, TRUE);
+ panel_return_val_if_fail (G_IS_VALUE (value), TRUE);
+
+ g_signal_emit (G_OBJECT (provider), plugin_signals[REMOTE_EVENT], 0,
+ name, value, &stop_emission);
+
+ return stop_emission;
+}
+
+
+
static void
xfce_panel_plugin_take_window_notify (gpointer data,
GObject *where_the_object_was)
diff --git a/libxfce4panel/xfce-panel-plugin.h b/libxfce4panel/xfce-panel-plugin.h
index f881aab..dd8e3bd 100644
--- a/libxfce4panel/xfce-panel-plugin.h
+++ b/libxfce4panel/xfce-panel-plugin.h
@@ -59,6 +59,9 @@ struct _XfcePanelPluginClass
void (*about) (XfcePanelPlugin *plugin);
void (*configure_plugin) (XfcePanelPlugin *plugin);
void (*removed) (XfcePanelPlugin *plugin);
+ gboolean (*remote_event) (XfcePanelPlugin *plugin,
+ const gchar *name,
+ const GValue *value);
/*< private >*/
void (*reserved1) (void);
diff --git a/panel/main.c b/panel/main.c
index 48e121d..6dce020 100644
--- a/panel/main.c
+++ b/panel/main.c
@@ -56,6 +56,7 @@ static gchar *opt_add = NULL;
static gboolean opt_restart = FALSE;
static gboolean opt_quit = FALSE;
static gboolean opt_version = FALSE;
+static gchar *opt_plugin_event = NULL;
static gchar **opt_arguments = NULL;
@@ -71,13 +72,14 @@ static gboolean callback_handler (const gchar *name,
#define PANEL_CALLBACK_OPTION G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, callback_handler
static GOptionEntry option_entries[] =
{
- { "preferences", 'p', PANEL_CALLBACK_OPTION, N_("Show the 'Panel Preferences' dialog"), N_("PANEL NUMBER") },
- { "add-items", 'a', PANEL_CALLBACK_OPTION, N_("Show the 'Add New Items' dialog"), N_("PANEL NUMBER") },
+ { "preferences", 'p', PANEL_CALLBACK_OPTION, N_("Show the 'Panel Preferences' dialog"), N_("PANEL-NUMBER") },
+ { "add-items", 'a', PANEL_CALLBACK_OPTION, N_("Show the 'Add New Items' dialog"), N_("PANEL-NUMBER") },
{ "save", 's', 0, G_OPTION_ARG_NONE, &opt_save, N_("Save the panel configuration"), NULL },
- { "add", '\0', 0, G_OPTION_ARG_STRING, &opt_add, N_("Add a new plugin to the panel"), N_("PLUGIN NAME") },
+ { "add", '\0', 0, G_OPTION_ARG_STRING, &opt_add, N_("Add a new plugin to the panel"), N_("PLUGIN-NAME") },
{ "restart", 'r', 0, G_OPTION_ARG_NONE, &opt_restart, N_("Restart the running panel instance"), NULL },
{ "quit", 'q', 0, G_OPTION_ARG_NONE, &opt_quit, N_("Quit the running panel instance"), NULL },
{ "version", 'V', 0, G_OPTION_ARG_NONE, &opt_version, N_("Print version information and exit"), NULL },
+ { "plugin-event", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &opt_plugin_event, NULL, NULL },
{ G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &opt_arguments, NULL, NULL },
{ NULL }
};
@@ -192,7 +194,7 @@ main (gint argc, gchar **argv)
result = panel_dbus_client_save (&error);
goto dbus_return;
}
- else if (opt_add)
+ else if (opt_add != NULL)
{
/* stop any running startup notification */
gdk_notify_startup_complete ();
@@ -207,6 +209,12 @@ main (gint argc, gchar **argv)
result = panel_dbus_client_terminate (opt_restart, &error);
goto dbus_return;
}
+ else if (opt_plugin_event != NULL)
+ {
+ /* send the plugin event to the running instance */
+ result = panel_dbus_client_plugin_event (opt_plugin_event, &error);
+ goto dbus_return;
+ }
else if (panel_dbus_client_check_instance_running ())
{
/* quit without error if and instance is running */
diff --git a/panel/panel-dbus-client.c b/panel/panel-dbus-client.c
index 99d8396..03716f5 100644
--- a/panel/panel-dbus-client.c
+++ b/panel/panel-dbus-client.c
@@ -20,6 +20,10 @@
#include <config.h>
#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
#include <dbus/dbus-glib.h>
#include <libxfce4util/libxfce4util.h>
#include <common/panel-private.h>
@@ -34,6 +38,17 @@
+enum
+{
+ PLUGIN_NAME,
+ NAME,
+ TYPE,
+ VALUE,
+ N_TOKENS
+};
+
+
+
static DBusGProxy *
panel_dbus_client_get_proxy (GError **error)
{
@@ -175,6 +190,96 @@ panel_dbus_client_add_new_item (const gchar *plugin_name,
+static GType
+panel_dbus_client_gtype_from_string (const gchar *str)
+{
+ if (strcmp (str, "bool") == 0)
+ return G_TYPE_BOOLEAN;
+ else if (strcmp (str, "double") == 0)
+ return G_TYPE_DOUBLE;
+ else if (strcmp (str, "int") == 0)
+ return G_TYPE_INT;
+ else if (strcmp (str, "string") == 0)
+ return G_TYPE_STRING;
+ else if (strcmp (str, "uint") == 0)
+ return G_TYPE_UINT;
+ else
+ return G_TYPE_NONE;
+}
+
+
+
+gboolean
+panel_dbus_client_plugin_event (const gchar *plugin_event,
+ GError **error)
+{
+ DBusGProxy *dbus_proxy;
+ gboolean result = FALSE;
+ gchar **tokens;
+ GType type;
+ GValue value = { 0, };
+
+ panel_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ dbus_proxy = panel_dbus_client_get_proxy (error);
+ if (G_UNLIKELY (dbus_proxy == NULL))
+ return FALSE;
+
+ tokens = g_strsplit (plugin_event, ":", -1);
+ if (G_LIKELY (g_strv_length (tokens) == N_TOKENS
+ && IS_STRING (tokens[VALUE])
+ && IS_STRING (tokens[NAME])
+ && *tokens[NAME] != SIGNAL_PREFIX))
+ {
+ type = panel_dbus_client_gtype_from_string (tokens[TYPE]);
+ if (G_LIKELY (type != G_TYPE_NONE))
+ {
+ g_value_init (&value, type);
+
+ if (type == G_TYPE_BOOLEAN)
+ g_value_set_boolean (&value, strcmp (tokens[VALUE], "true") == 0);
+ else if (type == G_TYPE_DOUBLE)
+ g_value_set_double (&value, g_ascii_strtod (tokens[VALUE], NULL));
+ else if (type == G_TYPE_INT)
+ g_value_set_int (&value, strtol (tokens[VALUE], NULL, 0));
+ else if (type == G_TYPE_STRING)
+ g_value_set_static_string (&value, tokens[VALUE]);
+ else if (type == G_TYPE_UINT)
+ g_value_set_uint (&value, strtol (tokens[VALUE], NULL, 0));
+ else
+ panel_assert_not_reached ();
+
+ result = _panel_dbus_client_plugin_event (dbus_proxy,
+ tokens[PLUGIN_NAME],
+ tokens[NAME],
+ &value,
+ error);
+
+ g_value_unset (&value);
+ }
+ else
+ {
+ g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Invalid hint type \"%s\". Valid types "
+ "are bool, double, int, string and uint."),
+ tokens[TYPE]);
+ }
+ }
+ else
+ {
+ g_set_error_literal (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
+ _("Invalid plugin event syntax specified. "
+ "Use PLUGIN-NAME:NAME:TYPE:VALUE."));
+ }
+
+ g_strfreev (tokens);
+ g_object_unref (G_OBJECT (dbus_proxy));
+
+ return result;
+}
+
+
+
gboolean
panel_dbus_client_terminate (gboolean restart,
GError **error)
diff --git a/panel/panel-dbus-client.h b/panel/panel-dbus-client.h
index 7581732..73d284d 100644
--- a/panel/panel-dbus-client.h
+++ b/panel/panel-dbus-client.h
@@ -36,6 +36,9 @@ gboolean panel_dbus_client_add_new_item (const gchar *plugin_nam
gchar **arguments,
GError **error);
+gboolean panel_dbus_client_plugin_event (const gchar *plugin_event,
+ GError **error);
+
gboolean panel_dbus_client_terminate (gboolean restart,
GError **error);
diff --git a/panel/panel-dbus-service-infos.xml b/panel/panel-dbus-service-infos.xml
index 5a9dd59..8c2d8b7 100644
--- a/panel/panel-dbus-service-infos.xml
+++ b/panel/panel-dbus-service-infos.xml
@@ -53,6 +53,22 @@
<arg name="plugin_name" direction="in" type="s" />
<arg name="arguments" direction="in" type="as" />
</method>
+
+ <!--
+ PluginEvent (plugin-name : STRING, name : STRING, value : VARIANT)
+
+ plugin-name : Name of the panel plugins to send this event to.
+ name : Event signal name.
+ value : GValue holding the event data.
+
+ Send a plugin to a group of plugins using the remote-event
+ XfcePanelPlugin signal.
+ -->
+ <method name="PluginEvent">
+ <arg name="plugin_name" direction="in" type="s" />
+ <arg name="name" direction="in" type="s" />
+ <arg name="value" direction="in" type="v" />
+ </method>
<!--
Terminate (restart : BOOL) : VOID
diff --git a/panel/panel-dbus-service.c b/panel/panel-dbus-service.c
index 7435a1c..deafd22 100644
--- a/panel/panel-dbus-service.c
+++ b/panel/panel-dbus-service.c
@@ -42,22 +42,27 @@
-static void panel_dbus_service_finalize (GObject *object);
-static gboolean panel_dbus_service_display_preferences_dialog (PanelDBusService *service,
- guint active,
- GError **error);
-static gboolean panel_dbus_service_display_items_dialog (PanelDBusService *service,
- guint active,
- GError **error);
-static gboolean panel_dbus_service_save (PanelDBusService *service,
- GError **error);
-static gboolean panel_dbus_service_add_new_item (PanelDBusService *service,
+static void panel_dbus_service_finalize (GObject *object);
+static gboolean panel_dbus_service_display_preferences_dialog (PanelDBusService *service,
+ guint active,
+ GError **error);
+static gboolean panel_dbus_service_display_items_dialog (PanelDBusService *service,
+ guint active,
+ GError **error);
+static gboolean panel_dbus_service_save (PanelDBusService *service,
+ GError **error);
+static gboolean panel_dbus_service_add_new_item (PanelDBusService *service,
+ const gchar *plugin_name,
+ gchar **arguments,
+ GError **error);
+static gboolean panel_dbus_service_plugin_event (PanelDBusService *service,
const gchar *plugin_name,
- gchar **arguments,
- GError **error);
-static gboolean panel_dbus_service_terminate (PanelDBusService *service,
- gboolean restart,
+ const gchar *name,
+ const GValue *value,
GError **error);
+static gboolean panel_dbus_service_terminate (PanelDBusService *service,
+ gboolean restart,
+ GError **error);
@@ -243,6 +248,42 @@ panel_dbus_service_add_new_item (PanelDBusService *service,
static gboolean
+panel_dbus_service_plugin_event (PanelDBusService *service,
+ const gchar *plugin_name,
+ const gchar *name,
+ const GValue *value,
+ GError **error)
+{
+ GSList *plugins, *li;
+ PanelModuleFactory *factory;
+
+ panel_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE);
+ panel_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+ panel_return_val_if_fail (plugin_name != NULL, FALSE);
+ panel_return_val_if_fail (name != NULL, FALSE);
+ panel_return_val_if_fail (G_IS_VALUE (value), FALSE);
+
+ factory = panel_module_factory_get ();
+
+ plugins = panel_module_factory_get_plugins (factory, plugin_name);
+
+ for (li = plugins; li != NULL; li = li->next)
+ {
+ panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (li->data), FALSE);
+ if (xfce_panel_plugin_provider_remote_event (li->data, name, value))
+ break;
+ }
+
+ g_slist_free (plugins);
+
+ g_object_unref (G_OBJECT (factory));
+
+ return TRUE;
+}
+
+
+
+static gboolean
panel_dbus_service_terminate (PanelDBusService *service,
gboolean restart,
GError **error)
diff --git a/panel/panel-module-factory.c b/panel/panel-module-factory.c
index 82e198b..4ab737f 100644
--- a/panel/panel-module-factory.c
+++ b/panel/panel-module-factory.c
@@ -254,6 +254,22 @@ panel_module_factory_remove_plugin (gpointer user_data,
+static gboolean
+panel_module_factory_unique_id_exists (PanelModuleFactory *factory,
+ gint unique_id)
+{
+ GSList *li;
+
+ for (li = factory->plugins; li != NULL; li = li->next)
+ if (xfce_panel_plugin_provider_get_unique_id (
+ XFCE_PANEL_PLUGIN_PROVIDER (li->data)) == unique_id)
+ return TRUE;
+
+ return FALSE;
+}
+
+
+
PanelModuleFactory *
panel_module_factory_get (void)
{
@@ -318,20 +334,6 @@ panel_module_factory_emit_unique_changed (PanelModule *module)
-#if !GLIB_CHECK_VERSION (2,14,0)
-static void
-panel_module_factory_get_modules_foreach (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- GList **keys = user_data;
-
- *keys = g_list_prepend (*keys, key);
-}
-#endif
-
-
-
GList *
panel_module_factory_get_modules (PanelModuleFactory *factory)
{
@@ -344,16 +346,7 @@ panel_module_factory_get_modules (PanelModuleFactory *factory)
g_hash_table_foreach_remove (factory->modules,
panel_module_factory_modules_cleanup, factory);
-#if !GLIB_CHECK_VERSION (2,14,0)
- GList *value = NULL;
-
- g_hash_table_foreach (factory->modules,
- panel_module_factory_get_modules_foreach, &value);
-
- return value;
-#else
return g_hash_table_get_values (factory->modules);
-#endif
}
@@ -370,22 +363,38 @@ panel_module_factory_has_module (PanelModuleFactory *factory,
-GtkWidget *
-panel_module_factory_get_plugin (PanelModuleFactory *factory,
- gint unique_id)
+GSList *
+panel_module_factory_get_plugins (PanelModuleFactory *factory,
+ const gchar *plugin_name)
{
- GSList *li;
+ GSList *li, *plugins = NULL;
+ gchar *unique_name;
panel_return_val_if_fail (PANEL_IS_MODULE_FACTORY (factory), NULL);
- panel_return_val_if_fail (unique_id != -1, NULL);
+ panel_return_val_if_fail (plugin_name != NULL, NULL);
- /* traverse the list to find the plugin with this unique id */
+ /* first assume a global plugin name is provided */
for (li = factory->plugins; li != NULL; li = li->next)
- if (xfce_panel_plugin_provider_get_unique_id (
- XFCE_PANEL_PLUGIN_PROVIDER (li->data)) == unique_id)
- return GTK_WIDGET (li->data);
+ {
+ panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (li->data), NULL);
+ if (strcmp (xfce_panel_plugin_provider_get_name (li->data), plugin_name) == 0)
+ plugins = g_slist_prepend (plugins, li->data);
+ }
+
+ /* try the unique plugin name (with id) if nothing is found */
+ for (li = factory->plugins; plugins == NULL && li != NULL; li = li->next)
+ {
+ panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (li->data), NULL);
+ unique_name = g_strdup_printf ("%s-%d", xfce_panel_plugin_provider_get_name (li->data),
+ xfce_panel_plugin_provider_get_unique_id (li->data));
+
+ if (strcmp (unique_name, plugin_name) == 0)
+ plugins = g_slist_prepend (plugins, li->data);
+
+ g_free (unique_name);
+ }
- return NULL;
+ return plugins;
}
@@ -418,7 +427,7 @@ panel_module_factory_new_plugin (PanelModuleFactory *factory,
/* make sure this plugin has a unique id */
while (unique_id == -1
- || panel_module_factory_get_plugin (factory, unique_id) != NULL)
+ || panel_module_factory_unique_id_exists (factory, unique_id))
unique_id = ++unique_id_counter;
/* set the return value with an always valid unique id */
diff --git a/panel/panel-module-factory.h b/panel/panel-module-factory.h
index 149e88b..c99cbc7 100644
--- a/panel/panel-module-factory.h
+++ b/panel/panel-module-factory.h
@@ -53,8 +53,8 @@ GList *panel_module_factory_get_modules (PanelModuleFactory
gboolean panel_module_factory_has_module (PanelModuleFactory *factory,
const gchar *name);
-GtkWidget *panel_module_factory_get_plugin (PanelModuleFactory *factory,
- gint unique_id);
+GSList *panel_module_factory_get_plugins (PanelModuleFactory *factory,
+ const gchar *plugin_name);
GtkWidget *panel_module_factory_new_plugin (PanelModuleFactory *factory,
const gchar *name,
diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c
index 353c6ac..4e50696 100644
--- a/panel/panel-plugin-external.c
+++ b/panel/panel-plugin-external.c
@@ -101,6 +101,9 @@ static void panel_plugin_external_show_configure (XfcePanelPlugin
static gboolean panel_plugin_external_get_show_about (XfcePanelPluginProvider *provider);
static void panel_plugin_external_show_about (XfcePanelPluginProvider *provider);
static void panel_plugin_external_remove (XfcePanelPluginProvider *provider);
+static gboolean panel_plugin_external_remote_event (XfcePanelPluginProvider *provider,
+ const gchar *name,
+ const GValue *value);
static void panel_plugin_external_set_sensitive (PanelPluginExternal *external);
static void panel_plugin_external_child_watch (GPid pid,
gint status,
@@ -279,6 +282,7 @@ panel_plugin_external_provider_init (XfcePanelPluginProviderIface *iface)
iface->get_show_about = panel_plugin_external_get_show_about;
iface->show_about = panel_plugin_external_show_about;
iface->remove = panel_plugin_external_remove;
+ iface->remote_event = panel_plugin_external_remote_event;
}
@@ -901,6 +905,24 @@ panel_plugin_external_remove (XfcePanelPluginProvider *provider)
+static gboolean
+panel_plugin_external_remote_event (XfcePanelPluginProvider *provider,
+ const gchar *name,
+ const GValue *value)
+{
+ panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider), TRUE);
+ panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider), TRUE);
+
+ /* TODO handle the return value */
+
+ panel_plugin_external_dbus_set (PANEL_PLUGIN_EXTERNAL (provider),
+ name, value);
+
+ return TRUE;
+}
+
+
+
static void
panel_plugin_external_set_sensitive (PanelPluginExternal *external)
{
diff --git a/wrapper/main.c b/wrapper/main.c
index 9563097..f5b1813 100644
--- a/wrapper/main.c
+++ b/wrapper/main.c
@@ -122,7 +122,7 @@ wrapper_gproxy_set (DBusGProxy *dbus_gproxy,
}
else
{
- /* external event */
+ xfce_panel_plugin_provider_remote_event (provider, property, value);
}
}
More information about the Xfce4-commits
mailing list