[Xfce4-commits] <xfce4-panel:devel> Use an array to send dbus messages.

Nick Schermer noreply at xfce.org
Fri Nov 20 21:40:01 CET 2009


Updating branch refs/heads/devel
         to d4be5dacbe6901e6e0baa86881b002756a312dba (commit)
       from 542ca64ef3c02da6ecb6fb8b8273a3806dffef98 (commit)

commit d4be5dacbe6901e6e0baa86881b002756a312dba
Author: Nick Schermer <nick at xfce.org>
Date:   Fri Nov 20 21:35:49 2009 +0100

    Use an array to send dbus messages.
    
    This will reduce the amount of dbus messages during
    startup. Also easy to work with transactions in the
    future, but that is not needed right now.

 common/panel-dbus.h                   |   21 +++-
 panel/panel-marshal.list              |    3 +-
 panel/panel-plugin-external-infos.xml |    4 +-
 panel/panel-plugin-external.c         |  231 ++++++++++++---------------------
 wrapper/main.c                        |  148 +++++++++++++---------
 5 files changed, 190 insertions(+), 217 deletions(-)

diff --git a/common/panel-dbus.h b/common/panel-dbus.h
index 453b288..66c2f2e 100644
--- a/common/panel-dbus.h
+++ b/common/panel-dbus.h
@@ -36,8 +36,23 @@
 #define SIGNAL_SHOW_CONFIGURE           SIGNAL_PREFIX_S "e"
 #define SIGNAL_SHOW_ABOUT               SIGNAL_PREFIX_S "f"
 #define SIGNAL_REMOVE                   SIGNAL_PREFIX_S "g"
-#define SIGNAL_WRAPPER_QUIT             SIGNAL_PREFIX_S "h"
-#define SIGNAL_WRAPPER_SET_SENSITIVE    SIGNAL_PREFIX_S "i"
-#define SIGNAL_WRAPPER_BACKGROUND_ALPHA SIGNAL_PREFIX_S "j"
+#define SIGNAL_WRAPPER_SET_SENSITIVE    SIGNAL_PREFIX_S "h"
+#define SIGNAL_WRAPPER_BACKGROUND_ALPHA SIGNAL_PREFIX_S "i"
+
+/* special types for dbus communication */
+#define PANEL_TYPE_DBUS_SET_MESSAGE dbus_g_type_get_struct ("GValueArray", \
+                                                            G_TYPE_STRING, \
+                                                            G_TYPE_VALUE, \
+                                                            G_TYPE_UINT, \
+                                                            G_TYPE_INVALID)
+#define PANEL_TYPE_DBUS_SET_SIGNAL  dbus_g_type_get_collection ("GPtrArray", \
+                                                                PANEL_TYPE_DBUS_SET_MESSAGE)
+
+enum
+{
+  DBUS_SET_PROPERTY,
+  DBUS_SET_VALUE,
+  DBUS_SET_REPLY_ID
+};
 
 #endif /* !__PANEL_DBUS_H__ */
diff --git a/panel/panel-marshal.list b/panel/panel-marshal.list
index 5eeace3..8b13789 100644
--- a/panel/panel-marshal.list
+++ b/panel/panel-marshal.list
@@ -1,2 +1 @@
-VOID:INT,INT,BOXED
-VOID:STRING,BOXED,UINT
+
diff --git a/panel/panel-plugin-external-infos.xml b/panel/panel-plugin-external-infos.xml
index 6012a4e..87c0680 100644
--- a/panel/panel-plugin-external-infos.xml
+++ b/panel/panel-plugin-external-infos.xml
@@ -17,9 +17,7 @@
                  return together with the Reply method.
     -->
     <signal name="Set">
-      <arg name="property" type="s" />
-      <arg name="value" type="v" />
-      <arg name="reply_id" type="u" />
+      <arg name="values" type="a(svu)" />
     </signal>
 
     <!--
diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c
index 4e50696..e645b0c 100644
--- a/panel/panel-plugin-external.c
+++ b/panel/panel-plugin-external.c
@@ -54,10 +54,6 @@
 
 
 
-typedef struct _QueuedData QueuedData;
-
-
-
 static void         panel_plugin_external_provider_init         (XfcePanelPluginProviderIface    *iface);
 static GObject     *panel_plugin_external_constructor           (GType                            type,
                                                                  guint                            n_construct_params,
@@ -72,7 +68,6 @@ static void         panel_plugin_external_set_property          (GObject
                                                                  const GValue                    *value,
                                                                  GParamSpec                      *pspec);
 static void         panel_plugin_external_realize               (GtkWidget                       *widget);
-static void         panel_plugin_external_unrealize             (GtkWidget                       *widget);
 static gboolean     panel_plugin_external_plug_removed          (GtkSocket                       *socket);
 static void         panel_plugin_external_plug_added            (GtkSocket                       *socket);
 static gboolean     panel_plugin_external_dbus_reply            (PanelPluginExternal             *external,
@@ -83,9 +78,13 @@ static gboolean     panel_plugin_external_dbus_provider_signal  (PanelPluginExte
                                                                  XfcePanelPluginProviderSignal    provider_signal,
                                                                  GError                         **error);
 static void         panel_plugin_external_dbus_set              (PanelPluginExternal             *external,
+                                                                 gboolean                         force);
+static void         panel_plugin_external_queue_add             (PanelPluginExternal             *external,
+                                                                 gboolean                         force,
                                                                  const gchar                     *property,
                                                                  const GValue                    *value);
-static void         panel_plugin_external_dbus_set_noop         (PanelPluginExternal             *external,
+static void         panel_plugin_external_queue_add_noop        (PanelPluginExternal             *external,
+                                                                 gboolean                         force,
                                                                  const gchar                     *property);
 static const gchar *panel_plugin_external_get_name              (XfcePanelPluginProvider         *provider);
 static gint         panel_plugin_external_get_unique_id         (XfcePanelPluginProvider         *provider);
@@ -109,7 +108,6 @@ static void         panel_plugin_external_child_watch           (GPid
                                                                  gint                             status,
                                                                  gpointer                         user_data);
 static void         panel_plugin_external_child_watch_destroyed (gpointer                         user_data);
-static void         panel_plugin_external_queue_data_free       (QueuedData                      *data);
 
 
 
@@ -140,7 +138,7 @@ struct _PanelPluginExternal
   guint             plug_embedded : 1;
 
   /* dbus message queue */
-  GSList           *dbus_queue;
+  GPtrArray        *queue;
 
   /* counter to count the number of restarts */
   guint             n_restarts;
@@ -154,12 +152,6 @@ struct _PanelPluginExternal
   guint             watch_id;
 };
 
-struct _QueuedData
-{
-  gchar  *property;
-  GValue  value;
-};
-
 enum
 {
   PROP_0,
@@ -200,7 +192,6 @@ panel_plugin_external_class_init (PanelPluginExternalClass *klass)
 
   gtkwidget_class = GTK_WIDGET_CLASS (klass);
   gtkwidget_class->realize = panel_plugin_external_realize;
-  gtkwidget_class->unrealize = panel_plugin_external_unrealize;
 
   gtksocket_class = GTK_SOCKET_CLASS (klass);
   gtksocket_class->plug_removed = panel_plugin_external_plug_removed;
@@ -211,11 +202,9 @@ panel_plugin_external_class_init (PanelPluginExternalClass *klass)
                   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);
+                  g_cclosure_marshal_VOID__BOXED,
+                  G_TYPE_NONE, 1,
+                  PANEL_TYPE_DBUS_SET_SIGNAL);
 
   g_object_class_install_property (gobject_class,
                                    PROP_UNIQUE_ID,
@@ -254,7 +243,7 @@ panel_plugin_external_init (PanelPluginExternal *external)
   external->unique_id = -1;
   external->module = NULL;
   external->arguments = NULL;
-  external->dbus_queue = NULL;
+  external->queue = NULL;
   external->plug_embedded = FALSE;
   external->n_restarts = 0;
   external->show_configure = FALSE;
@@ -333,12 +322,8 @@ panel_plugin_external_finalize (GObject *object)
       g_child_watch_add (external->pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
     }
 
-  /* free the queue */
-  if (G_UNLIKELY (external->dbus_queue != NULL))
-    {
-      g_slist_foreach (external->dbus_queue, (GFunc) panel_plugin_external_queue_data_free, NULL);
-      g_slist_free (external->dbus_queue);
-    }
+  if (external->queue != NULL)
+    g_ptr_array_free (external->queue, TRUE);
 
   g_strfreev (external->arguments);
 
@@ -482,28 +467,6 @@ panel_plugin_external_realize (GtkWidget *widget)
 
 
 
-static void
-panel_plugin_external_unrealize (GtkWidget *widget)
-{
-  PanelPluginExternal *external = PANEL_PLUGIN_EXTERNAL (widget);
-  GValue               value = { 0, };
-
-  /* create dummy value */
-  g_value_init (&value, G_TYPE_BOOLEAN);
-  g_value_set_boolean (&value, FALSE);
-
-  /* send directly (don't queue here) */
-  g_signal_emit (G_OBJECT (external), external_signals[SET], 0,
-                 SIGNAL_WRAPPER_QUIT, &value, 0);
-
-  /* unset */
-  g_value_unset (&value);
-
-  return (*GTK_WIDGET_CLASS (panel_plugin_external_parent_class)->unrealize) (widget);
-}
-
-
-
 static gboolean
 panel_plugin_external_plug_removed (GtkSocket *socket)
 {
@@ -603,32 +566,12 @@ static void
 panel_plugin_external_plug_added (GtkSocket *socket)
 {
   PanelPluginExternal *external = PANEL_PLUGIN_EXTERNAL (socket);
-  GSList              *li;
-  QueuedData          *data;
 
   /* plug has been added */
   external->plug_embedded = TRUE;
 
-  if (G_LIKELY (external->dbus_queue))
-    {
-      /* reverse the order fo the queue, since we prepended all the time */
-      external->dbus_queue = g_slist_reverse (external->dbus_queue);
-
-      /* flush the queue */
-      for (li = external->dbus_queue; li != NULL; li = li->next)
-        {
-          data = li->data;
-
-          g_signal_emit (G_OBJECT (external), external_signals[SET], 0,
-                         data->property, &data->value, 0);
-
-          panel_plugin_external_queue_data_free (data);
-        }
-
-      /* free the list */
-      g_slist_free (external->dbus_queue);
-      external->dbus_queue = NULL;
-    }
+  if (external->queue != NULL)
+    panel_plugin_external_dbus_set (external, FALSE);
 }
 
 
@@ -687,51 +630,66 @@ panel_plugin_external_dbus_provider_signal (PanelPluginExternal            *exte
 
 static void
 panel_plugin_external_dbus_set (PanelPluginExternal *external,
-                                const gchar         *property,
-                                const GValue        *value)
+                                gboolean             force)
 {
-  QueuedData *data;
-
   panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external));
-  panel_return_if_fail (value && G_TYPE_CHECK_VALUE (value));
+  panel_return_if_fail (external->queue != NULL);
 
-  if (G_LIKELY (external->plug_embedded))
+  if (force || external->plug_embedded)
     {
-      /* directly send the new property */
       g_signal_emit (G_OBJECT (external), external_signals[SET], 0,
-                     property, value, 0);
-    }
-  else
-    {
-      /* queue the property */
-      data = g_slice_new0 (QueuedData);
-      data->property = g_strdup (property);
-      g_value_init (&data->value, G_VALUE_TYPE (value));
-      g_value_copy (value, &data->value);
-
-      /* add to the queue (still in reversed order here) */
-      external->dbus_queue = g_slist_prepend (external->dbus_queue, data);
+                     external->queue);
+
+      g_ptr_array_free (external->queue, TRUE);
+      external->queue = NULL;
     }
 }
 
 
 
 static void
