I want to simulate many key press events. I found a solution by using XTestFakeKeyEvent, but when I simulate more than 210 times my program raises a "Maximum number of clients reached" segmentation fault. I don't known how to solve this problem.
My code 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 ++;
}
}
Output :
$ 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
Does one please help, Thank you.
You're doing an XOpenDisplay per iteration without a matching XCloseDisplay. Consider opening the display once, in main(), outside the loop, and closing it before you exit.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With