OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/global_shortcut_listener_x11.h" | 5 #include "chrome/browser/extensions/global_shortcut_listener_x11.h" |
6 | 6 |
7 #include "content/public/browser/browser_thread.h" | 7 #include "content/public/browser/browser_thread.h" |
8 #include "ui/base/accelerators/accelerator.h" | 8 #include "ui/base/accelerators/accelerator.h" |
9 #include "ui/events/keycodes/keyboard_code_conversion_x.h" | 9 #include "ui/events/keycodes/keyboard_code_conversion_x.h" |
10 #include "ui/gfx/x/x11_error_tracker.h" | 10 #include "ui/gfx/x/x11_error_tracker.h" |
11 #include "ui/gfx/x/x11_types.h" | 11 #include "ui/gfx/x/x11_types.h" |
12 | 12 |
13 #if defined(TOOLKIT_GTK) | 13 #if defined(TOOLKIT_GTK) |
14 #include <gdk/gdkx.h> | 14 #include <gdk/gdkx.h> |
15 #else | 15 #else |
16 #include "base/message_loop/message_pump_x11.h" | 16 #include "ui/events/platform/x11/x11_event_source.h" |
17 #endif | 17 #endif |
18 | 18 |
19 using content::BrowserThread; | 19 using content::BrowserThread; |
20 | 20 |
21 namespace { | 21 namespace { |
22 | 22 |
23 // The modifiers masks used for grabing keys. Due to XGrabKey only working on | 23 // The modifiers masks used for grabing keys. Due to XGrabKey only working on |
24 // exact modifiers, we need to grab all key combination including zero or more | 24 // exact modifiers, we need to grab all key combination including zero or more |
25 // of the following: Num lock, Caps lock and Scroll lock. So that we can make | 25 // of the following: Num lock, Caps lock and Scroll lock. So that we can make |
26 // sure the behavior of global shortcuts is consistent on all platforms. | 26 // sure the behavior of global shortcuts is consistent on all platforms. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 | 70 |
71 void GlobalShortcutListenerX11::StartListening() { | 71 void GlobalShortcutListenerX11::StartListening() { |
72 DCHECK(!is_listening_); // Don't start twice. | 72 DCHECK(!is_listening_); // Don't start twice. |
73 DCHECK(!registered_hot_keys_.empty()); // Also don't start if no hotkey is | 73 DCHECK(!registered_hot_keys_.empty()); // Also don't start if no hotkey is |
74 // registered. | 74 // registered. |
75 #if defined(TOOLKIT_GTK) | 75 #if defined(TOOLKIT_GTK) |
76 gdk_window_add_filter(gdk_get_default_root_window(), | 76 gdk_window_add_filter(gdk_get_default_root_window(), |
77 &GlobalShortcutListenerX11::OnXEventThunk, | 77 &GlobalShortcutListenerX11::OnXEventThunk, |
78 this); | 78 this); |
79 #else | 79 #else |
80 base::MessagePumpX11::Current()->AddDispatcherForRootWindow(this); | 80 ui::X11EventSource::GetInstance()->AddPlatformEventDispatcher(this); |
81 #endif | 81 #endif |
82 | 82 |
83 is_listening_ = true; | 83 is_listening_ = true; |
84 } | 84 } |
85 | 85 |
86 void GlobalShortcutListenerX11::StopListening() { | 86 void GlobalShortcutListenerX11::StopListening() { |
87 DCHECK(is_listening_); // No point if we are not already listening. | 87 DCHECK(is_listening_); // No point if we are not already listening. |
88 DCHECK(registered_hot_keys_.empty()); // Make sure the set is clean before | 88 DCHECK(registered_hot_keys_.empty()); // Make sure the set is clean before |
89 // ending. | 89 // ending. |
90 | 90 |
91 #if defined(TOOLKIT_GTK) | 91 #if defined(TOOLKIT_GTK) |
92 gdk_window_remove_filter(NULL, | 92 gdk_window_remove_filter(NULL, |
93 &GlobalShortcutListenerX11::OnXEventThunk, | 93 &GlobalShortcutListenerX11::OnXEventThunk, |
94 this); | 94 this); |
95 #else | 95 #else |
96 base::MessagePumpX11::Current()->RemoveDispatcherForRootWindow(this); | 96 ui::X11EventSource::GetInstance()->RemovePlatformEventDispatcher(this); |
97 #endif | 97 #endif |
98 | 98 |
99 is_listening_ = false; | 99 is_listening_ = false; |
100 } | 100 } |
101 | 101 |
102 #if !defined(TOOLKIT_GTK) | 102 #if !defined(TOOLKIT_GTK) |
103 uint32_t GlobalShortcutListenerX11::Dispatch(const base::NativeEvent& event) { | 103 bool GlobalShortcutListenerX11::CanDispatchEvent( |
104 if (event->type == KeyPress) | 104 const ui::PlatformEvent& event) { |
105 OnXKeyPressEvent(event); | 105 return event->type == KeyPress; |
| 106 } |
106 | 107 |
107 return POST_DISPATCH_NONE; | 108 uint32_t GlobalShortcutListenerX11::DispatchEvent( |
| 109 const ui::PlatformEvent& event) { |
| 110 CHECK_EQ(KeyPress, event->type); |
| 111 OnXKeyPressEvent(event); |
| 112 |
| 113 return ui::POST_DISPATCH_NONE; |
108 } | 114 } |
109 #endif | 115 #endif |
110 | 116 |
111 bool GlobalShortcutListenerX11::RegisterAcceleratorImpl( | 117 bool GlobalShortcutListenerX11::RegisterAcceleratorImpl( |
112 const ui::Accelerator& accelerator) { | 118 const ui::Accelerator& accelerator) { |
113 DCHECK(registered_hot_keys_.find(accelerator) == registered_hot_keys_.end()); | 119 DCHECK(registered_hot_keys_.find(accelerator) == registered_hot_keys_.end()); |
114 | 120 |
115 int modifiers = GetNativeModifiers(accelerator); | 121 int modifiers = GetNativeModifiers(accelerator); |
116 KeyCode keycode = XKeysymToKeycode(x_display_, | 122 KeyCode keycode = XKeysymToKeycode(x_display_, |
117 XKeysymForWindowsKeyCode(accelerator.key_code(), false)); | 123 XKeysymForWindowsKeyCode(accelerator.key_code(), false)); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 modifiers |= (x_event->xkey.state & ControlMask) ? ui::EF_CONTROL_DOWN : 0; | 178 modifiers |= (x_event->xkey.state & ControlMask) ? ui::EF_CONTROL_DOWN : 0; |
173 modifiers |= (x_event->xkey.state & Mod1Mask) ? ui::EF_ALT_DOWN : 0; | 179 modifiers |= (x_event->xkey.state & Mod1Mask) ? ui::EF_ALT_DOWN : 0; |
174 | 180 |
175 ui::Accelerator accelerator( | 181 ui::Accelerator accelerator( |
176 ui::KeyboardCodeFromXKeyEvent(x_event), modifiers); | 182 ui::KeyboardCodeFromXKeyEvent(x_event), modifiers); |
177 if (registered_hot_keys_.find(accelerator) != registered_hot_keys_.end()) | 183 if (registered_hot_keys_.find(accelerator) != registered_hot_keys_.end()) |
178 NotifyKeyPressed(accelerator); | 184 NotifyKeyPressed(accelerator); |
179 } | 185 } |
180 | 186 |
181 } // namespace extensions | 187 } // namespace extensions |
OLD | NEW |