-panel_plugin_external_dbus_set_noop (PanelPluginExternal *external,
-                                     const gchar         *property)
+panel_plugin_external_queue_add (PanelPluginExternal *external,
+                                 gboolean             force,
+                                 const gchar         *property,
+                                 const GValue        *value)
 {
-  GValue value = { 0, };
+  GValue message = { 0, };
 
   panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external));
+  panel_return_if_fail (G_TYPE_CHECK_VALUE (value));
+  panel_return_if_fail (!force || external->queue == NULL);
 
-  /* create a noop value */
-  g_value_init (&value, G_TYPE_BOOLEAN);
-  g_value_set_boolean (&value, FALSE);
+  if (external->queue == NULL)
+    external->queue = g_ptr_array_sized_new (1);
 
-  /* send the value */
-  panel_plugin_external_dbus_set (external, property, &value);
+  g_value_init (&message, PANEL_TYPE_DBUS_SET_MESSAGE);
+  g_value_take_boxed (&message, dbus_g_type_specialized_construct (G_VALUE_TYPE (&message)));
+
+  dbus_g_type_struct_set (&message,
+                          DBUS_SET_PROPERTY, property,
+                          DBUS_SET_VALUE, value,
+                          DBUS_SET_REPLY_ID, 0,
+                          G_MAXUINT);
+
+  g_ptr_array_add (external->queue, g_value_get_boxed (&message));
+
+  panel_plugin_external_dbus_set (external, force);
+}
+
+
+
+static void
+panel_plugin_external_queue_add_noop (PanelPluginExternal *external,
+                                      gboolean             force,
+                                      const gchar         *property)
+{
+  GValue value = { 0, };
+
+  panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external));
 
