OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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_X_TOUCH_FACTORY_X11_H_ | |
6 #define UI_EVENTS_X_TOUCH_FACTORY_X11_H_ | |
7 | |
8 #include <bitset> | |
9 #include <map> | |
10 #include <set> | |
11 #include <utility> | |
12 #include <vector> | |
13 | |
14 #include "ui/events/events_base_export.h" | |
15 #include "ui/gfx/sequential_id_generator.h" | |
16 | |
17 template <typename T> struct DefaultSingletonTraits; | |
18 | |
19 typedef unsigned long Cursor; | |
20 typedef unsigned long Window; | |
21 typedef struct _XDisplay Display; | |
22 typedef union _XEvent XEvent; | |
23 | |
24 namespace ui { | |
25 | |
26 // Functions related to determining touch devices. | |
27 class EVENTS_BASE_EXPORT TouchFactory { | |
28 private: | |
29 TouchFactory(); | |
30 ~TouchFactory(); | |
31 | |
32 public: | |
33 // Returns the TouchFactory singleton. | |
34 static TouchFactory* GetInstance(); | |
35 | |
36 // Sets the touch devices from the command line. | |
37 static void SetTouchDeviceListFromCommandLine(); | |
38 | |
39 // Updates the list of devices. | |
40 void UpdateDeviceList(Display* display); | |
41 | |
42 // Checks whether an XI2 event should be processed or not (i.e. if the event | |
43 // originated from a device we are interested in). | |
44 bool ShouldProcessXI2Event(XEvent* xevent); | |
45 | |
46 // Setup an X Window for XInput2 events. | |
47 void SetupXI2ForXWindow(::Window xid); | |
48 | |
49 // Keeps a list of touch devices so that it is possible to determine if a | |
50 // pointer event is a touch-event or a mouse-event. The list is reset each | |
51 // time this is called. | |
52 void SetTouchDeviceList(const std::vector<unsigned int>& devices); | |
53 | |
54 // Is the device a touch-device? | |
55 bool IsTouchDevice(unsigned int deviceid) const; | |
56 | |
57 // Is the device a real multi-touch-device? (see doc. for |touch_device_list_| | |
58 // below for more explanation.) | |
59 bool IsMultiTouchDevice(unsigned int deviceid) const; | |
60 | |
61 // Tries to find an existing slot ID mapping to tracking ID. Returns true | |
62 // if the slot is found and it is saved in |slot|, false if no such slot | |
63 // can be found. | |
64 bool QuerySlotForTrackingID(uint32 tracking_id, int* slot); | |
65 | |
66 // Tries to find an existing slot ID mapping to tracking ID. If there | |
67 // isn't one already, allocates a new slot ID and sets up the mapping. | |
68 int GetSlotForTrackingID(uint32 tracking_id); | |
69 | |
70 // Increases the number of times |ReleaseSlotForTrackingID| needs to be called | |
71 // on a given tracking id before it will actually be released. | |
72 void AcquireSlotForTrackingID(uint32 tracking_id); | |
73 | |
74 // Releases the slot ID mapping to tracking ID. | |
75 void ReleaseSlotForTrackingID(uint32 tracking_id); | |
76 | |
77 // Whether any touch device is currently present and enabled. | |
78 bool IsTouchDevicePresent(); | |
79 | |
80 // Pairs of <vendor id, product id> of external touch screens. | |
81 const std::set<std::pair<int, int> >& GetTouchscreenIds() const { | |
82 return touchscreen_ids_; | |
83 } | |
84 | |
85 // Return maximum simultaneous touch points supported by device. | |
86 int GetMaxTouchPoints() const; | |
87 | |
88 // Resets the TouchFactory singleton. | |
89 void ResetForTest(); | |
90 | |
91 // Sets up the device id in the list |devices| as multi-touch capable | |
92 // devices and enables touch events processing. This function is only | |
93 // for test purpose, and it does not query from X server. | |
94 void SetTouchDeviceForTest(const std::vector<unsigned int>& devices); | |
95 | |
96 // Sets up the device id in the list |devices| as pointer devices. | |
97 // This function is only for test purpose, and it does not query from | |
98 // X server. | |
99 void SetPointerDeviceForTest(const std::vector<unsigned int>& devices); | |
100 | |
101 private: | |
102 // Requirement for Singleton | |
103 friend struct DefaultSingletonTraits<TouchFactory>; | |
104 | |
105 void CacheTouchscreenIds(Display* display, int id); | |
106 | |
107 // NOTE: To keep track of touch devices, we currently maintain a lookup table | |
108 // to quickly decide if a device is a touch device or not. We also maintain a | |
109 // list of the touch devices. Ideally, there will be only one touch device, | |
110 // and instead of having the lookup table and the list, there will be a single | |
111 // identifier for the touch device. This can be completed after enough testing | |
112 // on real touch devices. | |
113 | |
114 static const int kMaxDeviceNum = 128; | |
115 | |
116 // A quick lookup table for determining if events from the pointer device | |
117 // should be processed. | |
118 std::bitset<kMaxDeviceNum> pointer_device_lookup_; | |
119 | |
120 // A quick lookup table for determining if a device is a touch device. | |
121 std::bitset<kMaxDeviceNum> touch_device_lookup_; | |
122 | |
123 // Indicates whether touch events are explicitly disabled. | |
124 bool touch_events_disabled_; | |
125 | |
126 // The list of touch devices. For testing/debugging purposes, a single-pointer | |
127 // device (mouse or touch screen without sufficient X/driver support for MT) | |
128 // can sometimes be treated as a touch device. The key in the map represents | |
129 // the device id, and the value represents if the device is multi-touch | |
130 // capable. | |
131 std::map<int, bool> touch_device_list_; | |
132 | |
133 // Touch screen <vid, pid>s. | |
134 std::set<std::pair<int, int> > touchscreen_ids_; | |
135 | |
136 // Maps from a tracking id to the number of times |ReleaseSlotForTrackingID| | |
137 // must be called before the tracking id is released. | |
138 std::map<uint32, int> tracking_id_refcounts_; | |
139 | |
140 // Maximum simultaneous touch points supported by device. In the case of | |
141 // devices with multiple digitizers (e.g. multiple touchscreens), the value | |
142 // is the maximum of the set of maximum supported contacts by each individual | |
143 // digitizer. | |
144 int max_touch_points_; | |
145 | |
146 // Device ID of the virtual core keyboard. | |
147 int virtual_core_keyboard_device_; | |
148 | |
149 SequentialIDGenerator id_generator_; | |
150 | |
151 DISALLOW_COPY_AND_ASSIGN(TouchFactory); | |
152 }; | |
153 | |
154 } // namespace ui | |
155 | |
156 #endif // UI_EVENTS_X_TOUCH_FACTORY_X11_H_ | |
OLD | NEW |