]> git.saurik.com Git - wxWidgets.git/commitdiff
Create a small helper class for Unity global menu bug workaround.
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 21 Mar 2013 22:36:42 +0000 (22:36 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 21 Mar 2013 22:36:42 +0000 (22:36 +0000)
Encapsulate the code temporarily incrementing wxOpenModalDialogsCount in a
small helper class to make it easier to reuse it elsewhere.

See #14823.

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

include/wx/gtk/private/dialogcount.h [new file with mode: 0644]
src/gtk/dialog.cpp

diff --git a/include/wx/gtk/private/dialogcount.h b/include/wx/gtk/private/dialogcount.h
new file mode 100644 (file)
index 0000000..45b43e4
--- /dev/null
@@ -0,0 +1,49 @@
+///////////////////////////////////////////////////////////////////////////////
+// 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_
index c7ae206ec3affadafe8bb4e144fc92e80276bf3a..a79ee902e29a864fbb219f9d427e172f3ccec146 100644 (file)
@@ -23,9 +23,7 @@
 
 #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)
 
@@ -172,7 +170,7 @@ int wxDialog::ShowModal()
 
     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);
@@ -190,8 +188,6 @@ int wxDialog::ShowModal()
 
     gtk_window_set_modal(GTK_WINDOW(m_widget), FALSE);
 
-    wxOpenModalDialogsCount--;
-
     return GetReturnCode();
 }