#ifndef WX_PRECOMP
#include "wx/intl.h"
#include "wx/log.h"
+ #include "wx/dialog.h"
#include "wx/frame.h"
#include "wx/bitmap.h"
#include "wx/app.h"
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) )
+ {
+ // This must be an event from a menu bar of one of the frames.
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event)
+{
+ if ( !IsMenuEventAllowed(menu) )
return;
event.SetEventObject( menu );
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();