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.
101 lines
3.5 KiB
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
|
|
|