All pastes #1957052 Raw Edit

Anonymous

public c v1 · immutable
#1957052 ·published 2010-10-07 18:31 UTC
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;}