/***************************************************************************** * * grail - Gesture Recognition And Instantiation Library * * Copyright (C) 2010 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 . * * Authors: * Henrik Rydberg * ****************************************************************************/ #ifndef _GRAIL_TOUCH_H #define _GRAIL_TOUCH_H #include #define DIM_TOUCHES 32 typedef int touch_prop_t; typedef unsigned touch_prop_mask_t; typedef __u64 touch_time_t; enum touch_prop_list { TP_POS_X, TP_POS_Y, TP_TOUCH_MAJOR, TP_TOUCH_MINOR, TP_WIDTH_MAJOR, TP_WIDTH_MINOR, TP_ORIENTATION, TP_PRESSURE, DIM_TOUCH_PROP }; struct touch { int active; int slot; int next; touch_prop_t prop[DIM_TOUCH_PROP]; }; struct touch_frame { int ntouch; int slot; int ncreate, nmodify, ndestroy; touch_time_t time; struct touch touch[DIM_TOUCHES]; }; struct touch_dev { void (*event)(struct touch_dev *dev, const struct input_event *ev); void (*create)(struct touch_dev *dev, int slot, const touch_prop_mask_t *mask, const touch_prop_t *prop); void (*modify)(struct touch_dev *dev, int slot, const touch_prop_mask_t *mask, const touch_prop_t *prop); void (*destroy)(struct touch_dev *dev, int slot); void (*sync)(struct touch_dev *dev, const struct input_event *syn); struct touch_dev_impl *impl; void *priv; }; struct touch_engine { void (*event)(struct touch_engine *engine, const struct input_event *ev); void (*sync)(struct touch_engine *engine, const struct input_event *syn); struct touch_frame frame; void *priv; }; static inline int has_prop(const touch_prop_mask_t *mask, int code) { return (mask[code >> 5] >> (code & 31)) & 1; } static inline int next_slot(const struct touch_frame *frame, int slot) { return frame->touch[slot].next; } int touch_dev_open(struct touch_dev *dev, int fd); int touch_dev_idle(struct touch_dev *dev, int fd, int ms); int touch_dev_pull(struct touch_dev *dev, int fd); void touch_dev_close(struct touch_dev *dev, int fd); void touch_engine_init(struct touch_engine *engine, void (*event)(struct touch_engine *engine, const struct input_event *ev), void (*sync)(struct touch_engine *engine, const struct input_event *ev), void *priv); void touch_engine_attach(struct touch_engine *engine, struct touch_dev *dev); void touch_engine_detach(struct touch_engine *engine, struct touch_dev *dev); #endif