aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2010-03-31 13:47:27 -0500
committerTed Gould <ted@gould.cx>2010-03-31 13:47:27 -0500
commitcae176681adb2e32464ec690b319008ae04a4a09 (patch)
tree64a5a117dac2a8d7b315fdd6361d7c30c2c77a39
parent2033f92976ad4e34f01ebf14d11f2198e7ec5142 (diff)
downloadlibdbusmenu-cae176681adb2e32464ec690b319008ae04a4a09.tar.gz
libdbusmenu-cae176681adb2e32464ec690b319008ae04a4a09.tar.bz2
libdbusmenu-cae176681adb2e32464ec690b319008ae04a4a09.zip
Adding a set of callbacks so that we can respond to the about to show request.
-rw-r--r--libdbusmenu-glib/client-menuitem.c38
-rw-r--r--libdbusmenu-glib/client.c41
-rw-r--r--libdbusmenu-glib/client.h4
-rw-r--r--libdbusmenu-glib/menuitem.c9
-rw-r--r--libdbusmenu-glib/menuitem.h15
5 files changed, 86 insertions, 21 deletions
diff --git a/libdbusmenu-glib/client-menuitem.c b/libdbusmenu-glib/client-menuitem.c
index 833b28c..979cf79 100644
--- a/libdbusmenu-glib/client-menuitem.c
+++ b/libdbusmenu-glib/client-menuitem.c
@@ -46,7 +46,7 @@ static void dbusmenu_client_menuitem_init (DbusmenuClientMenuitem *self);
static void dbusmenu_client_menuitem_dispose (GObject *object);
static void dbusmenu_client_menuitem_finalize (GObject *object);
static void handle_event (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, guint timestamp);
-static void send_about_to_show (DbusmenuMenuitem * mi);
+static void send_about_to_show (DbusmenuMenuitem * mi, dbusmenu_menuitem_about_to_show_cb cb, gpointer cb_data);
G_DEFINE_TYPE (DbusmenuClientMenuitem, dbusmenu_client_menuitem, DBUSMENU_TYPE_MENUITEM);
@@ -109,11 +109,43 @@ handle_event (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, g
return;
}
+typedef struct _about_to_show_t about_to_show_t;
+struct _about_to_show_t {
+ DbusmenuMenuitem * mi;
+ dbusmenu_menuitem_about_to_show_cb cb;
+ gpointer cb_data;
+};
+
+/* Handles calling the callback that we were called with */
+static void
+about_to_show_cb (gpointer user_data)
+{
+ about_to_show_t * data = (about_to_show_t *)user_data;
+
+ data->cb(data->mi, data->cb_data);
+
+ g_object_unref(data->mi);
+ g_free(user_data);
+ return;
+}
+
/* Passes the about to show signal on through the client. */
static void
-send_about_to_show (DbusmenuMenuitem * mi)
+send_about_to_show (DbusmenuMenuitem * mi, dbusmenu_menuitem_about_to_show_cb cb, gpointer cb_data)
{
DbusmenuClientMenuitemPrivate * priv = DBUSMENU_CLIENT_MENUITEM_GET_PRIVATE(mi);
- dbusmenu_client_send_about_to_show(priv->client, dbusmenu_menuitem_get_id(mi));
+ if (cb == NULL) {
+ /* Common enough that we don't want to bother
+ with the allocation */
+ dbusmenu_client_send_about_to_show(priv->client, dbusmenu_menuitem_get_id(mi), NULL, NULL);
+ } else {
+ about_to_show_t * data = g_new0(about_to_show_t, 1);
+ data->mi = mi;
+ data->cb = cb;
+ data->cb_data = cb_data;
+ g_object_ref(mi);
+
+ dbusmenu_client_send_about_to_show(priv->client, dbusmenu_menuitem_get_id(mi), about_to_show_cb, data);
+ }
return;
}
diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c
index 940adad..ef0205f 100644
--- a/libdbusmenu-glib/client.c
+++ b/libdbusmenu-glib/client.c
@@ -670,40 +670,55 @@ dbusmenu_client_send_event (DbusmenuClient * client, gint id, const gchar * name
return;
}
+typedef struct _about_to_show_t about_to_show_t;
+struct _about_to_show_t {
+ DbusmenuClient * client;
+ void (*cb) (gpointer data);
+ gpointer cb_data;
+};
+
/* Reports errors and responds to update request that were a result
of sending the about to show signal. */
static void
about_to_show_cb (DBusGProxy * proxy, gboolean need_update, GError * error, gpointer userdata)
{
- DbusmenuClient * client = DBUSMENU_CLIENT(userdata);
+ about_to_show_t * data = (about_to_show_t *)userdata;
+
if (error != NULL) {
g_warning("Unable to send about_to_show: %s", error->message);
- return;
+ /* Note: we're just ensuring only the callback gets called */
+ need_update = FALSE;
}
+ /* If we need to update, do that first. */
if (need_update) {
- update_layout(client);
+ update_layout(data->client);
}
+
+ if (data->cb != NULL) {
+ data->cb(data->cb_data);
+ }
+
+ g_object_unref(data->client);
+ g_free(data);
+
return;
}
/* Sends the about to show signal for a given id to the
server on the other side of DBus */
void
-dbusmenu_client_send_about_to_show(DbusmenuClient * client, gint id)
+dbusmenu_client_send_about_to_show(DbusmenuClient * client, gint id, void (*cb)(gpointer data), gpointer cb_data)
{
DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(client);
- org_ayatana_dbusmenu_about_to_show_async (priv->menuproxy, id, about_to_show_cb, client);
- /*
- TODO: We should ideally restrict the displaying of the menu until:
- - about_to_show_cb has been called and need_update was false
- - about_to_show_cb has been called, need_update was true and menu has been
- updated
- - about_to_show_cb has not been called and we already waited for 10msecs
+ about_to_show_t * data = g_new0(about_to_show_t, 1);
+ data->client = client;
+ data->cb = cb;
+ data->cb_data = cb_data;
+ g_object_ref(client);
- There's not really support in GTK for doing this easily.
- */
+ org_ayatana_dbusmenu_about_to_show_async (priv->menuproxy, id, about_to_show_cb, data);
return;
}
diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h
index 5f1c8d1..2b76f5e 100644
--- a/libdbusmenu-glib/client.h
+++ b/libdbusmenu-glib/client.h
@@ -110,7 +110,9 @@ void dbusmenu_client_send_event (DbusmenuClient * client,
const GValue * value,
guint timestamp);
void dbusmenu_client_send_about_to_show(DbusmenuClient * client,
- gint id);
+ gint id,
+ void (*cb) (gpointer user_data),
+ gpointer cb_data);
/**
SECTION:client
diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c
index f33da74..0186a20 100644
--- a/libdbusmenu-glib/menuitem.c
+++ b/libdbusmenu-glib/menuitem.c
@@ -1207,6 +1207,8 @@ dbusmenu_menuitem_handle_event (DbusmenuMenuitem * mi, const gchar * name, const
/**
dbusmenu_menuitem_send_about_to_show:
@mi: The #DbusmenuMenuitem to send the signal on.
+ @cb: Callback to call when the call has returned.
+ @cb_data: Data to pass to the callback.
This function is used to send the even that the submenu
of this item is about to be shown. Callers to this event
@@ -1214,7 +1216,7 @@ dbusmenu_menuitem_handle_event (DbusmenuMenuitem * mi, const gchar * name, const
called if possible.
*/
void
-dbusmenu_menuitem_send_about_to_show (DbusmenuMenuitem * mi)
+dbusmenu_menuitem_send_about_to_show (DbusmenuMenuitem * mi, dbusmenu_menuitem_about_to_show_cb cb, gpointer cb_data)
{
g_return_if_fail(DBUSMENU_IS_MENUITEM(mi));
#ifdef MASSIVEDEBUGGING
@@ -1223,7 +1225,10 @@ dbusmenu_menuitem_send_about_to_show (DbusmenuMenuitem * mi)
DbusmenuMenuitemClass * class = DBUSMENU_MENUITEM_GET_CLASS(mi);
if (class->send_about_to_show != NULL) {
- return class->send_about_to_show(mi);
+ return class->send_about_to_show(mi, cb, cb_data);
+ } else if (cb != NULL) {
+ cb(mi, cb_data);
}
+
return;
}
diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h
index 777c3ca..0183254 100644
--- a/libdbusmenu-glib/menuitem.h
+++ b/libdbusmenu-glib/menuitem.h
@@ -83,6 +83,17 @@ struct _DbusmenuMenuitem
};
/**
+ dbusmenu_menuitem_about_to_show_cb:
+ @mi Menu item that should be shown
+ @user_data Extra user data sent with the function
+
+ Callback prototype for a callback that is called when the
+ menu should be shown.
+*/
+typedef void (*dbusmenu_menuitem_about_to_show_cb) (DbusmenuMenuitem * mi, gpointer user_data);
+
+
+/**
DbusmenuMenuitemClass:
@property_changed: Slot for #DbusmenuMenuitem::property-changed.
@item_activated: Slot for #DbusmenuMenuitem::item-activated.
@@ -118,7 +129,7 @@ struct _DbusmenuMenuitemClass
/* Virtual functions */
void (*buildxml) (GPtrArray * stringarray);
void (*handle_event) (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, guint timestamp);
- void (*send_about_to_show) (DbusmenuMenuitem * mi);
+ void (*send_about_to_show) (DbusmenuMenuitem * mi, dbusmenu_menuitem_about_to_show_cb cb, gpointer cb_data);
void (*reserved1) (void);
/* void (*reserved2) (void); */
@@ -162,7 +173,7 @@ gboolean dbusmenu_menuitem_get_root (DbusmenuMenuitem * mi);
void dbusmenu_menuitem_foreach (DbusmenuMenuitem * mi, void (*func) (DbusmenuMenuitem * mi, gpointer data), gpointer data);
void dbusmenu_menuitem_handle_event (DbusmenuMenuitem * mi, const gchar * name, const GValue * value, guint timestamp);
-void dbusmenu_menuitem_send_about_to_show (DbusmenuMenuitem * mi);
+void dbusmenu_menuitem_send_about_to_show (DbusmenuMenuitem * mi, dbusmenu_menuitem_about_to_show_cb cb, gpointer cb_data);
/**
SECTION:menuitem