aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2010-08-26 10:56:29 -0500
committerTed Gould <ted@gould.cx>2010-08-26 10:56:29 -0500
commit9a8c525d75c3f92351c0e60f15504d061fde4160 (patch)
treeb063aeb0ee76a6ba493262f99f4d391d65807e5e
parentffd29638de796d57380def939ef23c7ad8e892cd (diff)
downloadlibdbusmenu-9a8c525d75c3f92351c0e60f15504d061fde4160.tar.gz
libdbusmenu-9a8c525d75c3f92351c0e60f15504d061fde4160.tar.bz2
libdbusmenu-9a8c525d75c3f92351c0e60f15504d061fde4160.zip
Building a data structure to track all the data we need to emit the event error signal
-rw-r--r--libdbusmenu-glib/client.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c
index ac9561e..5d0325a 100644
--- a/libdbusmenu-glib/client.c
+++ b/libdbusmenu-glib/client.c
@@ -103,6 +103,16 @@ struct _properties_listener_t {
gboolean replied;
};
+typedef struct _event_data_t event_data_t;
+struct _event_data_t {
+ DbusmenuClient * client;
+ DbusmenuMenuitem * menuitem;
+ gchar * event;
+ GValue data;
+ guint timestamp;
+};
+
+
#define DBUSMENU_CLIENT_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_TYPE_CLIENT, DbusmenuClientPrivate))
@@ -1044,10 +1054,18 @@ menuitem_get_properties_new_cb (DBusGProxy * proxy, GHashTable * properties, GEr
static void
menuitem_call_cb (DBusGProxy * proxy, GError * error, gpointer userdata)
{
+ event_data_t * edata = (event_data_t *)userdata;
+
if (error != NULL) {
g_warning("Unable to call menu item %d: %s", GPOINTER_TO_INT(userdata), error->message);
+ g_signal_emit(edata->client, signals[EVENT_ERROR], 0, edata->menuitem, edata->event, edata->data, edata->timestamp, TRUE);
}
+ g_value_unset(&edata->data);
+ g_free(edata->event);
+ g_object_unref(edata->menuitem);
+ g_free(edata);
+
return;
}
@@ -1060,6 +1078,13 @@ dbusmenu_client_send_event (DbusmenuClient * client, gint id, const gchar * name
g_return_if_fail(id >= 0);
g_return_if_fail(name != NULL);
+ DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client);
+ DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
+ if (mi == NULL) {
+ g_warning("Asked to activate a menuitem %d that we don't know about", id);
+ return;
+ }
+
if (value == NULL) {
GValue internalval = {0};
g_value_init(&internalval, G_TYPE_INT);
@@ -1067,8 +1092,16 @@ dbusmenu_client_send_event (DbusmenuClient * client, gint id, const gchar * name
value = &internalval;
}
- DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client);
- org_ayatana_dbusmenu_event_async (priv->menuproxy, id, name, value, timestamp, menuitem_call_cb, GINT_TO_POINTER(id));
+ event_data_t * edata = g_new0(event_data_t, 1);
+ edata->client = client;
+ edata->menuitem = mi;
+ g_object_ref(edata->menuitem);
+ edata->event = g_strdup(name);
+ g_value_init(&edata->data, G_VALUE_TYPE(value));
+ g_value_copy(value, &edata->data);
+ edata->timestamp = timestamp;
+
+ org_ayatana_dbusmenu_event_async (priv->menuproxy, id, name, value, timestamp, menuitem_call_cb, edata);
return;
}