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
This commit is contained in:
Vadim Zeitlin 2013-03-21 22:36:42 +00:00
parent 49b18c6cd9
commit d3bd8b1a48
2 changed files with 51 additions and 6 deletions

View File

@ -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_

View 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();
}