/***************************************************************************** * * grail - Gesture Recognition And Instantiation Library * * Copyright (C) 2010-2011 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * ****************************************************************************/ #ifndef _GRAIL_H #define _GRAIL_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define GRAIL_VERSION 0x00011000 #define DIM_GRAIL_TYPE 64 #define DIM_GRAIL_TYPE_BYTES ((DIM_GRAIL_TYPE + 7) >> 3) #define DIM_GRAIL_PROP 32 #define DIM_GRAIL_PROP_BYTES ((DIM_GRAIL_PROP + 7) >> 3) #define GRAIL_STATUS_BEGIN 0 #define GRAIL_STATUS_UPDATE 1 #define GRAIL_STATUS_END 2 #define GRAIL_EXPECT_CENTER_X 0x0001 #define GRAIL_EXPECT_CENTER_Y 0x0002 #define GRAIL_EXPECT_DRAG_X 0x0004 #define GRAIL_EXPECT_DRAG_Y 0x0008 #define GRAIL_EXPECT_SCALE 0x0010 #define GRAIL_EXPECT_ANGLE 0x0020 #define GRAIL_EXPECT_MASK 0x003f typedef float grail_prop_t; /* gesture properties */ typedef utouch_frame_time_t grail_time_t; /* time in milliseconds */ typedef struct grail *grail_handle; /* the grail instance handle */ /** * struct grail_get_version - get grail library version * * Report the version of the grail library, which can be different from * the value of GRAIL_VERSION in this header file. * * This function allows for fallback options from major interface * extensions within the same ABI version. For the normal cases of ABI * agnostic or backwards incompatible changes, this function is not * needed. */ unsigned int GRAIL_PUBLIC grail_get_version(void); /** * struct grail_coord - coordinate in bounding box units * @x: the horizontal position (bbox units) * @y: the vertical position (bbox units) */ struct grail_coord { float x, y; }; grail_handle GRAIL_PUBLIC grail_new_raw(utouch_frame_handle fh, unsigned int num_frames, void *select, unsigned int version, unsigned int control_size, unsigned int frame_size, unsigned int slot_size); /** * grail_new - allocate and initialize a new grail instance * @fh: utouch frame handle to use * @num_frames: number of frames in cyclic buffer * @select: client selection callback * * Initialize the internal grail structures. * * Returns zero in case of failure. */ #define grail_new(fh, num_frames, select) \ grail_new_raw(fh, num_frames, select, \ GRAIL_VERSION, \ sizeof(struct grail_control), \ sizeof(struct grail_frame), \ sizeof(struct grail_element)) /** * grail_delete - destroy and delete grail instance * @ge: grail instance in use * * Deallocates all internal memory structures. */ void GRAIL_PUBLIC grail_delete(grail_handle ge); /** * grail_get_control - get mutable control structure * @ge: the grail device in use * * Return the control struct of the grail instance. * * The control pointer is ABI agnostic, owned by the grail instance, and * has grail scope. */ struct grail_control GRAIL_PUBLIC *grail_get_control(grail_handle ge); /** * grail_pump_frame - insert touch frames into grail * @ge: the grail device in use * @frame: the touch frame to insert * * Insert a new touch frame into the grail engine. If the frame induces a * new gesture frame, a pointer to the frame is returned. * * The grail frame pointer is ABI agnostic, owned by the grail instance, and * has grail scope. */ const struct grail_frame GRAIL_PUBLIC * grail_pump_frame(grail_handle ge, const struct utouch_frame *frame); /** * struct grail_client_id - Gesture client information * @client: Client id * @root: Root window * @event: Window to route events to * @child: Window the event occured in * * This struct is treated opaquely, and only has meaning to the gesture * client. Details are subject to change. */ struct grail_client_id { int client; int root, event, child; }; /** * struct grail_client_info - Gesture request information * @id: Gesture client id * @mask: Gestures the client is listening to */ struct grail_client_info { struct grail_client_id id; grail_mask_t mask[DIM_GRAIL_TYPE_BYTES]; }; /** * struct grail_control - control parameters of grail * @glue_ms: minimum time to hold activation (ms) * @bar_center_x: horizontal distance to activate (surface width fraction) * @bar_center_y: vertical distance to activate (surface height fraction) * @bar_drag_x: horizontal distance to activate (surface width fraction) * @bar_drag_y: vertical distance to activate (surface height fraction) * @bar_scale: minimum scaling to activate (fraction) * @bar_angle: minimum angle to activate (radians) * @drop_x_ms: horizontal expect timeout (ms) * @drop_y_ms: vertical expect timeout (ms) * @drop_scale_ms: scaling expect timeout (ms) * @drop_angle_ms: rotation expect timeout (ms) * @pivot_unbound: when true, the pivot is not bound to the contact area * * The parameters are used to tune the behavior of the gesture recognition. * * The moveness is a number between zero and one denoting the * character of the current transform. Zero means pure rotate and * scale, one means pure drag. * * Later versions of this struct may grow in size, but will remain * binary compatible with older versions. */ struct grail_control { float glue_ms; float bar_center_x; float bar_center_y; float bar_drag_x; float bar_drag_y; float bar_scale; float bar_angle; float drop_x_ms; float drop_y_ms; float drop_scale_ms; float drop_angle_ms; int pivot_unbound; }; /** * struct grail_frame - frame of ongoing elementary transformations * @prev: pointer to the previous gesture frame * @touch: pointer to the touch frame triggering this gesture frame * @num_ongoing: number of elements in the ongoing array * @ongoing: array of ongoing transformation elements * @slots: array of all transformation slots * * A gesture frame consists of one or several touch frames glued * together into a stable transition, combined with information on * ongoing elementary gestural transformations. The array of ongoing * elements contains all elements with a nonzero expect mask. * * Later versions of this struct may grow in size, but will remain * binary compatible with older versions. */ struct grail_frame { const struct grail_frame *prev; const struct utouch_frame *touch; unsigned int num_ongoing; struct grail_element **ongoing; struct grail_element **slots; }; /** * struct grail_element - elementary gesture transformation * @prev: respective element of previous frame * @slot: the transformation slot occupied by this element * @id: unique identifier of the ongoing transformation * @num_touches: number of contacts of this element * @touches: array of contacts of this element * @start_time: start time of this element * @start_center: center position at start of transform (surface units) * @expect_mask: bitmask of expected gestures (grail main types) * @active_mask: bitmask of activated gestures (grail main types) * @center: gesture center position (surface units) * @velocity: current center velocity (surface units per second) * @radius: gesture radius from center (surface units) * @transform: the transformation matrix of the gesture * @pivot: current center of rotate and scale (surface units) * @drag: accumulated transformation displacement (surface units) * @scale: accumulated scale (dimensionless) * @angle: accumulated rotation angle (radians) * * The grail element describes the ongoing gestural transformation of * a particular set of contacts. The expect mask describes which * gestural transformations may become active during the course of * events, and the active mask describes which have passed their * respective activation threshold. The set of expected gestures can * change over time, for instance by exclusion or timeout. * * Applications handling rotation, either by transformation matrix or * angle, should use the drag displacement. For other applications, * the center displacement may be used instead, as to not lose * movement accuracy. * * Later versions of this struct may grow in size, but will remain * binary compatible with older versions. */ struct grail_element { const struct grail_element *prev; int slot; int id; int num_touches; const struct utouch_contact **touches; grail_time_t start_time; struct grail_coord start_center; unsigned int expect_mask; unsigned int active_mask; struct grail_coord center; struct grail_coord velocity; float radius2; float transform[6]; float moveness; struct grail_coord pivot; struct grail_coord drag; float scale2; float angle; }; /** * grail_element_transform - transform coordinates using element * @slot: the transformation element to use * @q: the grail coordinate to fill * @x: the grail coordinate to transform * * Performs the 3x3 transform *q = T *p, where T is the element * transform. */ static inline void grail_element_transform(const struct grail_element *slot, struct grail_coord *q, const struct grail_coord *p) { const float *T = slot->transform; q->x = T[0] * p->x + T[1] * p->y + T[2]; q->y = T[3] * p->x + T[4] * p->y + T[5]; } /** * struct grail_event - Gesture event * @type: The gesture type * @id: Unique identifier foof the gesture instance * @status: Gesture status (begin, update, end) * @ntouch: Number of current touches * @nprop: Number of properties in the gesture * @pos: Focus point of the gesture (bbox coordinates) * @touch: Array of individual touch information * @client_id: The gesture client to route the gesture to * @time: Time of event (milliseconds) * @prop: Array of properties of the event * * Gesture events are passed to the client via the gesture() callback. */ struct grail_event { int type; int id; int status; int ntouch; int nprop; struct grail_coord pos; struct grail_client_id client_id; grail_time_t time; grail_prop_t prop[DIM_GRAIL_PROP]; }; /** * struct grail - Main grail device * @get_clients: Called at the onset of new gestures to retrieve the list * of listening clients. * @event: Callback for kernel events passing through grail. * @gesture: Main gesture callback. * @impl: Grail implementation details. * @gin: Gesture instatiation details. * @gru: Gesture recognition details. * @priv: Generic pointer to user-defined content. * * The grail device pulls events from the underlying device, detects * gestures, and passes them on to the client via the gesture() * callback. Events that are not gesture or for other reasons held back are * passed on via the event() callback. The user provides information about * windows and listening clients via the get_clients callback, which is * called during gesture instantiation. * */ struct grail { int (*get_clients)(struct grail *ge, struct grail_client_info *client, int max_clients, const struct grail_coord *coords, int num_coords, const grail_mask_t *types, int type_bytes); void (*event)(struct grail *ge, const struct input_event *ev); void (*gesture)(struct grail *ge, const struct grail_event *ev); struct grail_impl *impl; struct gesture_inserter *gin; struct gesture_recognizer *gru; void *priv; }; /** * grail_open - open a grail device * @ge: the grail device to open * @fd: file descriptor of the kernel device * * Initialize the internal grail structures and configure it by reading the * protocol capabilities through the file descriptor. * * The callbacks, parameters and priv pointer should be set prior to this * call. * * Returns zero on success, negative error number otherwise. */ int GRAIL_PUBLIC grail_open(struct grail *ge, int fd); /** * grail_idle - check state of kernel device * @ge: the grail device in use * @fd: file descriptor of the kernel device * @ms: number of milliseconds to wait for activity * * Returns true if the device is idle, i.e., there are no fetched * events in the pipe and there is nothing to fetch from the device. */ int GRAIL_PUBLIC grail_idle(struct grail *ge, int fd, int ms); /** * grail_pull - pull and process available events from the kernel device * @ge: the grail device in use * @fd: file descriptor of the kernel device * * Pull all available events and process them. The grail callbacks are * invoked during this call. * * The underlying file descriptor must have O_NONBLOCK set, or this method * will not return until the file is closed. * * On success, returns the number of events read. Otherwise, * a standard negative error number is returned. */ int GRAIL_PUBLIC grail_pull(struct grail *ge, int fd); /** * grail_close - close the grail device * @ge: the grail device to close * @fd: file descriptor of the kernel device * * Deallocates all memory associated with grail, and clears the grail * structure. */ void GRAIL_PUBLIC grail_close(struct grail *ge, int fd); /** * grail_set_bbox - set the grail unit bounding box * @ge: the grail device in use * @min: the minimum (lower-left) corner of the bounding box * @max: the maximum (upper-right) corner of the bounding box * * Sets the box within which the device coordinates should be presented. */ void GRAIL_PUBLIC grail_set_bbox(struct grail *ge, const struct grail_coord *min, const struct grail_coord *max); /** * grail_get_units - get device coordinate ranges * @ge: the grail device in use * @min: minimum x and y coordinates * @max: maximum x and y coordinates * * The grail event attributes pos, touch_major, touch_minor, * width_major, and width_minor are all given in device coordinate * units, unless specified otherwise using the grail_set_bbox() * function. This function reports the device coordinate ranges. * */ void GRAIL_PUBLIC grail_get_units(const struct grail *ge, struct grail_coord *min, struct grail_coord *max); /** * grail_get_contact_frame - get current contact frame * @ge: the grail device in use * * Return the contact frame current being processed. If called from * within a gesture callback, it is guaranteed to return the frame * corresponding to the gesture. * * The returned pointer can be NULL if no input has yet been extracted * through the grail instance. * * The frame pointer is ABI agnostic, owned by the grail instance, and * has grail scope. */ const struct utouch_frame GRAIL_PUBLIC * grail_get_contact_frame(const struct grail *ge); #ifndef GRAIL_NO_LEGACY_API struct grail_contact { int id; int tool_type; struct grail_coord pos; float touch_major; float touch_minor; float width_major; float width_minor; float angle; float pressure; }; void GRAIL_PUBLIC grail_filter_abs_events(struct grail *ge, int usage); int GRAIL_PUBLIC grail_get_contacts(const struct grail *ge, struct grail_contact *touch, int max_touch); #endif #ifdef __cplusplus } #endif #endif