From: Bernie Innocenti <bernie@codewiz.org>
To: otaylor@redhat.com
Subject: [PATCH] Really ungrab X keybindings when they are disabled
Date: Tue, 15 Jun 2010 16:02:22 -0400

Signed-off-by: Bernie Innocenti <bernie@codewiz.org>
---
 src/core/display.c     |    2 +-
 src/core/keybindings.c |   30 +++++++++++++++---------------
 src/core/keybindings.h |    3 ++-
 3 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/src/core/display.c b/src/core/display.c
index 4c7b4c0..22a9b1e 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -2311,7 +2311,7 @@ event_callback (XEvent   *event,
                 {
                   meta_verbose ("Received set keybindings request = %d\n",
                                 (int) event->xclient.data.l[0]);
-                  meta_set_keybindings_disabled (!event->xclient.data.l[0]);
+                  meta_set_keybindings_disabled (screen, !event->xclient.data.l[0]);
                 }
               else if (event->xclient.message_type ==
                        display->atom__METACITY_TOGGLE_VERBOSE)
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 63596bb..82a0527 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -692,20 +692,11 @@ meta_change_keygrab (MetaDisplay *display,
 }
 
 static void
-meta_grab_key (MetaDisplay *display,
-               Window       xwindow,
-               int          keysym,
-               unsigned int keycode,
-               int          modmask)
-{
-  meta_change_keygrab (display, xwindow, TRUE, keysym, keycode, modmask);
-}
-
-static void
 grab_keys (MetaKeyBinding *bindings,
            int             n_bindings,
            MetaDisplay    *display,
            Window          xwindow,
+           gboolean        grab,
            gboolean        binding_per_window)
 {
   int i;
@@ -721,7 +712,8 @@ grab_keys (MetaKeyBinding *bindings,
           !!(bindings[i].handler->flags & BINDING_PER_WINDOW) &&
           bindings[i].keycode != 0)
         {
-          meta_grab_key (display, xwindow,
+          meta_change_keygrab (display, xwindow,
+                         grab,
                          bindings[i].keysym,
                          bindings[i].keycode,
                          bindings[i].mask);
@@ -771,7 +763,7 @@ meta_screen_grab_keys (MetaScreen *screen)
   grab_keys (screen->display->key_bindings,
              screen->display->n_key_bindings,
              screen->display, screen->xroot,
-             FALSE);
+             TRUE, FALSE);
 
   screen->keys_grabbed = TRUE;
 }
@@ -781,7 +773,10 @@ meta_screen_ungrab_keys (MetaScreen  *screen)
 {
   if (screen->keys_grabbed)
     {
-      ungrab_all_keys (screen->display, screen->xroot);
+      grab_keys (screen->display->key_bindings,
+                 screen->display->n_key_bindings,
+                 screen->display, screen->xroot,
+                 FALSE, FALSE);
       screen->keys_grabbed = FALSE;
     }
 }
@@ -815,7 +810,7 @@ meta_window_grab_keys (MetaWindow  *window)
              window->display->n_key_bindings,
              window->display,
              window->frame ? window->frame->xwindow : window->xwindow,
-             TRUE);
+             TRUE, TRUE);
 
   window->keys_grabbed = TRUE;
   window->grab_on_frame = window->frame != NULL;
@@ -3307,9 +3302,14 @@ handle_set_spew_mark (MetaDisplay    *display,
 }
 
 void
-meta_set_keybindings_disabled (gboolean setting)
+meta_set_keybindings_disabled (MetaScreen *screen, gboolean setting)
 {
   all_bindings_disabled = setting;
+  if (all_bindings_disabled)
+    meta_screen_ungrab_keys (screen);
+  else
+    meta_screen_grab_keys (screen);
+
   meta_topic (META_DEBUG_KEYBINDINGS,
               "Keybindings %s\n", all_bindings_disabled ? "disabled" : "enabled");
 }
diff --git a/src/core/keybindings.h b/src/core/keybindings.h
index 618520b..8a76214 100644
--- a/src/core/keybindings.h
+++ b/src/core/keybindings.h
@@ -49,7 +49,8 @@ void     meta_window_ungrab_all_keys        (MetaWindow  *window,
 void     meta_display_process_key_event     (MetaDisplay *display,
                                              MetaWindow  *window,
                                              XEvent      *event);
-void     meta_set_keybindings_disabled      (gboolean     setting);
+void     meta_set_keybindings_disabled      (MetaScreen  *screen,
+                                             gboolean     setting);
 void     meta_display_process_mapping_event (MetaDisplay *display,
                                              XEvent      *event);
 
-- 
1.6.2.5


