// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_EVENTS_OZONE_EVDEV_INPUT_DEVICE_FACTORY_EVDEV_H_ #define UI_EVENTS_OZONE_EVDEV_INPUT_DEVICE_FACTORY_EVDEV_H_ #include #include #include #include "base/callback.h" #include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "base/task_runner.h" #include "ui/events/ozone/evdev/event_converter_evdev.h" #include "ui/events/ozone/evdev/event_device_info.h" #include "ui/events/ozone/evdev/events_ozone_evdev_export.h" #include "ui/events/ozone/evdev/input_device_settings_evdev.h" namespace ui { class CursorDelegateEvdev; class DeviceEventDispatcherEvdev; class InputDeviceFactoryEvdevProxy; #if !defined(USE_EVDEV) #error Missing dependency on ui/events/ozone:events_ozone_evdev #endif #if defined(USE_EVDEV_GESTURES) class GesturePropertyProvider; #endif typedef base::Callback)> GetTouchDeviceStatusReply; typedef base::Callback>)> GetTouchEventLogReply; // Manager for event device objects. All device I/O starts here. class EVENTS_OZONE_EVDEV_EXPORT InputDeviceFactoryEvdev { public: InputDeviceFactoryEvdev(scoped_ptr dispatcher, CursorDelegateEvdev* cursor); ~InputDeviceFactoryEvdev(); // Open & start reading a newly plugged-in input device. void AddInputDevice(int id, const base::FilePath& path); // Stop reading & close an unplugged input device. void RemoveInputDevice(const base::FilePath& path); // Device thread handler for initial scan completion. void OnStartupScanComplete(); // LED state. void SetCapsLockLed(bool enabled); // Bits from InputController that have to be answered on IO. void UpdateInputDeviceSettings(const InputDeviceSettingsEvdev& settings); void GetTouchDeviceStatus(const GetTouchDeviceStatusReply& reply); void GetTouchEventLog(const base::FilePath& out_dir, const GetTouchEventLogReply& reply); base::WeakPtr GetWeakPtr(); private: // Open device at path & starting processing events (on UI thread). void AttachInputDevice(scoped_ptr converter); // Close device at path (on UI thread). void DetachInputDevice(const base::FilePath& file_path); // Sync input_device_settings_ to attached devices. void ApplyInputDeviceSettings(); void ApplyCapsLockLed(); // Policy for device enablement. bool IsDeviceEnabled(const EventConverterEvdev* converter); // Update observers on device changes. void UpdateDirtyFlags(const EventConverterEvdev* converter); void NotifyDevicesUpdated(); void NotifyKeyboardsUpdated(); void NotifyTouchscreensUpdated(); void NotifyMouseDevicesUpdated(); void NotifyTouchpadDevicesUpdated(); void SetIntPropertyForOneType(const EventDeviceType type, const std::string& name, int value); void SetBoolPropertyForOneType(const EventDeviceType type, const std::string& name, bool value); // Owned per-device event converters (by path). std::map converters_; // Task runner for our thread. scoped_refptr task_runner_; // Cursor movement. CursorDelegateEvdev* cursor_; #if defined(USE_EVDEV_GESTURES) // Gesture library property provider (used by touchpads/mice). scoped_ptr gesture_property_provider_; #endif // Dispatcher for events. scoped_ptr dispatcher_; // Number of pending device additions & device classes. int pending_device_changes_ = 0; bool touchscreen_list_dirty_ = true; bool keyboard_list_dirty_ = true; bool mouse_list_dirty_ = true; bool touchpad_list_dirty_ = true; // Whether we have a list of devices that were present at startup. bool startup_devices_enumerated_ = false; // Whether devices that were present at startup are open. bool startup_devices_opened_ = false; // LEDs. bool caps_lock_led_enabled_ = false; // Device settings. These primarily affect libgestures behavior. InputDeviceSettingsEvdev input_device_settings_; // Support weak pointers for attach & detach callbacks. base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(InputDeviceFactoryEvdev); }; } // namespace ui #endif // UI_EVENTS_OZONE_EVDEV_INPUT_DEVICE_FACTORY_EVDEV_H_