summaryrefslogtreecommitdiffstats
path: root/genkeymap/genkeymap.c
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2014-10-27 12:39:05 +0100
committerMichał Górny <mgorny@gentoo.org>2014-10-27 12:39:05 +0100
commit0409da6af94d4d63c79373a9b0c8c4219d79b7ff (patch)
tree6d2f342dd777f063580002ead53f9a073fd00e72 /genkeymap/genkeymap.c
parent2f919932cb876ac95d2e58290f95580e4e524a13 (diff)
downloadxrdp-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.c35
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);