-  /* unset */
+  /* send the value */
+  g_value_init (&value, G_TYPE_BOOLEAN);
+  panel_plugin_external_queue_add (external, force, property, &value);
   g_value_unset (&value);
 }
 
@@ -768,16 +726,13 @@ panel_plugin_external_set_size (XfcePanelPluginProvider *provider,
   panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider));
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
 
-  /* create a new value */
   g_value_init (&value, G_TYPE_INT);
   g_value_set_int (&value, size);
 
-  /* send the value */
-  panel_plugin_external_dbus_set (PANEL_PLUGIN_EXTERNAL (provider),
-                                  SIGNAL_SET_SIZE,
-                                  &value);
+  panel_plugin_external_queue_add (PANEL_PLUGIN_EXTERNAL (provider),
+                                   FALSE, SIGNAL_SET_SIZE,
+                                   &value);
 
-  /* unset */
   g_value_unset (&value);
 }
 
@@ -792,16 +747,13 @@ panel_plugin_external_set_orientation (XfcePanelPluginProvider *provider,
   panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider));
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
 
-  /* create a new value */
   g_value_init (&value, G_TYPE_UINT);
   g_value_set_uint (&value, orientation);
 
-  /* send the value */
-  panel_plugin_external_dbus_set (PANEL_PLUGIN_EXTERNAL (provider),
-                                  SIGNAL_SET_ORIENTATION,
-                                  &value);
+  panel_plugin_external_queue_add (PANEL_PLUGIN_EXTERNAL (provider),
+                                   FALSE, SIGNAL_SET_ORIENTATION,
+                                   &value);
 
-  /* unset */
   g_value_unset (&value);
 }
 
@@ -816,16 +768,13 @@ panel_plugin_external_set_screen_position (XfcePanelPluginProvider *provider,
   panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (provider));
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
 
-  /* set the orientation */
   g_value_init (&value, G_TYPE_UINT);
   g_value_set_uint (&value, screen_position);
 
