Skip to content

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 ();
}

Merge request reports