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()); |