diff --git a/include/freerdp/keyboard_scancode.h b/include/freerdp/keyboard_scancode.h new file mode 100644 index 000000000..50ea3761e --- /dev/null +++ b/include/freerdp/keyboard_scancode.h @@ -0,0 +1,213 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RDP protocol "scancodes" + * + * Copyright 2009-2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __FREERDP_LOCALE_KEYBOARD_RDP_SCANCODE_H +#define __FREERDP_LOCALE_KEYBOARD_RDP_SCANCODE_H + +/* @msdn{cc240584} says: + * "... (a scancode is an 8-bit value specifying a key location on the keyboard). + * The server accepts a scancode value and translates it into the correct character depending on the language locale and keyboard layout used in the session." + * The 8-bit value is later called "keyCode" + * The extended flag is for all practical an important 9th bit with a strange encoding - not just a modifier. + */ + +typedef uint32 RDP_SCANCODE; /* Our own representation of a RDP protocol scancode */ +#define rdp_scancode_code(_rdp_scancode) ((uint8)(_rdp_scancode & 0xff)) +#define rdp_scancode_extended(_rdp_scancode) (((_rdp_scancode) & 0x100) ? true : false) +#define mk_rdp_scancode(_code, _extended) (((_code) & 0xff) | ((_extended) ? 0x100 : 0)) + + +/* Defines for known RDP_SCANCODE protocol values. + * Mostly the same as the undocumented PKBDLLHOOKSTRUCT scanCode, "A hardware scan code for the key", @msdn{ms644967} */ + +#define RDP_SCANCODE_UNKNOWN mk_rdp_scancode(0x00, false) +/* #define RDP_SCANCODE_LBUTTON VK_LBUTTON */ +/* #define RDP_SCANCODE_RBUTTON VK_RBUTTON */ +/* #define RDP_SCANCODE_CANCEL VK_CANCEL */ +/* #define RDP_SCANCODE_MBUTTON VK_MBUTTON */ +/* #define RDP_SCANCODE_XBUTTON1 VK_XBUTTON1 */ +/* #define RDP_SCANCODE_XBUTTON2 VK_XBUTTON2 */ +#define RDP_SCANCODE_BACK mk_rdp_scancode(0x0E, false) /* VK_BACK */ +#define RDP_SCANCODE_TAB mk_rdp_scancode(0x0F, false) /* VK_TAB */ +/* #define RDP_SCANCODE_CLEAR VK_CLEAR */ +#define RDP_SCANCODE_RETURN mk_rdp_scancode(0x1C, false) /* VK_RETURN */ +#define RDP_SCANCODE_SHIFT mk_rdp_scancode(0x2A, false) /* VK_SHIFT */ +/* #define RDP_SCANCODE_CONTROL VK_CONTROL */ +#define RDP_SCANCODE_MENU mk_rdp_scancode(0x38, false) /* VK_MENU */ +#define RDP_SCANCODE_PAUSE mk_rdp_scancode(0x46, true) /* VK_PAUSE */ +#define RDP_SCANCODE_CAPITAL mk_rdp_scancode(0x3A, false) /* VK_CAPITAL */ +#define RDP_SCANCODE_KANA / VK_HANGUL mk_rdp_scancode(0x72, false) /* VK_KANA / VK_HANGUL */ +/* #define RDP_SCANCODE_JUNJA VK_JUNJA */ +/* #define RDP_SCANCODE_FINAL VK_FINAL */ +#define RDP_SCANCODE_HANJA / VK_KANJI mk_rdp_scancode(0x71, false) /* VK_HANJA / VK_KANJI */ +#define RDP_SCANCODE_ESCAPE mk_rdp_scancode(0x01, false) /* VK_ESCAPE */ +/* #define RDP_SCANCODE_CONVERT VK_CONVERT */ +/* #define RDP_SCANCODE_NONCONVERT VK_NONCONVERT */ +/* #define RDP_SCANCODE_ACCEPT VK_ACCEPT */ +/* #define RDP_SCANCODE_MODECHANGE VK_MODECHANGE */ +#define RDP_SCANCODE_SPACE mk_rdp_scancode(0x39, false) /* VK_SPACE */ +#define RDP_SCANCODE_PRIOR mk_rdp_scancode(0x49, true) /* VK_PRIOR */ +#define RDP_SCANCODE_NEXT mk_rdp_scancode(0x51, true) /* VK_NEXT */ +#define RDP_SCANCODE_END mk_rdp_scancode(0x4F, true) /* VK_END */ +#define RDP_SCANCODE_HOME mk_rdp_scancode(0x47, true) /* VK_HOME */ +#define RDP_SCANCODE_LEFT mk_rdp_scancode(0x4B, true) /* VK_LEFT */ +#define RDP_SCANCODE_UP mk_rdp_scancode(0x48, true) /* VK_UP */ +#define RDP_SCANCODE_RIGHT mk_rdp_scancode(0x4D, true) /* VK_RIGHT */ +#define RDP_SCANCODE_DOWN mk_rdp_scancode(0x50, true) /* VK_DOWN */ +/* #define RDP_SCANCODE_SELECT VK_SELECT */ +#define RDP_SCANCODE_PRINT mk_rdp_scancode(0x37, true) /* VK_PRINT */ +#define RDP_SCANCODE_EXECUTE mk_rdp_scancode(0x37, true) /* VK_EXECUTE */ +#define RDP_SCANCODE_SNAPSHOT mk_rdp_scancode(0x37, true) /* VK_SNAPSHOT */ +#define RDP_SCANCODE_INSERT mk_rdp_scancode(0x52, true) /* VK_INSERT */ +#define RDP_SCANCODE_DELETE mk_rdp_scancode(0x53, true) /* VK_DELETE */ +#define RDP_SCANCODE_HELP mk_rdp_scancode(0x63, false) /* VK_HELP */ +#define RDP_SCANCODE_KEY_0 mk_rdp_scancode(0x0B, false) /* VK_KEY_0 */ +#define RDP_SCANCODE_KEY_1 mk_rdp_scancode(0x02, false) /* VK_KEY_1 */ +#define RDP_SCANCODE_KEY_2 mk_rdp_scancode(0x03, false) /* VK_KEY_2 */ +#define RDP_SCANCODE_KEY_3 mk_rdp_scancode(0x04, false) /* VK_KEY_3 */ +#define RDP_SCANCODE_KEY_4 mk_rdp_scancode(0x05, false) /* VK_KEY_4 */ +#define RDP_SCANCODE_KEY_5 mk_rdp_scancode(0x06, false) /* VK_KEY_5 */ +#define RDP_SCANCODE_KEY_6 mk_rdp_scancode(0x07, false) /* VK_KEY_6 */ +#define RDP_SCANCODE_KEY_7 mk_rdp_scancode(0x08, false) /* VK_KEY_7 */ +#define RDP_SCANCODE_KEY_8 mk_rdp_scancode(0x09, false) /* VK_KEY_8 */ +#define RDP_SCANCODE_KEY_9 mk_rdp_scancode(0x0A, false) /* VK_KEY_9 */ +#define RDP_SCANCODE_KEY_A mk_rdp_scancode(0x1E, false) /* VK_KEY_A */ +#define RDP_SCANCODE_KEY_B mk_rdp_scancode(0x30, false) /* VK_KEY_B */ +#define RDP_SCANCODE_KEY_C mk_rdp_scancode(0x2E, false) /* VK_KEY_C */ +#define RDP_SCANCODE_KEY_D mk_rdp_scancode(0x20, false) /* VK_KEY_D */ +#define RDP_SCANCODE_KEY_E mk_rdp_scancode(0x12, false) /* VK_KEY_E */ +#define RDP_SCANCODE_KEY_F mk_rdp_scancode(0x21, false) /* VK_KEY_F */ +#define RDP_SCANCODE_KEY_G mk_rdp_scancode(0x22, false) /* VK_KEY_G */ +#define RDP_SCANCODE_KEY_H mk_rdp_scancode(0x23, false) /* VK_KEY_H */ +#define RDP_SCANCODE_KEY_I mk_rdp_scancode(0x17, false) /* VK_KEY_I */ +#define RDP_SCANCODE_KEY_J mk_rdp_scancode(0x24, false) /* VK_KEY_J */ +#define RDP_SCANCODE_KEY_K mk_rdp_scancode(0x25, false) /* VK_KEY_K */ +#define RDP_SCANCODE_KEY_L mk_rdp_scancode(0x26, false) /* VK_KEY_L */ +#define RDP_SCANCODE_KEY_M mk_rdp_scancode(0x32, false) /* VK_KEY_M */ +#define RDP_SCANCODE_KEY_N mk_rdp_scancode(0x31, false) /* VK_KEY_N */ +#define RDP_SCANCODE_KEY_O mk_rdp_scancode(0x18, false) /* VK_KEY_O */ +#define RDP_SCANCODE_KEY_P mk_rdp_scancode(0x19, false) /* VK_KEY_P */ +#define RDP_SCANCODE_KEY_Q mk_rdp_scancode(0x10, false) /* VK_KEY_Q */ +#define RDP_SCANCODE_KEY_R mk_rdp_scancode(0x13, false) /* VK_KEY_R */ +#define RDP_SCANCODE_KEY_S mk_rdp_scancode(0x1F, false) /* VK_KEY_S */ +#define RDP_SCANCODE_KEY_T mk_rdp_scancode(0x14, false) /* VK_KEY_T */ +#define RDP_SCANCODE_KEY_U mk_rdp_scancode(0x16, false) /* VK_KEY_U */ +#define RDP_SCANCODE_KEY_V mk_rdp_scancode(0x2F, false) /* VK_KEY_V */ +#define RDP_SCANCODE_KEY_W mk_rdp_scancode(0x11, false) /* VK_KEY_W */ +#define RDP_SCANCODE_KEY_X mk_rdp_scancode(0x2D, false) /* VK_KEY_X */ +#define RDP_SCANCODE_KEY_Y mk_rdp_scancode(0x15, false) /* VK_KEY_Y */ +#define RDP_SCANCODE_KEY_Z mk_rdp_scancode(0x2C, false) /* VK_KEY_Z */ +#define RDP_SCANCODE_LWIN mk_rdp_scancode(0x5B, true) /* VK_LWIN */ +#define RDP_SCANCODE_RWIN mk_rdp_scancode(0x5C, true) /* VK_RWIN */ +#define RDP_SCANCODE_APPS mk_rdp_scancode(0x5D, true) /* VK_APPS */ +#define RDP_SCANCODE_SLEEP mk_rdp_scancode(0x5F, false) /* VK_SLEEP */ +#define RDP_SCANCODE_NUMPAD0 mk_rdp_scancode(0x52, false) /* VK_NUMPAD0 */ +#define RDP_SCANCODE_NUMPAD1 mk_rdp_scancode(0x4F, false) /* VK_NUMPAD1 */ +#define RDP_SCANCODE_NUMPAD2 mk_rdp_scancode(0x50, false) /* VK_NUMPAD2 */ +#define RDP_SCANCODE_NUMPAD3 mk_rdp_scancode(0x51, false) /* VK_NUMPAD3 */ +#define RDP_SCANCODE_NUMPAD4 mk_rdp_scancode(0x4B, false) /* VK_NUMPAD4 */ +#define RDP_SCANCODE_NUMPAD5 mk_rdp_scancode(0x4C, false) /* VK_NUMPAD5 */ +#define RDP_SCANCODE_NUMPAD6 mk_rdp_scancode(0x4D, false) /* VK_NUMPAD6 */ +#define RDP_SCANCODE_NUMPAD7 mk_rdp_scancode(0x47, false) /* VK_NUMPAD7 */ +#define RDP_SCANCODE_NUMPAD8 mk_rdp_scancode(0x48, false) /* VK_NUMPAD8 */ +#define RDP_SCANCODE_NUMPAD9 mk_rdp_scancode(0x49, false) /* VK_NUMPAD9 */ +#define RDP_SCANCODE_MULTIPLY mk_rdp_scancode(0x37, false) /* VK_MULTIPLY */ +#define RDP_SCANCODE_ADD mk_rdp_scancode(0x4E, false) /* VK_ADD */ +/* #define RDP_SCANCODE_SEPARATOR VK_SEPARATOR */ +#define RDP_SCANCODE_SUBTRACT mk_rdp_scancode(0x4A, false) /* VK_SUBTRACT */ +#define RDP_SCANCODE_DECIMAL mk_rdp_scancode(0x53, false) /* VK_DECIMAL */ +#define RDP_SCANCODE_DIVIDE mk_rdp_scancode(0x35, true) /* VK_DIVIDE */ +#define RDP_SCANCODE_F1 mk_rdp_scancode(0x3B, false) /* VK_F1 */ +#define RDP_SCANCODE_F2 mk_rdp_scancode(0x3C, false) /* VK_F2 */ +#define RDP_SCANCODE_F3 mk_rdp_scancode(0x3D, false) /* VK_F3 */ +#define RDP_SCANCODE_F4 mk_rdp_scancode(0x3E, false) /* VK_F4 */ +#define RDP_SCANCODE_F5 mk_rdp_scancode(0x3F, false) /* VK_F5 */ +#define RDP_SCANCODE_F6 mk_rdp_scancode(0x40, false) /* VK_F6 */ +#define RDP_SCANCODE_F7 mk_rdp_scancode(0x41, false) /* VK_F7 */ +#define RDP_SCANCODE_F8 mk_rdp_scancode(0x42, false) /* VK_F8 */ +#define RDP_SCANCODE_F9 mk_rdp_scancode(0x43, false) /* VK_F9 */ +#define RDP_SCANCODE_F10 mk_rdp_scancode(0x44, false) /* VK_F10 */ +#define RDP_SCANCODE_F11 mk_rdp_scancode(0x57, false) /* VK_F11 */ +#define RDP_SCANCODE_F12 mk_rdp_scancode(0x58, false) /* VK_F12 */ +#define RDP_SCANCODE_F13 mk_rdp_scancode(0x64, false) /* VK_F13 */ +#define RDP_SCANCODE_F14 mk_rdp_scancode(0x65, false) /* VK_F14 */ +#define RDP_SCANCODE_F15 mk_rdp_scancode(0x66, false) /* VK_F15 */ +#define RDP_SCANCODE_F16 mk_rdp_scancode(0x67, false) /* VK_F16 */ +#define RDP_SCANCODE_F17 mk_rdp_scancode(0x68, false) /* VK_F17 */ +#define RDP_SCANCODE_F18 mk_rdp_scancode(0x69, false) /* VK_F18 */ +#define RDP_SCANCODE_F19 mk_rdp_scancode(0x6A, false) /* VK_F19 */ +#define RDP_SCANCODE_F20 mk_rdp_scancode(0x6B, false) /* VK_F20 */ +#define RDP_SCANCODE_F21 mk_rdp_scancode(0x6C, false) /* VK_F21 */ +#define RDP_SCANCODE_F22 mk_rdp_scancode(0x6D, false) /* VK_F22 */ +#define RDP_SCANCODE_F23 mk_rdp_scancode(0x6E, false) /* VK_F23 */ +#define RDP_SCANCODE_F24 mk_rdp_scancode(0x6F, false) /* VK_F24 */ +#define RDP_SCANCODE_NUMLOCK mk_rdp_scancode(0x45, false) /* VK_NUMLOCK */ +#define RDP_SCANCODE_SCROLL mk_rdp_scancode(0x46, false) /* VK_SCROLL */ +#define RDP_SCANCODE_LSHIFT mk_rdp_scancode(0x2A, false) /* VK_LSHIFT */ +#define RDP_SCANCODE_RSHIFT mk_rdp_scancode(0x36, false) /* VK_RSHIFT */ +#define RDP_SCANCODE_LCONTROL mk_rdp_scancode(0x1D, false) /* VK_LCONTROL */ +#define RDP_SCANCODE_RCONTROL mk_rdp_scancode(0x1D, true) /* VK_RCONTROL */ +#define RDP_SCANCODE_LMENU mk_rdp_scancode(0x38, false) /* VK_LMENU */ +#define RDP_SCANCODE_RMENU mk_rdp_scancode(0x38, true) /* VK_RMENU */ +/* #define RDP_SCANCODE_BROWSER_BACK VK_BROWSER_BACK */ +/* #define RDP_SCANCODE_BROWSER_FORWARD VK_BROWSER_FORWARD */ +/* #define RDP_SCANCODE_BROWSER_REFRESH VK_BROWSER_REFRESH */ +/* #define RDP_SCANCODE_BROWSER_STOP VK_BROWSER_STOP */ +/* #define RDP_SCANCODE_BROWSER_SEARCH VK_BROWSER_SEARCH */ +/* #define RDP_SCANCODE_BROWSER_FAVORITES VK_BROWSER_FAVORITES */ +/* #define RDP_SCANCODE_BROWSER_HOME VK_BROWSER_HOME */ +/* #define RDP_SCANCODE_VOLUME_MUTE VK_VOLUME_MUTE */ +/* #define RDP_SCANCODE_VOLUME_DOWN VK_VOLUME_DOWN */ +/* #define RDP_SCANCODE_VOLUME_UP VK_VOLUME_UP */ +/* #define RDP_SCANCODE_MEDIA_NEXT_TRACK VK_MEDIA_NEXT_TRACK */ +/* #define RDP_SCANCODE_MEDIA_PREV_TRACK VK_MEDIA_PREV_TRACK */ +/* #define RDP_SCANCODE_MEDIA_STOP VK_MEDIA_STOP */ +/* #define RDP_SCANCODE_MEDIA_PLAY_PAUSE VK_MEDIA_PLAY_PAUSE */ +/* #define RDP_SCANCODE_LAUNCH_MAIL VK_LAUNCH_MAIL */ +/* #define RDP_SCANCODE_MEDIA_SELECT VK_MEDIA_SELECT */ +/* #define RDP_SCANCODE_LAUNCH_APP1 VK_LAUNCH_APP1 */ +/* #define RDP_SCANCODE_LAUNCH_APP2 VK_LAUNCH_APP2 */ +#define RDP_SCANCODE_OEM_1 mk_rdp_scancode(0x27, false) /* VK_OEM_1 */ +#define RDP_SCANCODE_OEM_PLUS mk_rdp_scancode(0x0D, false) /* VK_OEM_PLUS */ +#define RDP_SCANCODE_OEM_COMMA mk_rdp_scancode(0x33, false) /* VK_OEM_COMMA */ +#define RDP_SCANCODE_OEM_MINUS mk_rdp_scancode(0x0C, false) /* VK_OEM_MINUS */ +#define RDP_SCANCODE_OEM_PERIOD mk_rdp_scancode(0x34, false) /* VK_OEM_PERIOD */ +#define RDP_SCANCODE_OEM_2 mk_rdp_scancode(0x35, false) /* VK_OEM_2 */ +#define RDP_SCANCODE_OEM_3 mk_rdp_scancode(0x29, false) /* VK_OEM_3 */ +#define RDP_SCANCODE_ABNT_C1 mk_rdp_scancode(0x73, false) /* VK_ABNT_C1 */ +#define RDP_SCANCODE_ABNT_C2 mk_rdp_scancode(0x7E, false) /* VK_ABNT_C2 */ +#define RDP_SCANCODE_OEM_4 mk_rdp_scancode(0x1A, false) /* VK_OEM_4 */ +#define RDP_SCANCODE_OEM_5 mk_rdp_scancode(0x2B, false) /* VK_OEM_5 */ +#define RDP_SCANCODE_OEM_6 mk_rdp_scancode(0x1B, false) /* VK_OEM_6 */ +#define RDP_SCANCODE_OEM_7 mk_rdp_scancode(0x28, false) /* VK_OEM_7 */ +#define RDP_SCANCODE_OEM_8 mk_rdp_scancode(0x1D, false) /* VK_OEM_8 */ +#define RDP_SCANCODE_OEM_102 mk_rdp_scancode(0x56, false) /* VK_OEM_102 */ +/* #define RDP_SCANCODE_PROCESSKEY VK_PROCESSKEY */ +/* #define RDP_SCANCODE_PACKET VK_PACKET */ +/* #define RDP_SCANCODE_ATTN VK_ATTN */ +/* #define RDP_SCANCODE_CRSEL VK_CRSEL */ +/* #define RDP_SCANCODE_EXSEL VK_EXSEL */ +/* #define RDP_SCANCODE_EREOF VK_EREOF */ +/* #define RDP_SCANCODE_PLAY VK_PLAY */ +#define RDP_SCANCODE_ZOOM mk_rdp_scancode(0x62, false) /* VK_ZOOM */ +/* #define RDP_SCANCODE_NONAME VK_NONAME */ +/* #define RDP_SCANCODE_PA1 VK_PA1 */ +/* #define RDP_SCANCODE_OEM_CLEAR VK_OEM_CLEAR */ + +#endif /* __FREERDP_LOCALE_KEYBOARD_RDP_SCANCODE_H */ diff --git a/include/freerdp/locale/keyboard.h b/include/freerdp/locale/keyboard.h index 091a6d54b..f9dca1e34 100644 --- a/include/freerdp/locale/keyboard.h +++ b/include/freerdp/locale/keyboard.h @@ -23,6 +23,7 @@ #include #include #include +#include #define RDP_KEYBOARD_LAYOUT_TYPE_STANDARD 1 #define RDP_KEYBOARD_LAYOUT_TYPE_VARIANT 2 @@ -35,12 +36,6 @@ struct _RDP_KEYBOARD_LAYOUT }; typedef struct _RDP_KEYBOARD_LAYOUT RDP_KEYBOARD_LAYOUT; -typedef uint32 RDP_SCANCODE; -#define rdp_scancode_code(_rdp_scancode) ((uint8)(_rdp_scancode)) -#define rdp_scancode_extended(_rdp_scancode) (((_rdp_scancode) & 0x100) ? true : false) -#define mk_rdp_scancode(_code, _extended) (((_code) & 0xff) | ((_extended) ? 0x100 : 0)) - - /* Keyboard layout IDs */ #define KBD_ARABIC_101 0x00000401 diff --git a/libfreerdp-locale/keyboard_layout.c b/libfreerdp-locale/keyboard_layout.c index c13cbdf0b..8e2a7a202 100644 --- a/libfreerdp-locale/keyboard_layout.c +++ b/libfreerdp-locale/keyboard_layout.c @@ -23,6 +23,7 @@ #include "liblocale.h" #include +#include #include #include @@ -212,262 +213,262 @@ static const RDP_KEYBOARD_IME RDP_KEYBOARD_IME_TABLE[] = const RDP_SCANCODE VIRTUAL_KEY_CODE_TO_DEFAULT_RDP_SCANCODE_TABLE[256] = { - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), /* VK_LBUTTON */ - mk_rdp_scancode(0x00, false), /* VK_RBUTTON */ - mk_rdp_scancode(0x00, false), /* VK_CANCEL */ - mk_rdp_scancode(0x00, false), /* VK_MBUTTON */ - mk_rdp_scancode(0x00, false), /* VK_XBUTTON1 */ - mk_rdp_scancode(0x00, false), /* VK_XBUTTON2 */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x0E, false), /* VK_BACK */ - mk_rdp_scancode(0x0F, false), /* VK_TAB */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), /* VK_CLEAR */ - mk_rdp_scancode(0x1C, false), /* VK_RETURN */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x2A, false), /* VK_SHIFT */ - mk_rdp_scancode(0x00, false), /* VK_CONTROL */ - mk_rdp_scancode(0x38, false), /* VK_MENU */ - mk_rdp_scancode(0x46, true), /* VK_PAUSE */ - mk_rdp_scancode(0x3A, false), /* VK_CAPITAL */ - mk_rdp_scancode(0x72, false), /* VK_KANA / VK_HANGUL */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), /* VK_JUNJA */ - mk_rdp_scancode(0x00, false), /* VK_FINAL */ - mk_rdp_scancode(0x71, false), /* VK_HANJA / VK_KANJI */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x01, false), /* VK_ESCAPE */ - mk_rdp_scancode(0x00, false), /* VK_CONVERT */ - mk_rdp_scancode(0x00, false), /* VK_NONCONVERT */ - mk_rdp_scancode(0x00, false), /* VK_ACCEPT */ - mk_rdp_scancode(0x00, false), /* VK_MODECHANGE */ - mk_rdp_scancode(0x39, false), /* VK_SPACE */ - mk_rdp_scancode(0x49, true), /* VK_PRIOR */ - mk_rdp_scancode(0x51, true), /* VK_NEXT */ - mk_rdp_scancode(0x4F, true), /* VK_END */ - mk_rdp_scancode(0x47, true), /* VK_HOME */ - mk_rdp_scancode(0x4B, true), /* VK_LEFT */ - mk_rdp_scancode(0x48, true), /* VK_UP */ - mk_rdp_scancode(0x4D, true), /* VK_RIGHT */ - mk_rdp_scancode(0x50, true), /* VK_DOWN */ - mk_rdp_scancode(0x00, false), /* VK_SELECT */ - mk_rdp_scancode(0x37, true), /* VK_PRINT */ - mk_rdp_scancode(0x37, true), /* VK_EXECUTE */ - mk_rdp_scancode(0x37, true), /* VK_SNAPSHOT */ - mk_rdp_scancode(0x52, true), /* VK_INSERT */ - mk_rdp_scancode(0x53, true), /* VK_DELETE */ - mk_rdp_scancode(0x63, false), /* VK_HELP */ - mk_rdp_scancode(0x0B, false), /* VK_KEY_0 */ - mk_rdp_scancode(0x02, false), /* VK_KEY_1 */ - mk_rdp_scancode(0x03, false), /* VK_KEY_2 */ - mk_rdp_scancode(0x04, false), /* VK_KEY_3 */ - mk_rdp_scancode(0x05, false), /* VK_KEY_4 */ - mk_rdp_scancode(0x06, false), /* VK_KEY_5 */ - mk_rdp_scancode(0x07, false), /* VK_KEY_6 */ - mk_rdp_scancode(0x08, false), /* VK_KEY_7 */ - mk_rdp_scancode(0x09, false), /* VK_KEY_8 */ - mk_rdp_scancode(0x0A, false), /* VK_KEY_9 */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x1E, false), /* VK_KEY_A */ - mk_rdp_scancode(0x30, false), /* VK_KEY_B */ - mk_rdp_scancode(0x2E, false), /* VK_KEY_C */ - mk_rdp_scancode(0x20, false), /* VK_KEY_D */ - mk_rdp_scancode(0x12, false), /* VK_KEY_E */ - mk_rdp_scancode(0x21, false), /* VK_KEY_F */ - mk_rdp_scancode(0x22, false), /* VK_KEY_G */ - mk_rdp_scancode(0x23, false), /* VK_KEY_H */ - mk_rdp_scancode(0x17, false), /* VK_KEY_I */ - mk_rdp_scancode(0x24, false), /* VK_KEY_J */ - mk_rdp_scancode(0x25, false), /* VK_KEY_K */ - mk_rdp_scancode(0x26, false), /* VK_KEY_L */ - mk_rdp_scancode(0x32, false), /* VK_KEY_M */ - mk_rdp_scancode(0x31, false), /* VK_KEY_N */ - mk_rdp_scancode(0x18, false), /* VK_KEY_O */ - mk_rdp_scancode(0x19, false), /* VK_KEY_P */ - mk_rdp_scancode(0x10, false), /* VK_KEY_Q */ - mk_rdp_scancode(0x13, false), /* VK_KEY_R */ - mk_rdp_scancode(0x1F, false), /* VK_KEY_S */ - mk_rdp_scancode(0x14, false), /* VK_KEY_T */ - mk_rdp_scancode(0x16, false), /* VK_KEY_U */ - mk_rdp_scancode(0x2F, false), /* VK_KEY_V */ - mk_rdp_scancode(0x11, false), /* VK_KEY_W */ - mk_rdp_scancode(0x2D, false), /* VK_KEY_X */ - mk_rdp_scancode(0x15, false), /* VK_KEY_Y */ - mk_rdp_scancode(0x2C, false), /* VK_KEY_Z */ - mk_rdp_scancode(0x5B, true), /* VK_LWIN */ - mk_rdp_scancode(0x5C, true), /* VK_RWIN */ - mk_rdp_scancode(0x5D, true), /* VK_APPS */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x5F, false), /* VK_SLEEP */ - mk_rdp_scancode(0x52, false), /* VK_NUMPAD0 */ - mk_rdp_scancode(0x4F, false), /* VK_NUMPAD1 */ - mk_rdp_scancode(0x50, false), /* VK_NUMPAD2 */ - mk_rdp_scancode(0x51, false), /* VK_NUMPAD3 */ - mk_rdp_scancode(0x4B, false), /* VK_NUMPAD4 */ - mk_rdp_scancode(0x4C, false), /* VK_NUMPAD5 */ - mk_rdp_scancode(0x4D, false), /* VK_NUMPAD6 */ - mk_rdp_scancode(0x47, false), /* VK_NUMPAD7 */ - mk_rdp_scancode(0x48, false), /* VK_NUMPAD8 */ - mk_rdp_scancode(0x49, false), /* VK_NUMPAD9 */ - mk_rdp_scancode(0x37, false), /* VK_MULTIPLY */ - mk_rdp_scancode(0x4E, false), /* VK_ADD */ - mk_rdp_scancode(0x00, false), /* VK_SEPARATOR */ - mk_rdp_scancode(0x4A, false), /* VK_SUBTRACT */ - mk_rdp_scancode(0x53, false), /* VK_DECIMAL */ - mk_rdp_scancode(0x35, true), /* VK_DIVIDE */ - mk_rdp_scancode(0x3B, false), /* VK_F1 */ - mk_rdp_scancode(0x3C, false), /* VK_F2 */ - mk_rdp_scancode(0x3D, false), /* VK_F3 */ - mk_rdp_scancode(0x3E, false), /* VK_F4 */ - mk_rdp_scancode(0x3F, false), /* VK_F5 */ - mk_rdp_scancode(0x40, false), /* VK_F6 */ - mk_rdp_scancode(0x41, false), /* VK_F7 */ - mk_rdp_scancode(0x42, false), /* VK_F8 */ - mk_rdp_scancode(0x43, false), /* VK_F9 */ - mk_rdp_scancode(0x44, false), /* VK_F10 */ - mk_rdp_scancode(0x57, false), /* VK_F11 */ - mk_rdp_scancode(0x58, false), /* VK_F12 */ - mk_rdp_scancode(0x64, false), /* VK_F13 */ - mk_rdp_scancode(0x65, false), /* VK_F14 */ - mk_rdp_scancode(0x66, false), /* VK_F15 */ - mk_rdp_scancode(0x67, false), /* VK_F16 */ - mk_rdp_scancode(0x68, false), /* VK_F17 */ - mk_rdp_scancode(0x69, false), /* VK_F18 */ - mk_rdp_scancode(0x6A, false), /* VK_F19 */ - mk_rdp_scancode(0x6B, false), /* VK_F20 */ - mk_rdp_scancode(0x6C, false), /* VK_F21 */ - mk_rdp_scancode(0x6D, false), /* VK_F22 */ - mk_rdp_scancode(0x6E, false), /* VK_F23 */ - mk_rdp_scancode(0x6F, false), /* VK_F24 */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x45, false), /* VK_NUMLOCK */ - mk_rdp_scancode(0x46, false), /* VK_SCROLL */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x2A, false), /* VK_LSHIFT */ - mk_rdp_scancode(0x36, false), /* VK_RSHIFT */ - mk_rdp_scancode(0x1D, false), /* VK_LCONTROL */ - mk_rdp_scancode(0x1D, true), /* VK_RCONTROL */ - mk_rdp_scancode(0x38, false), /* VK_LMENU */ - mk_rdp_scancode(0x38, true), /* VK_RMENU */ - mk_rdp_scancode(0x00, false), /* VK_BROWSER_BACK */ - mk_rdp_scancode(0x00, false), /* VK_BROWSER_FORWARD */ - mk_rdp_scancode(0x00, false), /* VK_BROWSER_REFRESH */ - mk_rdp_scancode(0x00, false), /* VK_BROWSER_STOP */ - mk_rdp_scancode(0x00, false), /* VK_BROWSER_SEARCH */ - mk_rdp_scancode(0x00, false), /* VK_BROWSER_FAVORITES */ - mk_rdp_scancode(0x00, false), /* VK_BROWSER_HOME */ - mk_rdp_scancode(0x00, false), /* VK_VOLUME_MUTE */ - mk_rdp_scancode(0x00, false), /* VK_VOLUME_DOWN */ - mk_rdp_scancode(0x00, false), /* VK_VOLUME_UP */ - mk_rdp_scancode(0x00, false), /* VK_MEDIA_NEXT_TRACK */ - mk_rdp_scancode(0x00, false), /* VK_MEDIA_PREV_TRACK */ - mk_rdp_scancode(0x00, false), /* VK_MEDIA_STOP */ - mk_rdp_scancode(0x00, false), /* VK_MEDIA_PLAY_PAUSE */ - mk_rdp_scancode(0x00, false), /* VK_LAUNCH_MAIL */ - mk_rdp_scancode(0x00, false), /* VK_MEDIA_SELECT */ - mk_rdp_scancode(0x00, false), /* VK_LAUNCH_APP1 */ - mk_rdp_scancode(0x00, false), /* VK_LAUNCH_APP2 */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x27, false), /* VK_OEM_1 */ - mk_rdp_scancode(0x0D, false), /* VK_OEM_PLUS */ - mk_rdp_scancode(0x33, false), /* VK_OEM_COMMA */ - mk_rdp_scancode(0x0C, false), /* VK_OEM_MINUS */ - mk_rdp_scancode(0x34, false), /* VK_OEM_PERIOD */ - mk_rdp_scancode(0x35, false), /* VK_OEM_2 */ - mk_rdp_scancode(0x29, false), /* VK_OEM_3 */ - mk_rdp_scancode(0x73, false), /* VK_ABNT_C1 */ - mk_rdp_scancode(0x7E, false), /* VK_ABNT_C2 */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x1A, false), /* VK_OEM_4 */ - mk_rdp_scancode(0x2B, false), /* VK_OEM_5 */ - mk_rdp_scancode(0x1B, false), /* VK_OEM_6 */ - mk_rdp_scancode(0x28, false), /* VK_OEM_7 */ - mk_rdp_scancode(0x1D, false), /* VK_OEM_8 */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x56, false), /* VK_OEM_102 */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), /* VK_PROCESSKEY */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), /* VK_PACKET */ - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), - mk_rdp_scancode(0x00, false), /* VK_ATTN */ - mk_rdp_scancode(0x00, false), /* VK_CRSEL */ - mk_rdp_scancode(0x00, false), /* VK_EXSEL */ - mk_rdp_scancode(0x00, false), /* VK_EREOF */ - mk_rdp_scancode(0x00, false), /* VK_PLAY */ - mk_rdp_scancode(0x62, false), /* VK_ZOOM */ - mk_rdp_scancode(0x00, false), /* VK_NONAME */ - mk_rdp_scancode(0x00, false), /* VK_PA1 */ - mk_rdp_scancode(0x00, false), /* VK_OEM_CLEAR */ - mk_rdp_scancode(0x00, false) + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, /* VK_LBUTTON */ + RDP_SCANCODE_UNKNOWN, /* VK_RBUTTON */ + RDP_SCANCODE_UNKNOWN, /* VK_CANCEL */ + RDP_SCANCODE_UNKNOWN, /* VK_MBUTTON */ + RDP_SCANCODE_UNKNOWN, /* VK_XBUTTON1 */ + RDP_SCANCODE_UNKNOWN, /* VK_XBUTTON2 */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_BACK, /* VK_BACK */ + RDP_SCANCODE_TAB, /* VK_TAB */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, /* VK_CLEAR */ + RDP_SCANCODE_RETURN, /* VK_RETURN */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_SHIFT, /* VK_SHIFT */ + RDP_SCANCODE_UNKNOWN, /* VK_CONTROL */ + RDP_SCANCODE_MENU, /* VK_MENU */ + RDP_SCANCODE_PAUSE, /* VK_PAUSE */ + RDP_SCANCODE_CAPITAL, /* VK_CAPITAL */ + RDP_SCANCODE_UNKNOWN, /* VK_KANA / VK_HANGUL */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, /* VK_JUNJA */ + RDP_SCANCODE_UNKNOWN, /* VK_FINAL */ + RDP_SCANCODE_UNKNOWN, /* VK_HANJA / VK_KANJI */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_ESCAPE, /* VK_ESCAPE */ + RDP_SCANCODE_UNKNOWN, /* VK_CONVERT */ + RDP_SCANCODE_UNKNOWN, /* VK_NONCONVERT */ + RDP_SCANCODE_UNKNOWN, /* VK_ACCEPT */ + RDP_SCANCODE_UNKNOWN, /* VK_MODECHANGE */ + RDP_SCANCODE_SPACE, /* VK_SPACE */ + RDP_SCANCODE_PRIOR, /* VK_PRIOR */ + RDP_SCANCODE_NEXT, /* VK_NEXT */ + RDP_SCANCODE_END, /* VK_END */ + RDP_SCANCODE_HOME, /* VK_HOME */ + RDP_SCANCODE_LEFT, /* VK_LEFT */ + RDP_SCANCODE_UP, /* VK_UP */ + RDP_SCANCODE_RIGHT, /* VK_RIGHT */ + RDP_SCANCODE_DOWN, /* VK_DOWN */ + RDP_SCANCODE_UNKNOWN, /* VK_SELECT */ + RDP_SCANCODE_PRINT, /* VK_PRINT */ + RDP_SCANCODE_EXECUTE, /* VK_EXECUTE */ + RDP_SCANCODE_SNAPSHOT, /* VK_SNAPSHOT */ + RDP_SCANCODE_INSERT, /* VK_INSERT */ + RDP_SCANCODE_DELETE, /* VK_DELETE */ + RDP_SCANCODE_HELP, /* VK_HELP */ + RDP_SCANCODE_KEY_0, /* VK_KEY_0 */ + RDP_SCANCODE_KEY_1, /* VK_KEY_1 */ + RDP_SCANCODE_KEY_2, /* VK_KEY_2 */ + RDP_SCANCODE_KEY_3, /* VK_KEY_3 */ + RDP_SCANCODE_KEY_4, /* VK_KEY_4 */ + RDP_SCANCODE_KEY_5, /* VK_KEY_5 */ + RDP_SCANCODE_KEY_6, /* VK_KEY_6 */ + RDP_SCANCODE_KEY_7, /* VK_KEY_7 */ + RDP_SCANCODE_KEY_8, /* VK_KEY_8 */ + RDP_SCANCODE_KEY_9, /* VK_KEY_9 */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_KEY_A, /* VK_KEY_A */ + RDP_SCANCODE_KEY_B, /* VK_KEY_B */ + RDP_SCANCODE_KEY_C, /* VK_KEY_C */ + RDP_SCANCODE_KEY_D, /* VK_KEY_D */ + RDP_SCANCODE_KEY_E, /* VK_KEY_E */ + RDP_SCANCODE_KEY_F, /* VK_KEY_F */ + RDP_SCANCODE_KEY_G, /* VK_KEY_G */ + RDP_SCANCODE_KEY_H, /* VK_KEY_H */ + RDP_SCANCODE_KEY_I, /* VK_KEY_I */ + RDP_SCANCODE_KEY_J, /* VK_KEY_J */ + RDP_SCANCODE_KEY_K, /* VK_KEY_K */ + RDP_SCANCODE_KEY_L, /* VK_KEY_L */ + RDP_SCANCODE_KEY_M, /* VK_KEY_M */ + RDP_SCANCODE_KEY_N, /* VK_KEY_N */ + RDP_SCANCODE_KEY_O, /* VK_KEY_O */ + RDP_SCANCODE_KEY_P, /* VK_KEY_P */ + RDP_SCANCODE_KEY_Q, /* VK_KEY_Q */ + RDP_SCANCODE_KEY_R, /* VK_KEY_R */ + RDP_SCANCODE_KEY_S, /* VK_KEY_S */ + RDP_SCANCODE_KEY_T, /* VK_KEY_T */ + RDP_SCANCODE_KEY_U, /* VK_KEY_U */ + RDP_SCANCODE_KEY_V, /* VK_KEY_V */ + RDP_SCANCODE_KEY_W, /* VK_KEY_W */ + RDP_SCANCODE_KEY_X, /* VK_KEY_X */ + RDP_SCANCODE_KEY_Y, /* VK_KEY_Y */ + RDP_SCANCODE_KEY_Z, /* VK_KEY_Z */ + RDP_SCANCODE_LWIN, /* VK_LWIN */ + RDP_SCANCODE_RWIN, /* VK_RWIN */ + RDP_SCANCODE_APPS, /* VK_APPS */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_SLEEP, /* VK_SLEEP */ + RDP_SCANCODE_NUMPAD0, /* VK_NUMPAD0 */ + RDP_SCANCODE_NUMPAD1, /* VK_NUMPAD1 */ + RDP_SCANCODE_NUMPAD2, /* VK_NUMPAD2 */ + RDP_SCANCODE_NUMPAD3, /* VK_NUMPAD3 */ + RDP_SCANCODE_NUMPAD4, /* VK_NUMPAD4 */ + RDP_SCANCODE_NUMPAD5, /* VK_NUMPAD5 */ + RDP_SCANCODE_NUMPAD6, /* VK_NUMPAD6 */ + RDP_SCANCODE_NUMPAD7, /* VK_NUMPAD7 */ + RDP_SCANCODE_NUMPAD8, /* VK_NUMPAD8 */ + RDP_SCANCODE_NUMPAD9, /* VK_NUMPAD9 */ + RDP_SCANCODE_MULTIPLY, /* VK_MULTIPLY */ + RDP_SCANCODE_ADD, /* VK_ADD */ + RDP_SCANCODE_UNKNOWN, /* VK_SEPARATOR */ + RDP_SCANCODE_SUBTRACT, /* VK_SUBTRACT */ + RDP_SCANCODE_DECIMAL, /* VK_DECIMAL */ + RDP_SCANCODE_DIVIDE, /* VK_DIVIDE */ + RDP_SCANCODE_F1, /* VK_F1 */ + RDP_SCANCODE_F2, /* VK_F2 */ + RDP_SCANCODE_F3, /* VK_F3 */ + RDP_SCANCODE_F4, /* VK_F4 */ + RDP_SCANCODE_F5, /* VK_F5 */ + RDP_SCANCODE_F6, /* VK_F6 */ + RDP_SCANCODE_F7, /* VK_F7 */ + RDP_SCANCODE_F8, /* VK_F8 */ + RDP_SCANCODE_F9, /* VK_F9 */ + RDP_SCANCODE_F10, /* VK_F10 */ + RDP_SCANCODE_F11, /* VK_F11 */ + RDP_SCANCODE_F12, /* VK_F12 */ + RDP_SCANCODE_F13, /* VK_F13 */ + RDP_SCANCODE_F14, /* VK_F14 */ + RDP_SCANCODE_F15, /* VK_F15 */ + RDP_SCANCODE_F16, /* VK_F16 */ + RDP_SCANCODE_F17, /* VK_F17 */ + RDP_SCANCODE_F18, /* VK_F18 */ + RDP_SCANCODE_F19, /* VK_F19 */ + RDP_SCANCODE_F20, /* VK_F20 */ + RDP_SCANCODE_F21, /* VK_F21 */ + RDP_SCANCODE_F22, /* VK_F22 */ + RDP_SCANCODE_F23, /* VK_F23 */ + RDP_SCANCODE_F24, /* VK_F24 */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_NUMLOCK, /* VK_NUMLOCK */ + RDP_SCANCODE_SCROLL, /* VK_SCROLL */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_LSHIFT, /* VK_LSHIFT */ + RDP_SCANCODE_RSHIFT, /* VK_RSHIFT */ + RDP_SCANCODE_LCONTROL, /* VK_LCONTROL */ + RDP_SCANCODE_RCONTROL, /* VK_RCONTROL */ + RDP_SCANCODE_LMENU, /* VK_LMENU */ + RDP_SCANCODE_RMENU, /* VK_RMENU */ + RDP_SCANCODE_UNKNOWN, /* VK_BROWSER_BACK */ + RDP_SCANCODE_UNKNOWN, /* VK_BROWSER_FORWARD */ + RDP_SCANCODE_UNKNOWN, /* VK_BROWSER_REFRESH */ + RDP_SCANCODE_UNKNOWN, /* VK_BROWSER_STOP */ + RDP_SCANCODE_UNKNOWN, /* VK_BROWSER_SEARCH */ + RDP_SCANCODE_UNKNOWN, /* VK_BROWSER_FAVORITES */ + RDP_SCANCODE_UNKNOWN, /* VK_BROWSER_HOME */ + RDP_SCANCODE_UNKNOWN, /* VK_VOLUME_MUTE */ + RDP_SCANCODE_UNKNOWN, /* VK_VOLUME_DOWN */ + RDP_SCANCODE_UNKNOWN, /* VK_VOLUME_UP */ + RDP_SCANCODE_UNKNOWN, /* VK_MEDIA_NEXT_TRACK */ + RDP_SCANCODE_UNKNOWN, /* VK_MEDIA_PREV_TRACK */ + RDP_SCANCODE_UNKNOWN, /* VK_MEDIA_STOP */ + RDP_SCANCODE_UNKNOWN, /* VK_MEDIA_PLAY_PAUSE */ + RDP_SCANCODE_UNKNOWN, /* VK_LAUNCH_MAIL */ + RDP_SCANCODE_UNKNOWN, /* VK_MEDIA_SELECT */ + RDP_SCANCODE_UNKNOWN, /* VK_LAUNCH_APP1 */ + RDP_SCANCODE_UNKNOWN, /* VK_LAUNCH_APP2 */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_OEM_1, /* VK_OEM_1 */ + RDP_SCANCODE_OEM_PLUS, /* VK_OEM_PLUS */ + RDP_SCANCODE_OEM_COMMA, /* VK_OEM_COMMA */ + RDP_SCANCODE_OEM_MINUS, /* VK_OEM_MINUS */ + RDP_SCANCODE_OEM_PERIOD, /* VK_OEM_PERIOD */ + RDP_SCANCODE_OEM_2, /* VK_OEM_2 */ + RDP_SCANCODE_OEM_3, /* VK_OEM_3 */ + RDP_SCANCODE_ABNT_C1, /* VK_ABNT_C1 */ + RDP_SCANCODE_ABNT_C2, /* VK_ABNT_C2 */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_OEM_4, /* VK_OEM_4 */ + RDP_SCANCODE_OEM_5, /* VK_OEM_5 */ + RDP_SCANCODE_OEM_6, /* VK_OEM_6 */ + RDP_SCANCODE_OEM_7, /* VK_OEM_7 */ + RDP_SCANCODE_OEM_8, /* VK_OEM_8 */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_OEM_102, /* VK_OEM_102 */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, /* VK_PROCESSKEY */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, /* VK_PACKET */ + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, + RDP_SCANCODE_UNKNOWN, /* VK_ATTN */ + RDP_SCANCODE_UNKNOWN, /* VK_CRSEL */ + RDP_SCANCODE_UNKNOWN, /* VK_EXSEL */ + RDP_SCANCODE_UNKNOWN, /* VK_EREOF */ + RDP_SCANCODE_UNKNOWN, /* VK_PLAY */ + RDP_SCANCODE_ZOOM, /* VK_ZOOM */ + RDP_SCANCODE_UNKNOWN, /* VK_NONAME */ + RDP_SCANCODE_UNKNOWN, /* VK_PA1 */ + RDP_SCANCODE_UNKNOWN, /* VK_OEM_CLEAR */ + RDP_SCANCODE_UNKNOWN }; RDP_KEYBOARD_LAYOUT* freerdp_keyboard_get_layouts(uint32 types)