diff options
author | Ted Gould <ted@gould.cx> | 2010-03-31 13:47:27 -0500 |
---|---|---|
committer | Ted Gould <ted@gould.cx> | 2010-03-31 13:47:27 -0500 |
commit | cae176681adb2e32464ec690b319008ae04a4a09 (patch) | |
tree | 64a5a117dac2a8d7b315fdd6361d7c30c2c77a39 /libdbusmenu-glib | |
parent | 2033f92976ad4e34f01ebf14d11f2198e7ec5142 (diff) | |
download | libdbusmenu-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.
Diffstat (limited to 'libdbusmenu-glib')
-rw-r--r-- | libdbusmenu-glib/client-menuitem.c | 38 | ||||
-rw-r--r-- | libdbusmenu-glib/client.c | 41 | ||||
-rw-r--r-- | libdbusmenu-glib/client.h | 4 | ||||
-rw-r--r-- | libdbusmenu-glib/menuitem.c | 9 | ||||
-rw-r--r-- | libdbusmenu-glib/menuitem.h | 15 |
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 |