| 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 88ec979fb35f4f3a3809cfcbb61d479d164b4d14..0895c0a14c892a30ab10253c57eed33914e88c80 100644
|
| --- a/ui/events/ozone/evdev/event_factory_evdev.cc
|
| +++ b/ui/events/ozone/evdev/event_factory_evdev.cc
|
| @@ -33,6 +33,24 @@ namespace ui {
|
|
|
| namespace {
|
|
|
| +typedef base::Callback<void(scoped_ptr<EventConverterEvdev>)>
|
| + OpenInputDeviceReplyCallback;
|
| +
|
| +struct OpenInputDeviceParams {
|
| + // Unique identifier for the new device.
|
| + int id;
|
| +
|
| + // Device path to open.
|
| + base::FilePath path;
|
| +
|
| + // Callback for dispatching events. Call on UI thread only.
|
| + EventDispatchCallback dispatch_callback;
|
| +
|
| + // State shared between devices. Must not be dereferenced on worker thread.
|
| + EventModifiersEvdev* modifiers;
|
| + CursorDelegateEvdev* cursor;
|
| +};
|
| +
|
| #if defined(USE_EVDEV_GESTURES)
|
| bool UseGesturesLibraryForDevice(const EventDeviceInfo& devinfo) {
|
| if (devinfo.HasAbsXY() && !devinfo.IsMappedToScreen())
|
| @@ -46,24 +64,21 @@ bool UseGesturesLibraryForDevice(const EventDeviceInfo& devinfo) {
|
| #endif
|
|
|
| scoped_ptr<EventConverterEvdev> CreateConverter(
|
| + const OpenInputDeviceParams& params,
|
| int fd,
|
| - const base::FilePath& path,
|
| - int id,
|
| - const EventDeviceInfo& devinfo,
|
| - const EventDispatchCallback& dispatch,
|
| - EventModifiersEvdev* modifiers,
|
| - CursorDelegateEvdev* cursor) {
|
| + const EventDeviceInfo& devinfo) {
|
| #if defined(USE_EVDEV_GESTURES)
|
| // Touchpad or mouse: use gestures library.
|
| // EventReaderLibevdevCros -> GestureInterpreterLibevdevCros -> DispatchEvent
|
| if (UseGesturesLibraryForDevice(devinfo)) {
|
| - scoped_ptr<GestureInterpreterLibevdevCros> gesture_interp = make_scoped_ptr(
|
| - new GestureInterpreterLibevdevCros(modifiers, cursor, dispatch));
|
| + scoped_ptr<GestureInterpreterLibevdevCros> gesture_interp =
|
| + make_scoped_ptr(new GestureInterpreterLibevdevCros(
|
| + params.modifiers, params.cursor, params.dispatch_callback));
|
| scoped_ptr<EventReaderLibevdevCros> libevdev_reader =
|
| make_scoped_ptr(new EventReaderLibevdevCros(
|
| fd,
|
| - path,
|
| - id,
|
| + params.path,
|
| + params.id,
|
| gesture_interp.PassAs<EventReaderLibevdevCros::Delegate>()));
|
| return libevdev_reader.PassAs<EventConverterEvdev>();
|
| }
|
| @@ -72,12 +87,12 @@ scoped_ptr<EventConverterEvdev> CreateConverter(
|
| // Touchscreen: use TouchEventConverterEvdev.
|
| scoped_ptr<EventConverterEvdev> converter;
|
| if (devinfo.HasAbsXY())
|
| - return make_scoped_ptr<EventConverterEvdev>(
|
| - new TouchEventConverterEvdev(fd, path, id, devinfo, dispatch));
|
| + return make_scoped_ptr<EventConverterEvdev>(new TouchEventConverterEvdev(
|
| + fd, params.path, params.id, devinfo, params.dispatch_callback));
|
|
|
| // Everything else: use KeyEventConverterEvdev.
|
| - return make_scoped_ptr<EventConverterEvdev>(
|
| - new KeyEventConverterEvdev(fd, path, id, modifiers, dispatch));
|
| + return make_scoped_ptr<EventConverterEvdev>(new KeyEventConverterEvdev(
|
| + fd, params.path, params.id, params.modifiers, params.dispatch_callback));
|
| }
|
|
|
| // Open an input device. Opening may put the calling thread to sleep, and
|
| @@ -86,14 +101,11 @@ scoped_ptr<EventConverterEvdev> CreateConverter(
|
| //
|
| // This takes a TaskRunner and runs the reply on that thread, so that we
|
| // can hop threads if necessary (back to the UI thread).
|
| -void OpenInputDevice(
|
| - const base::FilePath& path,
|
| - EventModifiersEvdev* modifiers,
|
| - CursorDelegateEvdev* cursor,
|
| - int device_id,
|
| - scoped_refptr<base::TaskRunner> reply_runner,
|
| - const EventDispatchCallback& dispatch,
|
| - base::Callback<void(scoped_ptr<EventConverterEvdev>)> reply_callback) {
|
| +void OpenInputDevice(scoped_ptr<OpenInputDeviceParams> params,
|
| + scoped_refptr<base::TaskRunner> reply_runner,
|
| + const OpenInputDeviceReplyCallback& reply_callback) {
|
| + const base::FilePath& path = params->path;
|
| +
|
| TRACE_EVENT1("ozone", "OpenInputDevice", "path", path.value());
|
|
|
| int fd = open(path.value().c_str(), O_RDONLY | O_NONBLOCK);
|
| @@ -116,8 +128,8 @@ void OpenInputDevice(
|
| return;
|
| }
|
|
|
| - scoped_ptr<EventConverterEvdev> converter = CreateConverter(
|
| - fd, path, device_id, devinfo, dispatch, modifiers, cursor);
|
| + scoped_ptr<EventConverterEvdev> converter =
|
| + CreateConverter(*params, fd, devinfo);
|
|
|
| // Reply with the constructed converter.
|
| reply_runner->PostTask(FROM_HERE,
|
| @@ -154,8 +166,9 @@ void EventFactoryEvdev::DispatchUiEvent(Event* event) {
|
| }
|
|
|
| void EventFactoryEvdev::AttachInputDevice(
|
| - const base::FilePath& path,
|
| scoped_ptr<EventConverterEvdev> converter) {
|
| + const base::FilePath& path = converter->path();
|
| +
|
| TRACE_EVENT1("ozone", "AttachInputDevice", "path", path.value());
|
| DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
|
|
|
| @@ -180,20 +193,24 @@ void EventFactoryEvdev::OnDeviceEvent(const DeviceEvent& event) {
|
| case DeviceEvent::CHANGE: {
|
| TRACE_EVENT1("ozone", "OnDeviceAdded", "path", event.path().value());
|
|
|
| + scoped_ptr<OpenInputDeviceParams> params(new OpenInputDeviceParams);
|
| + params->id = NextDeviceId();
|
| + params->path = event.path();
|
| + params->dispatch_callback = dispatch_callback_;
|
| + params->modifiers = &modifiers_;
|
| + params->cursor = cursor_;
|
| +
|
| + OpenInputDeviceReplyCallback reply_callback =
|
| + base::Bind(&EventFactoryEvdev::AttachInputDevice,
|
| + weak_ptr_factory_.GetWeakPtr());
|
| +
|
| // Dispatch task to open from the worker pool, since open may block.
|
| - base::WorkerPool::PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&OpenInputDevice,
|
| - event.path(),
|
| - &modifiers_,
|
| - cursor_,
|
| - NextDeviceId(),
|
| - ui_task_runner_,
|
| - dispatch_callback_,
|
| - base::Bind(&EventFactoryEvdev::AttachInputDevice,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - event.path())),
|
| - true);
|
| + base::WorkerPool::PostTask(FROM_HERE,
|
| + base::Bind(&OpenInputDevice,
|
| + base::Passed(¶ms),
|
| + ui_task_runner_,
|
| + reply_callback),
|
| + true /* task_is_slow */);
|
| }
|
| break;
|
| case DeviceEvent::REMOVE: {
|
|
|