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:
49
include/wx/gtk/private/dialogcount.h
Normal file
49
include/wx/gtk/private/dialogcount.h
Normal 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_
|
@@ -23,9 +23,7 @@
|
|||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include "wx/gtk/private/gtk2-compat.h"
|
#include "wx/gtk/private/gtk2-compat.h"
|
||||||
|
#include "wx/gtk/private/dialogcount.h"
|
||||||
// this is defined in src/gtk/toplevel.cpp
|
|
||||||
extern int wxOpenModalDialogsCount;
|
|
||||||
|
|
||||||
wxDEFINE_TIED_SCOPED_PTR_TYPE(wxGUIEventLoop)
|
wxDEFINE_TIED_SCOPED_PTR_TYPE(wxGUIEventLoop)
|
||||||
|
|
||||||
@@ -172,7 +170,7 @@ int wxDialog::ShowModal()
|
|||||||
|
|
||||||
m_modalShowing = true;
|
m_modalShowing = true;
|
||||||
|
|
||||||
wxOpenModalDialogsCount++;
|
wxOpenModalDialogLocker modalLock;
|
||||||
|
|
||||||
// NOTE: gtk_window_set_modal internally calls gtk_grab_add() !
|
// 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), TRUE);
|
||||||
@@ -190,8 +188,6 @@ int wxDialog::ShowModal()
|
|||||||
|
|
||||||
gtk_window_set_modal(GTK_WINDOW(m_widget), FALSE);
|
gtk_window_set_modal(GTK_WINDOW(m_widget), FALSE);
|
||||||
|
|
||||||
wxOpenModalDialogsCount--;
|
|
||||||
|
|
||||||
return GetReturnCode();
|
return GetReturnCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user