rendered paste body/* Test case to reproduce hanging inside geis_event_dispatch() * * Compiling: gcc test.c -lutouch-geis -lXtst -lX11 -o test * Testing: (1) ./test * (2) 3 fingers drag * Result: 100% cpu usage without returning from geis_event_dispatch() * * Author: gustavold@gmail.com */#include <geis/geis.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/select.h>#include <X11/Xlib.h>static Window getRootWindow(){ Display *display = NULL; Window window = 0; display = XOpenDisplay(NULL); if (!display) { fprintf(stderr, "error opening X11 display.\n"); exit(1); } window = DefaultRootWindow(display); XCloseDisplay(display); return window;}static voidgesture_finish(void *cookie, GeisGestureType gesture_type, GeisGestureId gesture_id, GeisSize attr_count, GeisGestureAttr *attrs){ system("xdotool getactivewindow key x"); }GeisGestureFuncs gesture_funcs = { NULL, NULL, NULL, NULL, gesture_finish};int main(int argc, char* argv[]){ GeisStatus status = GEIS_UNKNOWN_ERROR; GeisXcbWinInfo xcb_win_info = { .display_name = NULL, .screenp = NULL, .window_id = getRootWindow() }; GeisWinInfo win_info = { GEIS_XCB_FULL_WINDOW, &xcb_win_info }; GeisInstance instance; status = geis_init(&win_info, &instance); if (status != GEIS_STATUS_SUCCESS) { fprintf(stderr, "error in geis_init\n"); return 1; } int fd = -1; status = geis_configuration_get_value(instance, GEIS_CONFIG_UNIX_FD, &fd); if (status != GEIS_STATUS_SUCCESS) { fprintf(stderr, "error retrieving GEIS fd\n"); return 1; } const char *gestures[] = {GEIS_GESTURE_TYPE_DRAG3, NULL}; status = geis_subscribe(instance, GEIS_ALL_INPUT_DEVICES, gestures, &gesture_funcs, NULL); if (status != GEIS_STATUS_SUCCESS) { fprintf(stderr, "error subscribing to gestures\n"); return 1; } while(1) { fd_set read_fds; FD_ZERO(&read_fds); FD_SET(fd, &read_fds); int sstat = select(fd+1, &read_fds, NULL, NULL, NULL); if (sstat < 0) { fprintf(stderr, "error %d in select(): %s\n", errno, strerror(errno)); break; } if (FD_ISSET(fd, &read_fds)) { geis_event_dispatch(instance); } } geis_finish(instance); return 0;}