From e0eb1015bf30fd0913db571b000ba6a83ea22660 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Thu, 29 Jul 2010 15:54:31 +0200 Subject: Split the code into recognizer and inserter Refactor code to make more room for gesture recognition. Also simplify public headers. Signed-off-by: Henrik Rydberg --- test/Makefile.am | 5 +- test/evlink.c | 96 ---------------------------------- test/grail.c | 154 +++++++++++++------------------------------------------ 3 files changed, 36 insertions(+), 219 deletions(-) delete mode 100644 test/evlink.c (limited to 'test') diff --git a/test/Makefile.am b/test/Makefile.am index a24f615..c8404f8 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,4 +1,4 @@ -noinst_PROGRAMS = touch grail evlink +noinst_PROGRAMS = touch grail INCLUDES=-I$(top_srcdir)/include/ @@ -7,6 +7,3 @@ touch_LDFLAGS = -L$(top_builddir)/src/.libs/ -lgrail -lmtdev grail_SOURCES = grail.c grail_LDFLAGS = -L$(top_builddir)/src/.libs/ -lgrail -lmtdev - -evlink_SOURCES = evlink.c -evlink_LDFLAGS = -L$(top_builddir)/src/.libs/ -lgrail -lmtdev diff --git a/test/evlink.c b/test/evlink.c deleted file mode 100644 index bef5e22..0000000 --- a/test/evlink.c +++ /dev/null @@ -1,96 +0,0 @@ -/***************************************************************************** - * - * 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 - * - ****************************************************************************/ - -#include -#include -#include -#include -#include - -static int tp_get_clients(int x, int y, int screen, - grail_clientid_t *clients, int nclients) -{ - return 0; -} - -static void tp_event(struct grail *ge, const struct input_event *ev) -{ - fprintf(stderr, "event %d %d %d\n", ev->type, ev->code, ev->value); -} - -static void tp_gesture(struct grail *ge, const struct grail_event *ev) -{ - fprintf(stderr, "gesture %d %d\n", ev->type, ev->id); -} - -static void loop_device(struct grail *ge, int fd) -{ - while (!grail_idle(ge, fd, 5000)) - grail_pull(ge, fd); -} - -#if 0 -void grail_add_client(struct grail *ge, grail_clientid_t id, - const int *types, const int *priority, int ntypes); -void grail_remove_client(struct grail *ge, grail_clientid_t id); - -#endif - - -int main(int argc, char *argv[]) -{ - struct grail ge; - int fd; - - if (argc < 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); - return -1; - } - - memset(&ge, 0, sizeof(ge)); - ge.get_clients = tp_get_clients; - ge.event = tp_event; - ge.gesture = tp_gesture; - - fd = open(argv[1], O_RDONLY | O_NONBLOCK); - if (fd < 0) { - fprintf(stderr, "error: could not open device\n"); - return -1; - } - if (ioctl(fd, EVIOCGRAB, 1)) { - fprintf(stderr, "error: could not grab the device\n"); - return -1; - } - - if (grail_open(&ge, fd)) { - fprintf(stderr, "error: could not open touch device\n"); - return -1; - } - loop_device(&ge, fd); - grail_close(&ge, fd); - - ioctl(fd, EVIOCGRAB, 0); - close(fd); - return 0; -} diff --git a/test/grail.c b/test/grail.c index e22ffd8..85c5bd4 100644 --- a/test/grail.c +++ b/test/grail.c @@ -22,146 +22,60 @@ * ****************************************************************************/ -#include +#include #include #include #include #include -struct gesture_handler { - struct touch_frame frame; - struct gesture_client client; - struct gesture_dev dev; - touch_time_t last_scroll; -}; - -static void gh_gesture(struct gesture_client *client, - const struct gesture_event *ev) -{ - int i; - fprintf(stderr, "gesture %d %lld\n", - ev->type, ev->time); - switch (ev->type) { - case GE_MOVE: - fprintf(stderr, " %d\n", ev->prop[0]); - fprintf(stderr, " %d\n", ev->prop[1]); - break; - case GE_VSCROLL: - fprintf(stderr, " %d\n", ev->prop[0]); - break; - } -} - -static void gh_init(struct gesture_handler *gh) +static int tp_get_clients(struct grail *ge, + struct grail_client_info *clients, int max_clients, + const struct grail_coord *coords, int num_coords, + const grail_mask_t *types) { - memset(gh, 0, sizeof(*gh)); - gedev_init(&gh->dev, 0); - client_init(&gh->client, gh); - gh->client.gesture = gh_gesture; - gh->client.priority[GE_MOVE] = 1; - gh->client.priority[GE_VSCROLL] = 2; - gedev_attach_client(&gh->dev, &gh->client); + memset(&clients[0], 0, sizeof(clients[0])); + clients[0].id.client = 345; + clients[0].id.root = 1; + clients[0].id.event = 2; + clients[0].id.child = 3; + clients[0].mask[0] = 3; + return 1; } -static void gh_handle(struct gesture_handler *gh, - const struct touch_frame *frame, - touch_time_t time) +static void tp_event(struct grail *ge, const struct input_event *ev) { - struct gesture_flag flag; - struct gesture_event ev; - if (frame->ntouch == 1 || frame->ntouch == 2) { - flag.type = GE_MOVE; - flag.time = time; - flag.state = GS_BEGIN; - gedev_flag(&gh->dev, &flag); - - ev.type = GE_MOVE; - ev.time = time; - ev.prop[0] = - frame->touch[0].prop[TP_POS_X] - - gh->frame.touch[0].prop[TP_POS_X]; - ev.prop[1] = - frame->touch[0].prop[TP_POS_Y] - - gh->frame.touch[0].prop[TP_POS_Y]; - if (ev.prop[0] || ev.prop[1]) - gedev_event(&gh->dev, &ev); - - flag.time = time + 1; - flag.state = GS_END; - gedev_flag(&gh->dev, &flag); - } - if (frame->ntouch == 2) { - flag.type = GE_VSCROLL; - flag.time = time; - flag.state = GS_BEGIN; - gedev_flag(&gh->dev, &flag); - - ev.type = GE_VSCROLL; - ev.time = time; - ev.prop[0] = - frame->touch[0].prop[TP_POS_Y] - - gh->frame.touch[0].prop[TP_POS_Y]; - - if (ev.prop[0]) - gedev_event(&gh->dev, &ev); - - if (time > gh->last_scroll + 100) { - flag.time = time + 1; - flag.state = GS_END; - gedev_flag(&gh->dev, &flag); - gh->last_scroll = time; - } - } else { - flag.type = GE_VSCROLL; - flag.time = time; - flag.state = GS_CANCEL; - gedev_flag(&gh->dev, &flag); - } - gedev_sync(&gh->dev); - gh->frame = *frame; + fprintf(stderr, "event %d %d %d\n", ev->type, ev->code, ev->value); } -static void gh_destroy(struct gesture_handler *gh) +static void tp_gesture(struct grail *ge, const struct grail_event *ev) { - gedev_detach_client(&gh->dev, &gh->client); - client_destroy(&gh->client); - gedev_destroy(&gh->dev); + fprintf(stderr, "gesture %d %d %d %d: %d %d\n", + ev->type, ev->id, + ev->client_id.client, ev->client_id.event, + ev->prop[0], ev->prop[1]); } -static void tp_event(struct touch_engine *engine, - const struct input_event *ev) +static void loop_device(struct grail *ge, int fd) { -} - -static void tp_sync(struct touch_engine *engine, - const struct input_event *syn) -{ - struct gesture_handler *gh = engine->priv; - struct touch_frame *frame = &engine->frame; - gh_handle(gh, frame, frame->time); -} - -static void loop_device(struct touch_dev *dev, int fd) -{ - struct gesture_handler gh; - struct touch_engine engine; - gh_init(&gh); - touch_engine_init(&engine, tp_event, tp_sync, &gh); - touch_engine_attach(&engine, dev); - while (!touch_dev_idle(dev, fd, 5000)) - touch_dev_pull(dev, fd); - touch_engine_detach(&engine, dev); - gh_destroy(&gh); + while (!grail_idle(ge, fd, 5000)) + grail_pull(ge, fd); } int main(int argc, char *argv[]) { - struct touch_dev dev; + struct grail ge; int fd; + if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return -1; } + + memset(&ge, 0, sizeof(ge)); + ge.get_clients = tp_get_clients; + ge.event = tp_event; + ge.gesture = tp_gesture; + fd = open(argv[1], O_RDONLY | O_NONBLOCK); if (fd < 0) { fprintf(stderr, "error: could not open device\n"); @@ -171,12 +85,14 @@ int main(int argc, char *argv[]) fprintf(stderr, "error: could not grab the device\n"); return -1; } - if (touch_dev_open(&dev, fd)) { + + if (grail_open(&ge, fd)) { fprintf(stderr, "error: could not open touch device\n"); return -1; } - loop_device(&dev, fd); - touch_dev_close(&dev, fd); + loop_device(&ge, fd); + grail_close(&ge, fd); + ioctl(fd, EVIOCGRAB, 0); close(fd); return 0; -- cgit v1.2.3