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> |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 return kDeviceAppleKeyboard; | 178 return kDeviceAppleKeyboard; |
179 } | 179 } |
180 | 180 |
181 return kDeviceUnknown; | 181 return kDeviceUnknown; |
182 } | 182 } |
183 | 183 |
184 void EventRewriter::RewriteForTesting(XEvent* event) { | 184 void EventRewriter::RewriteForTesting(XEvent* event) { |
185 Rewrite(event); | 185 Rewrite(event); |
186 } | 186 } |
187 | 187 |
| 188 void EventRewriter::DeviceKeyPressedOrReleased(int device_id) { |
| 189 std::map<int, DeviceType>::const_iterator iter = |
| 190 device_id_to_type_.find(device_id); |
| 191 if (iter == device_id_to_type_.end()) { |
| 192 // |device_id| is unknown. This means the device was connected before |
| 193 // booting the OS. Query the name of the device and add it to the map. |
| 194 DeviceAdded(device_id); |
| 195 } |
| 196 |
| 197 last_device_id_ = device_id; |
| 198 } |
| 199 |
188 base::EventStatus EventRewriter::WillProcessEvent( | 200 base::EventStatus EventRewriter::WillProcessEvent( |
189 const base::NativeEvent& event) { | 201 const base::NativeEvent& event) { |
190 XEvent* xevent = event; | 202 XEvent* xevent = event; |
191 if (xevent->type == KeyPress || xevent->type == KeyRelease) { | 203 if (xevent->type == KeyPress || xevent->type == KeyRelease) { |
192 Rewrite(xevent); | 204 Rewrite(xevent); |
193 } else if (xevent->type == GenericEvent) { | 205 } else if (xevent->type == GenericEvent) { |
194 RewriteLocatedEvent(xevent); | 206 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); |
| 207 if (xievent->evtype == XI_KeyPress || xievent->evtype == XI_KeyRelease) { |
| 208 if (xievent->deviceid == xievent->sourceid) |
| 209 DeviceKeyPressedOrReleased(xievent->deviceid); |
| 210 } else { |
| 211 RewriteLocatedEvent(xevent); |
| 212 } |
195 } else if (xevent->type == MappingNotify) { | 213 } else if (xevent->type == MappingNotify) { |
196 if (xevent->xmapping.request == MappingModifier || | 214 if (xevent->xmapping.request == MappingModifier || |
197 xevent->xmapping.request == MappingKeyboard) { | 215 xevent->xmapping.request == MappingKeyboard) { |
198 RefreshKeycodes(); | 216 RefreshKeycodes(); |
199 } | 217 } |
200 } | 218 } |
201 return base::EVENT_CONTINUE; | 219 return base::EVENT_CONTINUE; |
202 } | 220 } |
203 | 221 |
204 void EventRewriter::DidProcessEvent(const base::NativeEvent& event) { | 222 void EventRewriter::DidProcessEvent(const base::NativeEvent& event) { |
205 } | 223 } |
206 | 224 |
| 225 void EventRewriter::DeviceHierarchyChanged() {} |
| 226 |
207 void EventRewriter::DeviceAdded(int device_id) { | 227 void EventRewriter::DeviceAdded(int device_id) { |
208 DCHECK_NE(XIAllDevices, device_id); | 228 DCHECK_NE(XIAllDevices, device_id); |
209 DCHECK_NE(XIAllMasterDevices, device_id); | 229 DCHECK_NE(XIAllMasterDevices, device_id); |
210 if (device_id == XIAllDevices || device_id == XIAllMasterDevices) { | 230 if (device_id == XIAllDevices || device_id == XIAllMasterDevices) { |
211 LOG(ERROR) << "Unexpected device_id passed: " << device_id; | 231 LOG(ERROR) << "Unexpected device_id passed: " << device_id; |
212 return; | 232 return; |
213 } | 233 } |
214 | 234 |
215 int ndevices_return = 0; | 235 int ndevices_return = 0; |
216 XIDeviceInfo* device_info = XIQueryDevice(gfx::GetXDisplay(), | 236 XIDeviceInfo* device_info = XIQueryDevice(gfx::GetXDisplay(), |
(...skipping 14 matching lines...) Expand all Loading... |
231 DeviceAddedInternal(device_info[i].deviceid, device_info[i].name); | 251 DeviceAddedInternal(device_info[i].deviceid, device_info[i].name); |
232 } | 252 } |
233 | 253 |
234 XIFreeDeviceInfo(device_info); | 254 XIFreeDeviceInfo(device_info); |
235 } | 255 } |
236 | 256 |
237 void EventRewriter::DeviceRemoved(int device_id) { | 257 void EventRewriter::DeviceRemoved(int device_id) { |
238 device_id_to_type_.erase(device_id); | 258 device_id_to_type_.erase(device_id); |
239 } | 259 } |
240 | 260 |
241 void EventRewriter::DeviceKeyPressedOrReleased(int device_id) { | |
242 std::map<int, DeviceType>::const_iterator iter = | |
243 device_id_to_type_.find(device_id); | |
244 if (iter == device_id_to_type_.end()) { | |
245 // |device_id| is unknown. This means the device was connected before | |
246 // booting the OS. Query the name of the device and add it to the map. | |
247 DeviceAdded(device_id); | |
248 } | |
249 | |
250 last_device_id_ = device_id; | |
251 } | |
252 | |
253 void EventRewriter::RefreshKeycodes() { | 261 void EventRewriter::RefreshKeycodes() { |
254 keysym_to_keycode_map_.clear(); | 262 keysym_to_keycode_map_.clear(); |
255 } | 263 } |
256 | 264 |
257 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { | 265 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { |
258 if (keysym_to_keycode_map_.count(keysym)) | 266 if (keysym_to_keycode_map_.count(keysym)) |
259 return keysym_to_keycode_map_[keysym]; | 267 return keysym_to_keycode_map_[keysym]; |
260 | 268 |
261 XDisplay* display = gfx::GetXDisplay(); | 269 XDisplay* display = gfx::GetXDisplay(); |
262 KeyCode keycode = XKeysymToKeycode(display, keysym); | 270 KeyCode keycode = XKeysymToKeycode(display, keysym); |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " | 897 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " |
890 << "id=" << device_id; | 898 << "id=" << device_id; |
891 } | 899 } |
892 // Always overwrite the existing device_id since the X server may reuse a | 900 // Always overwrite the existing device_id since the X server may reuse a |
893 // device id for an unattached device. | 901 // device id for an unattached device. |
894 device_id_to_type_[device_id] = type; | 902 device_id_to_type_[device_id] = type; |
895 return type; | 903 return type; |
896 } | 904 } |
897 | 905 |
898 } // namespace chromeos | 906 } // namespace chromeos |
OLD | NEW |