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.