2
* geistest.c Demo code for programming against the geis interface.
4
* Copyright 2010 Canonical Ltd.
6
* This library is free software; you can redistribute it and/or modify it under
7
* the terms of the GNU General Public License as published by the Free Software
8
* Foundation; either version 3 of the License, or (at your option) any later
11
* This library is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16
* You should have received a copy of the GNU General Public License along with
17
* this program; if not, write to the Free Software Foundation, Inc., 51
18
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#include "geis_config.h"
23
#include <geis/geis.h>
27
#include <sys/select.h>
33
const char* s_gestures[] = {
34
GEIS_GESTURE_TYPE_DRAG2, GEIS_GESTURE_TYPE_DRAG3,
35
GEIS_GESTURE_TYPE_PINCH2, GEIS_GESTURE_TYPE_PINCH3,
36
GEIS_GESTURE_TYPE_ROTATE2, GEIS_GESTURE_TYPE_ROTATE3,
37
GEIS_GESTURE_TYPE_TAP2, GEIS_GESTURE_TYPE_TAP3, GEIS_GESTURE_TYPE_TAP4,
38
GEIS_GESTURE_TYPE_TOUCH3, GEIS_GESTURE_TYPE_TOUCH4,
39
GEIS_GESTURE_TYPE_FLICK2, GEIS_GESTURE_TYPE_FLICK3, GEIS_GESTURE_TYPE_FLICK4,
43
GeisSize g_device_count = 0;
44
GeisInputDeviceId *g_devices = GEIS_ALL_INPUT_DEVICES;
48
print_attr(GeisGestureAttr *attr)
50
fprintf(stdout, "\tattr \"%s\" = ", attr->name);
53
case GEIS_ATTR_TYPE_BOOLEAN:
54
fprintf(stdout, "%s\n", attr->boolean_val ? "true" : "false");
56
case GEIS_ATTR_TYPE_FLOAT:
57
fprintf(stdout, "%f\n", attr->float_val);
59
case GEIS_ATTR_TYPE_INTEGER:
60
fprintf(stdout, "%d\n", attr->integer_val);
62
case GEIS_ATTR_TYPE_STRING:
63
fprintf(stdout, "\"%s\"\n", attr->string_val);
66
fprintf(stdout, "<unknown>\n");
73
input_device_added(void *cookie GEIS_UNUSED,
74
GeisInputDeviceId device_id,
78
fprintf(stdout, "Device %d added\n", device_id);
79
for (a = attrs; a->name; ++a)
87
input_device_changed(void *cookie GEIS_UNUSED,
88
GeisInputDeviceId device_id GEIS_UNUSED,
89
void *attrs GEIS_UNUSED)
95
input_device_removed(void *cookie GEIS_UNUSED,
96
GeisInputDeviceId device_id,
100
fprintf(stdout, "Device %d removed\n", device_id);
101
for (a = attrs; a->name; ++a)
109
gesture_added(void *cookie GEIS_UNUSED,
110
GeisGestureType gesture_type,
111
GeisGestureId gesture_id GEIS_UNUSED,
113
GeisGestureAttr *attrs)
116
fprintf(stdout, "Gesture type %d added\n", gesture_type);
117
for (i = 0; i < attr_count; ++i)
118
print_attr(&attrs[i]);
122
gesture_removed(void *cookie GEIS_UNUSED,
123
GeisGestureType gesture_type,
124
GeisGestureId gesture_id GEIS_UNUSED,
126
GeisGestureAttr *attrs)
129
fprintf(stdout, "Gesture type %d removed\n", gesture_type);
130
for (i = 0; i < attr_count; ++i)
131
print_attr(&attrs[i]);
135
gesture_start(void *cookie GEIS_UNUSED,
136
GeisGestureType gesture_type,
137
GeisGestureId gesture_id,
139
GeisGestureAttr *attrs)
142
fprintf(stdout, "Gesture id %d type %d started\n", gesture_id, gesture_type);
143
for (i = 0; i < attr_count; ++i)
144
print_attr(&attrs[i]);
148
gesture_update(void *cookie GEIS_UNUSED,
149
GeisGestureType gesture_type,
150
GeisGestureId gesture_id,
152
GeisGestureAttr *attrs)
155
fprintf(stdout, "Gesture id %d type %d updated\n", gesture_id, gesture_type);
156
for (i = 0; i < attr_count; ++i)
157
print_attr(&attrs[i]);
161
gesture_finish(void *cookie GEIS_UNUSED,
162
GeisGestureType gesture_type,
163
GeisGestureId gesture_id,
165
GeisGestureAttr *attrs)
168
fprintf(stdout, "Gesture id %d type %d finished\n", gesture_id, gesture_type);
169
for (i = 0; i < attr_count; ++i)
170
print_attr(&attrs[i]);
174
GeisInputFuncs input_funcs = {
176
input_device_changed,
180
GeisGestureFuncs gesture_funcs = {
190
_add_device_id(GeisInteger id)
192
GeisInputDeviceId *d = realloc(g_devices, g_device_count + 2);
195
fprintf(stderr, "error allocating device list.\n");
199
g_devices[g_device_count] = id;
200
g_devices[g_device_count+1] = 0;
206
parse_opts(int argc, char* argv[], uint32_t *window_id)
210
while ((opt = getopt(argc, argv, "w:d:")) != -1)
215
*window_id = strtol(optarg, NULL, 0);
220
GeisInteger id = strtol(optarg, NULL, 0);
223
fprintf(stderr, "invalid device id '%s'\n'", optarg);
240
subscribe_window(uint32_t window_id)
242
GeisStatus status = GEIS_UNKNOWN_ERROR;
243
GeisXcbWinInfo xcb_win_info = {
244
.display_name = NULL,
246
.window_id = window_id
248
GeisWinInfo win_info = {
249
GEIS_XCB_FULL_WINDOW,
252
GeisInstance instance;
254
status = geis_init(&win_info, &instance);
255
if (status != GEIS_STATUS_SUCCESS)
257
fprintf(stderr, "error in geis_init\n");
261
status = geis_input_devices(instance, &input_funcs, NULL);
262
if (status != GEIS_STATUS_SUCCESS)
264
fprintf(stderr, "error subscribing to input devices\n");
268
status = geis_subscribe(instance,
273
if (status != GEIS_STATUS_SUCCESS)
275
fprintf(stderr, "error subscribing to gestures\n");
284
subscribe_all_windows(GeisInstance **instance_table)
286
int instance_table_size = 0;
288
xcb_connection_t *xcb = xcb_connect(NULL, NULL);
290
fprintf(stderr, "error connecting to X server\n");
294
const xcb_setup_t *setup = xcb_get_setup(xcb);
297
fprintf(stderr, "error getting xcb setup\n");
301
xcb_screen_iterator_t screen = xcb_setup_roots_iterator(setup);
304
++instance_table_size;
305
xcb_screen_next(&screen);
308
*instance_table = calloc(instance_table_size, sizeof(GeisInstance));
310
screen = xcb_setup_roots_iterator(setup);
311
for (int i = 0; screen.rem; ++i, xcb_screen_next(&screen))
313
GeisInstance instance = subscribe_window(screen.data->root);
316
fprintf(stderr, "error subscribing window 0x%08x\n",
317
(unsigned)screen.data->root);
320
*instance_table[i] = instance;
327
main(int argc, char* argv[])
330
uint32_t window_id = 0;
332
GeisStatus status = GEIS_UNKNOWN_ERROR;
333
GeisInstance *instance_table = NULL;
334
size_t instance_table_size = 0;
336
if (!parse_opts(argc, argv, &window_id))
338
fprintf(stderr, "usage: %s windowid\n", argv[0]);
344
instance_table_size = 1;
345
instance_table = calloc(instance_table_size, sizeof(GeisInstance));
346
instance_table[0] = subscribe_window(window_id);
347
if (!instance_table[0])
349
fprintf(stderr, "can not continue, exiting....\n");
355
subscribe_all_windows(&instance_table);
358
status = geis_configuration_supported(instance_table[0], GEIS_CONFIG_UNIX_FD);
359
if (status != GEIS_STATUS_SUCCESS)
361
fprintf(stderr, "GEIS does not support Unix fd\n");
365
status = geis_configuration_get_value(instance_table[0], GEIS_CONFIG_UNIX_FD, &fd);
366
if (status != GEIS_STATUS_SUCCESS)
368
fprintf(stderr, "error retrieving GEIS fd\n");
379
FD_SET(0, &read_fds);
380
for (i = 0; i < instance_table_size; ++i)
382
status = geis_configuration_get_value(instance_table[i],
383
GEIS_CONFIG_UNIX_FD, &fd);
384
max_fd = (fd > max_fd ? fd : max_fd);
385
FD_SET(fd, &read_fds);
387
int sstat = select(max_fd + 1, &read_fds, NULL, NULL, NULL);
390
fprintf(stderr, "error %d in select(): %s\n", errno, strerror(errno));
394
for (i = 0; i < instance_table_size; ++i)
396
status = geis_configuration_get_value(instance_table[i],
397
GEIS_CONFIG_UNIX_FD, &fd);
398
if (FD_ISSET(fd, &read_fds))
400
geis_event_dispatch(instance_table[i]);
404
if (FD_ISSET(0, &read_fds))
413
for (i = 0; i < instance_table_size; ++i)
415
geis_finish(instance_table[i]);
420
if (instance_table_size > 0)
422
free(instance_table);