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 261b95ba925d78fa4944d72bfe1330f50e1cea1f..bee96cd1a39d423642fdadf22d8b7565ab75508c 100644 |
--- a/ui/events/ozone/evdev/event_factory_evdev.cc |
+++ b/ui/events/ozone/evdev/event_factory_evdev.cc |
@@ -21,6 +21,90 @@ |
namespace ui { |
+namespace { |
+ |
+// Thread safe dispatcher proxy for EventFactoryEvdev. |
+class ProxyDeviceEventDispatcher : public DeviceEventDispatcherEvdev { |
+ public: |
+ ProxyDeviceEventDispatcher( |
+ 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) {} |
+ ~ProxyDeviceEventDispatcher() override {} |
+ |
+ // DeviceEventDispatcher: |
+ void DispatchKeyEvent(const KeyEventParams& params) override { |
+ ui_thread_runner_->PostTask(FROM_HERE, |
+ base::Bind(&EventFactoryEvdev::DispatchKeyEvent, |
+ event_factory_evdev_, params)); |
+ } |
+ |
+ void DispatchMouseMoveEvent(const MouseMoveEventParams& params) override { |
+ ui_thread_runner_->PostTask( |
+ FROM_HERE, base::Bind(&EventFactoryEvdev::DispatchMouseMoveEvent, |
+ event_factory_evdev_, params)); |
+ } |
+ |
+ void DispatchMouseButtonEvent(const MouseButtonEventParams& params) override { |
+ ui_thread_runner_->PostTask( |
+ FROM_HERE, base::Bind(&EventFactoryEvdev::DispatchMouseButtonEvent, |
+ event_factory_evdev_, params)); |
+ } |
+ |
+ void DispatchMouseWheelEvent(const MouseWheelEventParams& params) override { |
+ ui_thread_runner_->PostTask( |
+ FROM_HERE, base::Bind(&EventFactoryEvdev::DispatchMouseWheelEvent, |
+ event_factory_evdev_, params)); |
+ } |
+ |
+ 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) |
@@ -43,8 +127,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 ProxyDeviceEventDispatcher(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()); |