/***************************************************************************** * * 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 #define DIM_CLIENT 32 struct gedev_impl { int nclient; struct gesture_client *client[DIM_CLIENT]; }; int gedev_init(struct gesture_dev *dev, void *priv) { struct gedev_impl *x; x = calloc(1, sizeof(*x)); if (!x) return -ENOMEM; dev->impl = x; dev->priv = priv; return 0; } int gedev_attach_client(struct gesture_dev *dev, struct gesture_client *client) { struct gedev_impl *x = dev->impl; if (x->nclient >= DIM_CLIENT) return -ENOMEM; x->client[x->nclient++] = client; return 0; } void gedev_flag(struct gesture_dev *dev, const struct gesture_flag *flag) { struct gedev_impl *x = dev->impl; int i; for (i = 0; i < x->nclient; i++) client_flag(x->client[i], flag); } void gedev_event(struct gesture_dev *dev, const struct gesture_event *ev) { struct gedev_impl *x = dev->impl; int i; for (i = 0; i < x->nclient; i++) client_event(x->client[i], ev); } void gedev_sync(struct gesture_dev *dev) { struct gedev_impl *x = dev->impl; int i; for (i = 0; i < x->nclient; i++) client_sync(x->client[i]); } void gedev_detach_client(struct gesture_dev *dev, struct gesture_client *client) { struct gedev_impl *x = dev->impl; int i, j; for (i = 0; i < x->nclient; i++) if (x->client[i] == client) break; if (i >= x->nclient) return; x->nclient--; for (j = i; j < x->nclient; j++) x->client[j] = x->client[j + 1]; for (j = x->nclient; j < DIM_CLIENT; j++) x->client[j] = 0; } void gedev_destroy(struct gesture_dev *dev) { free(dev->impl); memset(dev, 0, sizeof(*dev)); }