summaryrefslogtreecommitdiffstats
path: root/genkeymap
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
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')
-rw-r--r--genkeymap/Makefile.am2
-rw-r--r--genkeymap/evdev-map.c156
-rw-r--r--genkeymap/genkeymap.c35
3 files changed, 191 insertions, 2 deletions
diff --git a/genkeymap/Makefile.am b/genkeymap/Makefile.am
index e358c61b..aed72512 100644
--- a/genkeymap/Makefile.am
+++ b/genkeymap/Makefile.am
@@ -2,7 +2,7 @@
bin_PROGRAMS = \
xrdp-genkeymap
-xrdp_genkeymap_SOURCES = genkeymap.c
+xrdp_genkeymap_SOURCES = genkeymap.c evdev-map.c
xrdp_genkeymap_LDADD = \
-L/usr/X11R6/lib \
diff --git a/genkeymap/evdev-map.c b/genkeymap/evdev-map.c
new file mode 100644
index 00000000..4610eb69
--- /dev/null
+++ b/genkeymap/evdev-map.c
@@ -0,0 +1,156 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
+/*
+ * evdev-map.c
+ * Copyright (C) Michał Górny 2014 <mgorny@gentoo.org>
+ *
+ * You may redistribute it and/or modify it under the terms of the
+ * GNU General Public License, as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * main.cc is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with main.cc. If not, write to:
+ * The Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301, USA
+ *
+ * xfree86(base)->evdev keycode mapping
+ */
+
+int xfree86_to_evdev[137-8+1] = {
+ /* MDSW */ 203,
+ /* ESC */ 9,
+ /* AE01 */ 10,
+ /* AE02 */ 11,
+ /* AE03 */ 12,
+ /* AE04 */ 13,
+ /* AE05 */ 14,
+ /* AE06 */ 15,
+ /* AE07 */ 16,
+ /* AE08 */ 17,
+ /* AE09 */ 18,
+ /* AE10 */ 19,
+ /* AE11 */ 20,
+ /* AE12 */ 21,
+ /* BKSP */ 22,
+ /* TAB */ 23,
+ /* AD01 */ 24,
+ /* AD02 */ 25,
+ /* AD03 */ 26,
+ /* AD04 */ 27,
+ /* AD05 */ 28,
+ /* AD06 */ 29,
+ /* AD07 */ 30,
+ /* AD08 */ 31,
+ /* AD09 */ 32,
+ /* AD10 */ 33,
+ /* AD11 */ 34,
+ /* AD12 */ 35,
+ /* RTRN */ 36,
+ /* LCTL */ 37,
+ /* AC01 */ 38,
+ /* AC02 */ 39,
+ /* AC03 */ 40,
+ /* AC04 */ 41,
+ /* AC05 */ 42,
+ /* AC06 */ 43,
+ /* AC07 */ 44,
+ /* AC08 */ 45,
+ /* AC09 */ 46,
+ /* AC10 */ 47,
+ /* AC11 */ 48,
+ /* TLDE */ 49,
+ /* LFSH */ 50,
+ /* BKSL */ 51,
+ /* AB01 */ 52,
+ /* AB02 */ 53,
+ /* AB03 */ 54,
+ /* AB04 */ 55,
+ /* AB05 */ 56,
+ /* AB06 */ 57,
+ /* AB07 */ 58,
+ /* AB08 */ 59,
+ /* AB09 */ 60,
+ /* AB10 */ 61,
+ /* RTSH */ 62,
+ /* KPMU */ 63,
+ /* LALT */ 64,
+ /* SPCE */ 65,
+ /* CAPS */ 66,
+ /* FK01 */ 67,
+ /* FK02 */ 68,
+ /* FK03 */ 69,
+ /* FK04 */ 70,
+ /* FK05 */ 71,
+ /* FK06 */ 72,
+ /* FK07 */ 73,
+ /* FK08 */ 74,
+ /* FK09 */ 75,
+ /* FK10 */ 76,
+ /* NMLK */ 77,
+ /* SCLK */ 78,
+ /* KP7 */ 79,
+ /* KP8 */ 80,
+ /* KP9 */ 81,
+ /* KPSU */ 82,
+ /* KP4 */ 83,
+ /* KP5 */ 84,
+ /* KP6 */ 85,
+ /* KPAD */ 86,
+ /* KP1 */ 87,
+ /* KP2 */ 88,
+ /* KP3 */ 89,
+ /* KP0 */ 90,
+ /* KPDL */ 91,
+ /* SYRQ */ 107,
+ /* II5D */ 0,
+ /* LSGT */ 94,
+ /* FK11 */ 95,
+ /* FK12 */ 96,
+ /* HOME */ 110,
+ /* UP */ 111,
+ /* PGUP */ 112,
+ /* LEFT */ 113,
+ /* II65 */ 0,
+ /* RGHT */ 114,
+ /* END */ 115,
+ /* DOWN */ 116,
+ /* PGDN */ 117,
+ /* INS */ 118,
+ /* DELE */ 119,
+ /* KPEN */ 104,
+ /* RCTL */ 105,
+ /* PAUS */ 127,
+ /* PRSC */ 107,
+ /* KPDV */ 106,
+ /* RALT */ 108,
+ /* BRK */ 419,
+ /* LWIN */ 133,
+ /* RWIN */ 134,
+ /* MENU */ 0,
+ /* FK13 */ 191,
+ /* FK14 */ 192,
+ /* FK15 */ 193,
+ /* FK16 */ 194,
+ /* FK17 */ 195,
+ /* KPDC */ 0,
+ /* LVL3 */ 92,
+ /* ALT */ 204,
+ /* KPEQ */ 125,
+ /* SUPR */ 206,
+ /* HYPR */ 207,
+ /* XFER */ 0,
+ /* I02 */ 0,
+ /* NFER */ 0,
+ /* I04 */ 0,
+ /* AE13 */ 132,
+ /* I06 */ 0,
+ /* I07 */ 0,
+ 0,
+ 0
+};
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);