diff options
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); |
