From d3bd8b1a48d542ae8737a985052febe9ae0a5d63 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 21 Mar 2013 22:36:42 +0000 Subject: [PATCH 1/1] Create a small helper class for Unity global menu bug workaround. 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 | 49 ++++++++++++++++++++++++++++ src/gtk/dialog.cpp | 8 ++--- 2 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 include/wx/gtk/private/dialogcount.h diff --git a/include/wx/gtk/private/dialogcount.h b/include/wx/gtk/private/dialogcount.h new file mode 100644 index 0000000000..45b43e4165 --- /dev/null +++ b/include/wx/gtk/private/dialogcount.h @@ -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 +// 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_ diff --git a/src/gtk/dialog.cpp b/src/gtk/dialog.cpp index c7ae206ec3..a79ee902e2 100644 --- a/src/gtk/dialog.cpp +++ b/src/gtk/dialog.cpp @@ -23,9 +23,7 @@ #include #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(); } -- 2.45.2