You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libreoffice/0001-gnome-745909-grab-ungr...

101 lines
3.5 KiB

From 27e0fee7da99f3df722668d132bc034bef421514 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Fri, 27 Mar 2015 15:28:28 +0000
Subject: [PATCH] gnome#745909 grab/ungrab keyboard for menus
Change-Id: Id0593e1c9af79084ae798f26a0be37c57d254227
---
vcl/inc/unx/gtk/gtkframe.hxx | 3 ++-
vcl/unx/gtk/window/gtksalframe.cxx | 39 ++++++++++++++++++++++++++++++++++++--
2 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index d514411..2eb0634 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -328,7 +328,8 @@ public:
// and false else; if true was returned the event should
// be swallowed
bool Dispatch( const XEvent* pEvent );
- void grabPointer( bool bGrab, bool bOwnerEvents = false );
+ void grabPointer(bool bGrab, bool bOwnerEvents = false);
+ void grabKeyboard(bool bGrab);
GtkSalDisplay* getDisplay();
GdkDisplay* getGdkDisplay();
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index aa94c26..1b8bdc5 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -1864,7 +1864,13 @@ void GtkSalFrame::Show( bool bVisible, bool bNoActivate )
{
m_nFloats++;
if( ! getDisplay()->GetCaptureFrame() && m_nFloats == 1 )
- grabPointer( true, true );
+ {
+ grabPointer(true, true);
+ GtkSalFrame *pKeyboardFrame = this;
+ while (pKeyboardFrame->m_pParent)
+ pKeyboardFrame = pKeyboardFrame->m_pParent;
+ pKeyboardFrame->grabKeyboard(true);
+ }
// #i44068# reset parent's IM context
if( m_pParent )
m_pParent->EndExtTextInput(0);
@@ -1878,7 +1884,13 @@ void GtkSalFrame::Show( bool bVisible, bool bNoActivate )
{
m_nFloats--;
if( ! getDisplay()->GetCaptureFrame() && m_nFloats == 0)
- grabPointer( false );
+ {
+ GtkSalFrame *pKeyboardFrame = this;
+ while (pKeyboardFrame->m_pParent)
+ pKeyboardFrame = pKeyboardFrame->m_pParent;
+ pKeyboardFrame->grabKeyboard(false);
+ grabPointer(false);
+ }
}
gtk_widget_hide( m_pWindow );
if( m_pIMHandler )
@@ -2762,7 +2774,9 @@ void GtkSalFrame::grabPointer( bool bGrab, bool bOwnerEvents )
{
// Two GdkDisplays may be open
if( !pEnv || !*pEnv )
+ {
gdk_display_pointer_ungrab( getGdkDisplay(), GDK_CURRENT_TIME);
+ }
}
}
#else
@@ -2771,6 +2785,27 @@ void GtkSalFrame::grabPointer( bool bGrab, bool bOwnerEvents )
#endif
}
+void GtkSalFrame::grabKeyboard( bool bGrab )
+{
+#if !GTK_CHECK_VERSION(3,0,0)
+ if( m_pWindow )
+ {
+ if( bGrab )
+ {
+ gdk_keyboard_grab(widget_get_window(m_pWindow), true,
+ GDK_CURRENT_TIME);
+ }
+ else
+ {
+ gdk_keyboard_ungrab(GDK_CURRENT_TIME);
+ }
+ }
+#else
+ (void)bGrab;
+ //FIXME: No GrabKeyboard implementation for gtk3 ...
+#endif
+}
+
void GtkSalFrame::CaptureMouse( bool bCapture )
{
getDisplay()->CaptureMouse( bCapture ? this : NULL );
--
1.9.3