Index: third_party/gestures/include/gestures/gestures.h |
diff --git a/third_party/gestures/include/gestures/gestures.h b/third_party/gestures/include/gestures/gestures.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..96d4340a33d5981612875b33cfb6b0d3f2773e27 |
--- /dev/null |
+++ b/third_party/gestures/include/gestures/gestures.h |
@@ -0,0 +1,608 @@ |
+// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef GESTURES_GESTURES_H__ |
+#define GESTURES_GESTURES_H__ |
+ |
+#include <stdint.h> |
+#include <sys/time.h> |
+#include <sys/types.h> |
+ |
+#ifdef __cplusplus |
+#include <string> |
+ |
+#include <memory> |
+ |
+extern "C" { |
+#endif |
+ |
+// C API: |
+ |
+// external logging interface |
+#define GESTURES_LOG_ERROR 0 |
+#define GESTURES_LOG_INFO 1 |
+ |
+// this function has to be provided by the user of the library. |
+void gestures_log(int verb, const char* format, ...) |
+ __attribute__((format(printf, 2, 3))); |
+ |
+typedef double stime_t; // seconds |
+ |
+enum GestureInterpreterDeviceClass { |
+ GESTURES_DEVCLASS_UNKNOWN, |
+ GESTURES_DEVCLASS_MOUSE, |
+ GESTURES_DEVCLASS_MULTITOUCH_MOUSE, |
+ GESTURES_DEVCLASS_TOUCHPAD, |
+ GESTURES_DEVCLASS_TOUCHSCREEN, |
+}; |
+ |
+stime_t StimeFromTimeval(const struct timeval*); |
+stime_t StimeFromTimespec(const struct timespec*); |
+ |
+struct HardwareProperties { |
+ float left, top, right, bottom; |
+ float res_x; // pixels/mm |
+ float res_y; // pixels/mm |
+ float screen_x_dpi; // read from X server and passed to library |
+ float screen_y_dpi; // read from X server and passed to library |
+ float orientation_minimum; |
+ float orientation_maximum; |
+ unsigned short max_finger_cnt; // Max finger slots in one report |
+ unsigned short max_touch_cnt; // Max fingers that can be detected at once |
+ unsigned supports_t5r2:1; |
+ unsigned support_semi_mt:1; |
+ unsigned is_button_pad:1; |
+ unsigned has_wheel:1; |
+#ifdef __cplusplus |
+ std::string String() const; |
+#endif // __cplusplus |
+}; |
+ |
+// position is the (x,y) cartesian coord of the finger on the trackpad. |
+// touch_major/minor are the large/small radii of the ellipse of the touching |
+// finger. width_major/minor are also radii, but of the finger itself, |
+// including a little bit that isn't touching. So, width* is generally a tad |
+// larger than touch*. |
+// tracking_id: If a finger is the same physical finger across two |
+// consecutive frames, it must have the same tracking id; if it's a different |
+// finger, it may (should) have a different tracking id. |
+ |
+// Warp: If a finger has the 'warp' flag set for an axis, it means that while |
+// the finger may have moved, it should not cause any motion in that direction. |
+// This may occur is some situations where we thought a finger was in one place, |
+// but then we realized later it was actually in another place. |
+// The *_WARP_X/Y_MOVE version is an indication for suppressing unwanted |
+// cursor movement, while the *_WARP_X/Y_NON_MOVE version is for unwanted |
+// non-cursor movement (e.g. scrolling) |
+#define GESTURES_FINGER_WARP_X_NON_MOVE (1 << 0) |
+#define GESTURES_FINGER_WARP_Y_NON_MOVE (1 << 1) |
+// If a finger has notap set, it shouldn't begin a tap gesture. |
+#define GESTURES_FINGER_NO_TAP (1 << 2) |
+#define GESTURES_FINGER_POSSIBLE_PALM (1 << 3) |
+#define GESTURES_FINGER_PALM (1 << 4) |
+#define GESTURES_FINGER_WARP_X_MOVE (1 << 5) |
+#define GESTURES_FINGER_WARP_Y_MOVE (1 << 6) |
+// If tap to click movement detection should warp: |
+#define GESTURES_FINGER_WARP_X_TAP_MOVE (1 << 7) |
+#define GESTURES_FINGER_WARP_Y_TAP_MOVE (1 << 8) |
+// If a finger is a merged finger or one of close fingers |
+#define GESTURES_FINGER_MERGE (1 << 9) |
+// If a finger is showing a trend of moving (see the TrendClassifyingFilter). |
+#define GESTURES_FINGER_TREND_INC_X (1 << 10) |
+#define GESTURES_FINGER_TREND_DEC_X (1 << 11) |
+#define GESTURES_FINGER_TREND_INC_Y (1 << 12) |
+#define GESTURES_FINGER_TREND_DEC_Y (1 << 13) |
+#define GESTURES_FINGER_TREND_INC_PRESSURE (1 << 14) |
+#define GESTURES_FINGER_TREND_DEC_PRESSURE (1 << 15) |
+#define GESTURES_FINGER_TREND_INC_TOUCH_MAJOR (1 << 16) |
+#define GESTURES_FINGER_TREND_DEC_TOUCH_MAJOR (1 << 17) |
+// If a finger is non-stationary recently (see the StationaryWiggleFilter). |
+// Compared to the trend flags, this one takes the magnitude of movements |
+// into account so it might be more useful in some cases. However, it is also |
+// more prone to abrupt noisy jumps than the trend flags. It also looks at |
+// a shorter period of time than the trend ones so it may provide faster |
+// response and lower latency. |
+#define GESTURES_FINGER_INSTANTANEOUS_MOVING (1 << 18) |
+// We sometimes use the warp flags only because we want to suppress unwanted |
+// movements and not that we really have no good idea of the finger position. |
+// This poses additional difficulty for some classifying logics that relies |
+// much on the finger position. To maximize the use of any available data, |
+// we further mark a finger as GESTURES_FINGER_WARP_TELEPORTATION only if we |
+// indeed have no idea of its position (e.g. due to sensor jumps). For all |
+// other cases (e.g. click wiggle, plams suppression, stationary wiggle), we |
+// skip the flag so that we can have the option to use the not-that-accurate |
+// positions. |
+#define GESTURES_FINGER_WARP_TELEPORTATION (1 << 19) |
+ |
+#define GESTURES_FINGER_WARP_X (GESTURES_FINGER_WARP_X_NON_MOVE | \ |
+ GESTURES_FINGER_WARP_X_MOVE) |
+#define GESTURES_FINGER_WARP_Y (GESTURES_FINGER_WARP_Y_NON_MOVE | \ |
+ GESTURES_FINGER_WARP_Y_MOVE) |
+ |
+struct FingerState { |
+ float touch_major, touch_minor; |
+ float width_major, width_minor; |
+ float pressure; |
+ float orientation; |
+ float position_x; |
+ float position_y; |
+ short tracking_id; |
+ unsigned flags; |
+#ifdef __cplusplus |
+ bool NonFlagsEquals(const FingerState& that) const { |
+ return touch_major == that.touch_major && |
+ touch_minor == that.touch_minor && |
+ width_major == that.width_major && |
+ width_minor == that.width_minor && |
+ pressure == that.pressure && |
+ orientation == that.orientation && |
+ position_x == that.position_x && |
+ position_y == that.position_y && |
+ tracking_id == that.tracking_id; |
+ } |
+ bool operator==(const FingerState& that) const { |
+ return NonFlagsEquals(that) && flags == that.flags; |
+ } |
+ bool operator!=(const FingerState& that) const { return !(*this == that); } |
+ static std::string FlagsString(unsigned flags); |
+ std::string String() const; |
+#endif |
+}; |
+ |
+#define GESTURES_BUTTON_NONE 0 |
+#define GESTURES_BUTTON_LEFT 1 |
+#define GESTURES_BUTTON_MIDDLE 2 |
+#define GESTURES_BUTTON_RIGHT 4 |
+#define GESTURES_BUTTON_BACK 8 |
+#define GESTURES_BUTTON_FORWARD 16 |
+ |
+// One frame of trackpad data |
+struct HardwareState { |
+#ifdef __cplusplus |
+ FingerState* GetFingerState(short tracking_id); |
+ const FingerState* GetFingerState(short tracking_id) const; |
+ bool SameFingersAs(const HardwareState& that) const; |
+ std::string String() const; |
+ void DeepCopy(const HardwareState& that, unsigned short max_finger_cnt); |
+#endif // __cplusplus |
+ stime_t timestamp; // 64-bit Wall clock time in microseconds (10^-6 s) |
+ int buttons_down; // bit field, use GESTURES_BUTTON_* |
+ unsigned short finger_cnt; // Number of valid finger slots |
+ unsigned short touch_cnt; // Number of fingers touching pad |
+ struct FingerState* fingers; |
+ // For EV_REL events |
+ float rel_x; |
+ float rel_y; |
+ float rel_wheel; |
+ float rel_hwheel; |
+}; |
+ |
+#define GESTURES_FLING_START 0 // Scroll end/fling begin |
+#define GESTURES_FLING_TAP_DOWN 1 // Finger touched down/fling end |
+ |
+#define GESTURES_ZOOM_START 0 // Pinch zoom begin |
+#define GESTURES_ZOOM_UPDATE 1 // Zoom-in/Zoom-out update |
+#define GESTURES_ZOOM_END 2 // Pinch zoom end |
+ |
+// Gesture sub-structs |
+ |
+// Note about ordinal_* values: Sometimes, UI will want to use unaccelerated |
+// values for various gestures, so we expose the non-accelerated values in |
+// the ordinal_* fields. |
+ |
+typedef struct { |
+ float dx, dy; |
+ float ordinal_dx, ordinal_dy; |
+} GestureMove; |
+ |
+typedef struct{ |
+ float dx, dy; |
+ float ordinal_dx, ordinal_dy; |
+ // If set, stop_fling means that this scroll should stop flinging, thus |
+ // if an interpreter suppresses it for any reason (e.g., rounds the size |
+ // down to 0, thus making it a noop), it will replace it with a Fling |
+ // TAP_DOWN gesture |
+ unsigned stop_fling:1; |
+} GestureScroll; |
+ |
+typedef struct { |
+ // If a bit is set in both down and up, client should process down first |
+ unsigned down; // bit field, use GESTURES_BUTTON_* |
+ unsigned up; // bit field, use GESTURES_BUTTON_* |
+} GestureButtonsChange; |
+ |
+typedef struct { |
+ // fling velocity (valid when fling_state is GESTURES_FLING_START): |
+ float vx, vy; |
+ float ordinal_vx, ordinal_vy; |
+ unsigned fling_state:1; // GESTURES_FLING_START or GESTURES_FLING_TAP_DOWN |
+} GestureFling; |
+ |
+typedef struct { |
+ float dx, dy; |
+ float ordinal_dx, ordinal_dy; |
+} GestureSwipe; |
+ |
+typedef struct { |
+ float dx, dy; |
+ float ordinal_dx, ordinal_dy; |
+} GestureFourFingerSwipe; |
+ |
+typedef struct { |
+ char __dummy; |
+ // Remove this when there is a member in this struct. http://crbug.com/341155 |
+ // Currently no members |
+} GestureFourFingerSwipeLift; |
+ |
+typedef struct { |
+ char __dummy; |
+ // Remove this when there is a member in this struct. http://crbug.com/341155 |
+ // Currently no members |
+} GestureSwipeLift; |
+ |
+typedef struct { |
+ // Relative pinch factor starting with 1.0 = no pinch |
+ // <1.0 for outwards pinch |
+ // >1.0 for inwards pinch |
+ float dz; |
+ float ordinal_dz; |
+ // GESTURES_ZOOM_START, GESTURES_ZOOM_UPDATE, or GESTURES_ZOOM_END |
+ unsigned zoom_state; |
+} GesturePinch; |
+ |
+// Metrics types that we care about |
+enum GestureMetricsType { |
+ kGestureMetricsTypeNoisyGround = 0, |
+ kGestureMetricsTypeMouseMovement, |
+ kGestureMetricsTypeUnknown, |
+}; |
+ |
+typedef struct { |
+ enum GestureMetricsType type; |
+ // Optional values for the metrics. 2 are more than enough for now. |
+ float data[2]; |
+} GestureMetrics; |
+ |
+enum GestureType { |
+#ifdef GESTURES_INTERNAL |
+ kGestureTypeNull = -1, // internal to Gestures library only |
+#endif // GESTURES_INTERNAL |
+ kGestureTypeContactInitiated = 0, |
+ kGestureTypeMove, |
+ kGestureTypeScroll, |
+ kGestureTypeButtonsChange, |
+ kGestureTypeFling, |
+ kGestureTypeSwipe, |
+ kGestureTypePinch, |
+ kGestureTypeSwipeLift, |
+ kGestureTypeMetrics, |
+ kGestureTypeFourFingerSwipe, |
+ kGestureTypeFourFingerSwipeLift, |
+}; |
+ |
+#ifdef __cplusplus |
+// Pass these into Gesture() ctor as first arg |
+extern const GestureMove kGestureMove; |
+extern const GestureScroll kGestureScroll; |
+extern const GestureButtonsChange kGestureButtonsChange; |
+extern const GestureFling kGestureFling; |
+extern const GestureSwipe kGestureSwipe; |
+extern const GestureFourFingerSwipe kGestureFourFingerSwipe; |
+extern const GesturePinch kGesturePinch; |
+extern const GestureSwipeLift kGestureSwipeLift; |
+extern const GestureFourFingerSwipeLift kGestureFourFingerSwipeLift; |
+extern const GestureMetrics kGestureMetrics; |
+#endif // __cplusplus |
+ |
+struct Gesture { |
+#ifdef __cplusplus |
+ // Create Move/Scroll gesture |
+#ifdef GESTURES_INTERNAL |
+ Gesture() : start_time(0), end_time(0), type(kGestureTypeNull) {} |
+ std::string String() const; |
+ bool operator==(const Gesture& that) const; |
+ bool operator!=(const Gesture& that) const { return !(*this == that); }; |
+#endif // GESTURES_INTERNAL |
+ Gesture(const GestureMove&, stime_t start, stime_t end, float dx, float dy) |
+ : start_time(start), end_time(end), type(kGestureTypeMove) { |
+ details.move.ordinal_dx = details.move.dx = dx; |
+ details.move.ordinal_dy = details.move.dy = dy; |
+ } |
+ Gesture(const GestureScroll&, |
+ stime_t start, stime_t end, float dx, float dy) |
+ : start_time(start), end_time(end), type(kGestureTypeScroll) { |
+ details.scroll.ordinal_dx = details.scroll.dx = dx; |
+ details.scroll.ordinal_dy = details.scroll.dy = dy; |
+ details.scroll.stop_fling = 0; |
+ } |
+ Gesture(const GestureButtonsChange&, |
+ stime_t start, stime_t end, unsigned down, unsigned up) |
+ : start_time(start), |
+ end_time(end), |
+ type(kGestureTypeButtonsChange) { |
+ details.buttons.down = down; |
+ details.buttons.up = up; |
+ } |
+ Gesture(const GestureFling&, |
+ stime_t start, stime_t end, float vx, float vy, unsigned state) |
+ : start_time(start), end_time(end), type(kGestureTypeFling) { |
+ details.fling.ordinal_vx = details.fling.vx = vx; |
+ details.fling.ordinal_vy = details.fling.vy = vy; |
+ details.fling.fling_state = state; |
+ } |
+ Gesture(const GestureSwipe&, |
+ stime_t start, stime_t end, float dx, float dy) |
+ : start_time(start), |
+ end_time(end), |
+ type(kGestureTypeSwipe) { |
+ details.swipe.ordinal_dx = details.swipe.dx = dx; |
+ details.swipe.ordinal_dy = details.swipe.dy = dy; |
+ } |
+ Gesture(const GestureFourFingerSwipe&, |
+ stime_t start, stime_t end, float dx, float dy) |
+ : start_time(start), |
+ end_time(end), |
+ type(kGestureTypeFourFingerSwipe) { |
+ details.four_finger_swipe.ordinal_dx = details.four_finger_swipe.dx = dx; |
+ details.four_finger_swipe.ordinal_dy = details.four_finger_swipe.dy = dy; |
+ } |
+ Gesture(const GesturePinch&, |
+ stime_t start, stime_t end, float dz, unsigned state) |
+ : start_time(start), |
+ end_time(end), |
+ type(kGestureTypePinch) { |
+ details.pinch.ordinal_dz = details.pinch.dz = dz; |
+ details.pinch.zoom_state = state; |
+ } |
+ Gesture(const GestureSwipeLift&, stime_t start, stime_t end) |
+ : start_time(start), |
+ end_time(end), |
+ type(kGestureTypeSwipeLift) {} |
+ Gesture(const GestureFourFingerSwipeLift&, stime_t start, stime_t end) |
+ : start_time(start), |
+ end_time(end), |
+ type(kGestureTypeFourFingerSwipeLift) {} |
+ Gesture(const GestureMetrics&, |
+ stime_t start, stime_t end, GestureMetricsType m_type, |
+ float d1, float d2) |
+ : start_time(start), |
+ end_time(end), |
+ type(kGestureTypeMetrics) { |
+ details.metrics.type = m_type; |
+ details.metrics.data[0] = d1; |
+ details.metrics.data[1] = d2; |
+ } |
+#endif // __cplusplus |
+ |
+ stime_t start_time, end_time; |
+ enum GestureType type; |
+ union { |
+ GestureMove move; |
+ GestureScroll scroll; |
+ GestureButtonsChange buttons; |
+ GestureFling fling; |
+ GestureSwipe swipe; |
+ GesturePinch pinch; |
+ GestureSwipeLift swipe_lift; |
+ GestureMetrics metrics; |
+ GestureFourFingerSwipe four_finger_swipe; |
+ GestureFourFingerSwipeLift four_finger_swipe_lift; |
+ } details; |
+}; |
+ |
+typedef void (*GestureReadyFunction)(void* client_data, |
+ const struct Gesture* gesture); |
+ |
+// Gestures Timer Provider Interface |
+struct GesturesTimer; |
+typedef struct GesturesTimer GesturesTimer; |
+ |
+// If this returns < 0, the timer should be freed. If it returns >= 0.0, it |
+// should be called again after that amount of delay. |
+typedef stime_t (*GesturesTimerCallback)(stime_t now, |
+ void* callback_data); |
+// Allocate and return a new timer, or NULL if error. |
+typedef GesturesTimer* (*GesturesTimerCreate)(void* data); |
+// Set a timer: |
+typedef void (*GesturesTimerSet)(void* data, |
+ GesturesTimer* timer, |
+ stime_t delay, |
+ GesturesTimerCallback callback, |
+ void* callback_data); |
+// Cancel a set timer: |
+typedef void (*GesturesTimerCancel)(void* data, GesturesTimer* timer); |
+// Free the timer. Will not be called from within a timer callback. |
+typedef void (*GesturesTimerFree)(void* data, GesturesTimer* timer); |
+ |
+typedef struct { |
+ GesturesTimerCreate create_fn; |
+ GesturesTimerSet set_fn; |
+ GesturesTimerCancel cancel_fn; |
+ GesturesTimerFree free_fn; |
+} GesturesTimerProvider; |
+ |
+// Gestures Property Provider Interface |
+struct GesturesProp; |
+typedef struct GesturesProp GesturesProp; |
+ |
+typedef unsigned char GesturesPropBool; |
+ |
+// These functions create a named property of given type. |
+// data - data used by PropProvider |
+// loc - location of a variable to be updated by PropProvider. |
+// Set to NULL to create a ReadOnly property |
+// init - initial value for the property. |
+// If the PropProvider has an alternate configuration source, it may |
+// override this initial value, in which case *loc returns the |
+// value from the configuration source. |
+typedef GesturesProp* (*GesturesPropCreateInt)(void* data, const char* name, |
+ int* loc, size_t count, |
+ const int* init); |
+ |
+typedef GesturesProp* (*GesturesPropCreateShort)(void* data, const char* name, |
+ short* loc, size_t count, |
+ const short* init); |
+ |
+typedef GesturesProp* (*GesturesPropCreateBool)(void* data, const char* name, |
+ GesturesPropBool* loc, |
+ size_t count, |
+ const GesturesPropBool* init); |
+ |
+typedef GesturesProp* (*GesturesPropCreateString)(void* data, const char* name, |
+ const char** loc, |
+ const char* const init); |
+ |
+typedef GesturesProp* (*GesturesPropCreateReal)(void* data, const char* name, |
+ double* loc, size_t count, |
+ const double* init); |
+ |
+// A function to call just before a property is to be read. |
+// |handler_data| is a local context pointer that can be used by the handler. |
+// Handler should return non-zero if it modifies the property's value. |
+typedef GesturesPropBool (*GesturesPropGetHandler)(void* handler_data); |
+ |
+// A function to call just after a property's value is updated. |
+// |handler_data| is a local context pointer that can be used by the handler. |
+typedef void (*GesturesPropSetHandler)(void* handler_data); |
+ |
+// Register handlers to be called when a GesturesProp is accessed. |
+// The get handler, if not NULL, is called immediately before the property's |
+// value is to be read. This gives the library a chance to update its value. |
+// The set handler, if not NULL, is called immediately after the property's |
+// value is updated. This can be used to create a property that is used to |
+// trigger an action, or to force an update to multiple properties atomically. |
+// Note: the handlers are called from non-signal/interrupt context |
+typedef void (*GesturesPropRegisterHandlers)(void* data, GesturesProp* prop, |
+ void* handler_data, |
+ GesturesPropGetHandler getter, |
+ GesturesPropSetHandler setter); |
+ |
+// Free a property. |
+typedef void (*GesturesPropFree)(void* data, GesturesProp* prop); |
+ |
+typedef struct GesturesPropProvider { |
+ GesturesPropCreateInt create_int_fn; |
+ GesturesPropCreateShort create_short_fn; |
+ GesturesPropCreateBool create_bool_fn; |
+ GesturesPropCreateString create_string_fn; |
+ GesturesPropCreateReal create_real_fn; |
+ GesturesPropRegisterHandlers register_handlers_fn; |
+ GesturesPropFree free_fn; |
+} GesturesPropProvider; |
+ |
+#ifdef __cplusplus |
+// C++ API: |
+ |
+namespace gestures { |
+ |
+class Interpreter; |
+class PropRegistry; |
+class LoggingFilterInterpreter; |
+class Tracer; |
+class GestureInterpreterConsumer; |
+class MetricsProperties; |
+ |
+#if __cplusplus >= 201103L |
+ |
+struct GestureInterpreter { |
+ public: |
+ explicit GestureInterpreter(int version); |
+ ~GestureInterpreter(); |
+ void PushHardwareState(HardwareState* hwstate); |
+ |
+ void SetHardwareProperties(const HardwareProperties& hwprops); |
+ |
+ void TimerCallback(stime_t now, stime_t* timeout); |
+ |
+ void set_callback(GestureReadyFunction callback, |
+ void* client_data); |
+ void SetTimerProvider(GesturesTimerProvider* tp, void* data); |
+ void SetPropProvider(GesturesPropProvider* pp, void* data); |
+ |
+ // Initialize GestureInterpreter based on device configuration. This must be |
+ // called after GesturesPropProvider is set and before it accepts any inputs. |
+ void Initialize( |
+ GestureInterpreterDeviceClass type=GESTURES_DEVCLASS_TOUCHPAD); |
+ |
+ Interpreter* interpreter() const { return interpreter_.get(); } |
+ PropRegistry* prop_reg() const { return prop_reg_.get(); } |
+ |
+ std::string EncodeActivityLog(); |
+ private: |
+ void InitializeTouchpad(void); |
+ void InitializeTouchpad2(void); |
+ void InitializeMouse(void); |
+ void InitializeMultitouchMouse(void); |
+ |
+ GestureReadyFunction callback_; |
+ void* callback_data_; |
+ |
+ std::unique_ptr<PropRegistry> prop_reg_; |
+ std::unique_ptr<Tracer> tracer_; |
+ std::unique_ptr<Interpreter> interpreter_; |
+ std::unique_ptr<MetricsProperties> mprops_; |
+ |
+ GesturesTimerProvider* timer_provider_; |
+ void* timer_provider_data_; |
+ GesturesTimer* interpret_timer_; |
+ |
+ LoggingFilterInterpreter* loggingFilter_; |
+ std::unique_ptr<GestureInterpreterConsumer> consumer_; |
+ HardwareProperties hwprops_; |
+ |
+ // Disallow copy & assign; |
+ GestureInterpreter(const GestureInterpreter&); |
+ void operator=(const GestureInterpreter&); |
+}; |
+ |
+#else // __cplusplus >= 201103L |
+ |
+// Must be opaque under C++03 builds, since it has unique_ptr members. |
+struct GestureInterpreter; |
+ |
+#endif // __cplusplus >= 201103L |
+ |
+ |
+} // namespace gestures |
+ |
+typedef gestures::GestureInterpreter GestureInterpreter; |
+#else |
+struct GestureInterpreter; |
+typedef struct GestureInterpreter GestureInterpreter; |
+#endif // __cplusplus |
+ |
+#define GESTURES_VERSION 1 |
+GestureInterpreter* NewGestureInterpreterImpl(int); |
+#define NewGestureInterpreter() NewGestureInterpreterImpl(GESTURES_VERSION) |
+ |
+void DeleteGestureInterpreter(GestureInterpreter*); |
+ |
+void GestureInterpreterSetHardwareProperties(GestureInterpreter*, |
+ const struct HardwareProperties*); |
+ |
+void GestureInterpreterPushHardwareState(GestureInterpreter*, |
+ struct HardwareState*); |
+ |
+void GestureInterpreterSetCallback(GestureInterpreter*, |
+ GestureReadyFunction, |
+ void*); |
+ |
+// Gestures will hold a reference to passed provider. Pass NULL to tell |
+// Gestures to stop holding a reference. |
+void GestureInterpreterSetTimerProvider(GestureInterpreter*, |
+ GesturesTimerProvider*, |
+ void*); |
+ |
+void GestureInterpreterSetPropProvider(GestureInterpreter*, |
+ GesturesPropProvider*, |
+ void*); |
+ |
+void GestureInterpreterInitialize(GestureInterpreter*, |
+ enum GestureInterpreterDeviceClass); |
+ |
+#ifdef __cplusplus |
+} |
+#endif |
+ |
+#endif // GESTURES_GESTURES_H__ |