summaryrefslogtreecommitdiff
path: root/panel
diff options
context:
space:
mode:
authorAli Abdallah <ali@xfce.org>2017-06-21 18:50:09 +0200
committerSimon Steinbeiss <simon.steinbeiss@elfenbeinturm.at>2017-07-02 23:46:31 +0200
commitc3d56227fb0882f389d6a026973efddea08efb10 (patch)
treea2d35eb2b08879d1efc2c9cd1ecaafc1d6c868f6 /panel
parentf590e705122ef85f55093fbc7df5c82a662b9c7a (diff)
downloadxfce4-panel-c3d56227fb0882f389d6a026973efddea08efb10.tar.gz
Port the external plugin wrapper to GDBus
Diffstat (limited to 'panel')
-rw-r--r--panel/Makefile.am12
-rw-r--r--panel/panel-plugin-external-wrapper-infos.xml5
-rw-r--r--panel/panel-plugin-external-wrapper.c270
3 files changed, 173 insertions, 114 deletions
diff --git a/panel/Makefile.am b/panel/Makefile.am
index 89f93c2c..b5f2e48b 100644
--- a/panel/Makefile.am
+++ b/panel/Makefile.am
@@ -19,7 +19,8 @@ xfce4_panel_built_sources = \
panel-gdbus-exported-service.c \
panel-marshal.c \
panel-marshal.h \
- panel-plugin-external-wrapper-infos.h \
+ panel-plugin-external-wrapper-exported.h \
+ panel-plugin-external-wrapper-exported.c \
panel-preferences-dialog-ui.h
xfce4_panel_SOURCES = \
@@ -109,8 +110,13 @@ panel-gdbus-exported-service.c: panel-dbus-service-infos.xml Makefile
--generate-c-code panel-gdbus-exported-service \
$(srcdir)/panel-dbus-service-infos.xml
-panel-plugin-external-wrapper-infos.h: $(srcdir)/panel-plugin-external-wrapper-infos.xml Makefile
- $(AM_V_GEN) dbus-binding-tool --prefix=panel_plugin_external_wrapper --mode=glib-server $< > $@
+panel-plugin-external-wrapper-exported.h:
+panel-plugin-external-wrapper-exported.c: panel-plugin-external-wrapper-infos.xml Makefile
+ $(AM_V_GEN) $(GDBUS_CODEGEN) \
+ --interface-prefix org.xfce.Panel.Wrapper \
+ --c-namespace XfcePanelPluginWrapper \
+ --generate-c-code panel-plugin-external-wrapper-exported \
+ $(srcdir)/panel-plugin-external-wrapper-infos.xml
panel-preferences-dialog-ui.h: $(srcdir)/panel-preferences-dialog.glade Makefile
$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=panel_preferences_dialog_ui $< >$@
diff --git a/panel/panel-plugin-external-wrapper-infos.xml b/panel/panel-plugin-external-wrapper-infos.xml
index e2d46802..4071ac06 100644
--- a/panel/panel-plugin-external-wrapper-infos.xml
+++ b/panel/panel-plugin-external-wrapper-infos.xml
@@ -3,10 +3,7 @@
org.xfce.Panel.Wrapper
-->
<interface name="org.xfce.Panel.Wrapper">
- <annotation name="org.freedesktop.DBus.GLib.CSymbol"
- value="panel_plugin_external_wrapper_dbus" />
- <annotation name="org.freedesktop.DBus.GLib.ClientCSymbol"
- value="wrapper_dbus" />
+ <annotation name="org.gtk.GDBus.C.Name" value="Exported" />
<!--
i : unsigned integer : enum from XfcePanelPluginProviderPropType.
diff --git a/panel/panel-plugin-external-wrapper.c b/panel/panel-plugin-external-wrapper.c
index 6b61713e..ae563766 100644
--- a/panel/panel-plugin-external-wrapper.c
+++ b/panel/panel-plugin-external-wrapper.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2017 Ali Abdallah <ali@xfce.org>
* Copyright (C) 2008-2010 Nick Schermer <nick@xfce.org>
*
* This program is free software; you can redistribute it and/or modify
@@ -44,6 +45,7 @@
#include <panel/panel-module.h>
#include <panel/panel-plugin-external.h>
#include <panel/panel-plugin-external-wrapper.h>
+#include <panel/panel-plugin-external-wrapper-exported.h>
#include <panel/panel-window.h>
#include <panel/panel-dialogs.h>
#include <panel/panel-marshal.h>
@@ -54,9 +56,8 @@
-static GObject *panel_plugin_external_wrapper_constructor (GType type,
- guint n_construct_params,
- GObjectConstructParam *construct_params);
+static void panel_plugin_external_wrapper_constructed (GObject *object);
+static void panel_plugin_external_wrapper_finalize (GObject *object);
static void panel_plugin_external_wrapper_set_properties (PanelPluginExternal *external,
GSList *properties);
static gchar **panel_plugin_external_wrapper_get_argv (PanelPluginExternal *external,
@@ -65,20 +66,18 @@ static gboolean panel_plugin_external_wrapper_remote_event (PanelP
const gchar *name,
const GValue *value,
guint *handle);
-static gboolean panel_plugin_external_wrapper_dbus_provider_signal (PanelPluginExternalWrapper *external,
+static gboolean panel_plugin_external_wrapper_dbus_provider_signal (XfcePanelPluginWrapperExported *skeleton,
+ GDBusMethodInvocation *invocation,
XfcePanelPluginProviderSignal provider_signal,
- GError **error);
-static gboolean panel_plugin_external_wrapper_dbus_remote_event_result (PanelPluginExternalWrapper *external,
+ PanelPluginExternalWrapper *wrapper);
+static gboolean panel_plugin_external_wrapper_dbus_remote_event_result (XfcePanelPluginWrapperExported *skeleton,
+ GDBusMethodInvocation *invocation,
guint handle,
gboolean result,
- GError **error);
+ PanelPluginExternalWrapper *wrapper);
-/* include the dbus glue generated by dbus-binding-tool */
-#include <panel/panel-plugin-external-wrapper-infos.h>
-
-
struct _PanelPluginExternalWrapperClass
{
@@ -88,12 +87,17 @@ struct _PanelPluginExternalWrapperClass
struct _PanelPluginExternalWrapper
{
PanelPluginExternal __parent__;
+
+ XfcePanelPluginWrapperExported *skeleton;
+
+ GDBusConnection *connection;
+
+ gboolean exported : 1;
+
};
enum
{
- SET,
- REMOTE_EVENT,
REMOTE_EVENT_RESULT,
LAST_SIGNAL
};
@@ -115,31 +119,14 @@ panel_plugin_external_wrapper_class_init (PanelPluginExternalWrapperClass *klass
PanelPluginExternalClass *plugin_external_class;
gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->constructor = panel_plugin_external_wrapper_constructor;
+ gobject_class->finalize = panel_plugin_external_wrapper_finalize;
+ gobject_class->constructed = panel_plugin_external_wrapper_constructed;
plugin_external_class = PANEL_PLUGIN_EXTERNAL_CLASS (klass);
plugin_external_class->get_argv = panel_plugin_external_wrapper_get_argv;
plugin_external_class->set_properties = panel_plugin_external_wrapper_set_properties;
plugin_external_class->remote_event = panel_plugin_external_wrapper_remote_event;
- external_signals[SET] =
- g_signal_new (g_intern_static_string ("set"),
- G_TYPE_FROM_CLASS (gobject_class),
- G_SIGNAL_RUN_LAST,
- 0, NULL, NULL,
- g_cclosure_marshal_VOID__BOXED,
- G_TYPE_NONE, 1,
- PANEL_TYPE_DBUS_SET_SIGNAL);
-
- external_signals[REMOTE_EVENT] =
- g_signal_new (g_intern_static_string ("remote-event"),
- G_TYPE_FROM_CLASS (gobject_class),
- G_SIGNAL_RUN_LAST,
- 0, NULL, NULL,
- _panel_marshal_VOID__STRING_BOXED_UINT,
- G_TYPE_NONE, 3,
- G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_UINT);
-
external_signals[REMOTE_EVENT_RESULT] =
g_signal_new (g_intern_static_string ("remote-event-result"),
G_TYPE_FROM_CLASS (gobject_class),
@@ -148,10 +135,6 @@ panel_plugin_external_wrapper_class_init (PanelPluginExternalWrapperClass *klass
_panel_marshal_VOID__UINT_BOOLEAN,
G_TYPE_NONE, 2,
G_TYPE_UINT, G_TYPE_BOOLEAN);
-
- /* add dbus type info for plugins */
- dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
- &dbus_glib_panel_plugin_external_wrapper_object_info);
}
@@ -163,39 +146,74 @@ panel_plugin_external_wrapper_init (PanelPluginExternalWrapper *external)
-static GObject *
-panel_plugin_external_wrapper_constructor (GType type,
- guint n_construct_params,
- GObjectConstructParam *construct_params)
+static void
+panel_plugin_external_wrapper_constructed (GObject *object)
{
- GObject *object;
- gchar *path;
- DBusGConnection *connection;
- GError *error = NULL;
+ PanelPluginExternalWrapper *wrapper;
+ gchar *path;
+ GError *error = NULL;
- object = G_OBJECT_CLASS (panel_plugin_external_wrapper_parent_class)->constructor (type,
- n_construct_params,
- construct_params);
+ wrapper = PANEL_PLUGIN_EXTERNAL_WRAPPER (object);
- connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
- if (G_LIKELY (connection != NULL))
+ wrapper->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+ if (G_LIKELY (wrapper->connection != NULL))
{
+ wrapper->skeleton = xfce_panel_plugin_wrapper_exported_skeleton_new ();
+
/* register the object in dbus, the wrapper will monitor this object */
- panel_return_val_if_fail (PANEL_PLUGIN_EXTERNAL (object)->unique_id != -1, NULL);
+ panel_return_if_fail (PANEL_PLUGIN_EXTERNAL (object)->unique_id != -1);
path = g_strdup_printf (PANEL_DBUS_WRAPPER_PATH, PANEL_PLUGIN_EXTERNAL (object)->unique_id);
- dbus_g_connection_register_g_object (connection, path, object);
- panel_debug (PANEL_DEBUG_EXTERNAL, "register dbus path %s", path);
- g_free (path);
+ g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (wrapper->skeleton),
+ wrapper->connection,
+ path,
+ &error);
+
+ if (G_UNLIKELY (error != NULL))
+ {
+ g_critical ("error wrapper path %s failed: %s", path, error->message);
+ g_error_free (error);
+ wrapper->exported = FALSE;
+ }
+ else
+ {
+ g_signal_connect (wrapper->skeleton, "handle_provider_signal",
+ G_CALLBACK (panel_plugin_external_wrapper_dbus_provider_signal), wrapper);
+ g_signal_connect (wrapper->skeleton, "handle_remote_event_result",
+ G_CALLBACK (panel_plugin_external_wrapper_dbus_remote_event_result), wrapper);
+ panel_debug (PANEL_DEBUG_EXTERNAL, "register dbus path %s", path);
+
+ wrapper->exported = TRUE;
+ }
- dbus_g_connection_unref (connection);
+ g_free (path);
}
else
{
+ wrapper->exported = FALSE;
g_critical ("Failed to get D-Bus session bus: %s", error->message);
g_error_free (error);
}
+}
+
+
+
+static void
+panel_plugin_external_wrapper_finalize (GObject *object)
+{
+ PanelPluginExternalWrapper *wrapper;
+
+ wrapper = PANEL_PLUGIN_EXTERNAL_WRAPPER (object);
+
+ if (wrapper->exported)
+ {
+ g_object_unref (wrapper->skeleton);
+ g_object_unref (wrapper->connection);
+ }
+ /* Export failed, but we have gotten a connection */
+ else if (wrapper->connection)
+ g_object_unref (wrapper->connection);
- return object;
+ (*G_OBJECT_CLASS (panel_plugin_external_wrapper_parent_class)->finalize) (object);
}
@@ -238,43 +256,78 @@ panel_plugin_external_wrapper_get_argv (PanelPluginExternal *external,
+static GVariant *
+panel_plugin_external_wrapper_gvalue_prop_to_gvariant (const GValue *value)
+{
+ const GVariantType *type = NULL;
+ GVariant *variant = NULL;
+
+ switch (G_VALUE_TYPE(value))
+ {
+ case G_TYPE_INT:
+ type = G_VARIANT_TYPE_INT32;
+ break;
+ case G_TYPE_BOOLEAN:
+ type = G_VARIANT_TYPE_BOOLEAN;
+ break;
+ case G_TYPE_DOUBLE:
+ type = G_VARIANT_TYPE_DOUBLE;
+ break;
+ case G_TYPE_STRING:
+ type = G_VARIANT_TYPE_STRING;
+ break;
+ default:
+ panel_assert_not_reached();
+ }
+
+ if (type)
+ variant = g_dbus_gvalue_to_gvariant(value, type);
+
+ return variant;
+}
+
+
+
static void
panel_plugin_external_wrapper_set_properties (PanelPluginExternal *external,
GSList *properties)
{
- GPtrArray *array;
- GValue message = { 0, };
- PluginProperty *property;
- GSList *li;
- guint i;
+ PanelPluginExternalWrapper *wrapper;
+ GVariantBuilder builder;
+ PluginProperty *property;
+ GSList *li;
- array = g_ptr_array_sized_new (1);
+ wrapper = PANEL_PLUGIN_EXTERNAL_WRAPPER (external);
- g_value_init (&message, PANEL_TYPE_DBUS_SET_PROPERTY);
- g_value_take_boxed (&message, dbus_g_type_specialized_construct (G_VALUE_TYPE (&message)));
+ g_variant_builder_init (&builder, G_VARIANT_TYPE("a(uv)"));
/* put properties in a dbus-suitable array for the wrapper */
for (li = properties; li != NULL; li = li->next)
{
- property = li->data;
+ GVariant *variant;
- dbus_g_type_struct_set (&message,
- DBUS_SET_TYPE, property->type,
- DBUS_SET_VALUE, &property->value,
- G_MAXUINT);
+ property = li->data;
- g_ptr_array_add (array, g_value_dup_boxed (&message));
+ variant = panel_plugin_external_wrapper_gvalue_prop_to_gvariant (&property->value);
+ if (G_LIKELY(variant))
+ {
+ g_variant_builder_add (&builder, "(uv)", property->type, variant);
+ g_variant_unref (variant);
+ }
+ else
+ {
+ g_warning ("Failed to convert wrapper property from gvalue:%s to gvariant", G_VALUE_TYPE_NAME(&property->value));
+ }
}
/* send array to the wrapper */
- g_signal_emit (G_OBJECT (external), external_signals[SET], 0, array);
-
- G_GNUC_BEGIN_IGNORE_DEPRECATIONS
- for (i = 0; i < array->len; i++)
- g_value_array_free (g_ptr_array_index (array, i));
- G_GNUC_END_IGNORE_DEPRECATIONS
- g_ptr_array_free (array, TRUE);
- g_value_unset (&message);
+ g_dbus_connection_emit_signal (wrapper->connection,
+ "org.xfce.Panel",
+ g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (wrapper->skeleton)),
+ "org.xfce.Panel.Wrapper",
+ "Set",
+ g_variant_builder_end (&builder),
+ NULL);
}
@@ -285,78 +338,81 @@ panel_plugin_external_wrapper_remote_event (PanelPluginExternal *external,
const GValue *value,
guint *handle)
{
- static guint handle_counter = 0;
- GValue dummy_value = { 0, };
- const GValue *real_value = value;
+ PanelPluginExternalWrapper *wrapper;
+ static guint handle_counter = 0;
panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL_WRAPPER (external), TRUE);
panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (external), TRUE);
panel_return_val_if_fail (value == NULL || G_IS_VALUE (value), FALSE);
+ wrapper = PANEL_PLUGIN_EXTERNAL_WRAPPER (external);
+
if (G_UNLIKELY (handle_counter > G_MAXUINT - 2))
handle_counter = 0;
*handle = ++handle_counter;
- if (value == NULL)
- {
- /* we send a dummy value over dbus */
- g_value_init (&dummy_value, G_TYPE_UCHAR);
- g_value_set_uchar (&dummy_value, '\0');
- real_value = &dummy_value;
- }
-
- g_signal_emit (G_OBJECT (external), external_signals[REMOTE_EVENT], 0,
- name, real_value, *handle);
-
- if (real_value != value)
- g_value_unset (&dummy_value);
+ g_dbus_connection_emit_signal (wrapper->connection,
+ "org.xfce.Panel",
+ g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (wrapper->skeleton)),
+ "org.xfce.Panel.Wrapper",
+ "RemoteEvent",
+ g_variant_new ("(svu)",
+ name,
+ g_variant_new_byte('\0'),
+ *handle),
+ NULL);
return TRUE;
}
-
static gboolean
-panel_plugin_external_wrapper_dbus_provider_signal (PanelPluginExternalWrapper *external,
+panel_plugin_external_wrapper_dbus_provider_signal (XfcePanelPluginWrapperExported *skeleton,
+ GDBusMethodInvocation *invocation,
XfcePanelPluginProviderSignal provider_signal,
- GError **error)
+ PanelPluginExternalWrapper *wrapper)
{
- panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external), FALSE);
- panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (external), FALSE);
+ panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL (wrapper), FALSE);
+ panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (wrapper), FALSE);
switch (provider_signal)
{
case PROVIDER_SIGNAL_SHOW_CONFIGURE:
- PANEL_PLUGIN_EXTERNAL (external)->show_configure = TRUE;
+ PANEL_PLUGIN_EXTERNAL (wrapper)->show_configure = TRUE;
break;
case PROVIDER_SIGNAL_SHOW_ABOUT:
- PANEL_PLUGIN_EXTERNAL (external)->show_about = TRUE;
+ PANEL_PLUGIN_EXTERNAL (wrapper)->show_about = TRUE;
break;
default:
/* other signals are handled in panel-applications.c */
- xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (external),
+ xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (wrapper),
provider_signal);
break;
}
+ xfce_panel_plugin_wrapper_exported_complete_provider_signal (skeleton, invocation);
+
return TRUE;
}
static gboolean
-panel_plugin_external_wrapper_dbus_remote_event_result (PanelPluginExternalWrapper *external,
- guint handle,
- gboolean result,
- GError **error)
+panel_plugin_external_wrapper_dbus_remote_event_result (XfcePanelPluginWrapperExported *skeleton,
+ GDBusMethodInvocation *invocation,
+ guint handle,
+ gboolean result,
+ PanelPluginExternalWrapper *wrapper)
{
- panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external), FALSE);
+ panel_return_val_if_fail (PANEL_IS_PLUGIN_EXTERNAL (wrapper), FALSE);
- g_signal_emit (G_OBJECT (external), external_signals[REMOTE_EVENT_RESULT], 0,
+ g_signal_emit (G_OBJECT (wrapper), external_signals[REMOTE_EVENT_RESULT], 0,
handle, result);
+ xfce_panel_plugin_wrapper_exported_complete_remote_event_result (skeleton, invocation);
+
return TRUE;
}