summaryrefslogtreecommitdiffstats
path: root/allow-keybindings-ungrab.patch
blob: 25d82aab60f52b4a1d60c57cdc095c6ddf408d38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
From 429b200aa0e21b33a720790d18e059491eb60089 Mon Sep 17 00:00:00 2001
From: Daniel Drake <dsd@laptop.org>
Date: Wed, 02 Mar 2011 15:52:53 +0000
Subject: Disable keybindings message should ungrab keys

The disable-keybindings action is currently only 'soft' in that it
just causes Metacity to ignore keypresses; the keys themselves are left
bound.

Sugar would like to use this message to actually disable the bindings
*and* release the grabs so that it can implement its own Alt-Tab handler.

This patch implements this. Based on earlier work by Bernie Innocenti.
---
diff --git a/src/core/display.c b/src/core/display.c
index 518b4f3..3143e0c 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -2268,7 +2268,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 (display, !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 8ea6b41..da274e0 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -817,6 +817,9 @@ meta_screen_grab_keys (MetaScreen *screen)
   if (screen->keys_grabbed)
     return;
 
+  if (all_bindings_disabled)
+    return;
+
   grab_keys (screen->display->key_bindings,
              screen->display->n_key_bindings,
              screen->display, screen->xroot,
@@ -841,6 +844,9 @@ meta_window_grab_keys (MetaWindow  *window)
   if (window->all_keys_grabbed)
     return;
 
+  if (all_bindings_disabled)
+    return;
+
   if (window->type == META_WINDOW_DOCK)
     {
       if (window->keys_grabbed)
@@ -3356,9 +3362,11 @@ handle_set_spew_mark (MetaDisplay    *display,
 }
 
 void
-meta_set_keybindings_disabled (gboolean setting)
+meta_set_keybindings_disabled (MetaDisplay *display,
+                               gboolean     setting)
 {
   all_bindings_disabled = setting;
+  regrab_key_bindings (display);
   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..f845b48 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      (MetaDisplay *display,
+                                             gboolean     setting);
 void     meta_display_process_mapping_event (MetaDisplay *display,
                                              XEvent      *event);
 
--
cgit v0.9