summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-05-08 16:27:23 +0100
committerCaolán McNamara <caolanm@redhat.com>2016-05-08 16:27:58 +0100
commit7c775c157693b076b014104b3548d202e0267895 (patch)
tree01a74ddef60fdb0731e431e90b7dcc784d872690
parente97a8f339ac262b3ead1f0f7e71166587eb7bc3b (diff)
Resolves: tdf#96604 remove and restore full stack of grabs
Change-Id: I51b5943f52ccdce6b4b50131f5f2b7d2c1ff7368
-rw-r--r--vcl/inc/unx/gtk/gtkframe.hxx2
-rw-r--r--vcl/unx/gtk3/gtk3gtkframe.cxx19
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 );