• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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