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/client-menuitem.c | |
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/client-menuitem.c')
-rw-r--r-- | libdbusmenu-glib/client-menuitem.c | 38 |
1 files changed, 35 insertions, 3 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; } |