From a533fb141dc85d7c28291b0c57055eb7b8160534 Mon Sep 17 00:00:00 2001 From: Paul Cornett Date: Mon, 24 Jul 2017 08:56:59 -0700 Subject: [PATCH] Fix unresponsive frame after using wxHtmlHelpFrame from a dialog. See #17837 --- include/wx/gtk/toplevel.h | 6 ++++-- src/gtk/toplevel.cpp | 23 +++++++++++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/include/wx/gtk/toplevel.h b/include/wx/gtk/toplevel.h index b26ea6d4ad..eba2c1f7e0 100644 --- a/include/wx/gtk/toplevel.h +++ b/include/wx/gtk/toplevel.h @@ -9,6 +9,8 @@ #ifndef _WX_GTK_TOPLEVEL_H_ #define _WX_GTK_TOPLEVEL_H_ +class WXDLLIMPEXP_CORE wxGUIEventLoop; + //----------------------------------------------------------------------------- // wxTopLevelWindowGTK //----------------------------------------------------------------------------- @@ -80,7 +82,7 @@ public: // viewable from within modal dialogs virtual void AddGrab(); virtual void RemoveGrab(); - virtual bool IsGrabbed() const { return m_grabbed; } + virtual bool IsGrabbed() const; virtual void Refresh( bool eraseBackground = true, @@ -158,7 +160,7 @@ private: bool m_isIconized; // is the frame currently grabbed explicitly by the application? - bool m_grabbed; + wxGUIEventLoop* m_grabbedEventLoop; bool m_updateDecorSize; bool m_deferShowAllowed; diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 42ca6f1ca0..2b289f4ea8 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -552,7 +552,7 @@ void wxTopLevelWindowGTK::Init() m_themeEnabled = true; m_gdkDecor = m_gdkFunc = 0; - m_grabbed = false; + m_grabbedEventLoop = NULL; m_deferShow = true; m_deferShowAllowed = true; m_updateDecorSize = true; @@ -808,7 +808,7 @@ wxTopLevelWindowGTK::~wxTopLevelWindowGTK() g_source_remove(m_netFrameExtentsTimerId); } - if (m_grabbed) + if (m_grabbedEventLoop) { wxFAIL_MSG(wxT("Window still grabbed")); RemoveGrab(); @@ -1478,24 +1478,31 @@ void wxTopLevelWindowGTK::SetIconizeState(bool iconize) void wxTopLevelWindowGTK::AddGrab() { - if (!m_grabbed) + if (!m_grabbedEventLoop) { - m_grabbed = true; + wxGUIEventLoop eventLoop; + m_grabbedEventLoop = &eventLoop; gtk_grab_add( m_widget ); - wxGUIEventLoop().Run(); + eventLoop.Run(); gtk_grab_remove( m_widget ); + m_grabbedEventLoop = NULL; } } void wxTopLevelWindowGTK::RemoveGrab() { - if (m_grabbed) + if (m_grabbedEventLoop) { - gtk_main_quit(); - m_grabbed = false; + m_grabbedEventLoop->Exit(); + m_grabbedEventLoop = NULL; } } +bool wxTopLevelWindowGTK::IsGrabbed() const +{ + return m_grabbedEventLoop != NULL; +} + bool wxTopLevelWindowGTK::IsActive() { return (this == (wxTopLevelWindowGTK*)g_activeFrame);