-  /* send the value */
-  panel_plugin_external_dbus_set (PANEL_PLUGIN_EXTERNAL (provider),
-                                  SIGNAL_SET_SCREEN_POSITION,
-                                  &value);
+  panel_plugin_external_queue_add (PANEL_PLUGIN_EXTERNAL (provider),
+                                   FALSE, SIGNAL_SET_SCREEN_POSITION,
+                                   &value);
 
-  /* unset */
   g_value_unset (&value);
 }
 
@@ -838,8 +787,8 @@ panel_plugin_external_save (XfcePanelPluginProvider *provider)
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
 
   /* send signal to wrapper */
-  panel_plugin_external_dbus_set_noop (PANEL_PLUGIN_EXTERNAL (provider),
-                                       SIGNAL_SAVE);
+  panel_plugin_external_queue_add_noop (PANEL_PLUGIN_EXTERNAL (provider),
+                                        FALSE, SIGNAL_SAVE);
 }
 
 
@@ -862,8 +811,8 @@ panel_plugin_external_show_configure (XfcePanelPluginProvider *provider)
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
 
   /* send signal to wrapper */
-  panel_plugin_external_dbus_set_noop (PANEL_PLUGIN_EXTERNAL (provider),
-                                       SIGNAL_SHOW_CONFIGURE);
+  panel_plugin_external_queue_add_noop (PANEL_PLUGIN_EXTERNAL (provider),
+                                        FALSE, SIGNAL_SHOW_CONFIGURE);
 }
 
 
@@ -886,8 +835,8 @@ panel_plugin_external_show_about (XfcePanelPluginProvider *provider)
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
 
   /* send signal to wrapper */
-  panel_plugin_external_dbus_set_noop (PANEL_PLUGIN_EXTERNAL (provider),
-                                       SIGNAL_SHOW_ABOUT);
+  panel_plugin_external_queue_add_noop (PANEL_PLUGIN_EXTERNAL (provider),
+                                        FALSE, SIGNAL_SHOW_ABOUT);
 }
 
 
@@ -899,8 +848,8 @@ panel_plugin_external_remove (XfcePanelPluginProvider *provider)
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
 
   /* send signal to wrapper */
-  panel_plugin_external_dbus_set_noop (PANEL_PLUGIN_EXTERNAL (provider),
-                                       SIGNAL_REMOVE);
+  panel_plugin_external_queue_add_noop (PANEL_PLUGIN_EXTERNAL (provider),
+                                        FALSE, SIGNAL_REMOVE);
 }
 
 
@@ -915,8 +864,8 @@ panel_plugin_external_remote_event (XfcePanelPluginProvider *provider,
 
   /* TODO handle the return value */
 
-  panel_plugin_external_dbus_set (PANEL_PLUGIN_EXTERNAL (provider),
-                                  name, value);
+  panel_plugin_external_queue_add (PANEL_PLUGIN_EXTERNAL (provider),
+                                   FALSE, name, value);
 
   return TRUE;
 }
@@ -930,16 +879,13 @@ panel_plugin_external_set_sensitive (PanelPluginExternal *external)
 
   panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external));
 
-  /* set the boolean */
   g_value_init (&value, G_TYPE_BOOLEAN);
   g_value_set_boolean (&value, GTK_WIDGET_IS_SENSITIVE (external));
 
-  /* send message */
-  panel_plugin_external_dbus_set (external,
-                                  SIGNAL_WRAPPER_SET_SENSITIVE,
-                                  &value);
+  panel_plugin_external_queue_add (external, FALSE,
+                                   SIGNAL_WRAPPER_SET_SENSITIVE,
+                                   &value);
 
-  /* unset */
   g_value_unset (&value);
 }
 
@@ -980,16 +926,6 @@ panel_plugin_external_child_watch_destroyed (gpointer user_data)
 
 
 
