MenuShell: activate a menu item before deactivating its parent
If we have a standalone menu that is destroyed on deactivation and that should perform an action if activated before, that won't work.
The reason is that gtk_menu_shell_activate_item deactivates the menu item container before activating the activated item and don't see any rationale for what is currently done.
https://bugzilla.gnome.org/show_bug.cgi?id=689247
--
A test case is code like the one below, just run it click on the "activate" menu item that popups
#include <gtk/gtk.h>
gboolean activated = FALSE;
static void
activate_menuitem (GtkWidget *menuitem, gpointer data)
{
g_print("Activating %p, this won't ever happen!\n", menuitem);
activated = TRUE;
}
static void
deactivate_menu (GtkWidget *menuitem, gpointer data)
{
g_print("Menu deactivated and destroyed\n");
gtk_widget_destroy(menuitem);
gtk_main_quit();
g_assert (activated == TRUE);
}
static void
positon_menu (GtkMenu *menu, gint *x, gint *y, gboolean *push, gpointer data)
{
*x = 150;
*y = 150;
*push = TRUE;
}
void main (int argc, char **argv)
{
GtkWidget *menubar;
GtkWidget *offscreen_window;
GtkWidget *menu;
GtkWidget *menuitem;
gtk_init (&argc, &argv);
offscreen_window = gtk_offscreen_window_new ();
menubar = gtk_menu_bar_new ();
menu = gtk_menu_new ();
menuitem = gtk_menu_item_new_with_label ("Activate");
gtk_container_add (GTK_CONTAINER (offscreen_window), menubar);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
gtk_widget_show (menuitem);
g_signal_connect (menuitem, "activate", G_CALLBACK (activate_menuitem), NULL);
g_signal_connect (menu, "deactivate", G_CALLBACK (deactivate_menu), NULL);
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, positon_menu, NULL, 0, GDK_CURRENT_TIME);
gtk_menu_reposition (GTK_MENU (menu));
gtk_main ();
}