X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/401165241497e609f4d5a08f8eb71a8097289d48..2a45803fc3877afd0ae3ce356dfe216505165882:/src/gtk/menu.cpp diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 694c0d503a..51e23212bc 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -17,6 +17,7 @@ #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" @@ -46,10 +47,32 @@ 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) ) + { + // 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 ); @@ -101,8 +124,6 @@ void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long st } PostCreation(); - - GTKApplyWidgetStyle(); #endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2/!wxUSE_LIBHILDON && !wxUSE_LIBHILDON2 g_object_ref_sink(m_widget); @@ -486,14 +507,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();