-static void
-panel_plugin_external_queue_data_free (QueuedData *data)
-{
-  g_free (data->property);
-  g_value_unset (&data->value);
-  g_slice_free (QueuedData, data);
-}
-
-
-
 GtkWidget *
 panel_plugin_external_new (PanelModule  *module,
                            gint          unique_id,
@@ -1014,15 +950,12 @@ panel_plugin_external_set_background_alpha (PanelPluginExternal *external,
 
   panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL (external));
 
-  /* set the boolean */
   g_value_init (&value, G_TYPE_INT);
   g_value_set_int (&value, percentage);
 
-  /* send message */
-  panel_plugin_external_dbus_set (external,
-                                  SIGNAL_WRAPPER_BACKGROUND_ALPHA,
-                                  &value);
+  panel_plugin_external_queue_add (external, FALSE,
+                                   SIGNAL_WRAPPER_BACKGROUND_ALPHA,
+                                   &value);
 
-  /* unset */
   g_value_unset (&value);
 }
diff --git a/wrapper/main.c b/wrapper/main.c
index f5b1813..c46871c 100644
--- a/wrapper/main.c
+++ b/wrapper/main.c
@@ -52,13 +52,14 @@
 
 
 
-static gchar   *opt_display_name = NULL;
-static gint     opt_unique_id = -1;
-static gchar   *opt_comment = NULL;
-static gchar   *opt_filename = NULL;
-static gint     opt_socket_id = 0;
-static gchar  **opt_arguments = NULL;
-static GQuark   plug_quark = 0;
+static gchar     *opt_display_name = NULL;
+static gint       opt_unique_id = -1;
+static gchar     *opt_comment = NULL;
+static gchar     *opt_filename = NULL;
+static gint       opt_socket_id = 0;
+static gchar    **opt_arguments = NULL;
+static GQuark     plug_quark = 0;
+static gboolean   gproxy_destroyed = FALSE;
 
 
 
