From d3e361d09b54eb16fe85c41f38b0c62fad24599b Mon Sep 17 00:00:00 2001 From: jsorg71 Date: Sun, 8 Oct 2006 20:48:24 +0000 Subject: [PATCH] added de, fr, and gb key layouts --- xrdp/Makefile | 2 +- xrdp/Tahoma-10.fv1 | Bin 4912 -> 11520 bytes xrdp/funcs.c | 198 -------------------- xrdp/lang.c | 393 ++++++++++++++++++++++++++++++++++++++++ xrdp/rdp-scan-codes.txt | 218 +++++++++++----------- xrdp/xrdp.h | 9 +- xrdp/xrdp_bitmap.c | 3 +- xrdp/xrdp_font.c | 4 +- xrdp/xrdp_wm.c | 3 +- 9 files changed, 515 insertions(+), 315 deletions(-) create mode 100644 xrdp/lang.c diff --git a/xrdp/Makefile b/xrdp/Makefile index 35c8cf5b..c7035c9a 100644 --- a/xrdp/Makefile +++ b/xrdp/Makefile @@ -2,7 +2,7 @@ XRDPOBJ = xrdp.o xrdp_process.o xrdp_listen.o \ xrdp_bitmap.o xrdp_wm.o xrdp_painter.o \ xrdp_region.o xrdp_cache.o xrdp_font.o funcs.o \ - xrdp_login_wnd.o xrdp_interface.o \ + xrdp_login_wnd.o xrdp_interface.o lang.o \ list.o file.o os_calls.o thread_calls.o DESTDIR = /usr/local/xrdp diff --git a/xrdp/Tahoma-10.fv1 b/xrdp/Tahoma-10.fv1 index 48e44cec5f4851abd4db6490bdba725bb2bc0c85..537bab62eb8ed11ba96fa38ad876a0e4f40b5c3c 100755 GIT binary patch delta 2265 zcmZuyO^6&t6n<6R)73rGJ>4@qJDFXx&M=$A*-1tsLD=LFdnE)79u^4_f-&)+MDXk( zhtPZTx$<7|)jMmi&*d>yVq}Ywe&%32kmY+G^%&yN)|P zk$YwGTqAN`I7jp%81I*l3Nhc&lF4Bln>3xOjNhvE`L1r&L~|FUN%3#Z{u1^$Tjci0 zFZ(l-0XWVU-)o*2PA@dm`^e24jN^h*%1Td&^WxHFo6VFrRNMGq`Q+w}x%`~ZH&jdc z81q=Q{eXnrjBlxd5wF2-lYN(>RsfC2WF~X?t8jl5k7?F;q`Eu~BeexTaS^s%C#{Ij z^1|oyajRyIk$#i(Nz%viwFQxU-m5!Mm_JLp;(&%V9U&1n*d}-8>t4&;B>!34FOr|i zz}yrE@Hww-ZwQ)Q_Ei|_l*sS7shjGIH>#a{^_U_a)%VX!pq-*ZQxc#ke$Uz6D0EK{ zV+wh@WX60y*%O*fY&RLi5nrzLBc17N8yNY!OS?*#$y?g?jL$f|1{v~k)J>g?Qa?2r zzv3)vole|w)!VhC5rJPQXi}i3y(t{<)h55}Jzgad55nm$!vSnVENpOe%6BWH4y2k* z0;VQi)Q|?)9}=feq*O{N5cD$zeUVscl~VFY9UYJJwZ$?Rt%{Y#uj(iGvaVx^PkFsi zpkIOsik$TJ%~1x7fi*)N!RSS}2T6g*@8+-(nmDyE+os0 z-Qly|LWl?Xr-POTHB*#TF132F2`>3yV6AoGYmCZz$6Wyv3` z$&Q{~exCFi(c47tkcy`}44`(2B$ILU12RKoFwt4;+fJmk_d~R)1h|lYJbN8Dq#l&06)RCDg2(_#ezc?NR!pT>|`6`ao;i#Qd=Qq@z!-dr?AvdAezA=ERrof3wo2of8-n!=XU{sM1 zWPCLk8rkUA#uRC@*Ov6J^9bueWI7p;Aa7yx~r$ zRyMv6EU*4(UAj*G6$%pRRjYZem~6u5znY7KZ&$5@Z&ydI4f`F;5#Kx2el&}OK;(Mu zP(xBBM!^umm;C&}(wwa!z<&+6vrAbmf6!Hm4@Vxd|Q>u1x(UPHdz_YyLMRmQr<8hhJ94&&*8Y-fdAuI z-ZJIS!<7V88l^R@f?Q;{pZ~Sw$woirThYLm?BAZ0a_!1c?5{QsIM~2HHM)E%>hmzE V - 53 0x35 / can be / on keypad, ext flag is keypad - 54 0x36 right shift - 55 0x37 * on keypad or print screen if ext - 56 0x38 left or right alt, ext flag is right - 57 0x39 space - 58 0x3a caps lock - 59 0x3b F1 - 60 0x3c F2 - 61 0x3d F3 - 62 0x3e F4 - 63 0x3f F5 - 64 0x40 F6 - 65 0x41 F7 - 66 0x42 F8 - 67 0x43 F9 - 68 0x44 F10 - 69 0x45 num lock - 70 0x46 scroll lock - 71 0x47 7 or home on keypad, ext flag is not keypad - 72 0x48 8 or arrow up on keypad, ext flag is not keypad - 73 0x49 9 or page up - 74 0x4a -(minus) on keypad - 75 0x4b 4 or arrow left on keypad, ext flag is not keypad - 76 0x4c middle(5 key) of keypad - 77 0x4d 6 or arrow right, can be on keypad, ext flag in not keypad - 78 0x4e + on keypad - 79 0x4f 1 or end - 80 0x50 2 or arrow down, can be on keypad, ext flag in not keypad - 81 0x51 3 or page down - 82 0x52 0 or insert on keypad, ext flag is not keypad - 83 0x53 . or delete on keypad, ext flag is not keypad - 84 0x54 - 85 0x55 - 86 0x56 - 87 0x57 F11 - 88 0x58 F12 - 89 0x59 - 90 0x5a - 91 0x5b left win key ext always on - 92 0x5c right win key ext always on - 93 0x5d menu key ext always on -*/ - -/* non shift chars */ -static char chars1[] = -{'\0', '\0', '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', '-', '=', '\0', '\0', - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', - 'o', 'p', '[', ']', '\0', '\0', 'a', 's', - 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', - '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v', - 'b', 'n', 'm', ',', '.', '/', '\0', '*', - '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', - '8', '9', '-', '4', '5', '6', '+', '1', - '2', '3', '0', '.', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; -/* shift chars */ -static char chars2[] = -{'\0', '\0', '!', '@', '#', '$', '%', '^', - '&', '*', '(', ')', '_', '+', '\0', '\0', - 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', - 'O', 'P', '{', '}', '\0', '\0', 'A', 'S', - 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', - '"', '~', '\0', '|', 'Z', 'X', 'C', 'V', - 'B', 'N', 'M', '<', '>', '?', '\0', '*', - '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', - '8', '9', '-', '4', '5', '6', '+', '1', - '2', '3', '0', '.', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; - -/*****************************************************************************/ -char APP_CC -get_char_from_scan_code(int device_flags, int scan_code, int* keys, - int caps_lock, int num_lock, int scroll_lock) -{ - char rv; - int shift; - int ext; - - shift = keys[42] || keys[54]; - ext = device_flags & 0x0100; - rv = 0; - if (scan_code >= 128) - { - scan_code = scan_code % 128; - num_lock = 0; - } - if (!num_lock) - { - switch (scan_code) - { - case 71: /* 7 */ - case 72: /* 8 */ - case 73: /* 9 */ - case 75: /* 4 */ - case 76: /* 5 */ - case 77: /* 6 */ - case 79: /* 1 */ - case 80: /* 2 */ - case 81: /* 3 */ - case 82: /* 0 */ - case 83: /* . */ - return rv; - } - } - if (ext) - { - if (scan_code == 53) - { - rv = '/'; - } - } - else - { - if (shift) - { - rv = chars2[scan_code]; - } - else - { - rv = chars1[scan_code]; - } - if (rv >= 'a' && rv <= 'z' && caps_lock) - { - rv = rv - ('a' - 'A'); - } - else if (rv >= 'A' && rv <= 'Z' && caps_lock) - { - rv = rv + ('a' - 'A'); - } - } - return rv; -} - /*****************************************************************************/ /* add a ch at index position in text, index starts at 0 */ /* if index = -1 add it to the end */ diff --git a/xrdp/lang.c b/xrdp/lang.c new file mode 100644 index 00000000..8fedb287 --- /dev/null +++ b/xrdp/lang.c @@ -0,0 +1,393 @@ +/* + This program is free software; you can 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + xrdp: A Remote Desktop Protocol server. + Copyright (C) Jay Sorg 2006 + + keylayout + +*/ + +#include "xrdp.h" + +/*****************************************************************************/ +/* us english */ + +/* non shift chars */ +char en_us_noshift[] = +{ + 0, 0, '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '-', '=', 0, 0, + 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', + 'o', 'p', '[', ']', 0, 0, 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', + '\'', '`', 0, '\\', 'z', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '/', 0, '*', + 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* shift chars */ +char en_us_shift[] = +{ + 0, 0, '!', '@', '#', '$', '%', '^', + '&', '*', '(', ')', '_', '+', 0, 0, + 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', + 'O', 'P', '{', '}', 0, 0, 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', + '"', '~', 0, '|', 'Z', 'X', 'C', 'V', + 'B', 'N', 'M', '<', '>', '?', 0, '*', + 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* right alt chars */ +char en_us_altgr[] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/*****************************************************************************/ +/* uk english */ + +/* non shift chars */ +char en_uk_noshift[] = +{ + 0, 0, '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '-', '=', 0, 0, + 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', + 'o', 'p', '[', ']', 0, 0, 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', + '\'', '`', 0, '#', 'z', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '/', 0, '*', + 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* shift chars */ +char en_uk_shift[] = +{ + 0, 0, '!', '"', 0xa3, '$', '%', '^', + '&', '*', '(', ')', '_', '+', 0, 0, + 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', + 'O', 'P', '{', '}', 0, 0, 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', + '@', 0xac, 0, '~', 'Z', 'X', 'C', 'V', + 'B', 'N', 'M', '<', '>', '?', 0, '*', + 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0xa6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* right alt chars */ +char en_uk_altgr[] = +{ + 0, 0, 0, 0, 0, 0x80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0xe9, 0, 0, 0, 0xfa, 0xed, + 0xf3, 0, 0, 0, 0, 0, 0xe1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0xa6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0xa6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/*****************************************************************************/ +/* german */ + +/* non shift chars */ +char de_noshift[] = +{ + 0, 0, '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', 0xdf, 0xb4, 0, 0, + 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', + 'o', 'p', 0xfc, '+', 0, 0, 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0xf6, + 0xe4, '^', 0, '#', 'y', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '-', 0, '*', + 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* shift chars */ +char de_shift[] = +{ + 0, 0, '!', '"', 0xa7, '$', '%', '&', + '/', '(', ')', '=', '?', '`', 0, 0, + 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', + 'O', 'P', 0xdc, '*', 0, 0, 'A', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', 0xd6, + 0xc4, 0xb0, 0, '\'', 'Y', 'X', 'C', 'V', + 'B', 'N', 'M', ';', ':', '_', 0, '*', + 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* right alt chars */ +char de_altgr[] = +{ + 0, 0, 0, 0xb2, 0xb3, 0, 0, 0, + '{', '[', ']', '}', '\\', 0, 0, 0, + '@', 0, 0x80, 0, 0, 0, 0, 0, + 0, 0, 0, '~', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0xb5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/*****************************************************************************/ +/* french */ + +/* non shift chars */ +char fr_noshift[] = +{ + 0, 0, '&', 0xe9, '"', '\'', '(', '-', + 0xe8, '_', 0xe7, 0xe0, ')', '=', 0, 0, + 'a', 'z', 'e', 'r', 't', 'y', 'u', 'i', + 'o', 'p', '^', '$', 0, 0, 'q', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', + 0xf9, 0xb2, 0, '*', 'w', 'x', 'c', 'v', + 'b', 'n', ',', ';', ':', '!', 0, '*', + 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* shift chars */ +char fr_shift[] = +{ + 0, 0, '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', 0xb0, '+', 0, 0, + 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', + 'O', 'P', 0xa8, 0xa3, 0, 0, 'Q', 'S', + 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', + '%', '~', 0, 0xb5, 'W', 'X', 'C', 'V', + 'B', 'N', '?', '.', '/', 0xa7, 0, '*', + 0, ' ', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, '7', + '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* right alt chars */ +char fr_altgr[] = +{ + 0, 0, 0, '~', '#', '{', '[', '|', + '`', '\\', '^', '@', ']', '}', 0, 0, + 0, 0, 0x80, 0, 0, 0, 0, 0, + 0, 0, 0, 0xa4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/*****************************************************************************/ +char APP_CC +get_char_from_scan_code(int device_flags, int scan_code, int* keys, + int caps_lock, int num_lock, int scroll_lock, + int keylayout) +{ + char rv; + char* keys_noshift; + char* keys_shift; + char* keys_altgr; + int shift; + int altgr; + int ext; + + if (keylayout == 0x40c) /* france */ + { + keys_noshift = fr_noshift; + keys_shift = fr_shift; + keys_altgr = fr_altgr; + } + else if (keylayout == 0x809) /* en-uk or en-gb */ + { + keys_noshift = en_uk_noshift; + keys_shift = en_uk_shift; + keys_altgr = en_uk_altgr; + } + else if (keylayout == 0x407) /* german */ + { + keys_noshift = de_noshift; + keys_shift = de_shift; + keys_altgr = de_altgr; + } + /* italy + else if (keylayout == 0x410) + { + } */ + else /* english us 0x409 */ + { + keys_noshift = en_us_noshift; + keys_shift = en_us_shift; + keys_altgr = en_us_altgr; + } + /*g_writeln("%d %d %x", scan_code, device_flags, keylayout);*/ + shift = keys[42] || keys[54]; + altgr = keys[56]; /* right alt */ + ext = device_flags & 0x0100; + rv = 0; + if (scan_code >= 128) + { + scan_code = scan_code % 128; + num_lock = 0; + } + if (!num_lock) + { + switch (scan_code) + { + case 71: /* 7 */ + case 72: /* 8 */ + case 73: /* 9 */ + case 75: /* 4 */ + case 76: /* 5 */ + case 77: /* 6 */ + case 79: /* 1 */ + case 80: /* 2 */ + case 81: /* 3 */ + case 82: /* 0 */ + case 83: /* . */ + return rv; + } + } + if (ext) + { + if (scan_code == 53) + { + rv = '/'; + } + } + else + { + if (shift) + { + rv = keys_shift[scan_code]; + } + else + { + if (altgr) + { + rv = keys_altgr[scan_code]; + } + else + { + rv = keys_noshift[scan_code]; + } + } + if (rv >= 'a' && rv <= 'z' && caps_lock) + { + rv = rv - ('a' - 'A'); + } + else if (rv >= 'A' && rv <= 'Z' && caps_lock) + { + rv = rv + ('a' - 'A'); + } + } + return rv; +} diff --git a/xrdp/rdp-scan-codes.txt b/xrdp/rdp-scan-codes.txt index ef532045..649bc5eb 100644 --- a/xrdp/rdp-scan-codes.txt +++ b/xrdp/rdp-scan-codes.txt @@ -9,116 +9,116 @@ come once at the end. Rdesktop does not do this as of yet. It always sends down and up for each repeat. -key rdp code down flags up flags -esc 01 0000 8000 -1 02 0000 8000 -2 03 0000 8000 -3 04 0000 8000 -4 05 0000 8000 -5 06 0000 8000 -6 07 0000 8000 -7 08 0000 8000 -8 09 0000 8000 -9 0a 0000 8000 -0 0b 0000 8000 -- 0c 0000 8000 -= 0d 0000 8000 -backspace 0e 0000 8000 -tab 0f 0000 8000 -q 10 0000 8000 -w 11 0000 8000 -e 12 0000 8000 -r 13 0000 8000 -t 14 0000 8000 -y 15 0000 8000 -u 16 0000 8000 -i 17 0000 8000 -o 18 0000 8000 -p 19 0000 8000 -[ 1a 0000 8000 -] 1b 0000 8000 -enter 1c 0000 8000 -left ctrl 1d 0000/4000 c000 -right ctrl 1d 0100/4100 c100 -a 1e 0000 8000 -s 1f 0000 8000 -d 20 0000 8000 -f 21 0000 8000 -g 22 0000 8000 -h 23 0000 8000 -j 24 0000 8000 -k 25 0000 8000 -l 26 0000 8000 -; 27 0000 8000 -' 28 0000 8000 -` 29 0000 8000 -left shift 2a 0000/4000 c000 -\ 2b 0000 8000 -z 2c 0000 8000 -x 2d 0000 8000 -c 2e 0000 8000 -v 2f 0000 8000 -b 30 0000 8000 -n 31 0000 8000 -m 32 0000 8000 -, 33 0000 8000 -. 34 0000 8000 -/ 35 0000 8000 -right shift 36 0000/4000 c000 -*(keypad) 37 0000 8000 -print scrn 37 0100 8100 -left alt 38 0000/4000 c000 -right alt 38 0100/4100 c100 -space 39 0000 8000 -caps lock 3a 0000/4000 c000 -f1 3b 0000 8000 -f2 3c 0000 8000 -f3 3d 0000 8000 -f4 3e 0000 8000 -f5 3f 0000 8000 -f6 40 0000 8000 -f7 41 0000 8000 -f8 42 0000 8000 -f9 43 0000 8000 -f10 44 0000 8000 -num lock 45 0000/4000 c000 -scroll lock 46 0000/4000 c000 -7(keypad) 47 0000 8000 -home 47 0100 8100 -8(keypad) 48 0000 8000 -up arrow 48 0100 8100 -9(kaypad) 49 0000 8000 -pg up 49 0100 8100 --(keypad) 4a 0000 8000 -4(keypad) 4b 0000 8000 -left arrow 4b 0100 8100 -5(keypad) 4c 0000 8000 -6(keypad) 4d 0000 8000 -right arrow 4d 0100 8100 -+(keypad) 4e 0000 8000 -1(keypad) 4f 0000 8000 -end 4f 0100 8100 -2(keypad) 50 0000 8000 -down arrow 50 0100 8100 -3(keypad) 51 0000 8000 -pg down 51 0100 8100 -o(keypad) 52 0000 8000 -insert 52 0100 8100 -.(keypad) 53 0000 8000 -delete 53 0100 8100 -? 54 -? 55 -? 56 -f11 57 0000 8000 -f12 58 0000 8000 -? 59 -? 5a -left win 5b 0100 8100 -right win 5c 0100 8100 -menu key 5d 0100 8100 +key rdp code down flags up flags +esc 0x01 1 0000 8000 +1 0x02 2 0000 8000 +2 0x03 3 0000 8000 +3 0x04 4 0000 8000 +4 0x05 5 0000 8000 +5 0x06 6 0000 8000 +6 0x07 7 0000 8000 +7 0x08 8 0000 8000 +8 0x09 9 0000 8000 +9 0x0a 10 0000 8000 +0 0x0b 11 0000 8000 +- 0x0c 12 0000 8000 += 0x0d 13 0000 8000 +backspace 0x0e 14 0000 8000 +tab 0x0f 15 0000 8000 +q 0x10 16 0000 8000 +w 0x11 17 0000 8000 +e 0x12 18 0000 8000 +r 0x13 19 0000 8000 +t 0x14 20 0000 8000 +y 0x15 21 0000 8000 +u 0x16 22 0000 8000 +i 0x17 23 0000 8000 +o 0x18 24 0000 8000 +p 0x19 25 0000 8000 +[ 0x1a 26 0000 8000 +] 0x1b 27 0000 8000 +enter 0x1c 28 0000 8000 +left ctrl 0x1d 29 0000/4000 c000 +right ctrl 0x1d 29 0100/4100 c100 +a 0x1e 30 0000 8000 +s 0x1f 31 0000 8000 +d 0x20 32 0000 8000 +f 0x21 33 0000 8000 +g 0x22 34 0000 8000 +h 0x23 35 0000 8000 +j 0x24 36 0000 8000 +k 0x25 37 0000 8000 +l 0x26 38 0000 8000 +; 0x27 39 0000 8000 +' 0x28 40 0000 8000 +` 0x29 41 0000 8000 +left shift 0x2a 42 0000/4000 c000 +\ 0x2b 43 0000 8000 +z 0x2c 44 0000 8000 +x 0x2d 45 0000 8000 +c 0x2e 46 0000 8000 +v 0x2f 47 0000 8000 +b 0x30 48 0000 8000 +n 0x31 49 0000 8000 +m 0x32 50 0000 8000 +, 0x33 51 0000 8000 +. 0x34 52 0000 8000 +/ 0x35 53 0000 8000 +right shift 0x36 54 0000/4000 c000 +*(keypad) 0x37 55 0000 8000 +print scrn 0x37 55 0100 8100 +left alt 0x38 56 0000/4000 c000 +right alt 0x38 56 0100/4100 c100 +space 0x39 57 0000 8000 +caps lock 0x3a 58 0000/4000 c000 +f1 0x3b 59 0000 8000 +f2 0x3c 60 0000 8000 +f3 0x3d 61 0000 8000 +f4 0x3e 62 0000 8000 +f5 0x3f 63 0000 8000 +f6 0x40 64 0000 8000 +f7 0x41 65 0000 8000 +f8 0x42 66 0000 8000 +f9 0x43 67 0000 8000 +f10 0x44 68 0000 8000 +num lock 0x45 69 0000/4000 c000 +scroll lock 0x46 70 0000/4000 c000 +7(keypad) 0x47 71 0000 8000 +home 0x47 71 0100 8100 +8(keypad) 0x48 72 0000 8000 +up arrow 0x48 72 0100 8100 +9(kaypad) 0x49 73 0000 8000 +pg up 0x49 73 0100 8100 +-(keypad) 0x4a 74 0000 8000 +4(keypad) 0x4b 75 0000 8000 +left arrow 0x4b 75 0100 8100 +5(keypad) 0x4c 76 0000 8000 +6(keypad) 0x4d 77 0000 8000 +right arrow 0x4d 77 0100 8100 ++(keypad) 0x4e 78 0000 8000 +1(keypad) 0x4f 79 0000 8000 +end 0x4f 79 0100 8100 +2(keypad) 0x50 80 0000 8000 +down arrow 0x50 80 0100 8100 +3(keypad) 0x51 81 0000 8000 +pg down 0x51 81 0100 8100 +o(keypad) 0x52 82 0000 8000 +insert 0x52 82 0100 8100 +.(keypad) 0x53 83 0000 8000 +delete 0x53 83 0100 8100 +? 0x54 84 +? 0x55 85 +? 0x56 86 +f11 0x57 87 0000 8000 +f12 0x58 88 0000 8000 +? 0x59 89 +? 0x5a 90 +left win 0x5b 91 0100 8100 +right win 0x5c 92 0100 8100 +menu key 0x5d 93 0100 8100 -pause break 1d 0200 8200 - 45 0000 8000 +pause break 0x1d 29 0200 8200 + 0x45 69 0000 8000 This is a special key that sends 2 down and 2 up like this down 001d 0200 down 0045 0000 diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h index 63655cab..bc7622c4 100644 --- a/xrdp/xrdp.h +++ b/xrdp/xrdp.h @@ -280,9 +280,6 @@ rect_contained_by(struct xrdp_rect* in1, int left, int top, int right, int bottom); int APP_CC check_bounds(struct xrdp_bitmap* b, int* x, int* y, int* cx, int* cy); -char APP_CC -get_char_from_scan_code(int device_flags, int scan_code, int* keys, - int caps_lock, int num_lock, int scroll_lock); int APP_CC add_char_at(char* text, char ch, int index); int APP_CC @@ -290,6 +287,12 @@ remove_char_at(char* text, int index); int APP_CC set_string(char** in_str, char* in); +/* in lang.c */ +char APP_CC +get_char_from_scan_code(int device_flags, int scan_code, int* keys, + int caps_lock, int num_lock, int scroll_lock, + int keylayout); + /* xrdp_login_wnd.c */ int APP_CC xrdp_wm_setup_mod1(struct xrdp_wm* self, diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index 5ef6a52d..2cb38aff 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -1383,7 +1383,8 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, c = get_char_from_scan_code(param2, scan_code, self->wm->keys, self->wm->caps_lock, self->wm->num_lock, - self->wm->scroll_lock); + self->wm->scroll_lock, + self->wm->session->client_info->keylayout); if (c != 0) { add_char_at(self->caption1, c, self->edit_pos); diff --git a/xrdp/xrdp_font.c b/xrdp/xrdp_font.c index 67bf268a..9195d5c9 100644 --- a/xrdp/xrdp_font.c +++ b/xrdp/xrdp_font.c @@ -78,11 +78,11 @@ xrdp_font_create(struct xrdp_wm* wm) self = (struct xrdp_font*)g_malloc(sizeof(struct xrdp_font), 1); self->wm = wm; make_stream(s); - init_stream(s, 8192); + init_stream(s, 8192 * 2); fd = g_file_open("Tahoma-10.fv1"); if (fd != -1) { - b = g_file_read(fd, s->data, 8192); + b = g_file_read(fd, s->data, 8192 * 2); g_file_close(fd); if (b > 0) { diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index 69f4864c..d2ef8fa5 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -1169,7 +1169,8 @@ xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code) c = get_char_from_scan_code(device_flags, scan_code, self->keys, self->caps_lock, self->num_lock, - self->scroll_lock); + self->scroll_lock, + self->session->client_info->keylayout); /*g_printf("%x\n", c);*/ if (c != 0) {