summaryrefslogtreecommitdiff
path: root/src/gesture-dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gesture-dev.c')
-rw-r--r--src/gesture-dev.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/gesture-dev.c b/src/gesture-dev.c
new file mode 100644
index 0000000..b49b8ea
--- /dev/null
+++ b/src/gesture-dev.c
@@ -0,0 +1,106 @@
1/*****************************************************************************
2 *
3 * grail - Gesture Recognition And Instantiation Library
4 *
5 * Copyright (C) 2010 Canonical Ltd.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 * Authors:
21 * Henrik Rydberg <rydberg@bitmath.org>
22 *
23 ****************************************************************************/
24
25#include <gesture-dev.h>
26#include <gesture-buffer.h>
27#include <malloc.h>
28#include <string.h>
29#include <errno.h>
30
31#define DIM_CLIENT 32
32
33struct gedev_impl {
34 int nclient;
35 struct gesture_client *client[DIM_CLIENT];
36};
37
38int gedev_init(struct gesture_dev *dev, void *priv)
39{
40 struct gedev_impl *x;
41 x = calloc(1, sizeof(*x));
42 if (!x)
43 return -ENOMEM;
44 dev->impl = x;
45 dev->priv = priv;
46 return 0;
47}
48
49int gedev_attach_client(struct gesture_dev *dev,
50 struct gesture_client *client)
51{
52 struct gedev_impl *x = dev->impl;
53 if (x->nclient >= DIM_CLIENT)
54 return -ENOMEM;
55 x->client[x->nclient++] = client;
56 return 0;
57}
58
59void gedev_flag(struct gesture_dev *dev,
60 const struct gesture_flag *flag)
61{
62 struct gedev_impl *x = dev->impl;
63 int i;
64 for (i = 0; i < x->nclient; i++)
65 client_flag(x->client[i], flag);
66}
67
68void gedev_event(struct gesture_dev *dev,
69 const struct gesture_event *ev)
70{
71 struct gedev_impl *x = dev->impl;
72 int i;
73 for (i = 0; i < x->nclient; i++)
74 client_event(x->client[i], ev);
75}
76
77void gedev_sync(struct gesture_dev *dev)
78{
79 struct gedev_impl *x = dev->impl;
80 int i;
81 for (i = 0; i < x->nclient; i++)
82 client_sync(x->client[i]);
83}
84
85void gedev_detach_client(struct gesture_dev *dev,
86 struct gesture_client *client)
87{
88 struct gedev_impl *x = dev->impl;
89 int i, j;
90 for (i = 0; i < x->nclient; i++)
91 if (x->client[i] == client)
92 break;
93 if (i >= x->nclient)
94 return;
95 x->nclient--;
96 for (j = i; j < x->nclient; j++)
97 x->client[j] = x->client[j + 1];
98 for (j = x->nclient; j < DIM_CLIENT; j++)
99 x->client[j] = 0;
100}
101
102void gedev_destroy(struct gesture_dev *dev)
103{
104 free(dev->impl);
105 memset(dev, 0, sizeof(*dev));
106}