| // Copyright 2013 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_EVENT_DEVICE_INFO_H_ |
| #define UI_EVENTS_OZONE_EVDEV_EVENT_DEVICE_INFO_H_ |
| |
| #include <limits.h> |
| #include <linux/input.h> |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "ui/events/ozone/evdev/event_device_util.h" |
| #include "ui/events/ozone/evdev/events_ozone_evdev_export.h" |
| |
| #if !defined(ABS_MT_TOOL_Y) |
| #define ABS_MT_TOOL_Y 0x3d |
| #endif |
| |
| // ABS_MT_SLOT isn't valid options for EVIOCGMTSLOTS ioctl. |
| #define EVDEV_ABS_MT_FIRST ABS_MT_TOUCH_MAJOR |
| #define EVDEV_ABS_MT_LAST ABS_MT_TOOL_Y |
| #define EVDEV_ABS_MT_COUNT (EVDEV_ABS_MT_LAST - EVDEV_ABS_MT_FIRST + 1) |
| |
| namespace ui { |
| |
| // Input device types. |
| enum EVENTS_OZONE_EVDEV_EXPORT EventDeviceType { |
| DT_KEYBOARD, |
| DT_MOUSE, |
| DT_TOUCHPAD, |
| DT_TOUCHSCREEN, |
| DT_MULTITOUCH, |
| DT_MULTITOUCH_MOUSE, |
| DT_ALL, |
| }; |
| |
| // Device information for Linux input devices |
| // |
| // This stores and queries information about input devices; in |
| // particular it knows which events the device can generate. |
| class EVENTS_OZONE_EVDEV_EXPORT EventDeviceInfo { |
| public: |
| EventDeviceInfo(); |
| ~EventDeviceInfo(); |
| |
| // Initialize device information from an open device. |
| bool Initialize(int fd); |
| |
| // Manual initialization. |
| void SetEventTypes(const unsigned long* ev_bits, size_t len); |
| void SetKeyEvents(const unsigned long* key_bits, size_t len); |
| void SetRelEvents(const unsigned long* rel_bits, size_t len); |
| void SetAbsEvents(const unsigned long* abs_bits, size_t len); |
| void SetMscEvents(const unsigned long* msc_bits, size_t len); |
| void SetSwEvents(const unsigned long* sw_bits, size_t len); |
| void SetLedEvents(const unsigned long* led_bits, size_t len); |
| void SetProps(const unsigned long* prop_bits, size_t len); |
| void SetAbsInfo(unsigned int code, const input_absinfo& absinfo); |
| void SetAbsMtSlots(unsigned int code, const std::vector<int32_t>& values); |
| void SetAbsMtSlot(unsigned int code, unsigned int slot, uint32_t value); |
| |
| // Check events this device can generate. |
| bool HasEventType(unsigned int type) const; |
| bool HasKeyEvent(unsigned int code) const; |
| bool HasRelEvent(unsigned int code) const; |
| bool HasAbsEvent(unsigned int code) const; |
| bool HasMscEvent(unsigned int code) const; |
| bool HasSwEvent(unsigned int code) const; |
| bool HasLedEvent(unsigned int code) const; |
| |
| // Properties of absolute axes. |
| int32_t GetAbsMinimum(unsigned int code) const; |
| int32_t GetAbsMaximum(unsigned int code) const; |
| int32_t GetAbsValue(unsigned int code) const; |
| uint32_t GetAbsMtSlotCount() const; |
| int32_t GetAbsMtSlotValue(unsigned int code, unsigned int slot) const; |
| int32_t GetAbsMtSlotValueWithDefault(unsigned int code, |
| unsigned int slot, |
| int32_t default_value) const; |
| |
| // Device identification. |
| const std::string& name() const { return name_; } |
| uint16_t vendor_id() const { return vendor_id_; } |
| uint16_t product_id() const { return product_id_; } |
| |
| // Check input device properties. |
| bool HasProp(unsigned int code) const; |
| |
| // Has absolute X & Y axes (excludes MT) |
| bool HasAbsXY() const; |
| |
| // Has MT absolute X & Y events. |
| bool HasMTAbsXY() const; |
| |
| // Has relative X & Y axes. |
| bool HasRelXY() const; |
| |
| // Has multitouch protocol "B". |
| bool HasMultitouch() const; |
| |
| // Determine whether this is a "Direct Touch" device e.g. touchscreen. |
| // Corresponds to INPUT_PROP_DIRECT but may be inferred. |
| // NB: The Linux documentation says tablets would be direct, but they are |
| // not (and drivers do not actually set INPUT_PROP_DIRECT for them). |
| bool HasDirect() const; |
| |
| // Determine whether device moves the cursor. This is the case for touchpads |
| // and tablets but not touchscreens. |
| // Corresponds to INPUT_PROP_POINTER but may be inferred. |
| bool HasPointer() const; |
| |
| // Has stylus EV_KEY events. |
| bool HasStylus() const; |
| |
| // Determine whether there's a keyboard on this device. |
| bool HasKeyboard() const; |
| |
| // Determine whether there's a mouse on this device. |
| bool HasMouse() const; |
| |
| // Determine whether there's a touchpad on this device. |
| bool HasTouchpad() const; |
| |
| // Determine whether there's a tablet on this device. |
| bool HasTablet() const; |
| |
| // Determine whether there's a touchscreen on this device. |
| bool HasTouchscreen() const; |
| |
| private: |
| enum class LegacyAbsoluteDeviceType { |
| LADT_TOUCHPAD, |
| LADT_TOUCHSCREEN, |
| LADT_TABLET, |
| LADT_NONE, |
| }; |
| |
| // Probe absolute X & Y axis behavior. This is for legacy drivers that |
| // do not tell us what the axes mean. |
| LegacyAbsoluteDeviceType ProbeLegacyAbsoluteDevice() const; |
| |
| unsigned long ev_bits_[EVDEV_BITS_TO_LONGS(EV_CNT)]; |
| unsigned long key_bits_[EVDEV_BITS_TO_LONGS(KEY_CNT)]; |
| unsigned long rel_bits_[EVDEV_BITS_TO_LONGS(REL_CNT)]; |
| unsigned long abs_bits_[EVDEV_BITS_TO_LONGS(ABS_CNT)]; |
| unsigned long msc_bits_[EVDEV_BITS_TO_LONGS(MSC_CNT)]; |
| unsigned long sw_bits_[EVDEV_BITS_TO_LONGS(SW_CNT)]; |
| unsigned long led_bits_[EVDEV_BITS_TO_LONGS(LED_CNT)]; |
| unsigned long prop_bits_[EVDEV_BITS_TO_LONGS(INPUT_PROP_CNT)]; |
| |
| struct input_absinfo abs_info_[ABS_CNT]; |
| |
| // Store the values for the multi-touch properties for each slot. |
| std::vector<int32_t> slot_values_[EVDEV_ABS_MT_COUNT]; |
| |
| // Device identification. |
| std::string name_; |
| uint16_t vendor_id_; |
| uint16_t product_id_; |
| |
| DISALLOW_COPY_AND_ASSIGN(EventDeviceInfo); |
| }; |
| |
| } // namspace ui |
| |
| #endif // UI_EVENTS_OZONE_EVDEV_EVENT_DEVICE_INFO_H_ |