@@ -78,60 +79,79 @@ static GOptionEntry option_entries[] =
 
 static void
 wrapper_gproxy_set (DBusGProxy              *dbus_gproxy,
-                    const gchar             *property,
-                    const GValue            *value,
-                    guint                    reply_id,
+                    const GPtrArray         *array,
                     XfcePanelPluginProvider *provider)
 {
   WrapperPlug *plug;
+  guint        i;
+  GValue      *value;
+  gchar       *property;
+  guint        reply_id;
+  GValue       msg = { 0, };
 
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
-  panel_return_if_fail (G_TYPE_CHECK_VALUE (value));
-  panel_return_if_fail (property != NULL);
 
-  if (property != NULL && *property == SIGNAL_PREFIX)
+  g_value_init (&msg, PANEL_TYPE_DBUS_SET_MESSAGE);
+
+  for (i = 0; i < array->len; i++)
     {
-      if (strcmp (property, SIGNAL_SET_SIZE) == 0)
-        xfce_panel_plugin_provider_set_size (provider, g_value_get_int (value));
-      else if (strcmp (property, SIGNAL_SET_ORIENTATION) == 0)
-        xfce_panel_plugin_provider_set_orientation (provider, g_value_get_uint (value));
-      else if (strcmp (property, SIGNAL_SET_SCREEN_POSITION) == 0)
-        xfce_panel_plugin_provider_set_screen_position (provider, g_value_get_uint (value));
-      else if (strcmp (property, SIGNAL_SAVE) == 0)
-        xfce_panel_plugin_provider_save (provider);
-      else if (strcmp (property, SIGNAL_SHOW_CONFIGURE) == 0)
-        xfce_panel_plugin_provider_show_configure (provider);
-      else if (strcmp (property, SIGNAL_SHOW_ABOUT) == 0)
-        xfce_panel_plugin_provider_show_about (provider);
-      else if (strcmp (property, SIGNAL_REMOVE) == 0)
-        xfce_panel_plugin_provider_remove (provider);
-      else if (strcmp (property, SIGNAL_WRAPPER_QUIT) == 0)
-        gtk_main_quit ();
-      else if (strcmp (property, SIGNAL_WRAPPER_SET_SENSITIVE) == 0)
-        gtk_widget_set_sensitive (GTK_WIDGET (provider), g_value_get_boolean (value));
-      else if (strcmp (property, SIGNAL_WRAPPER_BACKGROUND_ALPHA) == 0)
+      g_value_set_static_boxed (&msg, g_ptr_array_index (array, i));
+      if (!dbus_g_type_struct_get (&msg,
+                                   DBUS_SET_PROPERTY, &property,
+                                   DBUS_SET_VALUE, &value,
+                                   DBUS_SET_REPLY_ID, &reply_id,
+                                   G_MAXUINT))
         {
-          plug = g_object_get_qdata (G_OBJECT (provider), plug_quark);
-          wrapper_plug_set_background_alpha (plug, g_value_get_int (value) / 100.00);
+          panel_assert_not_reached ();
+          continue;
+        }
+
+      if (G_LIKELY (*property == SIGNAL_PREFIX))
+        {
+          if (strcmp (property, SIGNAL_SET_SIZE) == 0)
+            xfce_panel_plugin_provider_set_size (provider, g_value_get_int (value));
+          else if (strcmp (property, SIGNAL_SET_ORIENTATION) == 0)
+            xfce_panel_plugin_provider_set_orientation (provider, g_value_get_uint (value));
+          else if (strcmp (property, SIGNAL_SET_SCREEN_POSITION) == 0)
+            xfce_panel_plugin_provider_set_screen_position (provider, g_value_get_uint (value));
+          else if (strcmp (property, SIGNAL_SAVE) == 0)
+            xfce_panel_plugin_provider_save (provider);
+          else if (strcmp (property, SIGNAL_SHOW_CONFIGURE) == 0)
+            xfce_panel_plugin_provider_show_configure (provider);
+          else if (strcmp (property, SIGNAL_SHOW_ABOUT) == 0)
+            xfce_panel_plugin_provider_show_about (provider);
+          else if (strcmp (property, SIGNAL_REMOVE) == 0)
+            xfce_panel_plugin_provider_remove (provider);
+          else if (strcmp (property, SIGNAL_WRAPPER_SET_SENSITIVE) == 0)
+            gtk_widget_set_sensitive (GTK_WIDGET (provider), g_value_get_boolean (value));
+          else if (strcmp (property, SIGNAL_WRAPPER_BACKGROUND_ALPHA) == 0)
+            {
+              plug = g_object_get_qdata (G_OBJECT (provider), plug_quark);
+              wrapper_plug_set_background_alpha (plug, g_value_get_int (value) / 100.00);
+            }
+          else
+            {
+              g_message ("External plugin \"%s-%d\" received unknown internal property \"%s\".",
+                         wrapper_name, opt_unique_id, property);
+            }
         }
       else
         {
-          g_message ("External plugin \"%s-%d\" received unknown internal property \"%s\".",
-                     wrapper_name, opt_unique_id, property);
+          xfce_panel_plugin_provider_remote_event (provider, property, value);
         }
-    }
-  else
-    {
-      xfce_panel_plugin_provider_remote_event (provider, property, value);
+
+      g_free (property);
+      g_value_unset (value);
+      g_free (value);
     }
 }
 
 
 
 static void
