I want to simulate many key press events. I found a solution using XTestFakeKeyEvent , but when I simulate more than 210 times, my program raises the "Maximum number of clients that have reached" segmentation. I do not know how to solve this problem.
My code is here:
#include <X11/Xlib.h> #include <X11/keysym.h> #include <X11/extensions/XTest.h> #include <stdio.h> #define PRESS_UP 0 #define PRESS_DOWN 1 #define PRESS_LEFT 2 #define PRESS_RIGHT 3 #define PRESS_ENTER 4 #define PRESS_ESC 5 #define PRESS_HOME 6 Display *display; unsigned int keycode; int press(int key){ display = XOpenDisplay(NULL); if(key == PRESS_UP) keycode = XKeysymToKeycode(display, XK_Up); else if(key == PRESS_DOWN) keycode = XKeysymToKeycode(display, XK_Down); else if(key == PRESS_LEFT) keycode = XKeysymToKeycode(display, XK_Left); else if(key == PRESS_RIGHT) keycode = XKeysymToKeycode(display, XK_Right); else if(key == PRESS_ENTER) keycode = XKeysymToKeycode(display, XK_Return); else if(key == PRESS_ESC) keycode = XKeysymToKeycode(display, XK_Escape); else if(key == PRESS_HOME) keycode = XKeysymToKeycode(display, XK_Home); XTestFakeKeyEvent(display, keycode, True, 0); XTestFakeKeyEvent(display, keycode, False, 0); XFlush(display); return 0; } int main(int argc, char *argv[]){ int count = 0; while (count < 500){ press(PRESS_UP); printf("count =%d\n" ,count); count ++; } }
Exit:
$ gcc -lXtst -lX11 Util_KeyPressSimulator.c $ ./a.out count =0 ^[[Acount =1 ^[[Acount =2 ... ^[[Acount =208 ^[[Acount =209 ^[[Acount =210 ^[[AMaximum number of clients reachedSegmentation fault
Please help, thanks.
wearetherock
source share