From 20a962b64073bc16591928e74bdff5f80f5accad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Fri, 24 Oct 2014 12:02:00 +0200 Subject: [PATCH] keymap: support combining shift & capslock with altgr Add support for combining shift & caps lock keys with altgr so that capital national characters can be written. There was some support for shift+altgr in xrdp-keygen but it was never actually used. --- genkeymap/genkeymap.c | 8 ++++---- genkeymap/readme.txt | 5 +++-- xrdp/lang.c | 17 ++++++++++++++++- xrdp/xrdp_types.h | 3 +++ 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/genkeymap/genkeymap.c b/genkeymap/genkeymap.c index 91ec9e89..16de6e10 100644 --- a/genkeymap/genkeymap.c +++ b/genkeymap/genkeymap.c @@ -45,8 +45,8 @@ int main(int argc, char **argv) char text[256]; char *displayname = NULL; char *outfname; - char *sections[6] = {"noshift", "shift", "altgr", "shiftaltgr", "capslock", "shiftcapslock"}; - int states[6] = {0, 1, 0x80, 0x81, 2, 3}; + char *sections[8] = {"noshift", "shift", "altgr", "shiftaltgr", "capslock", "capslockaltgr", "shiftcapslock", "shiftcapslockaltgr"}; + int states[8] = {0, 1, 0x80, 0x81, 2, 0x82, 3, 0x83}; int i; int idx; int char_count; @@ -94,7 +94,7 @@ int main(int argc, char **argv) e.display = dpy; e.same_screen = True; - for (idx = 0; idx < 6; idx++) /* Sections and states */ + for (idx = 0; idx < 8; idx++) /* Sections and states */ { fprintf(outf, "[%s]\n", sections[idx]); e.state = states[idx]; @@ -115,7 +115,7 @@ int main(int argc, char **argv) fprintf(outf, "Key%d=%d:%d\n", i, (int) ks, unicode); } - if (idx != 4) + if (idx != 7) { fprintf(outf, "\n"); } diff --git a/genkeymap/readme.txt b/genkeymap/readme.txt index d9df684d..b2b3b890 100644 --- a/genkeymap/readme.txt +++ b/genkeymap/readme.txt @@ -7,9 +7,10 @@ km-xxxx.ini where the xxxx is replaced by the hex number of the layout of interest. -The files have 6 sections; +The files have 8 sections; -[noshift], [shift], [altgr], [shiftaltgr], [capslock], [shiftcapslock] +[noshift], [shift], [altgr], [shiftaltgr], [capslock], [capslockaltgr], +[shiftcapslock], [shiftcapslockaltgr] In each section there are multiple lines for each key. diff --git a/xrdp/lang.c b/xrdp/lang.c index 5ffff0eb..a2942599 100644 --- a/xrdp/lang.c +++ b/xrdp/lang.c @@ -90,14 +90,26 @@ get_key_info_from_scan_code(int device_flags, int scan_code, int *keys, rv = &(keymap->keys_noshift[index]); } } + else if (shift && caps_lock && altgr) + { + rv = &(keymap->keys_shiftcapslockaltgr[index]); + } else if (shift && caps_lock) { rv = &(keymap->keys_shiftcapslock[index]); } - else if (shift) + else if (shift && altgr) + { + rv = &(keymap->keys_shiftaltgr[index]); + } + else if (shift) { rv = &(keymap->keys_shift[index]); } + else if (caps_lock && altgr) + { + rv = &(keymap->keys_capslockaltgr[index]); + } else if (caps_lock) { rv = &(keymap->keys_capslock[index]); @@ -242,8 +254,11 @@ get_keymaps(int keylayout, struct xrdp_keymap *keymap) km_read_section(fd, "noshift", keymap->keys_noshift); km_read_section(fd, "shift", keymap->keys_shift); km_read_section(fd, "altgr", keymap->keys_altgr); + km_read_section(fd, "shiftaltgr", keymap->keys_shiftaltgr); km_read_section(fd, "capslock", keymap->keys_capslock); + km_read_section(fd, "capslockaltgr", keymap->keys_capslockaltgr); km_read_section(fd, "shiftcapslock", keymap->keys_shiftcapslock); + km_read_section(fd, "shiftcapslockaltgr", keymap->keys_shiftcapslockaltgr); if (g_memcmp(lkeymap, keymap, sizeof(struct xrdp_keymap)) != 0) { diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index 89a7ce93..29aaac84 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -318,8 +318,11 @@ struct xrdp_keymap struct xrdp_key_info keys_noshift[256]; struct xrdp_key_info keys_shift[256]; struct xrdp_key_info keys_altgr[256]; + struct xrdp_key_info keys_shiftaltgr[256]; struct xrdp_key_info keys_capslock[256]; + struct xrdp_key_info keys_capslockaltgr[256]; struct xrdp_key_info keys_shiftcapslock[256]; + struct xrdp_key_info keys_shiftcapslockaltgr[256]; }; /* the window manager */