diff options
| author | jsorg71 <jay.sorg@gmail.com> | 2014-10-29 19:03:02 -0700 |
|---|---|---|
| committer | jsorg71 <jay.sorg@gmail.com> | 2014-10-29 19:03:02 -0700 |
| commit | 9a70d20f2059657d2a56e83489688bd8b2f11b8d (patch) | |
| tree | ff4add969e66876f2183f92463046d6d6809ac01 /genkeymap/genkeymap.c | |
| parent | 851c762ee722a84d15348b2512b3b578282e590b (diff) | |
| parent | 0409da6af94d4d63c79373a9b0c8c4219d79b7ff (diff) | |
| download | xrdp-proprietary-9a70d20f2059657d2a56e83489688bd8b2f11b8d.tar.gz xrdp-proprietary-9a70d20f2059657d2a56e83489688bd8b2f11b8d.zip | |
Merge pull request #180 from mgorny/evdev-genkeys
Generate correct xfree86 keymaps when evdev is used
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); |
