]> git.saurik.com Git - wxWidgets.git/commitdiff
Relax Unity menu interdiction hack to allow popup menus in modal dialogs.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 12 Jan 2013 03:09:06 +0000 (03:09 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 12 Jan 2013 03:09:06 +0000 (03:09 +0000)
The changes of r73007 fixed the problem with menus remaining active while a
modal dialog was shown (see #14823) but also disabled processing of the events
from any popup menus shown by the dialog itself. Reallow the latter while
still forbidding the former now by checking whether the window associated with
the menu is the dialog itself.

Closes #14961.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73365 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/gtk/menu.cpp

index b1c72ada506933294290381b509822be93a652af..01bdcfaaea37e17333caeb0564eaa73c16673a37 100644 (file)
@@ -46,10 +46,31 @@ extern "C"
 static void wxGetGtkAccel(const wxMenuItem*, guint*, GdkModifierType*);
 #endif
 
-static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event)
+// Unity hack: under Ubuntu Unity the global menu bar is not affected by a
+// modal dialog being shown, so the user can select a menu item before hiding
+// the dialog and, in particular, a new instance of the same dialog can be
+// shown again, breaking a lot of programs not expecting this.
+//
+// So explicitly ignore any menu events generated while any modal dialogs
+// are opened except for the events generated by a context menu within the
+// modal dialog itself that should have a dialog as their invoking window.
+static bool IsMenuEventAllowed(wxMenu* menu)
 {
-    // See the comment about Ubuntu Unity in menuitem_activate().
     if ( wxOpenModalDialogsCount )
+    {
+        wxWindow* tlw = wxGetTopLevelParent(menu->GetWindow());
+        if ( !tlw || !wxDynamicCast(tlw, wxDialog) )
+        {
+            return true;
+        }
+    }
+
+    return true;
+}
+
+static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event)
+{
+    if ( !IsMenuEventAllowed(menu) )
         return;
 
     event.SetEventObject( menu );
@@ -484,14 +505,7 @@ static void menuitem_activate(GtkWidget*, wxMenuItem* item)
     if (!item->IsEnabled())
         return;
 
-    // Unity hack: under Ubuntu Unity the global menu bar is not affected by a
-    // modal dialog being shown, so the user can select a menu item before
-    // hiding the dialog and, in particular, a new instance of the same dialog
-    // can be shown again, breaking a lot of programs not expecting this.
-    //
-    // So explicitly ignore any menu events generated while any modal dialogs
-    // are opened.
-    if ( wxOpenModalDialogsCount )
+    if ( !IsMenuEventAllowed(item->GetMenu()) )
         return;
 
     int id = item->GetId();