[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