Chromium Code Reviews| 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 "ui/events/ozone/evdev/event_factory_evdev.h" | 5 #include "ui/events/ozone/evdev/event_factory_evdev.h" |
| 6 | 6 |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <linux/input.h> | 8 #include <linux/input.h> |
| 9 | 9 |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 12 #include "base/task_runner.h" | 12 #include "base/task_runner.h" |
| 13 #include "ui/events/ozone/evdev/cursor_delegate_evdev.h" | 13 #include "ui/events/ozone/evdev/cursor_delegate_evdev.h" |
| 14 #include "ui/events/ozone/evdev/device_manager_evdev.h" | 14 #include "ui/events/ozone/evdev/device_manager_evdev.h" |
| 15 #include "ui/events/ozone/evdev/event_device_info.h" | 15 #include "ui/events/ozone/evdev/event_device_info.h" |
| 16 #include "ui/events/ozone/evdev/key_event_converter_evdev.h" | 16 #include "ui/events/ozone/evdev/key_event_converter_evdev.h" |
| 17 #include "ui/events/ozone/evdev/touch_event_converter_evdev.h" | 17 #include "ui/events/ozone/evdev/touch_event_converter_evdev.h" |
| 18 | 18 |
| 19 #if defined(USE_UDEV) | 19 #if defined(USE_UDEV) |
| 20 #include "ui/events/ozone/evdev/device_manager_udev.h" | 20 #include "ui/events/ozone/evdev/device_manager_udev.h" |
| 21 #endif | 21 #endif |
| 22 | 22 |
| 23 #if defined(USE_EVDEV_GESTURES) | |
|
rjkroege
2014/03/11 12:58:47
do we ever not want to use evdev_gestures?
spang
2014/03/11 16:38:11
It is only present on chromeos.
My suspicion is t
| |
| 24 #include "ui/events/ozone/evdev/gestures/event_reader_libevdev_cros.h" | |
| 25 #include "ui/events/ozone/evdev/gestures/gesture_interpreter_libevdev_cros.h" | |
| 26 #endif | |
| 27 | |
| 23 namespace ui { | 28 namespace ui { |
| 24 | 29 |
| 25 namespace { | 30 namespace { |
| 26 | 31 |
| 27 bool IsTouchPad(const EventDeviceInfo& devinfo) { | 32 bool UseGesturesLibraryForDevice(const EventDeviceInfo& devinfo) { |
| 28 if (!devinfo.HasEventType(EV_ABS)) | 33 if (devinfo.HasAbsXY() && !devinfo.IsMappedToScreen()) |
| 29 return false; | 34 return true; // touchpad |
| 30 | 35 |
| 31 return devinfo.HasKeyEvent(BTN_LEFT) || devinfo.HasKeyEvent(BTN_MIDDLE) || | 36 if (devinfo.HasRelXY()) |
| 32 devinfo.HasKeyEvent(BTN_RIGHT) || devinfo.HasKeyEvent(BTN_TOOL_FINGER); | 37 return true; // mouse |
| 38 | |
| 39 return false; | |
| 33 } | 40 } |
| 34 | 41 |
| 35 bool IsTouchScreen(const EventDeviceInfo& devinfo) { | 42 scoped_ptr<EventConverterEvdev> CreateConverter(int fd, |
| 36 return devinfo.HasEventType(EV_ABS) && !IsTouchPad(devinfo); | 43 const base::FilePath& path, |
| 44 const EventDeviceInfo& devinfo, | |
| 45 EventModifiersEvdev* modifiers, | |
| 46 CursorDelegateEvdev* cursor) { | |
| 47 #if defined(USE_EVDEV_GESTURES) | |
| 48 // Touchpad: use gestures library. | |
| 49 // EventReaderLibevdevCros -> GestureInterpreterLibevdevCros -> DispatchEvent | |
| 50 if (UseGesturesLibraryForDevice(devinfo)) { | |
| 51 EventDispatchCallback dispatch = | |
| 52 base::Bind(&EventFactoryOzone::DispatchEvent); | |
| 53 scoped_ptr<GestureInterpreterLibevdevCros> gesture_interp = make_scoped_ptr( | |
| 54 new GestureInterpreterLibevdevCros(modifiers, cursor, dispatch)); | |
| 55 scoped_ptr<EventReaderLibevdevCros> libevdev_reader = | |
| 56 make_scoped_ptr(new EventReaderLibevdevCros( | |
| 57 fd, | |
| 58 path, | |
| 59 gesture_interp.PassAs<EventReaderLibevdevCros::Delegate>())); | |
| 60 return libevdev_reader.PassAs<EventConverterEvdev>(); | |
| 61 } | |
| 62 #endif | |
| 63 | |
| 64 // Touchscreen: use TouchEventConverterEvdev. | |
| 65 scoped_ptr<EventConverterEvdev> converter; | |
| 66 if (devinfo.HasAbsXY()) | |
| 67 return make_scoped_ptr<EventConverterEvdev>( | |
| 68 new TouchEventConverterEvdev(fd, path, devinfo)); | |
| 69 | |
| 70 // Everything else: use KeyEventConverterEvdev. | |
| 71 return make_scoped_ptr<EventConverterEvdev>( | |
| 72 new KeyEventConverterEvdev(fd, path, modifiers)); | |
| 37 } | 73 } |
| 38 | 74 |
| 39 // Open an input device. Opening may put the calling thread to sleep, and | 75 // Open an input device. Opening may put the calling thread to sleep, and |
| 40 // therefore should be run on a thread where latency is not critical. We | 76 // therefore should be run on a thread where latency is not critical. We |
| 41 // run it on the FILE thread. | 77 // run it on the FILE thread. |
| 42 // | 78 // |
| 43 // This takes a TaskRunner and runs the reply on that thread, so that we | 79 // This takes a TaskRunner and runs the reply on that thread, so that we |
| 44 // can hop threads if necessary (back to the UI thread). | 80 // can hop threads if necessary (back to the UI thread). |
| 45 void OpenInputDevice( | 81 void OpenInputDevice( |
| 46 const base::FilePath& path, | 82 const base::FilePath& path, |
| 47 EventModifiersEvdev* modifiers, | 83 EventModifiersEvdev* modifiers, |
| 48 CursorDelegateEvdev* cursor, | 84 CursorDelegateEvdev* cursor, |
| 49 scoped_refptr<base::TaskRunner> reply_runner, | 85 scoped_refptr<base::TaskRunner> reply_runner, |
| 50 base::Callback<void(scoped_ptr<EventConverterEvdev>)> reply_callback) { | 86 base::Callback<void(scoped_ptr<EventConverterEvdev>)> reply_callback) { |
| 51 TRACE_EVENT1("ozone", "OpenInputDevice", "path", path.value()); | 87 TRACE_EVENT1("ozone", "OpenInputDevice", "path", path.value()); |
| 52 | 88 |
| 53 int fd = open(path.value().c_str(), O_RDONLY | O_NONBLOCK); | 89 int fd = open(path.value().c_str(), O_RDONLY | O_NONBLOCK); |
| 54 if (fd < 0) { | 90 if (fd < 0) { |
| 55 PLOG(ERROR) << "Cannot open '" << path.value(); | 91 PLOG(ERROR) << "Cannot open '" << path.value(); |
| 56 return; | 92 return; |
| 57 } | 93 } |
| 58 | 94 |
| 59 EventDeviceInfo devinfo; | 95 EventDeviceInfo devinfo; |
| 60 if (!devinfo.Initialize(fd)) { | 96 if (!devinfo.Initialize(fd)) { |
| 61 LOG(ERROR) << "failed to get device information for " << path.value(); | 97 LOG(ERROR) << "failed to get device information for " << path.value(); |
| 62 close(fd); | 98 close(fd); |
| 63 return; | 99 return; |
| 64 } | 100 } |
| 65 | 101 |
| 66 if (IsTouchPad(devinfo)) { | 102 scoped_ptr<EventConverterEvdev> converter = |
| 67 LOG(WARNING) << "touchpad device not supported: " << path.value(); | 103 CreateConverter(fd, path, devinfo, modifiers, cursor); |
| 68 close(fd); | |
| 69 return; | |
| 70 } | |
| 71 | 104 |
| 72 // TODO(spang) Add more device types. | 105 // Reply with the constructed converter. |
| 73 scoped_ptr<EventConverterEvdev> converter; | 106 reply_runner->PostTask(FROM_HERE, |
| 74 if (IsTouchScreen(devinfo)) | 107 base::Bind(reply_callback, base::Passed(&converter))); |
| 75 converter.reset(new TouchEventConverterEvdev(fd, path, devinfo)); | |
| 76 else if (devinfo.HasEventType(EV_KEY)) | |
| 77 converter.reset(new KeyEventConverterEvdev(fd, path, modifiers)); | |
| 78 | |
| 79 if (converter) { | |
| 80 // Reply with the constructed converter. | |
| 81 reply_runner->PostTask( | |
| 82 FROM_HERE, base::Bind(reply_callback, base::Passed(&converter))); | |
| 83 } else { | |
| 84 close(fd); | |
| 85 } | |
| 86 } | 108 } |
| 87 | 109 |
| 88 // Close an input device. Closing may put the calling thread to sleep, and | 110 // Close an input device. Closing may put the calling thread to sleep, and |
| 89 // therefore should be run on a thread where latency is not critical. We | 111 // therefore should be run on a thread where latency is not critical. We |
| 90 // run it on the FILE thread. | 112 // run it on the FILE thread. |
| 91 void CloseInputDevice(const base::FilePath& path, | 113 void CloseInputDevice(const base::FilePath& path, |
| 92 scoped_ptr<EventConverterEvdev> converter) { | 114 scoped_ptr<EventConverterEvdev> converter) { |
| 93 TRACE_EVENT1("ozone", "CloseInputDevice", "path", path.value()); | 115 TRACE_EVENT1("ozone", "CloseInputDevice", "path", path.value()); |
| 94 converter.reset(); | 116 converter.reset(); |
| 95 } | 117 } |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 195 cursor_->MoveCursorTo(widget, location); | 217 cursor_->MoveCursorTo(widget, location); |
| 196 scoped_ptr<Event> ev(new MouseEvent(ET_MOUSE_MOVED, | 218 scoped_ptr<Event> ev(new MouseEvent(ET_MOUSE_MOVED, |
| 197 cursor_->location(), | 219 cursor_->location(), |
| 198 cursor_->location(), | 220 cursor_->location(), |
| 199 modifiers_.GetModifierFlags(), | 221 modifiers_.GetModifierFlags(), |
| 200 /* changed_button_flags */ 0)); | 222 /* changed_button_flags */ 0)); |
| 201 DispatchEvent(ev.Pass()); | 223 DispatchEvent(ev.Pass()); |
| 202 } | 224 } |
| 203 | 225 |
| 204 } // namespace ui | 226 } // namespace ui |
| OLD | NEW |