diff options
Diffstat (limited to 'include/grail.h')
| -rw-r--r-- | include/grail.h | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/include/grail.h b/include/grail.h index b208556..d9f3937 100644 --- a/include/grail.h +++ b/include/grail.h | |||
| @@ -44,8 +44,17 @@ extern "C" { | |||
| 44 | #define GRAIL_STATUS_UPDATE 1 | 44 | #define GRAIL_STATUS_UPDATE 1 |
| 45 | #define GRAIL_STATUS_END 2 | 45 | #define GRAIL_STATUS_END 2 |
| 46 | 46 | ||
| 47 | #define GRAIL_EXPECT_CENTER_X 0x0001 | ||
| 48 | #define GRAIL_EXPECT_CENTER_Y 0x0002 | ||
| 49 | #define GRAIL_EXPECT_DRAG_X 0x0004 | ||
| 50 | #define GRAIL_EXPECT_DRAG_Y 0x0008 | ||
| 51 | #define GRAIL_EXPECT_SCALE 0x0010 | ||
| 52 | #define GRAIL_EXPECT_ANGLE 0x0020 | ||
| 53 | #define GRAIL_EXPECT_MASK 0x003f | ||
| 54 | |||
| 47 | typedef float grail_prop_t; /* gesture properties */ | 55 | typedef float grail_prop_t; /* gesture properties */ |
| 48 | typedef utouch_frame_time_t grail_time_t; /* time in milliseconds */ | 56 | typedef utouch_frame_time_t grail_time_t; /* time in milliseconds */ |
| 57 | typedef struct grail *grail_handle; /* the grail instance handle */ | ||
| 49 | 58 | ||
| 50 | /** | 59 | /** |
| 51 | * struct grail_get_version - get grail library version | 60 | * struct grail_get_version - get grail library version |
| @@ -69,6 +78,64 @@ struct grail_coord { | |||
| 69 | float x, y; | 78 | float x, y; |
| 70 | }; | 79 | }; |
| 71 | 80 | ||
| 81 | grail_handle GRAIL_PUBLIC grail_new_raw(utouch_frame_handle fh, | ||
| 82 | unsigned int num_frames, | ||
| 83 | void *select, | ||
| 84 | unsigned int version, | ||
| 85 | unsigned int control_size, | ||
| 86 | unsigned int frame_size, | ||
| 87 | unsigned int slot_size); | ||
| 88 | |||
| 89 | /** | ||
| 90 | * grail_new - allocate and initialize a new grail instance | ||
| 91 | * @fh: utouch frame handle to use | ||
| 92 | * @num_frames: number of frames in cyclic buffer | ||
| 93 | * @select: client selection callback | ||
| 94 | * | ||
| 95 | * Initialize the internal grail structures. | ||
| 96 | * | ||
| 97 | * Returns zero in case of failure. | ||
| 98 | */ | ||
| 99 | #define grail_new(fh, num_frames, select) \ | ||
| 100 | grail_new_raw(fh, num_frames, select, \ | ||
| 101 | GRAIL_VERSION, \ | ||
| 102 | sizeof(struct grail_control), \ | ||
| 103 | sizeof(struct grail_frame), \ | ||
| 104 | sizeof(struct grail_element)) | ||
| 105 | |||
| 106 | /** | ||
| 107 | * grail_delete - destroy and delete grail instance | ||
| 108 | * @ge: grail instance in use | ||
| 109 | * | ||
| 110 | * Deallocates all internal memory structures. | ||
| 111 | */ | ||
| 112 | void GRAIL_PUBLIC grail_delete(grail_handle ge); | ||
| 113 | |||
| 114 | /** | ||
| 115 | * grail_get_control - get mutable control structure | ||
| 116 | * @ge: the grail device in use | ||
| 117 | * | ||
| 118 | * Return the control struct of the grail instance. | ||
| 119 | * | ||
| 120 | * The control pointer is ABI agnostic, owned by the grail instance, and | ||
| 121 | * has grail scope. | ||
| 122 | */ | ||
| 123 | struct grail_control GRAIL_PUBLIC *grail_get_control(grail_handle ge); | ||
| 124 | |||
| 125 | /** | ||
| 126 | * grail_pump_frame - insert touch frames into grail | ||
| 127 | * @ge: the grail device in use | ||
| 128 | * @frame: the touch frame to insert | ||
| 129 | * | ||
| 130 | * Insert a new touch frame into the grail engine. If the frame induces a | ||
| 131 | * new gesture frame, a pointer to the frame is returned. | ||
| 132 | * | ||
| 133 | * The grail frame pointer is ABI agnostic, owned by the grail instance, and | ||
| 134 | * has grail scope. | ||
| 135 | */ | ||
| 136 | const struct grail_frame GRAIL_PUBLIC * | ||
| 137 | grail_pump_frame(grail_handle ge, const struct utouch_frame *frame); | ||
| 138 | |||
| 72 | /** | 139 | /** |
| 73 | * struct grail_client_id - Gesture client information | 140 | * struct grail_client_id - Gesture client information |
| 74 | * @client: Client id | 141 | * @client: Client id |
| @@ -95,6 +162,143 @@ struct grail_client_info { | |||
| 95 | }; | 162 | }; |
| 96 | 163 | ||
| 97 | /** | 164 | /** |
| 165 | * struct grail_control - control parameters of grail | ||
| 166 | * @glue_ms: minimum time to hold activation (ms) | ||
| 167 | * @bar_center_x: horizontal distance to activate (surface width fraction) | ||
| 168 | * @bar_center_y: vertical distance to activate (surface height fraction) | ||
| 169 | * @bar_drag_x: horizontal distance to activate (surface width fraction) | ||
| 170 | * @bar_drag_y: vertical distance to activate (surface height fraction) | ||
| 171 | * @bar_scale: minimum scaling to activate (fraction) | ||
| 172 | * @bar_angle: minimum angle to activate (radians) | ||
| 173 | * @drop_x_ms: horizontal expect timeout (ms) | ||
| 174 | * @drop_y_ms: vertical expect timeout (ms) | ||
| 175 | * @drop_scale_ms: scaling expect timeout (ms) | ||
| 176 | * @drop_angle_ms: rotation expect timeout (ms) | ||
| 177 | * @pivot_unbound: when true, the pivot is not bound to the contact area | ||
| 178 | * | ||
| 179 | * The parameters are used to tune the behavior of the gesture recognition. | ||
| 180 | * | ||
| 181 | * The moveness is a number between zero and one denoting the | ||
| 182 | * character of the current transform. Zero means pure rotate and | ||
| 183 | * scale, one means pure drag. | ||
| 184 | * | ||
| 185 | * Later versions of this struct may grow in size, but will remain | ||
| 186 | * binary compatible with older versions. | ||
| 187 | */ | ||
| 188 | struct grail_control { | ||
| 189 | float glue_ms; | ||
| 190 | float bar_center_x; | ||
| 191 | float bar_center_y; | ||
| 192 | float bar_drag_x; | ||
| 193 | float bar_drag_y; | ||
| 194 | float bar_scale; | ||
| 195 | float bar_angle; | ||
| 196 | float drop_x_ms; | ||
| 197 | float drop_y_ms; | ||
| 198 | float drop_scale_ms; | ||
| 199 | float drop_angle_ms; | ||
| 200 | int pivot_unbound; | ||
| 201 | }; | ||
| 202 | |||
| 203 | /** | ||
| 204 | * struct grail_frame - frame of ongoing elementary transformations | ||
| 205 | * @prev: pointer to the previous gesture frame | ||
| 206 | * @touch: pointer to the touch frame triggering this gesture frame | ||
| 207 | * @num_ongoing: number of elements in the ongoing array | ||
| 208 | * @ongoing: array of ongoing transformation elements | ||
| 209 | * @slots: array of all transformation slots | ||
| 210 | * | ||
| 211 | * A gesture frame consists of one or several touch frames glued | ||
| 212 | * together into a stable transition, combined with information on | ||
| 213 | * ongoing elementary gestural transformations. The array of ongoing | ||
| 214 | * elements contains all elements with a nonzero expect mask. | ||
| 215 | * | ||
| 216 | * Later versions of this struct may grow in size, but will remain | ||
| 217 | * binary compatible with older versions. | ||
| 218 | */ | ||
| 219 | struct grail_frame { | ||
| 220 | const struct grail_frame *prev; | ||
| 221 | const struct utouch_frame *touch; | ||
| 222 | unsigned int num_ongoing; | ||
| 223 | struct grail_element **ongoing; | ||
| 224 | struct grail_element **slots; | ||
| 225 | }; | ||
| 226 | |||
| 227 | /** | ||
| 228 | * struct grail_element - elementary gesture transformation | ||
| 229 | * @prev: respective element of previous frame | ||
| 230 | * @slot: the transformation slot occupied by this element | ||
| 231 | * @id: unique identifier of the ongoing transformation | ||
| 232 | * @num_touches: number of contacts of this element | ||
| 233 | * @touches: array of contacts of this element | ||
| 234 | * @start_time: start time of this element | ||
| 235 | * @start_center: center position at start of transform (surface units) | ||
| 236 | * @expect_mask: bitmask of expected gestures (grail main types) | ||
| 237 | * @active_mask: bitmask of activated gestures (grail main types) | ||
| 238 | * @center: gesture center position (surface units) | ||
| 239 | * @velocity: current center velocity (surface units per second) | ||
| 240 | * @radius: gesture radius from center (surface units) | ||
| 241 | * @transform: the transformation matrix of the gesture | ||
| 242 | * @pivot: current center of rotate and scale (surface units) | ||
| 243 | * @drag: accumulated transformation displacement (surface units) | ||
| 244 | * @scale: accumulated scale (dimensionless) | ||
| 245 | * @angle: accumulated rotation angle (radians) | ||
| 246 | * | ||
| 247 | * The grail element describes the ongoing gestural transformation of | ||
| 248 | * a particular set of contacts. The expect mask describes which | ||
| 249 | * gestural transformations may become active during the course of | ||
| 250 | * events, and the active mask describes which have passed their | ||
| 251 | * respective activation threshold. The set of expected gestures can | ||
| 252 | * change over time, for instance by exclusion or timeout. | ||
| 253 | * | ||
| 254 | * Applications handling rotation, either by transformation matrix or | ||
| 255 | * angle, should use the drag displacement. For other applications, | ||
| 256 | * the center displacement may be used instead, as to not lose | ||
| 257 | * movement accuracy. | ||
| 258 | * | ||
| 259 | * Later versions of this struct may grow in size, but will remain | ||
| 260 | * binary compatible with older versions. | ||
| 261 | */ | ||
| 262 | struct grail_element { | ||
| 263 | const struct grail_element *prev; | ||
| 264 | int slot; | ||
| 265 | int id; | ||
| 266 | int num_touches; | ||
| 267 | const struct utouch_contact **touches; | ||
| 268 | grail_time_t start_time; | ||
| 269 | struct grail_coord start_center; | ||
| 270 | unsigned int expect_mask; | ||
| 271 | unsigned int active_mask; | ||
| 272 | struct grail_coord center; | ||
| 273 | struct grail_coord velocity; | ||
| 274 | float radius2; | ||
| 275 | float transform[6]; | ||
| 276 | float moveness; | ||
| 277 | struct grail_coord pivot; | ||
| 278 | struct grail_coord drag; | ||
| 279 | float scale2; | ||
| 280 | float angle; | ||
| 281 | }; | ||
| 282 | |||
| 283 | /** | ||
| 284 | * grail_element_transform - transform coordinates using element | ||
| 285 | * @slot: the transformation element to use | ||
| 286 | * @q: the grail coordinate to fill | ||
| 287 | * @x: the grail coordinate to transform | ||
| 288 | * | ||
| 289 | * Performs the 3x3 transform *q = T *p, where T is the element | ||
| 290 | * transform. | ||
| 291 | */ | ||
| 292 | static inline void grail_element_transform(const struct grail_element *slot, | ||
| 293 | struct grail_coord *q, | ||
| 294 | const struct grail_coord *p) | ||
| 295 | { | ||
| 296 | const float *T = slot->transform; | ||
| 297 | q->x = T[0] * p->x + T[1] * p->y + T[2]; | ||
| 298 | q->y = T[3] * p->x + T[4] * p->y + T[5]; | ||
| 299 | } | ||
| 300 | |||
| 301 | /** | ||
| 98 | * struct grail_event - Gesture event | 302 | * struct grail_event - Gesture event |
| 99 | * @type: The gesture type | 303 | * @type: The gesture type |
| 100 | * @id: Unique identifier foof the gesture instance | 304 | * @id: Unique identifier foof the gesture instance |