-dbus_gproxy_provider_signal_callback (DBusGProxy *proxy,
-                                      GError     *error,
-                                      gpointer    user_data)
+wrapper_gproxy_provider_signal_callback (DBusGProxy *proxy,
+                                         GError     *error,
+                                         gpointer    user_data)
 {
   if (G_UNLIKELY (error != NULL))
     {
@@ -144,21 +164,35 @@ dbus_gproxy_provider_signal_callback (DBusGProxy *proxy,
 
 
 static void
-dbus_gproxy_provider_signal (XfcePanelPluginProvider       *provider,
-                             XfcePanelPluginProviderSignal  provider_signal,
-                             DBusGProxy                    *dbus_gproxy)
+wrapper_gproxy_provider_signal (XfcePanelPluginProvider       *provider,
+                                XfcePanelPluginProviderSignal  provider_signal,
+                                DBusGProxy                    *dbus_gproxy)
 {
   panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider));
   panel_return_if_fail (opt_unique_id == xfce_panel_plugin_provider_get_unique_id (provider));
 
   /* send the provider signal to the panel */
   wrapper_dbus_provider_signal_async (dbus_gproxy, provider_signal,
-                                      dbus_gproxy_provider_signal_callback,
+                                      wrapper_gproxy_provider_signal_callback,
                                       GUINT_TO_POINTER (provider_signal));
 }
 
 
 
+static void
+wrapper_gproxy_destroyed (DBusGProxy  *dbus_gproxy,
+                          GError     **error)
+{
+  panel_return_if_fail (error == NULL || *error == NULL);
+
+  /* we lost communication with the panel, silently close the wrapper */
+  gproxy_destroyed = TRUE;
+
+  gtk_main_quit ();
+}
+
+
+
 gint
 main (gint argc, gchar **argv)
 {
@@ -252,15 +286,7 @@ main (gint argc, gchar **argv)
 
   /* quit when the proxy is destroyed (panel segfault for example) */
   gproxy_destroy_id = g_signal_connect (G_OBJECT (dbus_gproxy), "destroy",
-      G_CALLBACK (gtk_main_quit), NULL);
-
-  /* preparations for the signal */
-  dbus_g_object_register_marshaller (wrapper_marshal_VOID__STRING_BOXED_UINT,
-                                     G_TYPE_NONE, G_TYPE_STRING, G_TYPE_VALUE,
-                                     G_TYPE_UINT, G_TYPE_INVALID);
-  dbus_g_proxy_add_signal (dbus_gproxy, "Set",
-                           G_TYPE_STRING, G_TYPE_VALUE,
-                           G_TYPE_UINT, G_TYPE_INVALID);
+      G_CALLBACK (wrapper_gproxy_destroyed), &error);
 
   /* create the type module */
   module = wrapper_module_new (library);
@@ -286,9 +312,10 @@ main (gint argc, gchar **argv)
 
       /* monitor provider signals */
       g_signal_connect (G_OBJECT (provider), "provider-signal",
-          G_CALLBACK (dbus_gproxy_provider_signal), dbus_gproxy);
+          G_CALLBACK (wrapper_gproxy_provider_signal), dbus_gproxy);
 
       /* connect dbus signal to set provider properties send from the panel */
+      dbus_g_proxy_add_signal (dbus_gproxy, "Set", PANEL_TYPE_DBUS_SET_SIGNAL, G_TYPE_INVALID);
       dbus_g_proxy_connect_signal (dbus_gproxy, "Set",
           G_CALLBACK (wrapper_gproxy_set), g_object_ref (provider),
           (GClosureNotify) g_object_unref);
@@ -303,8 +330,9 @@ main (gint argc, gchar **argv)
       gtk_main ();
 
       /* disconnect signals */
-      dbus_g_proxy_disconnect_signal (dbus_gproxy, "Set",
-          G_CALLBACK (wrapper_gproxy_set), provider);
+      if (!gproxy_destroyed)
+        dbus_g_proxy_disconnect_signal (dbus_gproxy, "Set",
+            G_CALLBACK (wrapper_gproxy_set), provider);
 
       /* destroy the plug and provider */
       if (plug != NULL)
@@ -319,7 +347,7 @@ leave:
   /* release the proxy */
   if (G_LIKELY (dbus_gproxy != NULL))
     {
-      if (G_LIKELY (gproxy_destroy_id != 0))
+      if (G_LIKELY (gproxy_destroy_id != 0 && !gproxy_destroyed))
         g_signal_handler_disconnect (G_OBJECT (dbus_gproxy), gproxy_destroy_id);
 
       g_object_unref (G_OBJECT (dbus_gproxy));



More information about the Xfce4-commits mailing list