OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/chromeos/events/event_rewriter.h" | 5 #include "chrome/browser/chromeos/events/event_rewriter.h" |
6 | 6 |
7 #include <X11/extensions/XInput2.h> | 7 #include <X11/extensions/XInput2.h> |
8 #include <X11/keysym.h> | 8 #include <X11/keysym.h> |
9 #include <X11/XF86keysym.h> | 9 #include <X11/XF86keysym.h> |
10 #include <X11/Xlib.h> | 10 #include <X11/Xlib.h> |
11 // Get rid of macros from Xlib.h that conflicts with other parts of the code. | 11 // Get rid of macros from Xlib.h that conflicts with other parts of the code. |
12 #undef RootWindow | 12 #undef RootWindow |
13 #undef Status | 13 #undef Status |
14 | 14 |
15 #include <vector> | 15 #include <vector> |
16 | 16 |
17 #include "ash/shell.h" | |
18 #include "ash/wm/window_state.h" | 17 #include "ash/wm/window_state.h" |
19 #include "ash/wm/window_util.h" | 18 #include "ash/wm/window_util.h" |
20 #include "base/command_line.h" | 19 #include "base/command_line.h" |
21 #include "base/logging.h" | 20 #include "base/logging.h" |
22 #include "base/prefs/pref_service.h" | 21 #include "base/prefs/pref_service.h" |
23 #include "base/strings/string_util.h" | 22 #include "base/strings/string_util.h" |
24 #include "base/sys_info.h" | 23 #include "base/sys_info.h" |
25 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h" | 24 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h" |
26 #include "chrome/browser/chromeos/events/xinput_hierarchy_changed_event_listener
.h" | 25 #include "chrome/browser/chromeos/events/xinput_hierarchy_changed_event_listener
.h" |
27 #include "chrome/browser/chromeos/login/login_display_host_impl.h" | 26 #include "chrome/browser/chromeos/login/login_display_host_impl.h" |
28 #include "chrome/browser/chromeos/login/user_manager.h" | 27 #include "chrome/browser/chromeos/login/user_manager.h" |
29 #include "chrome/browser/profiles/profile_manager.h" | 28 #include "chrome/browser/profiles/profile_manager.h" |
30 #include "chrome/common/pref_names.h" | 29 #include "chrome/common/pref_names.h" |
31 #include "chromeos/chromeos_switches.h" | 30 #include "chromeos/chromeos_switches.h" |
32 #include "chromeos/ime/input_method_manager.h" | 31 #include "chromeos/ime/input_method_manager.h" |
33 #include "chromeos/ime/xkeyboard.h" | 32 #include "chromeos/ime/xkeyboard.h" |
34 #include "ui/aura/window_event_dispatcher.h" | |
35 #include "ui/base/x/x11_util.h" | 33 #include "ui/base/x/x11_util.h" |
36 #include "ui/events/event.h" | 34 #include "ui/events/event.h" |
37 #include "ui/events/event_utils.h" | 35 #include "ui/events/event_utils.h" |
38 #include "ui/events/keycodes/keyboard_code_conversion_x.h" | 36 #include "ui/events/keycodes/keyboard_code_conversion_x.h" |
39 #include "ui/views/corewm/window_util.h" | 37 #include "ui/views/corewm/window_util.h" |
40 | 38 |
41 namespace { | 39 namespace { |
42 | 40 |
43 const int kBadDeviceId = -1; | 41 const int kBadDeviceId = -1; |
44 | 42 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 | 132 |
135 } // namespace | 133 } // namespace |
136 | 134 |
137 namespace chromeos { | 135 namespace chromeos { |
138 | 136 |
139 EventRewriter::EventRewriter() | 137 EventRewriter::EventRewriter() |
140 : last_device_id_(kBadDeviceId), | 138 : last_device_id_(kBadDeviceId), |
141 xkeyboard_for_testing_(NULL), | 139 xkeyboard_for_testing_(NULL), |
142 keyboard_driven_event_rewriter_(new KeyboardDrivenEventRewriter), | 140 keyboard_driven_event_rewriter_(new KeyboardDrivenEventRewriter), |
143 pref_service_for_testing_(NULL) { | 141 pref_service_for_testing_(NULL) { |
144 // The ash shell isn't instantiated for our unit tests. | |
145 if (ash::Shell::HasInstance()) { | |
146 ash::Shell::GetPrimaryRootWindow()->GetHost()->AddObserver(this); | |
147 } | |
148 base::MessageLoopForUI::current()->AddObserver(this); | 142 base::MessageLoopForUI::current()->AddObserver(this); |
149 if (base::SysInfo::IsRunningOnChromeOS()) { | 143 if (base::SysInfo::IsRunningOnChromeOS()) { |
150 XInputHierarchyChangedEventListener::GetInstance()->AddObserver(this); | 144 XInputHierarchyChangedEventListener::GetInstance()->AddObserver(this); |
151 } | 145 } |
152 RefreshKeycodes(); | 146 RefreshKeycodes(); |
153 } | 147 } |
154 | 148 |
155 EventRewriter::~EventRewriter() { | 149 EventRewriter::~EventRewriter() { |
156 base::MessageLoopForUI::current()->RemoveObserver(this); | 150 base::MessageLoopForUI::current()->RemoveObserver(this); |
157 if (ash::Shell::HasInstance()) { | |
158 ash::Shell::GetPrimaryRootWindow()->GetHost()->RemoveObserver(this); | |
159 } | |
160 if (base::SysInfo::IsRunningOnChromeOS()) { | 151 if (base::SysInfo::IsRunningOnChromeOS()) { |
161 XInputHierarchyChangedEventListener::GetInstance()->RemoveObserver(this); | 152 XInputHierarchyChangedEventListener::GetInstance()->RemoveObserver(this); |
162 } | 153 } |
163 } | 154 } |
164 | 155 |
165 EventRewriter::DeviceType EventRewriter::DeviceAddedForTesting( | 156 EventRewriter::DeviceType EventRewriter::DeviceAddedForTesting( |
166 int device_id, | 157 int device_id, |
167 const std::string& device_name) { | 158 const std::string& device_name) { |
168 return DeviceAddedInternal(device_id, device_name); | 159 return DeviceAddedInternal(device_id, device_name); |
169 } | 160 } |
(...skipping 17 matching lines...) Expand all Loading... |
187 return kDeviceAppleKeyboard; | 178 return kDeviceAppleKeyboard; |
188 } | 179 } |
189 | 180 |
190 return kDeviceUnknown; | 181 return kDeviceUnknown; |
191 } | 182 } |
192 | 183 |
193 void EventRewriter::RewriteForTesting(XEvent* event) { | 184 void EventRewriter::RewriteForTesting(XEvent* event) { |
194 Rewrite(event); | 185 Rewrite(event); |
195 } | 186 } |
196 | 187 |
197 void EventRewriter::OnKeyboardMappingChanged(const aura::WindowTreeHost* host) { | |
198 RefreshKeycodes(); | |
199 } | |
200 | |
201 base::EventStatus EventRewriter::WillProcessEvent( | 188 base::EventStatus EventRewriter::WillProcessEvent( |
202 const base::NativeEvent& event) { | 189 const base::NativeEvent& event) { |
203 XEvent* xevent = event; | 190 XEvent* xevent = event; |
204 if (xevent->type == KeyPress || xevent->type == KeyRelease) | 191 if (xevent->type == KeyPress || xevent->type == KeyRelease) { |
205 Rewrite(xevent); | 192 Rewrite(xevent); |
206 else if (xevent->type == GenericEvent) | 193 } else if (xevent->type == GenericEvent) { |
207 RewriteLocatedEvent(xevent); | 194 RewriteLocatedEvent(xevent); |
| 195 } else if (xevent->type == MappingNotify) { |
| 196 if (xevent->xmapping.request == MappingModifier || |
| 197 xevent->xmapping.request == MappingKeyboard) { |
| 198 RefreshKeycodes(); |
| 199 } |
| 200 } |
208 return base::EVENT_CONTINUE; | 201 return base::EVENT_CONTINUE; |
209 } | 202 } |
210 | 203 |
211 void EventRewriter::DidProcessEvent(const base::NativeEvent& event) { | 204 void EventRewriter::DidProcessEvent(const base::NativeEvent& event) { |
212 } | 205 } |
213 | 206 |
214 void EventRewriter::DeviceAdded(int device_id) { | 207 void EventRewriter::DeviceAdded(int device_id) { |
215 DCHECK_NE(XIAllDevices, device_id); | 208 DCHECK_NE(XIAllDevices, device_id); |
216 DCHECK_NE(XIAllMasterDevices, device_id); | 209 DCHECK_NE(XIAllMasterDevices, device_id); |
217 if (device_id == XIAllDevices || device_id == XIAllMasterDevices) { | 210 if (device_id == XIAllDevices || device_id == XIAllMasterDevices) { |
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " | 889 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " |
897 << "id=" << device_id; | 890 << "id=" << device_id; |
898 } | 891 } |
899 // Always overwrite the existing device_id since the X server may reuse a | 892 // Always overwrite the existing device_id since the X server may reuse a |
900 // device id for an unattached device. | 893 // device id for an unattached device. |
901 device_id_to_type_[device_id] = type; | 894 device_id_to_type_[device_id] = type; |
902 return type; | 895 return type; |
903 } | 896 } |
904 | 897 |
905 } // namespace chromeos | 898 } // namespace chromeos |
OLD | NEW |