diff options
author | Ali Abdallah <ali@xfce.org> | 2017-06-21 18:50:09 +0200 |
---|---|---|
committer | Simon Steinbeiss <simon.steinbeiss@elfenbeinturm.at> | 2017-07-02 23:46:31 +0200 |
commit | c3d56227fb0882f389d6a026973efddea08efb10 (patch) | |
tree | a2d35eb2b08879d1efc2c9cd1ecaafc1d6c868f6 /panel | |
parent | f590e705122ef85f55093fbc7df5c82a662b9c7a (diff) | |
download | xfce4-panel-c3d56227fb0882f389d6a026973efddea08efb10.tar.gz |
Port the external plugin wrapper to GDBus
Diffstat (limited to 'panel')
-rw-r--r-- | panel/Makefile.am | 12 | ||||
-rw-r--r-- | panel/panel-plugin-external-wrapper-infos.xml | 5 | ||||
-rw-r--r-- | panel/panel-plugin-external-wrapper.c | 270 |
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; } |