Convertir un caractère ASCII en keycode x11

J’ai un petit programme qui prend des entrées sous la forme de caractères ascii. Je dois pouvoir les convertir en codes de clé à utiliser avec les fonctions x11. Existe-t-il une fonction xlib pour faire ceci ou une autre bibliothèque? Ou bien un grand boîtier de commutateur fonctionnera-t-il mieux?

Vous pouvez utiliser XSsortingngToKeysym pour convertir en KeySym , suivi de XKeysymToKeycode pour la conversion en KeyCode .

 Display *display = ...; KeySym sym_a = XSsortingngToKeysym("A"); KeyCode code_a = XKeysymToKeycode(display, sym_a); 

Cette question a une vieille réponse fausse (de @oldrinb), qui, curieusement, n’a jamais été contestée. Comme indiqué dans le commentaire, vous ne pouvez pas utiliser XSsortingngToKeysym pour mapper des caractères sur KeySyms de manière générale. Cela fonctionnera pour les lettres et les chiffres, mais c’est à peu près tout, car le nom KeySym se trouve mapper directement pour ces caractères ASCII. Pour d’autres caractères ASCII tels que la ponctuation ou l’espace, cela ne fonctionnera pas.

Mais vous pouvez faire mieux que ça. Si vous regardez vous trouvez que pour ASCII 0x20-0xFF, les caractères sont directement XKeySyms sur XKeySyms . Donc, je dirais qu’il est plus simple d’utiliser cette gamme de caractères directement en tant que KeySyms et de mapper simplement les 32 caractères restants sur leurs KeyCodes correspondants. Donc, je dirais que le code devrait être plus correctement:

 Display *display = ...; if ((int)c >= 0x20) { XKeysymToKeycode(display, (KeySym)c); } else { ... // Exercise left to the reader :-) } 

La clause ‘else’ nécessitera plusieurs KeyCodes puisque, par exemple, ASCII 1 (Control-A) correspond à XK_A avec le XK_CONTROL_R (ou XK_CONTROL_L ). Il faudrait donc par exemple XK_CONTROL_L : XK_CONTROL_L DOWN, XK_A DOWN, XK_A UP, XK_CONTROL_L UP.

Voici un programme jouet qui illustre cela en faisant écho au premier argument via des événements de clavier simulés:

 #include  #include  #include  #include  #include  #include  main(int argc, char **argv) { char *pc; xcb_connection_t *xconn; KeyCode code_a; Display *dpy = XOpenDisplay(NULL); xconn = XGetXCBConnection(dpy); for (pc = argv[1]; *pc != '\0'; ++pc) { if (*pc >= (char)0x20) { code_a = XKeysymToKeycode(dpy, (KeySym)*pc); xcb_test_fake_input(xconn, XCB_KEY_PRESS, code_a, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0); xcb_test_fake_input(xconn, XCB_KEY_RELEASE, code_a, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0); xcb_flush(xconn); } else { fprintf(stderr, "Eeek - out-of-range character 0x%x\n", (unsigned int)*pc); } } XCloseDisplay(dpy); } 

Vous devez le lier avec: -lX11 -lxcb -lxcb-xtest -lX11-xcb

Clause de non-responsabilité: aucune clé KeySyms n’a été endommagée lors de la rédaction de ce code.