1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef UI_EVENTS_OZONE_EVDEV_TOUCH_EVENT_CONVERTER_EVDEV_H_ 6 #define UI_EVENTS_OZONE_EVDEV_TOUCH_EVENT_CONVERTER_EVDEV_H_ 7 8 #include <bitset> 9 10 #include "base/compiler_specific.h" 11 #include "base/files/file_path.h" 12 #include "base/message_loop/message_pump_libevent.h" 13 #include "ui/events/event_constants.h" 14 #include "ui/events/ozone/evdev/event_converter_evdev.h" 15 #include "ui/events/ozone/evdev/event_device_info.h" 16 #include "ui/events/ozone/evdev/events_ozone_evdev_export.h" 17 18 namespace ui { 19 20 class TouchEvent; 21 22 class EVENTS_OZONE_EVDEV_EXPORT TouchEventConverterEvdev 23 : public EventConverterEvdev, 24 public base::MessagePumpLibevent::Watcher { 25 public: 26 enum { 27 MAX_FINGERS = 11 28 }; 29 TouchEventConverterEvdev(int fd, 30 base::FilePath path, 31 const EventDeviceInfo& info, 32 const EventDispatchCallback& dispatch); 33 virtual ~TouchEventConverterEvdev(); 34 35 // Start & stop watching for events. 36 virtual void Start() OVERRIDE; 37 virtual void Stop() OVERRIDE; 38 39 private: 40 friend class MockTouchEventConverterEvdev; 41 42 // Unsafe part of initialization. 43 void Init(const EventDeviceInfo& info); 44 45 // Overidden from base::MessagePumpLibevent::Watcher. 46 virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE; 47 virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE; 48 49 virtual bool Reinitialize(); 50 51 void ProcessInputEvent(const input_event& input); 52 void ProcessAbs(const input_event& input); 53 void ProcessSyn(const input_event& input); 54 55 void ReportEvents(base::TimeDelta delta); 56 57 // Set if we have seen a SYN_DROPPED and not yet re-synced with the device. 58 bool syn_dropped_; 59 60 // Set if this is a type A device (uses SYN_MT_REPORT). 61 bool is_type_a_; 62 63 // Pressure values. 64 int pressure_min_; 65 int pressure_max_; // Used to normalize pressure values. 66 67 // Input range for x-axis. 68 float x_min_tuxels_; 69 float x_num_tuxels_; 70 71 // Input range for y-axis. 72 float y_min_tuxels_; 73 float y_num_tuxels_; 74 75 // Output range for x-axis. 76 float x_min_pixels_; 77 float x_num_pixels_; 78 79 // Output range for y-axis. 80 float y_min_pixels_; 81 float y_num_pixels_; 82 83 // Touch point currently being updated from the /dev/input/event* stream. 84 int current_slot_; 85 86 // File descriptor for the /dev/input/event* instance. 87 int fd_; 88 89 // Path to input device. 90 base::FilePath path_; 91 92 // Bit field tracking which in-progress touch points have been modified 93 // without a syn event. 94 std::bitset<MAX_FINGERS> altered_slots_; 95 96 struct InProgressEvents { 97 float x_; 98 float y_; 99 int id_; // Device reported "unique" touch point id; -1 means not active 100 int finger_; // "Finger" id starting from 0; -1 means not active 101 102 EventType type_; 103 int major_; 104 float pressure_; 105 }; 106 107 // In-progress touch points. 108 InProgressEvents events_[MAX_FINGERS]; 109 110 // Controller for watching the input fd. 111 base::MessagePumpLibevent::FileDescriptorWatcher controller_; 112 113 DISALLOW_COPY_AND_ASSIGN(TouchEventConverterEvdev); 114 }; 115 116 } // namespace ui 117 118 #endif // UI_EVENTS_OZONE_EVDEV_TOUCH_EVENT_CONVERTER_EVDEV_H_ 119