diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-05-08 16:27:23 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-05-08 16:27:58 +0100 |
commit | 7c775c157693b076b014104b3548d202e0267895 (patch) | |
tree | 01a74ddef60fdb0731e431e90b7dcc784d872690 | |
parent | e97a8f339ac262b3ead1f0f7e71166587eb7bc3b (diff) |
Resolves: tdf#96604 remove and restore full stack of grabs
Change-Id: I51b5943f52ccdce6b4b50131f5f2b7d2c1ff7368
-rw-r--r-- | vcl/inc/unx/gtk/gtkframe.hxx | 2 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkframe.cxx | 19 |
2 files changed, 11 insertions, 10 deletions
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index 45ea63626054..6cc42a49310c 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -300,7 +300,7 @@ class GtkSalFrame : public SalFrame static GdkNativeWindow findTopLevelSystemWindow( GdkNativeWindow aWindow ); static int m_nFloats; - static GtkWidget* m_pGrabWidgetBeforeShowFloats; + static std::vector<GtkWidget*> m_aGrabWidgetsBeforeShowFloat; bool isFloatGrabWindow() const { diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index d716a5cba87e..ec96b078fc3b 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -104,7 +104,7 @@ using namespace com::sun::star; int GtkSalFrame::m_nFloats = 0; -GtkWidget* GtkSalFrame::m_pGrabWidgetBeforeShowFloats = nullptr; +std::vector<GtkWidget*> GtkSalFrame::m_aGrabWidgetsBeforeShowFloat; #if defined ENABLE_GMENU_INTEGRATION static GDBusConnection* pSessionBus = nullptr; @@ -1418,9 +1418,12 @@ void GtkSalFrame::Show( bool bVisible, bool bNoActivate ) m_nFloats++; if( ! getDisplay()->GetCaptureFrame() && m_nFloats == 1 ) { - m_pGrabWidgetBeforeShowFloats = gtk_grab_get_current(); - if (m_pGrabWidgetBeforeShowFloats) - gtk_grab_remove(m_pGrabWidgetBeforeShowFloats); + GtkWidget* pGrabWidgetBeforeShowFloat; + while ((pGrabWidgetBeforeShowFloat = gtk_grab_get_current())) + { + m_aGrabWidgetsBeforeShowFloat.push_back(pGrabWidgetBeforeShowFloat); + gtk_grab_remove(pGrabWidgetBeforeShowFloat); + } grabPointer(true, true); GtkSalFrame *pKeyboardFrame = m_pParent ? m_pParent : this; pKeyboardFrame->grabKeyboard(true); @@ -1442,11 +1445,9 @@ void GtkSalFrame::Show( bool bVisible, bool bNoActivate ) GtkSalFrame *pKeyboardFrame = m_pParent ? m_pParent : this; pKeyboardFrame->grabKeyboard(false); grabPointer(false); - if (m_pGrabWidgetBeforeShowFloats) - { - gtk_grab_add(m_pGrabWidgetBeforeShowFloats); - m_pGrabWidgetBeforeShowFloats = nullptr; - } + for (auto i = m_aGrabWidgetsBeforeShowFloat.rbegin(); i != m_aGrabWidgetsBeforeShowFloat.rend(); ++i) + gtk_grab_add(*i); + m_aGrabWidgetsBeforeShowFloat.clear(); } } gtk_widget_hide( m_pWindow ); |