#include "wx/gtk/private/gtk2-compat.h"
 #include "wx/gtk/private/mnemonics.h"
 
+// Number of currently open modal dialogs, defined in src/gtk/toplevel.cpp.
+extern int wxOpenModalDialogsCount;
+
 // we use normal item but with a special id for the menu title
 static const int wxGTK_TITLE_ID = -3;
 
 
 static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event)
 {
+    // See the comment about Ubuntu Unity in menuitem_activate().
+    if ( wxOpenModalDialogsCount )
+        return;
+
     event.SetEventObject( menu );
 
     wxEvtHandler* handler = menu->GetEventHandler();
     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 )
+        return;
+
     int id = item->GetId();
     if (id == wxGTK_TITLE_ID)
     {