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