From 25f8b7c4553a85f8f90b807858b965ef4daa1f6a Mon Sep 17 00:00:00 2001
From: Simon Schampijer <simon@laptop.org>
Date: Thu, 13 Dec 2012 19:50:56 +0100
Subject: [PATCH shell] Tabbinghandler: port the tabbinghandler to the new
GTK+3 API, SL #3895
gdk-keyboard-grab [1] and gdk-pointer-grab [2] have been deprecated,
we have to use gdk_device_grab [3] now in order to grab the events. This
patch does the port to the new API.
We also switch to gdk_window_get_device_position instead of
gdk_window_get_pointer [4].
This patch needs as well a fix for the keygrabber (toolkit) to handle
XI2 key events in order to work.
[1] http://developer.gnome.org/gdk3/stable/gdk3-General.html#gdk-keyboard-grab
[2] http://developer.gnome.org/gdk3/stable/gdk3-General.html#gdk-pointer-grab
[3] http://developer.gnome.org/gdk3/stable/GdkDevice.html#gdk-device-grab
[4] http://developer.gnome.org/gdk3/stable/gdk3-Windows.html#gdk-window-get-pointer
Signed-off-by: Simon Schampijer <simon@laptop.org>
---
src/jarabe/view/tabbinghandler.py | 51 +++++++++++++++++++++++++++++----------
1 file changed, 38 insertions(+), 13 deletions(-)
diff --git a/src/jarabe/view/tabbinghandler.py b/src/jarabe/view/tabbinghandler.py
index 0d42c3f..66dd7ca 100644
a
|
b
|
class TabbingHandler(object): |
32 | 32 | self._tabbing = False |
33 | 33 | self._modifier = modifier |
34 | 34 | self._timeout = None |
35 | | |
36 | | def _start_tabbing(self): |
| 35 | self._keyboard = None |
| 36 | self._mouse = None |
| 37 | |
| 38 | display = Gdk.Display.get_default() |
| 39 | device_manager = display.get_device_manager() |
| 40 | devices = device_manager.list_devices(Gdk.DeviceType.MASTER) |
| 41 | for device in devices: |
| 42 | if device.get_source() == Gdk.InputSource.KEYBOARD: |
| 43 | self._keyboard = device |
| 44 | if device.get_source() == Gdk.InputSource.MOUSE: |
| 45 | self._mouse = device |
| 46 | |
| 47 | def _start_tabbing(self, event_time): |
37 | 48 | if not self._tabbing: |
38 | 49 | logging.debug('Grabing the input.') |
39 | 50 | |
40 | 51 | screen = Gdk.Screen.get_default() |
41 | 52 | window = screen.get_root_window() |
42 | | keyboard_grab_result = Gdk.keyboard_grab(window, False) |
43 | | pointer_grab_result = Gdk.pointer_grab(window) |
| 53 | |
| 54 | keyboard_grab_result = self._keyboard.grab(window, |
| 55 | Gdk.GrabOwnership.WINDOW, |
| 56 | False, |
| 57 | Gdk.EventMask.KEY_PRESS_MASK | |
| 58 | Gdk.EventMask.KEY_RELEASE_MASK, |
| 59 | None, |
| 60 | event_time) |
| 61 | |
| 62 | mouse_grab_result = self._mouse.grab(window, |
| 63 | Gdk.GrabOwnership.WINDOW, |
| 64 | False, |
| 65 | Gdk.EventMask.BUTTON_PRESS_MASK | |
| 66 | Gdk.EventMask.BUTTON_RELEASE_MASK, |
| 67 | None, |
| 68 | event_time) |
44 | 69 | |
45 | 70 | self._tabbing = (keyboard_grab_result == Gdk.GrabStatus.SUCCESS and |
46 | | pointer_grab_result == Gdk.GrabStatus.SUCCESS) |
| 71 | mouse_grab_result == Gdk.GrabStatus.SUCCESS) |
47 | 72 | |
48 | 73 | # Now test that the modifier is still active to prevent race |
49 | 74 | # conditions. We also test if one of the grabs failed. |
50 | | mask = window.get_pointer()[2] |
| 75 | mask = window.get_device_position(self._mouse)[3] |
51 | 76 | if not self._tabbing or not (mask & self._modifier): |
52 | 77 | logging.debug('Releasing grabs again.') |
53 | 78 | |
54 | 79 | # ungrab keyboard/pointer if the grab was successfull. |
55 | 80 | if keyboard_grab_result == Gdk.GrabStatus.SUCCESS: |
56 | | Gdk.keyboard_ungrab() |
57 | | if pointer_grab_result == Gdk.GrabStatus.SUCCESS: |
58 | | Gdk.pointer_ungrab() |
| 81 | self._keyboard.ungrab(event_time) |
| 82 | if mouse_grab_result == Gdk.GrabStatus.SUCCESS: |
| 83 | self._mouse.ungrab(event_time) |
59 | 84 | |
60 | 85 | self._tabbing = False |
61 | 86 | else: |
… |
… |
class TabbingHandler(object): |
85 | 110 | def next_activity(self, event_time): |
86 | 111 | if not self._tabbing: |
87 | 112 | first_switch = True |
88 | | self._start_tabbing() |
| 113 | self._start_tabbing(event_time) |
89 | 114 | else: |
90 | 115 | first_switch = False |
91 | 116 | |
… |
… |
class TabbingHandler(object): |
108 | 133 | def previous_activity(self, event_time): |
109 | 134 | if not self._tabbing: |
110 | 135 | first_switch = True |
111 | | self._start_tabbing() |
| 136 | self._start_tabbing(event_time) |
112 | 137 | else: |
113 | 138 | first_switch = False |
114 | 139 | |
… |
… |
class TabbingHandler(object): |
134 | 159 | next_activity.get_window().activate(event_time) |
135 | 160 | |
136 | 161 | def stop(self, event_time): |
137 | | Gdk.keyboard_ungrab() |
138 | | Gdk.pointer_ungrab() |
| 162 | self._keyboard.ungrab(event_time) |
| 163 | self._mouse.ungrab(event_time) |
139 | 164 | self._tabbing = False |
140 | 165 | |
141 | 166 | self._frame.hide() |