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 e3b1caa876b94b038e189a5a644b6e76afa31886..3130f6b6d112930b38ff14e6c9c2e2c8d86fe3aa 100644 |
| --- a/ui/events/ozone/evdev/event_factory_evdev.cc |
| +++ b/ui/events/ozone/evdev/event_factory_evdev.cc |
| @@ -20,6 +20,98 @@ |
| namespace ui { |
| +namespace { |
| + |
| +class ForwardingDeviceEventDispatcher : public DeviceEventDispatcherEvdev { |
|
alexst (slow to review)
2015/01/28 18:35:30
DeviceEventDispatcherProxy?
|
| + public: |
| + ForwardingDeviceEventDispatcher( |
| + scoped_refptr<base::SingleThreadTaskRunner> ui_thread_runner, |
| + base::WeakPtr<EventFactoryEvdev> event_factory_evdev) |
| + : ui_thread_runner_(ui_thread_runner), |
| + event_factory_evdev_(event_factory_evdev) {} |
| + ~ForwardingDeviceEventDispatcher() override {} |
| + |
| + // DeviceEventDispatcher: |
| + void DispatchKeyEvent(int device_id, unsigned int code, bool down) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, base::Bind(&EventFactoryEvdev::DispatchKeyEvent, |
| + event_factory_evdev_, device_id, code, down)); |
| + } |
| + |
| + void DispatchMouseMoveEvent(int device_id, |
| + const gfx::PointF& location) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, base::Bind(&EventFactoryEvdev::DispatchMouseMoveEvent, |
| + event_factory_evdev_, device_id, location)); |
| + } |
| + |
| + void DispatchMouseButtonEvent(int device_id, |
| + const gfx::PointF& location, |
| + unsigned int button, |
| + bool down, |
| + bool allow_remap) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, base::Bind(&EventFactoryEvdev::DispatchMouseButtonEvent, |
| + event_factory_evdev_, device_id, location, button, |
| + down, allow_remap)); |
| + } |
| + |
| + void DispatchMouseWheelEvent(int device_id, |
| + const gfx::PointF& location, |
| + const gfx::Vector2d& delta) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&EventFactoryEvdev::DispatchMouseWheelEvent, |
| + event_factory_evdev_, device_id, location, delta)); |
| + } |
| + |
| + void DispatchScrollEvent(const ScrollEventParams& params) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, base::Bind(&EventFactoryEvdev::DispatchScrollEvent, |
| + event_factory_evdev_, params)); |
| + } |
| + |
| + void DispatchTouchEvent(const TouchEventParams& params) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, base::Bind(&EventFactoryEvdev::DispatchTouchEvent, |
| + event_factory_evdev_, params)); |
| + } |
| + |
| + void DispatchKeyboardDevicesUpdated( |
| + const std::vector<KeyboardDevice>& devices) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&EventFactoryEvdev::DispatchKeyboardDevicesUpdated, |
| + event_factory_evdev_, devices)); |
| + } |
| + void DispatchTouchscreenDevicesUpdated( |
| + const std::vector<TouchscreenDevice>& devices) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&EventFactoryEvdev::DispatchTouchscreenDevicesUpdated, |
| + event_factory_evdev_, devices)); |
| + } |
| + void DispatchMouseDevicesUpdated( |
| + const std::vector<InputDevice>& devices) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, base::Bind(&EventFactoryEvdev::DispatchMouseDevicesUpdated, |
| + event_factory_evdev_, devices)); |
| + } |
| + void DispatchTouchpadDevicesUpdated( |
| + const std::vector<InputDevice>& devices) override { |
| + ui_thread_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&EventFactoryEvdev::DispatchTouchpadDevicesUpdated, |
| + event_factory_evdev_, devices)); |
| + } |
| + |
| + private: |
| + scoped_refptr<base::SingleThreadTaskRunner> ui_thread_runner_; |
| + base::WeakPtr<EventFactoryEvdev> event_factory_evdev_; |
| +}; |
| + |
| +} // namespace |
| + |
| EventFactoryEvdev::EventFactoryEvdev(CursorDelegateEvdev* cursor, |
| DeviceManager* device_manager, |
| KeyboardLayoutEngine* keyboard_layout) |
| @@ -42,8 +134,12 @@ void EventFactoryEvdev::Init() { |
| DCHECK(!initialized_); |
| // Set up device factory. |
| - input_device_factory_.reset(new InputDeviceFactoryEvdev( |
| - this, base::ThreadTaskRunnerHandle::Get(), cursor_)); |
| + scoped_ptr<DeviceEventDispatcherEvdev> dispatcher( |
| + new ForwardingDeviceEventDispatcher(base::ThreadTaskRunnerHandle::Get(), |
| + weak_ptr_factory_.GetWeakPtr())); |
| + input_device_factory_.reset( |
| + new InputDeviceFactoryEvdev(dispatcher.Pass(), cursor_)); |
| + |
| // TODO(spang): This settings interface is really broken. crbug.com/450899 |
| input_controller_.SetInputDeviceFactory(input_device_factory_.get()); |