--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// Name: wx/gtk/private/dialogcount.h
+// Purpose: Helper for temporarily changing wxOpenModalDialogsCount global.
+// Author: Vadim Zeitlin
+// Created: 2013-03-21
+// RCS-ID: $Id$
+// Copyright: (c) 2013 Vadim Zeitlin <vadim@wxwidgets.org>
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_GTK_PRIVATE_DIALOGCOUNT_H_
+#define _WX_GTK_PRIVATE_DIALOGCOUNT_H_
+
+#include "wx/defs.h"
+
+// This global variable contains the number of currently opened modal dialogs.
+// When it is non null, the global menu used in Ubuntu Unity needs to be
+// explicitly disabled as this doesn't currently happen on its own due to a bug
+// in Unity, see https://bugs.launchpad.net/indicator-appmenu/+bug/674605
+//
+// For this to work, all modal dialogs must use wxOpenModalDialogLocker class
+// below to increment this variable while they are indeed being modally shown.
+//
+// This variable is defined in src/gtk/toplevel.cpp
+extern int wxOpenModalDialogsCount;
+
+// ----------------------------------------------------------------------------
+// wxOpenModalDialogLocker: Create an object of this class to increment
+// wxOpenModalDialogsCount during its lifetime.
+// ----------------------------------------------------------------------------
+
+class wxOpenModalDialogLocker
+{
+public:
+ wxOpenModalDialogLocker()
+ {
+ wxOpenModalDialogsCount++;
+ }
+
+ ~wxOpenModalDialogLocker()
+ {
+ wxOpenModalDialogsCount--;
+ }
+
+private:
+ wxDECLARE_NO_COPY_CLASS(wxOpenModalDialogLocker);
+};
+
+#endif // _WX_GTK_PRIVATE_DIALOGCOUNT_H_
#include <gtk/gtk.h>
#include "wx/gtk/private/gtk2-compat.h"
-
-// this is defined in src/gtk/toplevel.cpp
-extern int wxOpenModalDialogsCount;
+#include "wx/gtk/private/dialogcount.h"
wxDEFINE_TIED_SCOPED_PTR_TYPE(wxGUIEventLoop)
m_modalShowing = true;
- wxOpenModalDialogsCount++;
+ wxOpenModalDialogLocker modalLock;
// NOTE: gtk_window_set_modal internally calls gtk_grab_add() !
gtk_window_set_modal(GTK_WINDOW(m_widget), TRUE);
gtk_window_set_modal(GTK_WINDOW(m_widget), FALSE);
- wxOpenModalDialogsCount--;
-
return GetReturnCode();
}