| 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 7dc288fc76554faced493aace085ca541eea1f16..88ec979fb35f4f3a3809cfcbb61d479d164b4d14 100644
|
| --- a/ui/events/ozone/evdev/event_factory_evdev.cc
|
| +++ b/ui/events/ozone/evdev/event_factory_evdev.cc
|
| @@ -12,6 +12,7 @@
|
| #include "base/task_runner.h"
|
| #include "base/thread_task_runner_handle.h"
|
| #include "base/threading/worker_pool.h"
|
| +#include "ui/events/device_data_manager.h"
|
| #include "ui/events/ozone/device/device_event.h"
|
| #include "ui/events/ozone/device/device_manager.h"
|
| #include "ui/events/ozone/evdev/cursor_delegate_evdev.h"
|
| @@ -47,6 +48,7 @@ bool UseGesturesLibraryForDevice(const EventDeviceInfo& devinfo) {
|
| scoped_ptr<EventConverterEvdev> CreateConverter(
|
| int fd,
|
| const base::FilePath& path,
|
| + int id,
|
| const EventDeviceInfo& devinfo,
|
| const EventDispatchCallback& dispatch,
|
| EventModifiersEvdev* modifiers,
|
| @@ -61,6 +63,7 @@ scoped_ptr<EventConverterEvdev> CreateConverter(
|
| make_scoped_ptr(new EventReaderLibevdevCros(
|
| fd,
|
| path,
|
| + id,
|
| gesture_interp.PassAs<EventReaderLibevdevCros::Delegate>()));
|
| return libevdev_reader.PassAs<EventConverterEvdev>();
|
| }
|
| @@ -70,11 +73,11 @@ scoped_ptr<EventConverterEvdev> CreateConverter(
|
| scoped_ptr<EventConverterEvdev> converter;
|
| if (devinfo.HasAbsXY())
|
| return make_scoped_ptr<EventConverterEvdev>(
|
| - new TouchEventConverterEvdev(fd, path, devinfo, dispatch));
|
| + new TouchEventConverterEvdev(fd, path, id, devinfo, dispatch));
|
|
|
| // Everything else: use KeyEventConverterEvdev.
|
| return make_scoped_ptr<EventConverterEvdev>(
|
| - new KeyEventConverterEvdev(fd, path, modifiers, dispatch));
|
| + new KeyEventConverterEvdev(fd, path, id, modifiers, dispatch));
|
| }
|
|
|
| // Open an input device. Opening may put the calling thread to sleep, and
|
| @@ -87,6 +90,7 @@ 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) {
|
| @@ -112,8 +116,8 @@ void OpenInputDevice(
|
| return;
|
| }
|
|
|
| - scoped_ptr<EventConverterEvdev> converter =
|
| - CreateConverter(fd, path, devinfo, dispatch, modifiers, cursor);
|
| + scoped_ptr<EventConverterEvdev> converter = CreateConverter(
|
| + fd, path, device_id, devinfo, dispatch, modifiers, cursor);
|
|
|
| // Reply with the constructed converter.
|
| reply_runner->PostTask(FROM_HERE,
|
| @@ -131,10 +135,10 @@ void CloseInputDevice(const base::FilePath& path,
|
|
|
| } // namespace
|
|
|
| -EventFactoryEvdev::EventFactoryEvdev(
|
| - CursorDelegateEvdev* cursor,
|
| - DeviceManager* device_manager)
|
| - : device_manager_(device_manager),
|
| +EventFactoryEvdev::EventFactoryEvdev(CursorDelegateEvdev* cursor,
|
| + DeviceManager* device_manager)
|
| + : last_device_id_(0),
|
| + device_manager_(device_manager),
|
| cursor_(cursor),
|
| dispatch_callback_(
|
| base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchUiEvent),
|
| @@ -163,6 +167,8 @@ void EventFactoryEvdev::AttachInputDevice(
|
| // Add initialized device to map.
|
| converters_[path] = converter.release();
|
| converters_[path]->Start();
|
| +
|
| + NotifyHotplugEventObserver(*converters_[path]);
|
| }
|
|
|
| void EventFactoryEvdev::OnDeviceEvent(const DeviceEvent& event) {
|
| @@ -181,6 +187,7 @@ void EventFactoryEvdev::OnDeviceEvent(const DeviceEvent& event) {
|
| event.path(),
|
| &modifiers_,
|
| cursor_,
|
| + NextDeviceId(),
|
| ui_task_runner_,
|
| dispatch_callback_,
|
| base::Bind(&EventFactoryEvdev::AttachInputDevice,
|
| @@ -219,6 +226,8 @@ void EventFactoryEvdev::DetachInputDevice(const base::FilePath& path) {
|
| // on UI since the polling happens on UI.
|
| converter->Stop();
|
|
|
| + NotifyHotplugEventObserver(*converter);
|
| +
|
| // Dispatch task to close from the worker pool, since close may block.
|
| base::WorkerPool::PostTask(
|
| FROM_HERE,
|
| @@ -240,4 +249,28 @@ void EventFactoryEvdev::WarpCursorTo(gfx::AcceleratedWidget widget,
|
| }
|
| }
|
|
|
| +void EventFactoryEvdev::NotifyHotplugEventObserver(
|
| + const EventConverterEvdev& converter) {
|
| + // For now the only information propagated is related to touchscreens. Ignore
|
| + // events for everything but touchscreens.
|
| + if (!converter.HasTouchscreen())
|
| + return;
|
| +
|
| + DeviceHotplugEventObserver* observer = DeviceDataManager::GetInstance();
|
| + std::vector<TouchscreenDevice> touchscreens;
|
| + for (auto it = converters_.begin(); it != converters_.end(); ++it) {
|
| + if (it->second->HasTouchscreen()) {
|
| + touchscreens.push_back(TouchscreenDevice(it->second->id(),
|
| + it->second->GetTouchscreenSize(),
|
| + false /* is_internal */));
|
| + }
|
| + }
|
| +
|
| + observer->OnTouchscreenDevicesUpdated(touchscreens);
|
| +}
|
| +
|
| +int EventFactoryEvdev::NextDeviceId() {
|
| + return ++last_device_id_;
|
| +}
|
| +
|
| } // namespace ui
|
|
|