diff --git a/src/jarabe/view/tabbinghandler.py b/src/jarabe/view/tabbinghandler.py
index 0d42c3f..7029276 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 | | logging.debug('Grabing the input.') |
| 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 | keyboard_grab_result = self._keyboard.grab(window, Gdk.GrabOwnership.WINDOW, False, |
| 54 | Gdk.EventMask.ALL_EVENTS_MASK, None, |
| 55 | event_time) |
| 56 | mouse_grab_result = self._mouse.grab(window, Gdk.GrabOwnership.WINDOW, False, |
| 57 | Gdk.EventMask.ALL_EVENTS_MASK, None, |
| 58 | event_time) |
44 | 59 | |
45 | 60 | self._tabbing = (keyboard_grab_result == Gdk.GrabStatus.SUCCESS and |
46 | | pointer_grab_result == Gdk.GrabStatus.SUCCESS) |
| 61 | mouse_grab_result == Gdk.GrabStatus.SUCCESS) |
47 | 62 | |
48 | 63 | # Now test that the modifier is still active to prevent race |
49 | 64 | # conditions. We also test if one of the grabs failed. |
50 | | mask = window.get_pointer()[2] |
51 | | if not self._tabbing or not (mask & self._modifier): |
52 | | logging.debug('Releasing grabs again.') |
| 65 | _pointer = window.get_pointer() |
| 66 | # mask is in position 3 now |
| 67 | mask = _pointer[3] |
| 68 | logging.debug('==> pointer=%s mask=%s', _pointer, mask) |
| 69 | if not self._tabbing or (mask in (0, self._modifier)): |
| 70 | logging.debug('==> Releasing grabs again. mask=%s', mask) |
53 | 71 | |
54 | 72 | # ungrab keyboard/pointer if the grab was successfull. |
55 | 73 | if keyboard_grab_result == Gdk.GrabStatus.SUCCESS: |
56 | | Gdk.keyboard_ungrab() |
57 | | if pointer_grab_result == Gdk.GrabStatus.SUCCESS: |
58 | | Gdk.pointer_ungrab() |
| 74 | self._keyboard.ungrab(event_time) |
| 75 | if mouse_grab_result == Gdk.GrabStatus.SUCCESS: |
| 76 | self._mouse.ungrab(event_time) |
59 | 77 | |
60 | 78 | self._tabbing = False |
61 | 79 | else: |
| 80 | logging.debug('==> show frame') |
62 | 81 | self._frame.show() |
63 | 82 | |
64 | 83 | def __timeout_cb(self, event_time): |
… |
… |
class TabbingHandler(object): |
85 | 104 | def next_activity(self, event_time): |
86 | 105 | if not self._tabbing: |
87 | 106 | first_switch = True |
88 | | self._start_tabbing() |
| 107 | self._start_tabbing(event_time) |
89 | 108 | else: |
90 | 109 | first_switch = False |
91 | 110 | |
… |
… |
class TabbingHandler(object): |
108 | 127 | def previous_activity(self, event_time): |
109 | 128 | if not self._tabbing: |
110 | 129 | first_switch = True |
111 | | self._start_tabbing() |
| 130 | self._start_tabbing(event_time) |
112 | 131 | else: |
113 | 132 | first_switch = False |
114 | 133 | |
… |
… |
class TabbingHandler(object): |
134 | 153 | next_activity.get_window().activate(event_time) |
135 | 154 | |
136 | 155 | def stop(self, event_time): |
137 | | Gdk.keyboard_ungrab() |
138 | | Gdk.pointer_ungrab() |
| 156 | logging.debug('===> stop tabbing') |
| 157 | self._keyboard.ungrab(event_time) |
| 158 | self._mouse.ungrab(event_time) |
139 | 159 | self._tabbing = False |
140 | 160 | |
141 | 161 | self._frame.hide() |