diff options
| author | Michał Górny <mgorny@gentoo.org> | 2014-10-27 12:39:05 +0100 |
|---|---|---|
| committer | Michał Górny <mgorny@gentoo.org> | 2014-10-27 12:39:05 +0100 |
| commit | 0409da6af94d4d63c79373a9b0c8c4219d79b7ff (patch) | |
| tree | 6d2f342dd777f063580002ead53f9a073fd00e72 /genkeymap/genkeymap.c | |
| parent | 2f919932cb876ac95d2e58290f95580e4e524a13 (diff) | |
| download | xrdp-proprietary-0409da6af94d4d63c79373a9b0c8c4219d79b7ff.tar.gz xrdp-proprietary-0409da6af94d4d63c79373a9b0c8c4219d79b7ff.zip | |
Generate correct xfree86 keymaps when evdev is used
Use a mapping table to map xfree86 keycodes to evdev keycodes and obtain
consistent keysyms for keymaps. This way, it is now possible to generate
correct keymaps when evdev driver is used on host.
Diffstat (limited to 'genkeymap/genkeymap.c')
| -rw-r--r-- | genkeymap/genkeymap.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/genkeymap/genkeymap.c b/genkeymap/genkeymap.c index 91ec9e89..2c640ce8 100644 --- a/genkeymap/genkeymap.c +++ b/genkeymap/genkeymap.c @@ -37,8 +37,11 @@ #include <string.h> #include <X11/Xlib.h> #include <X11/Xutil.h> +#include <X11/XKBlib.h> #include <locale.h> +extern int xfree86_to_evdev[137-8]; + int main(int argc, char **argv) { const char *programname; @@ -57,6 +60,9 @@ int main(int argc, char **argv) FILE *outf; XKeyPressedEvent e; wchar_t wtext[256]; + XkbDescPtr kbdesc; + char *symatom; + int is_evdev; setlocale(LC_CTYPE, ""); programname = argv[0]; @@ -78,6 +84,30 @@ int main(int argc, char **argv) return 1; } + /* check whether evdev is used */ + kbdesc = XkbAllocKeyboard(); + if (!kbdesc) + { + fprintf(stderr, "%s: unable to allocate keyboard desc\n", + programname); + XCloseDisplay(dpy); + return 1; + } + + if (XkbGetNames(dpy, XkbKeycodesNameMask, kbdesc) != Success) + { + fprintf(stderr, "%s: unable to obtain keycode name for keyboard\n", + programname); + XkbFreeKeyboard(kbdesc, 0, True); + XCloseDisplay(dpy); + return 1; + } + + symatom = XGetAtomName(dpy, kbdesc->names->keycodes); + is_evdev = !strncmp(symatom, "evdev", 5); + XFree(symatom); + XkbFreeKeyboard(kbdesc, 0, True); + outf = fopen(outfname, "w"); if (outf == NULL) @@ -101,7 +131,10 @@ int main(int argc, char **argv) for (i = 8; i <= 137; i++) /* Keycodes */ { - e.keycode = i; + if (is_evdev) + e.keycode = xfree86_to_evdev[i-8]; + else + e.keycode = i; nbytes = XLookupString(&e, text, 255, &ks, NULL); text[nbytes] = 0; char_count = mbstowcs(wtext, text, 255); |
