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.
5 #ifndef UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_PROPERTY_PROVIDER_H_
6 #define UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_PROPERTY_PROVIDER_H_
8 #include <gestures/gestures.h>
9 #include <libevdev/libevdev.h>
16 #include "base/basictypes.h"
17 #include "base/containers/scoped_ptr_hash_map.h"
18 #include "base/memory/scoped_vector.h"
19 #include "ui/events/ozone/evdev/event_device_info.h"
20 #include "ui/events/ozone/evdev/events_ozone_evdev_export.h"
24 class GesturesPropFunctionsWrapper
;
25 class GestureInterpreterLibevdevCros
;
27 // Not for public consumption, so we wrap it in namespace internal.
29 struct GestureDevicePropertyData
;
31 struct ConfigurationSection
;
34 // A struct holding device properties that are useful when interacting with
36 struct GestureDeviceProperties
{
43 int orientation_minimum
;
44 int orientation_maximum
;
45 GesturesPropBool raw_passthrough
;
46 GesturesPropBool dump_debug_log
;
49 // Provide the interface to access the CrOS gesture library properties.
50 // It maintains the property data for all input devices that runs with
51 // the gesture library.
53 // The class also parses the configuration files on the system to
54 // initialize the specified property values. The configuration files are
55 // currently in the xorg-conf format so that they can be shared with non-Ozone
57 class EVENTS_OZONE_EVDEV_EXPORT GesturePropertyProvider
{
68 // Pointer that leads to the device info.
69 typedef Evdev
* DevicePtr
;
71 // The device ids are only maintained by EventFactoryEvdev to identify the
72 // input devices and are not to be confused with the Evdev input node id, for
76 GesturePropertyProvider();
77 ~GesturePropertyProvider();
79 // Get a list of device ids that matches a device type. Return true if the
80 // list is not empty. |device_ids| can be NULL. Existing data in |device_ids|
82 bool GetDeviceIdsByType(const EventDeviceType type
,
83 std::vector
<DeviceId
>* device_ids
);
85 // Check if a device id matches a device type. Return true if it matches.
86 // Return false if it doesn't match or if it doesn't use
87 // the GesturePropertyProvider.
88 bool IsDeviceIdOfType(const DeviceId device_id
, const EventDeviceType type
);
90 // Get the GesturesProp object. Returns NULL if not found.
92 // The user may use the object returned to set/get the property value in the
93 // gesture library's memory. Note that the values in preferences are not
94 // synced with the ones here in realtime - they are only applied from the
95 // preference side in a single way once appropriate (e.g., when the user
97 GesturesProp
* GetProperty(const DeviceId device_id
, const std::string
& name
);
99 // Get the names of all properties of one device. Mostly used for the logging
101 std::vector
<std::string
> GetPropertyNamesById(const DeviceId device_id
);
103 // Get the (Evdev) device name. Mostly used for the logging purpose.
104 std::string
GetDeviceNameById(const DeviceId device_id
);
107 friend class GesturesPropFunctionsWrapper
;
109 // Mapping table from a device id to its device pointer.
110 typedef std::map
<DeviceId
, DevicePtr
> DeviceMap
;
112 // Mapping table from a device id to its property data.
113 // GestureDevicePropertyData contains both properties in use and default
114 // properties whose values will be applied upon the device attachment.
115 typedef base::ScopedPtrHashMap
<DeviceId
, internal::GestureDevicePropertyData
>
118 // Register a device. Setup data-structures and the device's default
120 void RegisterDevice(const DeviceId id
, const DevicePtr device
);
122 // Unregister a device. Remove all of its properties being tracked.
123 void UnregisterDevice(const DeviceId id
);
125 // Called by functions in GesturesPropFunctionsWrapper to manipulate
126 // properties. Note these functions do not new/delete the GesturesProp
127 // pointers. It is caller's responsibility to manage them.
128 void AddProperty(const DeviceId device_id
,
129 const std::string
& name
,
130 GesturesProp
* property
);
131 void DeleteProperty(const DeviceId device_id
, const std::string
& name
);
133 // Check if a property exists for a device. Return if it is found.
134 GesturesProp
* FindProperty(const DeviceId device_id
, const std::string
& name
);
136 // Get the default value of a property based on the configuration files.
137 GesturesProp
* GetDefaultProperty(const DeviceId device_id
,
138 const std::string
& name
);
140 // The device configuration files are parsed and stored in the memory upon
141 // Chrome starts. The default property values are then applied to each device
142 // when it is attached/detected.
143 void LoadDeviceConfigurations();
145 // Parse a xorg-conf file. We ignore all sections other than InputClass.
146 // Check the xorg-conf spec for more infomation about its format.
147 void ParseXorgConfFile(const std::string
& content
);
149 // Create a match criteria.
150 internal::MatchCriteria
* CreateMatchCriteria(const std::string
& match_type
,
151 const std::string
& arg
);
153 // Create a property that comes from the conf files.
154 GesturesProp
* CreateDefaultProperty(const std::string
& name
,
155 const std::string
& value
);
157 // Setup default property values for a newly found device.
158 void SetupDefaultProperties(const DeviceId device_id
, const DevicePtr device
);
160 // Map from device ids to device pointers.
161 DeviceMap device_map_
;
163 // GestureDevicePropertyData indexed by their respective device ids. Owns the
165 ScopedDeviceDataMap device_data_map_
;
167 // A vector of parsed sections in configuration files. Owns MatchCriterias,
168 // GesturesProps and ConfigurationSections in it.
169 ScopedVector
<internal::ConfigurationSection
> configurations_
;
171 DISALLOW_COPY_AND_ASSIGN(GesturePropertyProvider
);
174 // Wrapper of GesturesProp related functions. We group them together so that we
175 // can friend them all at once.
176 class GesturesPropFunctionsWrapper
{
178 // Property provider interface implementation.
180 // These functions will create a GesturesProp object that can link back to the
181 // memory that holds the real value, which is often declared in the gesture
183 static GesturesProp
* CreateInt(void* device_data
,
188 static GesturesProp
* CreateShort(void* device_data
,
193 static GesturesProp
* CreateBool(void* device_data
,
195 GesturesPropBool
* value
,
197 const GesturesPropBool
* init
);
199 // String GestureProps needs special care due to the use of const char* in the
200 // gesture lib. Its argument list is also different from numeric properties'.
201 static GesturesProp
* CreateString(void* device_data
,
206 static GesturesProp
* CreateReal(void* device_data
,
212 // Set the handlers to call when a property is accessed.
213 static void RegisterHandlers(void* device_data
,
214 GesturesProp
* property
,
216 GesturesPropGetHandler get
,
217 GesturesPropSetHandler set
);
220 static void Free(void* device_data
, GesturesProp
* property
);
222 // Initialize hardware-related device properties which will be used in the
224 static bool InitializeDeviceProperties(void* device_data
,
225 GestureDeviceProperties
* properties
);
227 // Unregister device from the gesture property provider.
228 static void UnregisterDevice(void* device_data
);
231 // Property helper functions.
232 // Core template function for creating GestureProps. Used by numerical types.
233 template <typename T
, class PROPTYPE
>
234 static GesturesProp
* CreateProperty(void* device_data
,
240 // Do things that should happen BEFORE we create the property.
241 static bool PreCreateProperty(void* device_data
,
243 GesturesProp
** default_property
);
245 // Do things that should happen AFTER we create the property.
246 static void PostCreateProperty(void* device_data
,
248 GesturesProp
* property
);
250 // Some other utility functions used in InitializeDeviceProperties.
251 static GesturesProp
* CreateIntSingle(void* device_data
,
255 static GesturesProp
* CreateBoolSingle(void* device_data
,
257 GesturesPropBool
* value
,
258 GesturesPropBool init
);
260 // Routines to extract information from the GestureInterpreterLibevdevCros
262 static GesturePropertyProvider
* GetPropertyProvider(void* device_data
);
263 static GesturePropertyProvider::DevicePtr
GetDevicePointer(void* device_data
);
264 static GesturePropertyProvider::DeviceId
GetDeviceId(void* device_data
);
267 extern const GesturesPropProvider kGesturePropProvider
;
271 // GesturesProp logging function.
272 std::ostream
& operator<<(std::ostream
& os
, const GesturesProp
& prop
);
274 // Implementation of GesturesProp declared in gestures.h
276 // libgestures requires that this be in the top level namespace. We have also
277 // to put it in the header file so that other classes will be able to use the
278 // gesture property objects.
279 struct GesturesProp
{
281 typedef ui::GesturePropertyProvider::PropertyType PropertyType
;
283 GesturesProp(const std::string
& name
,
284 const PropertyType type
,
286 virtual ~GesturesProp() {}
288 // Variant-ish interfaces for accessing the property value. Each type of
289 // property should override the corresponding interfaces for it.
290 virtual std::vector
<int> GetIntValue() const;
291 virtual bool SetIntValue(const std::vector
<int>& value
);
292 virtual std::vector
<int16_t> GetShortValue() const;
293 virtual bool SetShortValue(const std::vector
<int16_t>& value
);
294 virtual std::vector
<bool> GetBoolValue() const;
295 virtual bool SetBoolValue(const std::vector
<bool>& value
);
296 virtual std::string
GetStringValue() const;
297 virtual bool SetStringValue(const std::string
& value
);
298 virtual std::vector
<double> GetDoubleValue() const;
299 virtual bool SetDoubleValue(const std::vector
<double>& value
);
301 // Set property access handlers.
302 void SetHandlers(GesturesPropGetHandler get
,
303 GesturesPropSetHandler set
,
307 const std::string
& name() const { return name_
; }
308 PropertyType
type() const { return type_
; }
309 size_t count() const { return count_
; }
310 virtual bool IsReadOnly() const = 0;
313 // Functions to be called when the property value was accessed.
318 // For logging purpose.
319 friend std::ostream
& operator<<(std::ostream
& os
,
320 const GesturesProp
& property
);
322 // Interfaces for getting internal pointers and stuff.
323 virtual const char** GetStringWritebackPtr() const;
324 virtual bool IsAllocated() const;
326 // Property name, type and number of elements.
331 // Handler function pointers and the data to be passed to them when the
332 // property is accessed.
333 GesturesPropGetHandler get_
;
334 GesturesPropSetHandler set_
;
337 DISALLOW_COPY_AND_ASSIGN(GesturesProp
);
340 #endif // UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_PROPERTY_PROVIDER_H_