This is an automated email from the git hooks/post-receive script. o c h o s i p u s h e d a c o m m i t t o b r a n c h m a s t e r in repository xfce/xfce4-panel.
commit 6778d620c5f9f1849ba5064903dd5433ce89600f Author: Ali Abdallah <a...@xfce.org> Date: Wed Jun 21 08:48:16 2017 +0200 Port the panel dbus service to gdbus --- configure.ac.in | 13 ++ panel/Makefile.am | 22 ++- panel/panel-dbus-client.c | 120 ++++++------ panel/panel-dbus-service-infos.xml | 5 +- panel/panel-dbus-service.c | 379 +++++++++++++++++++------------------ 5 files changed, 285 insertions(+), 254 deletions(-) diff --git a/configure.ac.in b/configure.ac.in index 18c0df7..1f7feee 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -126,6 +126,18 @@ dnl ******************************* XDT_CHECK_LIBX11_REQUIRE() dnl *********************************** +dnl *** Check for gdbus-codegen *** +dnl *********************************** +AC_ARG_VAR([GDBUS_CODEGEN], [D-Bus code and documentation generator from XML D-Bus interface definitions]) +AC_PATH_PROG([GDBUS_CODEGEN], [gdbus-codegen], [no]) +if test x"$GDBUS_CODEGEN" = x"no"; then + AC_MSG_ERROR([could not find gdbus-codegen in \$PATH. You can run + ./configure GDBUS_CODEGEN=/path/to/gdbus-codegen to define + a custom location for it.]) +fi + + +dnl *********************************** dnl *** Check for required packages *** dnl *********************************** XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.9.0]) @@ -137,6 +149,7 @@ XDT_CHECK_PACKAGE([GTK], [gtk+-3.0], [3.16.0]) XDT_CHECK_PACKAGE([EXO], [exo-2], [0.11.2]) XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.24.0]) XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.24.0]) +PKG_CHECK_MODULES([GIO_UNIX], [gio-unix-2.0 >= 2.24.0]) XDT_CHECK_PACKAGE([GMODULE], [gmodule-2.0], [2.24.0]) XDT_CHECK_PACKAGE([DBUS], [dbus-glib-1], [0.73]) XDT_CHECK_PACKAGE([CAIRO], [cairo], [1.0.0]) diff --git a/panel/Makefile.am b/panel/Makefile.am index d9e1a2d..89f93c2 100644 --- a/panel/Makefile.am +++ b/panel/Makefile.am @@ -15,8 +15,8 @@ bin_PROGRAMS = \ xfce4-panel xfce4_panel_built_sources = \ - panel-dbus-service-infos.h \ - panel-dbus-client-infos.h \ + panel-gdbus-exported-service.h \ + panel-gdbus-exported-service.c \ panel-marshal.c \ panel-marshal.h \ panel-plugin-external-wrapper-infos.h \ @@ -29,10 +29,10 @@ xfce4_panel_SOURCES = \ panel-application.h \ panel-base-window.c \ panel-base-window.h \ - panel-dbus-client.c \ - panel-dbus-client.h \ panel-dbus-service.c \ panel-dbus-service.h \ + panel-dbus-client.c \ + panel-dbus-client.h \ panel-dialogs.c \ panel-dialogs.h \ panel-item-dialog.c \ @@ -59,6 +59,7 @@ xfce4_panel_SOURCES = \ xfce4_panel_CFLAGS = \ $(GTK_CFLAGS) \ $(GMODULE_CFLAGS) \ + $(GIO_UNIX_CFLAGS) \ $(LIBXFCE4UTIL_CFLAGS) \ $(LIBXFCE4UI_CFLAGS) \ $(LIBWNCK_CFLAGS) \ @@ -77,6 +78,7 @@ xfce4_panel_LDADD = \ $(top_builddir)/common/libpanel-common.la \ $(GTK_LIBS) \ $(GMODULE_LIBS) \ + $(GIO_UNIX_LIBS) \ $(LIBXFCE4UTIL_LIBS) \ $(LIBXFCE4UI_LIBS) \ $(LIBWNCK_LIBS) \ @@ -99,11 +101,13 @@ panel-marshal.c: panel-marshal.list Makefile $(AM_V_GEN) echo "#include <panel/panel-marshal.h>" > $@ \ && glib-genmarshal --prefix=_panel_marshal --body $< >> $@ -panel-dbus-service-infos.h: $(srcdir)/panel-dbus-service-infos.xml Makefile - $(AM_V_GEN) dbus-binding-tool --prefix=panel_dbus_service --mode=glib-server $< > $@ - -panel-dbus-client-infos.h: $(srcdir)/panel-dbus-service-infos.xml Makefile - $(AM_V_GEN) dbus-binding-tool --mode=glib-client $< > $@ +panel-gdbus-exported-service.h: +panel-gdbus-exported-service.c: panel-dbus-service-infos.xml Makefile + $(AM_V_GEN) $(GDBUS_CODEGEN) \ + --interface-prefix org.xfce.Panel \ + --c-namespace XfcePanel \ + --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 $< > $@ diff --git a/panel/panel-dbus-client.c b/panel/panel-dbus-client.c index b32b858..22cefad 100644 --- a/panel/panel-dbus-client.c +++ b/panel/panel-dbus-client.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2008-2010 Nick Schermer <n...@xfce.org> + * Copyright (c) 2017 Ali Abdallah <a...@xfce.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,7 +25,7 @@ #include <stdlib.h> #endif -#include <dbus/dbus-glib.h> +#include <gio/gio.h> #include <libxfce4util/libxfce4util.h> #include <common/panel-private.h> #include <common/panel-dbus.h> @@ -34,8 +35,7 @@ #include <panel/panel-dbus-client.h> #include <panel/panel-dbus-service.h> -#include <panel/panel-dbus-client-infos.h> - +#include <panel/panel-gdbus-exported-service.h> enum @@ -49,21 +49,15 @@ enum -static DBusGProxy * +static XfcePanelExportedService * panel_dbus_client_get_proxy (GError **error) { - DBusGConnection *dbus_connection; - - /* return null if no connection is found */ - dbus_connection = dbus_g_bus_get (DBUS_BUS_SESSION, error); - if (G_UNLIKELY (dbus_connection == NULL)) - return NULL; - - return dbus_g_proxy_new_for_name_owner (dbus_connection, - PANEL_DBUS_NAME, - PANEL_DBUS_PATH, - PANEL_DBUS_INTERFACE, - error); + return xfce_panel_exported_service_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + PANEL_DBUS_NAME, + PANEL_DBUS_PATH, + NULL, + error); } @@ -73,18 +67,20 @@ panel_dbus_client_display_preferences_dialog (guint active, const gchar *socket_id, GError **error) { - gboolean result; - DBusGProxy *dbus_proxy; + XfcePanelExportedService *dbus_proxy; + gboolean result; panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); dbus_proxy = panel_dbus_client_get_proxy (error); - if (G_LIKELY (dbus_proxy == NULL)) + if (G_UNLIKELY (dbus_proxy == NULL)) return FALSE; - result = _panel_dbus_client_display_preferences_dialog (dbus_proxy, - active, socket_id, - error); + result = xfce_panel_exported_service_call_display_preferences_dialog_sync (dbus_proxy, + active, + socket_id, + NULL, + error); g_object_unref (G_OBJECT (dbus_proxy)); @@ -97,8 +93,9 @@ gboolean panel_dbus_client_display_items_dialog (guint active, GError **error) { - gboolean result; - DBusGProxy *dbus_proxy; + XfcePanelExportedService *dbus_proxy; + gboolean result; + panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); @@ -106,8 +103,10 @@ panel_dbus_client_display_items_dialog (guint active, if (G_UNLIKELY (dbus_proxy == NULL)) return FALSE; - result = _panel_dbus_client_display_items_dialog (dbus_proxy, active, - error); + result = xfce_panel_exported_service_call_display_items_dialog_sync (dbus_proxy, + active, + NULL, + error); g_object_unref (G_OBJECT (dbus_proxy)); @@ -119,8 +118,8 @@ panel_dbus_client_display_items_dialog (guint active, gboolean panel_dbus_client_save (GError **error) { - DBusGProxy *dbus_proxy; - gboolean result; + XfcePanelExportedService *dbus_proxy; + gboolean result; panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); @@ -128,7 +127,7 @@ panel_dbus_client_save (GError **error) if (G_UNLIKELY (dbus_proxy == NULL)) return FALSE; - result = _panel_dbus_client_save (dbus_proxy, error); + result = xfce_panel_exported_service_call_save_sync (dbus_proxy, NULL, error); g_object_unref (G_OBJECT (dbus_proxy)); @@ -142,8 +141,9 @@ panel_dbus_client_add_new_item (const gchar *plugin_name, gchar **arguments, GError **error) { - DBusGProxy *dbus_proxy; - gboolean result; + + XfcePanelExportedService *dbus_proxy; + gboolean result; panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); @@ -151,9 +151,10 @@ panel_dbus_client_add_new_item (const gchar *plugin_name, if (G_UNLIKELY (dbus_proxy == NULL)) return FALSE; - result = _panel_dbus_client_add_new_item (dbus_proxy, plugin_name, - (const gchar **) arguments, - error); + result = xfce_panel_exported_service_call_add_new_item_sync (dbus_proxy, plugin_name, + (const gchar **) arguments, + NULL, + error); g_object_unref (G_OBJECT (dbus_proxy)); @@ -186,12 +187,12 @@ panel_dbus_client_plugin_event (const gchar *plugin_event, gboolean *return_succeed, GError **error) { - DBusGProxy *dbus_proxy; - gboolean result = FALSE; - gchar **tokens; - GType type; - GValue value = { 0, }; - guint n_tokens; + XfcePanelExportedService *dbus_proxy; + gchar **tokens; + GType type; + guint n_tokens; + gboolean result = FALSE; + GVariant *variant = NULL; panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); @@ -214,26 +215,23 @@ panel_dbus_client_plugin_event (const gchar *plugin_event, else if (n_tokens == 2) { /* set noop value, recognized by the dbus service as %NULL value */ - g_value_init (&value, G_TYPE_UCHAR); - g_value_set_uchar (&value, '\0'); + variant = g_variant_new_byte ('\0'); } else if (n_tokens == N_TOKENS) { 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); + variant = g_variant_new_boolean (strcmp (tokens[VALUE], "true") == 0); else if (type == G_TYPE_DOUBLE) - g_value_set_double (&value, g_ascii_strtod (tokens[VALUE], NULL)); + variant = g_variant_new_double (g_ascii_strtod (tokens[VALUE], NULL)); else if (type == G_TYPE_INT) - g_value_set_int (&value, strtol (tokens[VALUE], NULL, 0)); + variant = g_variant_new_int64 (g_ascii_strtoll (tokens[VALUE], NULL, 0)); else if (type == G_TYPE_STRING) - g_value_set_static_string (&value, tokens[VALUE]); + variant = g_variant_new_string (tokens[VALUE]); else if (type == G_TYPE_UINT) - g_value_set_uint (&value, strtol (tokens[VALUE], NULL, 0)); + variant = g_variant_new_uint64 (g_ascii_strtoll (tokens[VALUE], NULL, 0)); else panel_assert_not_reached (); } @@ -253,15 +251,15 @@ panel_dbus_client_plugin_event (const gchar *plugin_event, } /* send value over dbus */ - panel_return_val_if_fail (G_IS_VALUE (&value), FALSE); - result = _panel_dbus_client_plugin_event (dbus_proxy, - tokens[PLUGIN_NAME], - tokens[NAME], - &value, - return_succeed, - error); - g_value_unset (&value); - + panel_return_val_if_fail (variant != NULL, FALSE); + result = xfce_panel_exported_service_call_plugin_event_sync (dbus_proxy, + tokens[PLUGIN_NAME], + tokens[NAME], + variant, + return_succeed, + NULL, + error); + g_variant_unref (variant); out: g_strfreev (tokens); g_object_unref (G_OBJECT (dbus_proxy)); @@ -275,8 +273,8 @@ gboolean panel_dbus_client_terminate (gboolean restart, GError **error) { - DBusGProxy *dbus_proxy; - gboolean result; + XfcePanelExportedService *dbus_proxy; + gboolean result; panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); @@ -284,7 +282,7 @@ panel_dbus_client_terminate (gboolean restart, if (G_UNLIKELY (dbus_proxy == NULL)) return FALSE; - result = _panel_dbus_client_terminate (dbus_proxy, restart, error); + result = xfce_panel_exported_service_call_terminate_sync (dbus_proxy, restart, NULL, error); g_object_unref (G_OBJECT (dbus_proxy)); diff --git a/panel/panel-dbus-service-infos.xml b/panel/panel-dbus-service-infos.xml index d1a6316..a0eaa6d 100644 --- a/panel/panel-dbus-service-infos.xml +++ b/panel/panel-dbus-service-infos.xml @@ -6,10 +6,7 @@ with the panel. --> <interface name="org.xfce.Panel"> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" - value="panel_dbus_service"/> - <annotation name="org.freedesktop.DBus.GLib.ClientCSymbol" - value="_panel_dbus_client"/> + <annotation name="org.gtk.GDBus.C.Name" value="ExportedService" /> <!-- DisplayPreferencesDialog (active : UINT, socket-id : STRING) : VOID diff --git a/panel/panel-dbus-service.c b/panel/panel-dbus-service.c index 03c575d..aafceaa 100644 --- a/panel/panel-dbus-service.c +++ b/panel/panel-dbus-service.c @@ -24,9 +24,7 @@ #include <string.h> #endif -#include <dbus/dbus.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> +#include <gio/gio.h> #include <common/panel-private.h> #include <common/panel-dbus.h> #include <libxfce4util/libxfce4util.h> @@ -39,57 +37,63 @@ #include <panel/panel-item-dialog.h> #include <panel/panel-module-factory.h> +#include <panel/panel-gdbus-exported-service.h> + +static void panel_dbus_service_finalize (GObject *object); +static void panel_dbus_service_plugin_event_result (XfcePanelPluginProvider *prev_provider, + guint handle, + gboolean result, + PanelDBusService *service); + +static gboolean panel_dbus_service_display_preferences_dialog (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + guint active, + const gchar *socket_id, + PanelDBusService *service); +static gboolean panel_dbus_service_display_items_dialog (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + guint active, + PanelDBusService *service); +static gboolean panel_dbus_service_save (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + PanelDBusService *service); +static gboolean panel_dbus_service_add_new_item (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + const gchar *plugin_name, + gchar **arguments, + PanelDBusService *service); +static void panel_dbus_service_plugin_event_free (gpointer data); +static gboolean panel_dbus_service_plugin_event (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + const gchar *plugin_name, + const gchar *name, + GVariant *variant, + PanelDBusService *service); +static gboolean panel_dbus_service_terminate (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + gboolean restart, + PanelDBusService *service); -static void panel_dbus_service_finalize (GObject *object); -static gboolean panel_dbus_service_display_preferences_dialog (PanelDBusService *service, - guint active, - const gchar *socket_id, - 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 void panel_dbus_service_plugin_event_free (gpointer data); -static gboolean panel_dbus_service_plugin_event (PanelDBusService *service, - const gchar *plugin_name, - const gchar *name, - const GValue *value, - gboolean *OUT_succeed, - GError **error); -static gboolean panel_dbus_service_terminate (PanelDBusService *service, - gboolean restart, - GError **error); - - - -/* include the dbus glue generated by dbus-binding-tool */ -#include <panel/panel-dbus-service-infos.h> - struct _PanelDBusServiceClass { - GObjectClass __parent__; + XfcePanelExportedServiceSkeletonClass __parent__; }; struct _PanelDBusService { - GObject __parent__; + XfcePanelExportedServiceSkeleton __parent__; /* the dbus connection */ - DBusGConnection *connection; + GDBusConnection *connection; /* queue for remote-events */ GHashTable *remote_events; /* whether the service is owner of the name */ - guint is_owner : 1; + guint is_exported : 1; }; typedef struct @@ -120,8 +124,6 @@ panel_dbus_service_class_init (PanelDBusServiceClass *klass) gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = panel_dbus_service_finalize; - dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass), - &dbus_glib_panel_dbus_service_object_info); } @@ -130,27 +132,39 @@ static void panel_dbus_service_init (PanelDBusService *service) { GError *error = NULL; - DBusConnection *connection; - gint result; - service->is_owner = FALSE; + service->is_exported = FALSE; service->remote_events = NULL; - service->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); + service->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); if (G_LIKELY (service->connection != NULL)) { - /* TODO handle error */ - connection = dbus_g_connection_get_connection (service->connection); - result = dbus_bus_request_name (connection, PANEL_DBUS_NAME, DBUS_NAME_FLAG_DO_NOT_QUEUE, NULL); - if (result == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + service->is_exported = + g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(service), + service->connection, + "/org/xfce/Panel", + &error); + + if (error) { - /* yes we own the name */ - service->is_owner = TRUE; + g_critical ("Failed to export panel D-BUS interface: %s", error->message); + g_error_free (error); + } - /* register this object */ - dbus_g_connection_register_g_object (service->connection, - PANEL_DBUS_PATH, - G_OBJECT (service)); + if (G_LIKELY (service->is_exported)) + { + g_signal_connect (service, "handle_add_new_item", + G_CALLBACK(panel_dbus_service_add_new_item), service); + g_signal_connect (service, "handle_display_items_dialog", + G_CALLBACK(panel_dbus_service_display_items_dialog), service); + g_signal_connect (service, "handle_display_preferences_dialog", + G_CALLBACK(panel_dbus_service_display_preferences_dialog), service); + g_signal_connect (service, "handle_plugin_event", + G_CALLBACK(panel_dbus_service_plugin_event), service); + g_signal_connect (service, "handle_save", + G_CALLBACK(panel_dbus_service_save), service); + g_signal_connect (service, "handle_terminate", + G_CALLBACK(panel_dbus_service_terminate), service); } } else @@ -166,17 +180,6 @@ static void panel_dbus_service_finalize (GObject *object) { PanelDBusService *service = PANEL_DBUS_SERVICE (object); - DBusConnection *connection; - - if (G_LIKELY (service->connection != NULL)) - { - /* release the org.xfce.Panel name */ - connection = dbus_g_connection_get_connection (service->connection); - dbus_bus_release_name (connection, PANEL_DBUS_NAME, NULL); - dbus_g_connection_flush (service->connection); - - dbus_g_connection_unref (service->connection); - } if (service->remote_events != NULL) { @@ -190,16 +193,18 @@ panel_dbus_service_finalize (GObject *object) static gboolean -panel_dbus_service_display_preferences_dialog (PanelDBusService *service, - guint active, - const gchar *socket_id, - GError **error) +panel_dbus_service_display_preferences_dialog (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + guint active, + const gchar *socket_id, + PanelDBusService *service) { panel_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE); - panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); - /* show the preferences dialog */ - panel_preferences_dialog_show_from_id (active, socket_id); + /* show the items dialog */ + panel_item_dialog_show_from_id (active); + + xfce_panel_exported_service_complete_display_preferences_dialog(skeleton, invocation); return TRUE; } @@ -207,50 +212,55 @@ panel_dbus_service_display_preferences_dialog (PanelDBusService *service, static gboolean -panel_dbus_service_display_items_dialog (PanelDBusService *service, - guint active, - GError **error) +panel_dbus_service_display_items_dialog (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + guint active, + PanelDBusService *service) { panel_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE); - panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* show the items dialog */ panel_item_dialog_show_from_id (active); + xfce_panel_exported_service_complete_display_items_dialog (skeleton, invocation); + return TRUE; } static gboolean -panel_dbus_service_save (PanelDBusService *service, - GError **error) +panel_dbus_service_save (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + PanelDBusService *service) { PanelApplication *application; panel_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE); - panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); /* save the configuration */ application = panel_application_get (); panel_application_save (application, SAVE_EVERYTHING); g_object_unref (G_OBJECT (application)); + xfce_panel_exported_service_complete_save (skeleton, + invocation); + return TRUE; } static gboolean -panel_dbus_service_add_new_item (PanelDBusService *service, - const gchar *plugin_name, - gchar **arguments, - GError **error) +panel_dbus_service_add_new_item (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + const gchar *plugin_name, + gchar **arguments, + PanelDBusService *service) { PanelApplication *application; 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); application = panel_application_get (); @@ -263,120 +273,49 @@ panel_dbus_service_add_new_item (PanelDBusService *service, g_object_unref (G_OBJECT (application)); - return TRUE; -} - - + xfce_panel_exported_service_complete_add_new_item (skeleton, + invocation); -static void -panel_dbus_service_plugin_event_free (gpointer data) -{ - PluginEvent *event = data; - - g_value_unset (&event->value); - g_free (event->name); - g_slist_free (event->plugins); - g_slice_free (PluginEvent, event); -} - - - -static void -panel_dbus_service_plugin_event_result (XfcePanelPluginProvider *prev_provider, - guint handle, - gboolean result, - PanelDBusService *service) -{ - PluginEvent *event; - GSList *li, *lnext; - XfcePanelPluginProvider *provider; - guint new_handle; - gboolean new_result; - - g_signal_handlers_disconnect_by_func (G_OBJECT (prev_provider), - G_CALLBACK (panel_dbus_service_plugin_event_result), service); - - event = g_hash_table_lookup (service->remote_events, &handle); - if (G_LIKELY (event != NULL)) - { - panel_assert (event->handle == handle); - if (!result) - { - for (li = event->plugins, new_handle = 0; li != NULL; li = lnext, new_handle = 0) - { - lnext = li->next; - provider = li->data; - event->plugins = g_slist_delete_link (event->plugins, li); - new_handle = 0; - - /* maybe the plugin has been destroyed */ - if (!XFCE_PANEL_PLUGIN_PROVIDER (provider)) - continue; - - new_result = xfce_panel_plugin_provider_remote_event (provider, event->name, - &event->value, &new_handle); - - if (new_handle > 0 && lnext != NULL) - { - /* steal the old value */ - g_hash_table_steal (service->remote_events, &handle); - - /* update handle and insert again */ - event->handle = new_handle; - g_hash_table_insert (service->remote_events, &event->handle, event); - g_signal_connect (G_OBJECT (provider), "remote-event-result", - G_CALLBACK (panel_dbus_service_plugin_event_result), service); - - /* leave and wait for reply */ - return; - } - else if (new_result) - { - /* we're done, remove from hash table below */ - break; - } - } - } + return TRUE; - /* handle can be removed */ - g_hash_table_remove (service->remote_events, &handle); - } } static gboolean -panel_dbus_service_plugin_event (PanelDBusService *service, - const gchar *plugin_name, - const gchar *name, - const GValue *value, - gboolean *OUT_succeed, - GError **error) +panel_dbus_service_plugin_event (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + const gchar *plugin_name, + const gchar *name, + GVariant *variant, + PanelDBusService *service) { GSList *plugins, *li, *lnext; PanelModuleFactory *factory; PluginEvent *event; guint handle; gboolean result; + GValue value = { 0, }; gboolean plugin_replied = FALSE; 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); /* send the event to all matching plugins, break if one of the * plugins returns TRUE in this remote-event handler */ factory = panel_module_factory_get (); plugins = panel_module_factory_get_plugins (factory, plugin_name); + g_dbus_gvariant_to_gvalue (variant, &value); + for (li = plugins, handle = 0; li != NULL; li = lnext, handle = 0) { lnext = li->next; panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (li->data), FALSE); - result = xfce_panel_plugin_provider_remote_event (li->data, name, value, &handle); + + result = xfce_panel_plugin_provider_remote_event (li->data, name, &value, &handle); if (handle > 0 && lnext != NULL) { @@ -384,8 +323,8 @@ panel_dbus_service_plugin_event (PanelDBusService *service, event->handle = handle; event->name = g_strdup (name); event->plugins = g_slist_copy (lnext); - g_value_init (&event->value, G_VALUE_TYPE (value)); - g_value_copy (value, &event->value); + g_value_init (&event->value, G_VALUE_TYPE (&value)); + g_value_copy (&value, &event->value); /* create hash table if needed */ if (service->remote_events == NULL) @@ -416,26 +355,106 @@ panel_dbus_service_plugin_event (PanelDBusService *service, g_slist_free (plugins); g_object_unref (G_OBJECT (factory)); - /* return status for the panel */ - if (OUT_succeed) - *OUT_succeed = plugin_replied; + xfce_panel_exported_service_complete_plugin_event (skeleton, invocation, plugin_replied); return TRUE; + } static gboolean -panel_dbus_service_terminate (PanelDBusService *service, - gboolean restart, - GError **error) +panel_dbus_service_terminate (XfcePanelExportedService *skeleton, + GDBusMethodInvocation *invocation, + gboolean restart, + PanelDBusService *service) { - panel_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE); - panel_return_val_if_fail (error == NULL || *error == NULL, FALSE); + return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE); panel_dbus_service_exit_panel (restart); + xfce_panel_exported_service_complete_terminate (skeleton, + invocation); + return TRUE; + +} + + + +static void +panel_dbus_service_plugin_event_free (gpointer data) +{ + PluginEvent *event = data; + + g_value_unset (&event->value); + g_free (event->name); + g_slist_free (event->plugins); + g_slice_free (PluginEvent, event); +} + + + +static void +panel_dbus_service_plugin_event_result (XfcePanelPluginProvider *prev_provider, + guint handle, + gboolean result, + PanelDBusService *service) +{ + PluginEvent *event; + GSList *li, *lnext; + XfcePanelPluginProvider *provider; + guint new_handle; + gboolean new_result; + + g_signal_handlers_disconnect_by_func (G_OBJECT (prev_provider), + G_CALLBACK (panel_dbus_service_plugin_event_result), service); + + event = g_hash_table_lookup (service->remote_events, &handle); + if (G_LIKELY (event != NULL)) + { + panel_assert (event->handle == handle); + if (!result) + { + for (li = event->plugins, new_handle = 0; li != NULL; li = lnext, new_handle = 0) + { + lnext = li->next; + provider = li->data; + event->plugins = g_slist_delete_link (event->plugins, li); + new_handle = 0; + + /* maybe the plugin has been destroyed */ + if (!XFCE_PANEL_PLUGIN_PROVIDER (provider)) + continue; + + new_result = xfce_panel_plugin_provider_remote_event (provider, event->name, + &event->value, &new_handle); + + if (new_handle > 0 && lnext != NULL) + { + /* steal the old value */ + g_hash_table_steal (service->remote_events, &handle); + + /* update handle and insert again */ + event->handle = new_handle; + g_hash_table_insert (service->remote_events, &event->handle, event); + g_signal_connect (G_OBJECT (provider), "remote-event-result", + G_CALLBACK (panel_dbus_service_plugin_event_result), service); + + /* leave and wait for reply */ + return; + } + else if (new_result) + { + /* we're done, remove from hash table below */ + break; + } + } + } + + /* handle can be removed */ + g_hash_table_remove (service->remote_events, &handle); + } } @@ -461,10 +480,10 @@ panel_dbus_service_get (void) gboolean -panel_dbus_service_is_owner (PanelDBusService *service) +panel_dbus_service_is_exported (PanelDBusService *service) { panel_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE); - return service->is_owner; + return service->is_exported; } -- To stop receiving notification emails like this one, please contact the administrator of this repository. _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits