- add sources.
[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 <vector>
11
12 #include "base/timer/timer.h"
13 #include "ui/events/events_export.h"
14 #include "ui/gfx/sequential_id_generator.h"
15
16 template <typename T> struct DefaultSingletonTraits;
17
18 typedef unsigned long Cursor;
19 typedef unsigned long Window;
20 typedef struct _XDisplay Display;
21 typedef union _XEvent XEvent;
22
23 namespace ui {
24
25 // Functions related to determining touch devices.
26 class EVENTS_EXPORT TouchFactory {
27  private:
28   TouchFactory();
29   ~TouchFactory();
30
31  public:
32   // Returns the TouchFactory singleton.
33   static TouchFactory* GetInstance();
34
35   // Sets the touch devices from the command line.
36   static void SetTouchDeviceListFromCommandLine();
37
38   // Updates the list of devices.
39   void UpdateDeviceList(Display* display);
40
41   // Checks whether an XI2 event should be processed or not (i.e. if the event
42   // originated from a device we are interested in).
43   bool ShouldProcessXI2Event(XEvent* xevent);
44
45   // Setup an X Window for XInput2 events.
46   void SetupXI2ForXWindow(::Window xid);
47
48   // Keeps a list of touch devices so that it is possible to determine if a
49   // pointer event is a touch-event or a mouse-event. The list is reset each
50   // time this is called.
51   void SetTouchDeviceList(const std::vector<unsigned int>& devices);
52
53   // Is the device a touch-device?
54   bool IsTouchDevice(unsigned int deviceid) const;
55
56   // Is the device a real multi-touch-device? (see doc. for |touch_device_list_|
57   // below for more explanation.)
58   bool IsMultiTouchDevice(unsigned int deviceid) const;
59
60 #if defined(USE_XI2_MT)
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   // Releases the slot ID mapping to tracking ID.
71   void ReleaseSlotForTrackingID(uint32 tracking_id);
72 #endif
73
74   // Is the slot ID currently used?
75   bool IsSlotUsed(int slot) const;
76
77   // Marks a slot as being used/unused.
78   void SetSlotUsed(int slot, bool used);
79
80   // Whether any touch device is currently present and enabled.
81   bool IsTouchDevicePresent();
82
83   // Sets up the device id in the list |devices| as multi-touch capable
84   // devices and enables touch events processing. This function is only
85   // for test purpose, and it does not query from X server.
86   void SetTouchDeviceForTest(const std::vector<unsigned int>& devices);
87
88  private:
89   // Requirement for Singleton
90   friend struct DefaultSingletonTraits<TouchFactory>;
91
92   // NOTE: To keep track of touch devices, we currently maintain a lookup table
93   // to quickly decide if a device is a touch device or not. We also maintain a
94   // list of the touch devices. Ideally, there will be only one touch device,
95   // and instead of having the lookup table and the list, there will be a single
96   // identifier for the touch device. This can be completed after enough testing
97   // on real touch devices.
98
99   static const int kMaxDeviceNum = 128;
100
101   // A quick lookup table for determining if events from the pointer device
102   // should be processed.
103   std::bitset<kMaxDeviceNum> pointer_device_lookup_;
104
105   // A quick lookup table for determining if a device is a touch device.
106   std::bitset<kMaxDeviceNum> touch_device_lookup_;
107
108   // Indicates whether a touch device is currently available or not.
109   bool touch_device_available_;
110
111   // Indicates whether touch events are explicitly disabled.
112   bool touch_events_disabled_;
113
114   // The list of touch devices. For testing/debugging purposes, a single-pointer
115   // device (mouse or touch screen without sufficient X/driver support for MT)
116   // can sometimes be treated as a touch device. The key in the map represents
117   // the device id, and the value represents if the device is multi-touch
118   // capable.
119   std::map<int, bool> touch_device_list_;
120
121   // Maximum simultaneous touch points.
122   static const int kMaxTouchPoints = 32;
123
124 #if defined(USE_XI2_MT)
125   SequentialIDGenerator id_generator_;
126 #endif
127
128   // A lookup table for slots in use for a touch event.
129   std::bitset<kMaxTouchPoints> slots_used_;
130
131   DISALLOW_COPY_AND_ASSIGN(TouchFactory);
132 };
133
134 }  // namespace ui
135
136 #endif  // UI_EVENTS_X_TOUCH_FACTORY_X11_H_