diff options
author | Ted Gould <ted@gould.cx> | 2011-04-05 16:19:59 -0500 |
---|---|---|
committer | Ted Gould <ted@gould.cx> | 2011-04-05 16:19:59 -0500 |
commit | 5e396a0c6ce16ad0a510c5bffdff89b85e51983b (patch) | |
tree | 596edcbe825ca29adfa4ec9f347adbde0a1f98eb | |
parent | 57f6e7f1f7e7ecc00b46f5cb97ddd8f771d048d2 (diff) | |
parent | 8c41500a1dee8ee560842399ffb94211a80008a5 (diff) | |
download | libdbusmenu-5e396a0c6ce16ad0a510c5bffdff89b85e51983b.tar.gz libdbusmenu-5e396a0c6ce16ad0a510c5bffdff89b85e51983b.tar.bz2 libdbusmenu-5e396a0c6ce16ad0a510c5bffdff89b85e51983b.zip |
Add a handler for the open/close events and pass them up to GTK
-rw-r--r-- | libdbusmenu-gtk/parser.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index e68c286..c627854 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -79,6 +79,11 @@ static void item_activated (DbusmenuMenuitem * item, gpointer user_data); static gboolean item_about_to_show (DbusmenuMenuitem * item, gpointer user_data); +static gboolean item_handle_event (DbusmenuMenuitem * item, + const gchar * name, + GVariant * variant, + guint timestamp, + GtkWidget * widget); static void widget_notify_cb (GtkWidget * widget, GParamSpec * pspec, gpointer data); @@ -580,6 +585,11 @@ construct_dbusmenu_for_widget (GtkWidget * widget) DBUSMENU_MENUITEM_SIGNAL_ABOUT_TO_SHOW, G_CALLBACK (item_about_to_show), widget); + + g_signal_connect (G_OBJECT (mi), + DBUSMENU_MENUITEM_SIGNAL_EVENT, + G_CALLBACK (item_handle_event), + widget); } dbusmenu_menuitem_property_set_bool (mi, @@ -924,6 +934,34 @@ item_about_to_show (DbusmenuMenuitem *item, gpointer user_data) return TRUE; } +static gboolean +item_handle_event (DbusmenuMenuitem *item, const gchar *name, + GVariant *variant, guint timestamp, GtkWidget *widget) +{ + if (g_strcmp0 (name, DBUSMENU_MENUITEM_EVENT_OPENED) == 0) + { + GtkWidget *submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget)); + if (submenu != NULL) + { + // Show the submenu so the app can notice and futz with the menus as + // desired (empathy and geany do this) + gtk_widget_show (submenu); + } + } + else if (g_strcmp0 (name, DBUSMENU_MENUITEM_EVENT_CLOSED) == 0) + { + GtkWidget *submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget)); + if (submenu != NULL) + { + // Hide the submenu so the app can notice and futz with the menus as + // desired (empathy and geany do this) + gtk_widget_hide (submenu); + } + } + + return FALSE; // just pass through on everything +} + static void widget_notify_cb (GtkWidget *widget, GParamSpec *pspec, |