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