Chromium Code Reviews| Index: ui/events/ozone/evdev/event_factory_evdev.cc |
| diff --git a/ui/events/ozone/evdev/event_factory_evdev.cc b/ui/events/ozone/evdev/event_factory_evdev.cc |
| index 9e66505f3b20dd705cc37e0e106ff2f672fc1c3c..1b566de125538431c322590b2ada4e0124d13626 100644 |
| --- a/ui/events/ozone/evdev/event_factory_evdev.cc |
| +++ b/ui/events/ozone/evdev/event_factory_evdev.cc |
| @@ -20,20 +20,56 @@ |
| #include "ui/events/ozone/evdev/device_manager_udev.h" |
| #endif |
| +#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
|
| +#include "ui/events/ozone/evdev/gestures/event_reader_libevdev_cros.h" |
| +#include "ui/events/ozone/evdev/gestures/gesture_interpreter_libevdev_cros.h" |
| +#endif |
| + |
| namespace ui { |
| namespace { |
| -bool IsTouchPad(const EventDeviceInfo& devinfo) { |
| - if (!devinfo.HasEventType(EV_ABS)) |
| - return false; |
| +bool UseGesturesLibraryForDevice(const EventDeviceInfo& devinfo) { |
| + if (devinfo.HasAbsXY() && !devinfo.IsMappedToScreen()) |
| + return true; // touchpad |
| - return devinfo.HasKeyEvent(BTN_LEFT) || devinfo.HasKeyEvent(BTN_MIDDLE) || |
| - devinfo.HasKeyEvent(BTN_RIGHT) || devinfo.HasKeyEvent(BTN_TOOL_FINGER); |
| + if (devinfo.HasRelXY()) |
| + return true; // mouse |
| + |
| + return false; |
| } |
| -bool IsTouchScreen(const EventDeviceInfo& devinfo) { |
| - return devinfo.HasEventType(EV_ABS) && !IsTouchPad(devinfo); |
| +scoped_ptr<EventConverterEvdev> CreateConverter(int fd, |
| + const base::FilePath& path, |
| + const EventDeviceInfo& devinfo, |
| + EventModifiersEvdev* modifiers, |
| + CursorDelegateEvdev* cursor) { |
| +#if defined(USE_EVDEV_GESTURES) |
| + // Touchpad: use gestures library. |
| + // EventReaderLibevdevCros -> GestureInterpreterLibevdevCros -> DispatchEvent |
| + if (UseGesturesLibraryForDevice(devinfo)) { |
| + EventDispatchCallback dispatch = |
| + base::Bind(&EventFactoryOzone::DispatchEvent); |
| + scoped_ptr<GestureInterpreterLibevdevCros> gesture_interp = make_scoped_ptr( |
| + new GestureInterpreterLibevdevCros(modifiers, cursor, dispatch)); |
| + scoped_ptr<EventReaderLibevdevCros> libevdev_reader = |
| + make_scoped_ptr(new EventReaderLibevdevCros( |
| + fd, |
| + path, |
| + gesture_interp.PassAs<EventReaderLibevdevCros::Delegate>())); |
| + return libevdev_reader.PassAs<EventConverterEvdev>(); |
| + } |
| +#endif |
| + |
| + // Touchscreen: use TouchEventConverterEvdev. |
| + scoped_ptr<EventConverterEvdev> converter; |
| + if (devinfo.HasAbsXY()) |
| + return make_scoped_ptr<EventConverterEvdev>( |
| + new TouchEventConverterEvdev(fd, path, devinfo)); |
| + |
| + // Everything else: use KeyEventConverterEvdev. |
| + return make_scoped_ptr<EventConverterEvdev>( |
| + new KeyEventConverterEvdev(fd, path, modifiers)); |
| } |
| // Open an input device. Opening may put the calling thread to sleep, and |
| @@ -63,26 +99,12 @@ void OpenInputDevice( |
| return; |
| } |
| - if (IsTouchPad(devinfo)) { |
| - LOG(WARNING) << "touchpad device not supported: " << path.value(); |
| - close(fd); |
| - return; |
| - } |
| - |
| - // TODO(spang) Add more device types. |
| - scoped_ptr<EventConverterEvdev> converter; |
| - if (IsTouchScreen(devinfo)) |
| - converter.reset(new TouchEventConverterEvdev(fd, path, devinfo)); |
| - else if (devinfo.HasEventType(EV_KEY)) |
| - converter.reset(new KeyEventConverterEvdev(fd, path, modifiers)); |
| + scoped_ptr<EventConverterEvdev> converter = |
| + CreateConverter(fd, path, devinfo, modifiers, cursor); |
| - if (converter) { |
| - // Reply with the constructed converter. |
| - reply_runner->PostTask( |
| - FROM_HERE, base::Bind(reply_callback, base::Passed(&converter))); |
| - } else { |
| - close(fd); |
| - } |
| + // Reply with the constructed converter. |
| + reply_runner->PostTask(FROM_HERE, |
| + base::Bind(reply_callback, base::Passed(&converter))); |
| } |
| // Close an input device. Closing may put the calling thread to sleep, and |