From 7a2ac89d4193b9f735f6b8a72139776c381524f5 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Tue, 2 Jun 2026 01:19:34 +0500 Subject: [PATCH 01/71] #943 WIP: KKP support (initial implementaton) --- src/netxs/desktopio/ansivt.hpp | 106 +++--- src/netxs/desktopio/console.hpp | 2 + src/netxs/desktopio/input.hpp | 480 ++++++++++++++------------ src/netxs/desktopio/system.hpp | 585 +++++++++++++++++++++++++------- 4 files changed, 781 insertions(+), 392 deletions(-) diff --git a/src/netxs/desktopio/ansivt.hpp b/src/netxs/desktopio/ansivt.hpp index 8ea5b2accc..4b561efad7 100644 --- a/src/netxs/desktopio/ansivt.hpp +++ b/src/netxs/desktopio/ansivt.hpp @@ -608,6 +608,8 @@ namespace netxs::ansi auto& appkey(bool b) { return add(b ? "\033[?1h" : "\033[?1l" ); } // escx: Application(=on)/ANSI(=off) Cursor Keys (DECCKM). auto& bpmode(bool b) { return add(b ? "\033[?2004h" : "\033[?2004l" ); } // escx: Set bracketed paste mode. auto& autowr(bool b) { return add(b ? "\033[?7h" : "\033[?7l" ); } // escx: Set autowrap mode. + auto& kkp_on(bool b) { return add(b ? "\033[>31u" : "" ); } // escx: Set KKP mode. + auto& kkp_off(bool b) { return add(b ? "\033[<1u" : "" ); } // escx: Reset KKP mode. auto& report(twod p) { return add("\033[", p.y+1, ";", p.x+1, "R" ); } // escx: Report 1-Based cursor position (CPR). auto& win_sz(twod p) { return add("\033[8;", p.y, ";", p.x, "t" ); } // escx: Report viewport size (Reply on CSI 18 t). auto& area_sz_px(twod p) { return add("\033[4;", p.y, ";", p.x, "t" ); } // escx: Report text area size in pixels (Reply on CSI 14 t). @@ -1045,6 +1047,8 @@ namespace netxs::ansi auto cursor(bool b) { return escx{}.cursor(b); } // ansi: Cursor visibility. auto appkey(bool b) { return escx{}.appkey(b); } // ansi: Application cursor Keys (DECCKM). auto bpmode(bool b) { return escx{}.bpmode(b); } // ansi: Set bracketed paste mode. + auto kkp_on(bool b) { return escx{}.kkp_on(b); } // ansi: Set KKP mode. + auto kkp_off(bool b) { return escx{}.kkp_off(b); } // ansi: Reset KKP mode. auto styled(si32 b) { return escx{}.styled(b); } // ansi: Enable line style reporting. auto style(si32 i) { return escx{}.style(i); } // ansi: Line style report. auto link(si32 i) { return escx{}.link(i); } // ansi: Set object id link. @@ -1536,6 +1540,50 @@ namespace netxs::ansi template using osc_h = std::function; template using osc_t = std::map>; + static constexpr auto maxarg = 32_sz; // ansi: Maximal number of the parameters in CSI sequence. + using fifo32 = netxs::generics::bank; + + static const auto ints = [](auto cmd){ return cmd >= 0x20 && cmd <= 0x2f; }; // "intermediate bytes" in the range 0x20–0x2F + static const auto pars = [](auto cmd){ return cmd >= 0x3C && cmd <= 0x3f; }; // Front "parameter bytes" in the range 0x3C–0x3F (0x30–0x3F) + static const auto cmds = [](auto cmd){ return cmd >= 0x40 && cmd <= 0x7E; }; + static const auto isC0 = [](auto cmd){ return cmd <= 0x1F; }; + static const auto read_CSI = [](auto& ascii, auto& queue, auto trap) + { + auto a = (si32)';'; + auto b = 0; + auto push = [&](auto num) // Parse subparameters divided by colon ':' (max arg value is 1,073,741,823) + { + if (a == ':') queue.template push(num); + else queue.template push(num); + }; + while (ascii.length()) + { + if (auto param = utf::to_int(ascii)) + { + push(param.value()); + if (ascii.empty()) break; + a = ascii.front(); // Delimiter or cmd after number. + trap(a); + if (ascii.empty()) break; + } + else + { + auto c = ascii.front(); + if (trap(c)) continue; + push(fifo32::skip); // Default parameter expressed by standalone delimiter/semicolon. + a = c; // Delimiter or cmd after number. + } + ascii.pop_front(); + if (ansi::cmds(a)) + { + queue.settop(a); + break; + } + else if (ansi::ints(a)) b = a; // Intermediate byte and parameter byte never appear at the same time, so consider they as a single group. + } + return b; + }; + template struct vt_parser { @@ -1604,19 +1652,11 @@ namespace netxs::ansi // ESC [ n1 ; n2:p1:p2:...pi ; ... nx CSICMD // [-----------------------] - static constexpr auto maxarg = 32_sz; // ansi: Maximal number of the parameters in one escaped sequence. - using fifo32 = generics::bank; - if (ascii.length()) { - auto b = 0; - auto ints = [](auto cmd){ return cmd >= 0x20 && cmd <= 0x2f; }; // "intermediate bytes" in the range 0x20–0x2F - auto pars = [](auto cmd){ return cmd >= 0x3C && cmd <= 0x3f; }; // "parameter bytes" in the range 0x30–0x3F - auto cmds = [](auto cmd){ return cmd >= 0x40 && cmd <= 0x7E; }; - auto isC0 = [](auto cmd){ return cmd <= 0x1F; }; auto trap = [&](auto& c) // Catch and execute C0. { - if (isC0(c)) + if (ansi::isC0(c)) { auto& intro = ansi::get_parser().intro; auto empty = qiew{}; @@ -1627,61 +1667,25 @@ namespace netxs::ansi if (ascii.empty()) break; c = ascii.front(); } - while (isC0(c)); + while (ansi::isC0(c)); return true; } return faux; }; - auto fill = [&](auto& queue) - { - auto a = (si32)';'; - auto push = [&](auto num) // Parse subparameters divided by colon ':' (max arg value is 1,073,741,823) - { - if (a == ':') queue.template push(num); - else queue.template push(num); - }; - - while (ascii.length()) - { - if (auto param = utf::to_int(ascii)) - { - push(param.value()); - if (ascii.empty()) break; - a = ascii.front(); // Delimiter or cmd after number. - trap(a); - if (ascii.empty()) break; - } - else - { - auto c = ascii.front(); - if (trap(c)) continue; - push(fifo32::skip); // Default parameter expressed by standalone delimiter/semicolon. - a = c; // Delimiter or cmd after number. - } - ascii.pop_front(); - if (cmds(a)) - { - queue.settop(a); - break; - } - else if (ints(a)) b = a; // Intermediate byte and parameter byte never appear at the same time, so consider they as a single group. - } - }; - auto& csier = ansi::get_parser().csier; auto c = ascii.front(); - if (cmds(c)) + if (ansi::cmds(c)) { ascii.pop_front(); csier.proceed(c, client); } else { - auto queue = fifo32{ ccc_nop }; // Reserve for the command type. - if (pars(c)) + auto queue = ansi::fifo32{ ansi::ccc_nop }; // Reserve for the command type. + if (ansi::pars(c)) { ascii.pop_front(); - fill(queue); + auto b = ansi::read_CSI(ascii, queue, trap); if (c == '?' ) { if (b == '$') csier.proceed_quest_dollarsn(queue, client); @@ -1693,7 +1697,7 @@ namespace netxs::ansi } else { - fill(queue); + auto b = ansi::read_CSI(ascii, queue, trap); if (b == '\0') csier.proceed (queue, client); else if (b == '!' ) csier.proceed_excl (queue, client); else if (b == '#' ) csier.proceed_hash (queue, client); diff --git a/src/netxs/desktopio/console.hpp b/src/netxs/desktopio/console.hpp index 0badd0c0c6..24046d3294 100644 --- a/src/netxs/desktopio/console.hpp +++ b/src/netxs/desktopio/console.hpp @@ -23,6 +23,7 @@ namespace netxs::ui static constexpr auto direct = 1 << (__COUNTER__ - _counter); static constexpr auto vtrgb = 1 << (__COUNTER__ - _counter); static constexpr auto vt_2D = 1 << (__COUNTER__ - _counter); + static constexpr auto vt_KKP = 1 << (__COUNTER__ - _counter); template auto str(T mode) @@ -37,6 +38,7 @@ namespace netxs::ui if (mode & vtrgb ) result += "vtrgb "; if (mode & vt_2D ) result += "vt_2D "; if (mode & direct ) result += "direct "; + if (mode & vt_KKP ) result += "KKP "; if (result.size()) result.pop_back(); } else result = "unknown"; diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 06078f079d..ca611e7266 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -72,24 +72,217 @@ namespace netxs::input static constexpr auto repeated = __COUNTER__ - _counter; static constexpr auto interrupted = __COUNTER__ - _counter; - static constexpr auto generic_sign = 0xF0; - static constexpr auto scancode_sign = 0x80; - static constexpr auto unpressed_sign = 0x40; // Pressed: 0x00 Released: 0x40 + static constexpr auto generic_sign = 0xF0; // generic event: 0b1111'xxxx xxxx=4-bit tier + static constexpr auto scancode_sign = 0x80; // virtcode: 0x00 scancode: 0x80 + static constexpr auto unpressed_sign = 0x40; // Pressed: 0x00 Released: 0x40 static constexpr auto cluster_sign = 0x20; static constexpr auto mouse_sign = 0x10; + //todo check non-us kb layouts with key::Slash + // Notes: + // IsoLevel3Shift: It is effectively AltGR. + // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. + // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. + #define key_list \ + /*Id Index Vkey Scan CtrlState Mask I Name GenericName */\ + X(0, 0, 0, 0, 0, 0x0000'00'FF, 1, undef , "undef" )\ + X(1, 0, 0xFF, 0xFF, 0, 0x0100'FF'FF, 0, config , "config" )\ + X(2, 0xA2, 0x11, 0x1D, 0, 0x0100'00'FF, 0, LeftCtrl , "Ctrl" )\ + X( 3, 0xA3, 0x11, 0x1D, ExtendedKey, 0x0100'00'FF, 0, RightCtrl , "Ctrl" )\ + X(4, 0xA4, 0x12, 0x38, 0, 0x0100'00'FF, 0, LeftAlt , "Alt" )\ + X( 5, 0xA5, 0x12, 0x38, ExtendedKey, 0x0100'00'FF, 0, RightAlt , "Alt" )\ + X(6, 0xA0, 0x10, 0x2A, 0, 0x0000'FF'FF, 0, LeftShift , "Shift" )\ + X( 7, 0xA1, 0x10, 0x36, 0, 0x0000'FF'FF, 0, RightShift , "Shift" )\ + X(8, 0x5B, 0x5B, 0x5B, ExtendedKey, 0x0100'00'FF, 0, LeftWin , "Win" )\ + X( 9, 0x5C, 0x5C, 0x5C, ExtendedKey, 0x0100'00'FF, 0, RightWin , "Win" )\ + X(10, 0x5B, 0x5B, 0x5B, 0, 0x0100'00'FF, 0, LeftHyper , "Hyper" )\ + X( 11, 0x5C, 0x5C, 0x5C, 0, 0x0100'00'FF, 0, RightHyper , "Hyper" )\ + X(12, 0x5D, 0x5D, 0x5D, ExtendedKey, 0x0000'00'FF, 0, Apps , "Apps" )\ + X(14, 0x90, 0x90, 0x45, 0, 0x0000'00'FF, 0, NumLock , "NumLock" )\ + X(16, 0x14, 0x14, 0x3A, 0, 0x0100'00'FF, 0, CapsLock , "CapsLock" )\ + X(18, 0x91, 0x91, 0x45, 0, 0x0100'00'FF, 0, ScrollLock , "ScrollLock" )\ + X(20, 0x14, 0x14, 0x3A, ExtendedKey, 0x0100'00'FF, 0, IsoLevel3Shift , "IsoLevel3Shift" )\ + X(22, 0x91, 0x91, 0x45, ExtendedKey, 0x0100'00'FF, 0, IsoLevel5Shift , "IsoLevel5Shift" )\ + X(24, 0x1B, 0x1B, 0x01, 0, 0x0000'00'FF, 1, Esc , "Esc" )\ + X(26, 0x20, 0x20, 0x39, 0, 0x0000'00'FF, 1, Space , "Space" )\ + X(28, 0x08, 0x08, 0x0E, 0, 0x0000'00'FF, 1, Backspace , "Backspace" )\ + X(30, 0x09, 0x09, 0x0F, 0, 0x0000'00'FF, 1, Tab , "Tab" )\ + X(32, 0x03, 0x03, 0x46, 0, 0x0000'FF'FF, 1, Break , "Break" )\ + X(34, 0x13, 0x13, 0x45, 0, 0x0000'FF'FF, 0, Pause , "Pause" )\ + X(36, 0x29, 0x29, 0, 0, 0x0000'00'FF, 0, Select , "Select" )\ + X(38, 0x2C, 0x2C, 0x54, 0, 0x0000'FF'FF, 1, SysRq , "SysRq" )\ + X(40, 0x2C, 0x2C, 0x37, ExtendedKey, 0x0100'FF'FF, 0, PrintScreen , "PrintScreen" )\ + X(42, 0x0D, 0x0D, 0x1C, 0, 0x0100'00'FF, 1, KeyEnter , "Enter" )\ + X( 43, 0x0D, 0x0D, 0x1C, ExtendedKey, 0x0100'00'FF, 1, NumpadEnter , "Enter" )\ + X(44, 0x21, 0x21, 0x49, ExtendedKey, 0x0100'00'FF, 1, KeyPageUp , "PageUp" )\ + X( 45, 0x21, 0x21, 0x49, 0, 0x0100'00'FF, 1, NumpadPageUp , "PageUp" )\ + X(46, 0x22, 0x22, 0x51, ExtendedKey, 0x0100'00'FF, 1, KeyPageDown , "PageDown" )\ + X( 47, 0x22, 0x22, 0x51, 0, 0x0100'00'FF, 1, NumpadPageDown , "PageDown" )\ + X(48, 0x23, 0x23, 0x4F, ExtendedKey, 0x0100'00'FF, 1, KeyEnd , "End" )/*don't reorder*/\ + X( 49, 0x23, 0x23, 0x4F, 0, 0x0100'00'FF, 1, NumpadEnd , "End" )/*don't reorder*/\ + X(50, 0x24, 0x24, 0x47, ExtendedKey, 0x0100'00'FF, 1, KeyHome , "Home" )/*don't reorder*/\ + X( 51, 0x24, 0x24, 0x47, 0, 0x0100'00'FF, 1, NumpadHome , "Home" )/*don't reorder*/\ + X(52, 0x25, 0x25, 0x4B, ExtendedKey, 0x0100'00'FF, 1, KeyLeftArrow , "LeftArrow" )/*don't reorder*/\ + X( 53, 0x25, 0x25, 0x4B, 0, 0x0100'00'FF, 1, NumpadLeftArrow , "LeftArrow" )/*don't reorder*/\ + X(54, 0x26, 0x26, 0x48, ExtendedKey, 0x0100'00'FF, 1, KeyUpArrow , "UpArrow" )/*don't reorder*/\ + X( 55, 0x26, 0x26, 0x48, 0, 0x0100'00'FF, 1, NumpadUpArrow , "UpArrow" )/*don't reorder*/\ + X(56, 0x27, 0x27, 0x4D, ExtendedKey, 0x0100'00'FF, 1, KeyRightArrow , "RightArrow" )/*don't reorder*/\ + X( 57, 0x27, 0x27, 0x4D, 0, 0x0100'00'FF, 1, NumpadRightArrow, "RightArrow" )/*don't reorder*/\ + X(58, 0x28, 0x28, 0x50, ExtendedKey, 0x0100'00'FF, 1, KeyDownArrow , "DownArrow" )/*don't reorder*/\ + X( 59, 0x28, 0x28, 0x50, 0, 0x0100'00'FF, 1, NumpadDownArrow , "DownArrow" )/*don't reorder*/\ + X(60, 0x30, 0x30, 0x0B, 0, 0x0000'FF'FF, 1, Key0 , "0" )\ + X( 61, 0x60, 0x60, 0x52, NumLockMode, 0x0000'FF'FF, 1, Numpad0 , "0" )\ + X(62, 0x31, 0x31, 0x02, 0, 0x0000'FF'FF, 1, Key1 , "1" )\ + X( 63, 0x61, 0x61, 0x4F, NumLockMode, 0x0000'FF'FF, 1, Numpad1 , "1" )\ + X(64, 0x32, 0x32, 0x03, 0, 0x0000'FF'FF, 1, Key2 , "2" )\ + X( 65, 0x62, 0x62, 0x50, NumLockMode, 0x0000'FF'FF, 1, Numpad2 , "2" )\ + X(66, 0x33, 0x33, 0x04, 0, 0x0000'FF'FF, 1, Key3 , "3" )\ + X( 67, 0x63, 0x63, 0x51, NumLockMode, 0x0000'FF'FF, 1, Numpad3 , "3" )\ + X(68, 0x34, 0x34, 0x05, 0, 0x0000'FF'FF, 1, Key4 , "4" )\ + X( 69, 0x64, 0x64, 0x4B, NumLockMode, 0x0000'FF'FF, 1, Numpad4 , "4" )\ + X(70, 0x35, 0x35, 0x06, 0, 0x0000'FF'FF, 1, Key5 , "5" )\ + X( 71, 0x65, 0x65, 0x4C, NumLockMode, 0x0000'FF'FF, 1, Numpad5 , "5" )\ + X(72, 0x36, 0x36, 0x07, 0, 0x0000'FF'FF, 1, Key6 , "6" )\ + X( 73, 0x66, 0x66, 0x4D, NumLockMode, 0x0000'FF'FF, 1, Numpad6 , "6" )\ + X(74, 0x37, 0x37, 0x08, 0, 0x0000'FF'FF, 1, Key7 , "7" )\ + X( 75, 0x67, 0x67, 0x47, NumLockMode, 0x0000'FF'FF, 1, Numpad7 , "7" )\ + X(76, 0x38, 0x38, 0x09, 0, 0x0000'FF'FF, 1, Key8 , "8" )\ + X( 77, 0x68, 0x68, 0x48, NumLockMode, 0x0000'FF'FF, 1, Numpad8 , "8" )\ + X(78, 0x39, 0x39, 0x0A, 0, 0x0000'FF'FF, 1, Key9 , "9" )\ + X( 79, 0x69, 0x69, 0x49, NumLockMode, 0x0000'FF'FF, 1, Numpad9 , "9" )\ + X(80, 0x2D, 0x2D, 0x52, ExtendedKey, 0x0100'00'FF, 1, KeyInsert , "Insert" )\ + X( 81, 0x2D, 0x2D, 0x52, 0, 0x0100'00'FF, 1, NumpadInsert , "Insert" )\ + X(82, 0x2E, 0x2E, 0x53, ExtendedKey, 0x0100'00'FF, 1, KeyDelete , "Delete" )\ + X( 83, 0x2E, 0x2E, 0x55, 0, 0x0100'00'FF, 1, NumpadDelete , "Delete" )\ + X(84, 0x0C, 0x0C, 0x4C, ExtendedKey, 0x0100'00'FF, 1, KeyClear , "Clear" )\ + X( 85, 0x0C, 0x0C, 0x4C, 0, 0x0100'00'FF, 1, NumpadClear , "Clear" )\ + X(86, 0x6A, 0x6A, 0x09, 0, 0x0000'FF'FF, 1, KeyMultiply , "*" )\ + X( 87, 0x6A, 0x6A, 0x37, 0, 0x0000'FF'FF, 1, NumpadMultiply , "*" )\ + X(88, 0x6B, 0x6B, 0x0D, 0, 0x0000'FF'FF, 1, KeyPlus , "Plus" )\ + X( 89, 0x6B, 0x6B, 0x4E, 0, 0x0000'FF'FF, 1, NumpadPlus , "Plus" )\ + X(90, 0x6C, 0x6C, 0, 0, 0x0020'00'FF, 1, KeySeparator , "Separator" )\ + X( 91, 0x6C, 0x6C, 0, NumLockMode, 0x0020'00'FF, 1, NumpadSeparator , "Separator" )\ + X(92, 0xBD, 0xBD, 0x0C, 0, 0x0000'00'FF, 1, KeyMinus , "Minus" )\ + X( 93, 0x6D, 0x6D, 0x4A, 0, 0x0000'00'FF, 1, NumpadMinus , "Minus" )\ + X(94, 0xBE, 0xBE, 0x34, 0, 0x0000'00'FF, 1, KeyPeriod , "." )\ + X( 95, 0x6E, 0x6E, 0x53, NumLockMode, 0x0000'00'FF, 1, NumpadDecimal , "." )\ + X(96, 0xBF, 0xBF, 0x35, 0, 0x0000'00'FF, 1, KeySlash , "/" )\ + X( 97, 0x6F, 0x6F, 0x35, ExtendedKey, 0x0000'00'FF, 1, NumpadSlash , "/" )\ + X(98, 0xBB, 0xBB, 0x0D, 0, 0x0100'00'FF, 1, Equal , "=" )\ + X( 99, 0xBB, 0xBB, 0x0D, ExtendedKey, 0x0100'00'FF, 1, NumpadEqual , "=" )\ + X(100, 0xDC, 0xDC, 0x2B, 0, 0x0000'00'FF, 1, BackSlash , "BackSlash" )\ + X(102, 0xDB, 0xDB, 0x1A, 0, 0x0000'00'FF, 1, OpenBracket , "[" )\ + X(104, 0xDD, 0xDD, 0x1B, 0, 0x0000'00'FF, 1, ClosedBracket , "]" )\ + X(106, 0xC0, 0xC0, 0x29, 0, 0x0000'00'FF, 1, BackQuote , "`" )\ + X(108, 0xDE, 0xDE, 0x28, 0, 0x0000'00'FF, 1, SingleQuote , "'" )\ + X(110, 0xBC, 0xBC, 0x33, 0, 0x0000'00'FF, 1, Comma , "," )\ + X(112, 0xBA, 0xBA, 0x27, 0, 0x0000'00'FF, 1, Semicolon , ";" )\ + X(114, 0x70, 0x70, 0x3B, 0, 0x0000'00'FF, 1, F1 , "F1" )\ + X(116, 0x71, 0x71, 0x3C, 0, 0x0000'00'FF, 1, F2 , "F2" )\ + X(118, 0x72, 0x72, 0x3D, 0, 0x0000'00'FF, 1, F3 , "F3" )\ + X(120, 0x73, 0x73, 0x3E, 0, 0x0000'00'FF, 1, F4 , "F4" )\ + X(122, 0x74, 0x74, 0x3F, 0, 0x0000'00'FF, 1, F5 , "F5" )\ + X(124, 0x75, 0x75, 0x40, 0, 0x0000'00'FF, 1, F6 , "F6" )\ + X(126, 0x76, 0x76, 0x41, 0, 0x0000'00'FF, 1, F7 , "F7" )\ + X(128, 0x77, 0x77, 0x42, 0, 0x0000'00'FF, 1, F8 , "F8" )\ + X(130, 0x78, 0x78, 0x43, 0, 0x0000'00'FF, 1, F9 , "F9" )\ + X(132, 0x79, 0x79, 0x44, 0, 0x0000'00'FF, 1, F10 , "F10" )\ + X(134, 0x7A, 0x7A, 0x57, 0, 0x0000'00'FF, 1, F11 , "F11" )\ + X(136, 0x7B, 0x7B, 0x5B, 0, 0x0000'00'FF, 1, F12 , "F12" )\ + X(138, 0x7C, 0x7C, 0, 0, 0x0000'00'FF, 1, F13 , "F13" )\ + X(140, 0x7D, 0x7D, 0, 0, 0x0100'00'FF, 1, F14 , "F14" )\ + X(142, 0x7E, 0x7E, 0, 0, 0x0100'00'FF, 1, F15 , "F15" )\ + X(144, 0x7F, 0x7F, 0, 0, 0x0100'00'FF, 1, F16 , "F16" )\ + X(146, 0x80, 0x80, 0, 0, 0x0100'00'FF, 1, F17 , "F17" )\ + X(148, 0x81, 0x81, 0, 0, 0x0100'00'FF, 1, F18 , "F18" )\ + X(150, 0x82, 0x82, 0, 0, 0x0100'00'FF, 1, F19 , "F19" )\ + X(152, 0x83, 0x83, 0, 0, 0x0100'00'FF, 1, F20 , "F20" )\ + X(154, 0x84, 0x84, 0, 0, 0x0100'00'FF, 1, F21 , "F21" )\ + X(156, 0x85, 0x85, 0, 0, 0x0100'00'FF, 1, F22 , "F22" )\ + X(158, 0x86, 0x86, 0, 0, 0x0100'00'FF, 1, F23 , "F23" )\ + X(160, 0x87, 0x87, 0, 0, 0x0100'00'FF, 1, F24 , "F24" )\ + X(162, 0x7D, 0x7D, 0, ExtendedKey, 0x0100'00'FF, 1, F25 , "F25" )\ + X(164, 0x7E, 0x7E, 0, ExtendedKey, 0x0100'00'FF, 1, F26 , "F26" )\ + X(166, 0x7F, 0x7F, 0, ExtendedKey, 0x0100'00'FF, 1, F27 , "F27" )\ + X(168, 0x80, 0x80, 0, ExtendedKey, 0x0100'00'FF, 1, F28 , "F28" )\ + X(170, 0x81, 0x81, 0, ExtendedKey, 0x0100'00'FF, 1, F29 , "F29" )\ + X(172, 0x82, 0x82, 0, ExtendedKey, 0x0100'00'FF, 1, F30 , "F30" )\ + X(174, 0x83, 0x83, 0, ExtendedKey, 0x0100'00'FF, 1, F31 , "F31" )\ + X(176, 0x84, 0x84, 0, ExtendedKey, 0x0100'00'FF, 1, F32 , "F32" )\ + X(178, 0x85, 0x85, 0, ExtendedKey, 0x0100'00'FF, 1, F33 , "F33" )\ + X(180, 0x86, 0x86, 0, ExtendedKey, 0x0100'00'FF, 1, F34 , "F34" )\ + X(182, 0x87, 0x87, 0, ExtendedKey, 0x0100'00'FF, 1, F35 , "F35" )\ + X(184, 0x41, 0x41, 0, 0, 0x0100'00'FF, 1, KeyA , "A" )\ + X(186, 0x42, 0x42, 0, 0, 0x0100'00'FF, 1, KeyB , "B" )\ + X(188, 0x43, 0x43, 0, 0, 0x0100'00'FF, 1, KeyC , "C" )\ + X(190, 0x44, 0x44, 0, 0, 0x0100'00'FF, 1, KeyD , "D" )\ + X(192, 0x45, 0x45, 0, 0, 0x0100'00'FF, 1, KeyE , "E" )\ + X(194, 0x46, 0x46, 0, 0, 0x0100'00'FF, 1, KeyF , "F" )\ + X(196, 0x47, 0x47, 0, 0, 0x0100'00'FF, 1, KeyG , "G" )\ + X(198, 0x48, 0x48, 0, 0, 0x0100'00'FF, 1, KeyH , "H" )\ + X(200, 0x49, 0x49, 0, 0, 0x0100'00'FF, 1, KeyI , "I" )\ + X(202, 0x4A, 0x4A, 0, 0, 0x0100'00'FF, 1, KeyJ , "J" )\ + X(204, 0x4B, 0x4B, 0, 0, 0x0100'00'FF, 1, KeyK , "K" )\ + X(206, 0x4C, 0x4C, 0, 0, 0x0100'00'FF, 1, KeyL , "L" )\ + X(208, 0x4D, 0x4D, 0, 0, 0x0100'00'FF, 1, KeyM , "M" )\ + X(210, 0x4E, 0x4E, 0, 0, 0x0100'00'FF, 1, KeyN , "N" )\ + X(212, 0x4F, 0x4F, 0, 0, 0x0100'00'FF, 1, KeyO , "O" )\ + X(214, 0x50, 0x50, 0, 0, 0x0100'00'FF, 1, KeyP , "P" )\ + X(216, 0x51, 0x51, 0, 0, 0x0100'00'FF, 1, KeyQ , "Q" )\ + X(218, 0x52, 0x52, 0, 0, 0x0100'00'FF, 1, KeyR , "R" )\ + X(220, 0x53, 0x53, 0, 0, 0x0100'00'FF, 1, KeyS , "S" )\ + X(222, 0x54, 0x54, 0, 0, 0x0100'00'FF, 1, KeyT , "T" )\ + X(224, 0x55, 0x55, 0, 0, 0x0100'00'FF, 1, KeyU , "U" )\ + X(226, 0x56, 0x56, 0, 0, 0x0100'00'FF, 1, KeyV , "V" )\ + X(228, 0x57, 0x57, 0, 0, 0x0100'00'FF, 1, KeyW , "W" )\ + X(230, 0x58, 0x58, 0, 0, 0x0100'00'FF, 1, KeyX , "X" )\ + X(232, 0x59, 0x59, 0, 0, 0x0100'00'FF, 1, KeyY , "Y" )\ + X(234, 0x5A, 0x5A, 0, 0, 0x0100'00'FF, 1, KeyZ , "Z" )\ + X(236, 0x5F, 0x5F, 0, ExtendedKey, 0x0100'00'FF, 0, Sleep , "Sleep" )\ + X(238, 0xB7, 0xB7, 0, ExtendedKey, 0x0100'00'FF, 0, Calculator , "Calculator" )\ + X(240, 0x48, 0x48, 0, ExtendedKey, 0x0100'00'FF, 0, Mail , "Mail" )\ + X(242, 0xAD, 0xAD, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolMute , "MediaVolMute" )\ + X(244, 0xAE, 0xAE, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolDown , "MediaVolDown" )\ + X(246, 0xAF, 0xAF, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolUp , "MediaVolUp" )\ + X(248, 0xB0, 0xB0, 0, ExtendedKey, 0x0100'00'FF, 0, MediaNext , "MediaNext" )\ + X(250, 0xB1, 0xB1, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPrev , "MediaPrev" )\ + X(252, 0xB2, 0xB2, 0, ExtendedKey, 0x0100'00'FF, 0, MediaStop , "MediaStop" )\ + X(254, 0xB2, 0xB2, 0, 0, 0x0100'00'FF, 0, MediaPause , "MediaPause" )\ + X(256, 0xB3, 0xB3, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPlayPause , "MediaPlayPause" )\ + X(258, 0xB3, 0xB3, 0, 0, 0x0100'00'FF, 0, MediaPlay , "MediaPlay" )\ + X(260, 0xB5, 0xB5, 0, ExtendedKey, 0x0100'00'FF, 0, MediaSelect , "MediaSelect" )\ + X(262, 0xB8, 0xB8, 0, ExtendedKey, 0x0100'00'FF, 0, MediaReverse , "MediaReverse" )\ + X(264, 0xB8, 0xB8, 0, 0, 0x0100'00'FF, 0, MediaRecord , "MediaRecord" )\ + X(266, 0xB9, 0xB9, 0, ExtendedKey, 0x0100'00'FF, 0, MediaFastForward, "MediaFastForward")\ + X(268, 0xB9, 0xB9, 0, 0, 0x0100'00'FF, 0, MediaRewind , "MediaRewind" )\ + X(270, 0xA6, 0xA6, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserBack , "BrowserBack" )\ + X(272, 0xA7, 0xA7, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserForward , "BrowserForward" )\ + X(274, 0xA8, 0xA8, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserRefresh , "BrowserRefresh" )\ + X(276, 0xA9, 0xA9, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserStop , "BrowserStop" )\ + X(278, 0xAA, 0xAA, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserSearch , "BrowserSearch" )\ + X(280, 0xAB, 0xAB, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserFavorites, "BrowserFavorites")\ + X(282, 0xAC, 0xAC, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserHome , "BrowserHome" )\ + X(284, 0xFF, 0xFF, 0xFF, ExtendedKey, 0x0100'FF'FF, 0, lastKey , "lastKey" ) + // Max 12 bits for KeyId. + static constexpr auto idbits = 12; + + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName) \ + static constexpr auto Name = KeyId; + key_list + #undef X + struct map { sz_t hash; // map: Key hash. static auto& mask() { - static auto m = std::vector(256); + static auto m = std::vector(input::key::lastKey); return m; } static auto& mask(si32 vk) { - return mask()[std::clamp(vk, 0, 255)]; + return mask()[std::clamp(vk, 0, input::key::lastKey - 1)]; } static auto& data(si32 keycode) { @@ -101,8 +294,8 @@ namespace netxs::input si32 scan; si32 edit; }; - static auto data = std::vector(256); - return data[std::clamp(keycode, 0, 255)]; + static auto data = std::vector(input::key::lastKey); + return data[std::clamp(keycode, 0, input::key::lastKey - 1)]; } map(si32 vk, si32 sc, si32 cs) @@ -125,170 +318,6 @@ namespace netxs::input }; }; - //todo check non-us kb layouts with key::Slash - #define key_list \ - /*Id Index Vkey Scan CtrlState Mask I Name GenericName */\ - X(0, 0, 0, 0, 0, 0x0000'00'FF, 1, undef , "undef" )\ - X(1, 0, 0xFF, 0xFF, 0, 0x0000'FF'FF, 0, config , "config" )\ - X(2, 0xA2, 0x11, 0x1D, 0, 0x0100'00'FF, 0, LeftCtrl , "Ctrl" )\ - X(3, 0xA3, 0x11, 0x1D, ExtendedKey, 0x0100'00'FF, 0, RightCtrl , "Ctrl" )\ - X(4, 0xA4, 0x12, 0x38, 0, 0x0100'00'FF, 0, LeftAlt , "Alt" )\ - X(5, 0xA5, 0x12, 0x38, ExtendedKey, 0x0100'00'FF, 0, RightAlt , "Alt" )\ - X(6, 0xA0, 0x10, 0x2A, 0, 0x0000'FF'FF, 0, LeftShift , "Shift" )\ - X(7, 0xA1, 0x10, 0x36, 0, 0x0000'FF'FF, 0, RightShift , "Shift" )\ - X(8, 0x5B, 0x5B, 0x5B, ExtendedKey, 0x0000'00'FF, 0, LeftWin , "Win" )\ - X(9, 0x5C, 0x5C, 0x5C, ExtendedKey, 0x0000'00'FF, 0, RightWin , "Win" )\ - X(10, 0x5D, 0x5D, 0x5D, ExtendedKey, 0x0000'00'FF, 0, Apps , "Apps" )\ - X(12, 0x90, 0x90, 0x45, 0, 0x0000'00'FF, 0, NumLock , "NumLock" )\ - X(14, 0x14, 0x14, 0x3A, 0, 0x0000'00'FF, 0, CapsLock , "CapsLock" )\ - X(16, 0x91, 0x91, 0x45, 0, 0x0000'00'FF, 0, ScrollLock , "ScrollLock" )\ - X(18, 0x1B, 0x1B, 0x01, 0, 0x0000'00'FF, 1, Esc , "Esc" )\ - X(20, 0x20, 0x20, 0x39, 0, 0x0000'00'FF, 1, Space , "Space" )\ - X(22, 0x08, 0x08, 0x0E, 0, 0x0000'00'FF, 1, Backspace , "Backspace" )\ - X(24, 0x09, 0x09, 0x0F, 0, 0x0000'00'FF, 1, Tab , "Tab" )\ - X(26, 0x03, 0x03, 0x46, 0, 0x0000'FF'FF, 1, Break , "Break" )\ - X(28, 0x13, 0x13, 0x45, 0, 0x0000'FF'FF, 0, Pause , "Pause" )\ - X(30, 0x29, 0x29, 0, 0, 0x0000'00'FF, 0, Select , "Select" )\ - X(32, 0x2C, 0x2C, 0x54, 0, 0x0000'FF'FF, 1, SysRq , "SysRq" )\ - X(34, 0x2C, 0x2C, 0x37, ExtendedKey, 0x0100'FF'FF, 0, PrintScreen , "PrintScreen" )\ - X(36, 0x0D, 0x0D, 0x1C, 0, 0x0100'00'FF, 1, KeyEnter , "Enter" )\ - X(37, 0x0D, 0x0D, 0x1C, ExtendedKey, 0x0100'00'FF, 1, NumpadEnter , "Enter" )\ - X(38, 0x21, 0x21, 0x49, ExtendedKey, 0x0100'00'FF, 1, KeyPageUp , "PageUp" )\ - X(39, 0x21, 0x21, 0x49, 0, 0x0100'00'FF, 1, NumpadPageUp , "PageUp" )\ - X(40, 0x22, 0x22, 0x51, ExtendedKey, 0x0100'00'FF, 1, KeyPageDown , "PageDown" )\ - X(41, 0x22, 0x22, 0x51, 0, 0x0100'00'FF, 1, NumpadPageDown , "PageDown" )\ - X(42, 0x23, 0x23, 0x4F, ExtendedKey, 0x0100'00'FF, 1, KeyEnd , "End" )\ - X(43, 0x23, 0x23, 0x4F, 0, 0x0100'00'FF, 1, NumpadEnd , "End" )\ - X(44, 0x24, 0x24, 0x47, ExtendedKey, 0x0100'00'FF, 1, KeyHome , "Home" )\ - X(45, 0x24, 0x24, 0x47, 0, 0x0100'00'FF, 1, NumpadHome , "Home" )\ - X(46, 0x25, 0x25, 0x4B, ExtendedKey, 0x0100'00'FF, 1, KeyLeftArrow , "LeftArrow" )\ - X(47, 0x25, 0x25, 0x4B, 0, 0x0100'00'FF, 1, NumpadLeftArrow , "LeftArrow" )\ - X(48, 0x26, 0x26, 0x48, ExtendedKey, 0x0100'00'FF, 1, KeyUpArrow , "UpArrow" )\ - X(49, 0x26, 0x26, 0x48, 0, 0x0100'00'FF, 1, NumpadUpArrow , "UpArrow" )\ - X(50, 0x27, 0x27, 0x4D, ExtendedKey, 0x0100'00'FF, 1, KeyRightArrow , "RightArrow" )\ - X(51, 0x27, 0x27, 0x4D, 0, 0x0100'00'FF, 1, NumpadRightArrow, "RightArrow" )\ - X(52, 0x28, 0x28, 0x50, ExtendedKey, 0x0100'00'FF, 1, KeyDownArrow , "DownArrow" )\ - X(53, 0x28, 0x28, 0x50, 0, 0x0100'00'FF, 1, NumpadDownArrow , "DownArrow" )\ - X(54, 0x30, 0x30, 0x0B, 0, 0x0000'FF'FF, 1, Key0 , "0" )\ - X(55, 0x60, 0x60, 0x52, NumLockMode, 0x0000'FF'FF, 1, Numpad0 , "0" )\ - X(56, 0x31, 0x31, 0x02, 0, 0x0000'FF'FF, 1, Key1 , "1" )\ - X(57, 0x61, 0x61, 0x4F, NumLockMode, 0x0000'FF'FF, 1, Numpad1 , "1" )\ - X(58, 0x32, 0x32, 0x03, 0, 0x0000'FF'FF, 1, Key2 , "2" )\ - X(59, 0x62, 0x62, 0x50, NumLockMode, 0x0000'FF'FF, 1, Numpad2 , "2" )\ - X(60, 0x33, 0x33, 0x04, 0, 0x0000'FF'FF, 1, Key3 , "3" )\ - X(61, 0x63, 0x63, 0x51, NumLockMode, 0x0000'FF'FF, 1, Numpad3 , "3" )\ - X(62, 0x34, 0x34, 0x05, 0, 0x0000'FF'FF, 1, Key4 , "4" )\ - X(63, 0x64, 0x64, 0x4B, NumLockMode, 0x0000'FF'FF, 1, Numpad4 , "4" )\ - X(64, 0x35, 0x35, 0x06, 0, 0x0000'FF'FF, 1, Key5 , "5" )\ - X(65, 0x65, 0x65, 0x4C, NumLockMode, 0x0000'FF'FF, 1, Numpad5 , "5" )\ - X(66, 0x36, 0x36, 0x07, 0, 0x0000'FF'FF, 1, Key6 , "6" )\ - X(67, 0x66, 0x66, 0x4D, NumLockMode, 0x0000'FF'FF, 1, Numpad6 , "6" )\ - X(68, 0x37, 0x37, 0x08, 0, 0x0000'FF'FF, 1, Key7 , "7" )\ - X(69, 0x67, 0x67, 0x47, NumLockMode, 0x0000'FF'FF, 1, Numpad7 , "7" )\ - X(70, 0x38, 0x38, 0x09, 0, 0x0000'FF'FF, 1, Key8 , "8" )\ - X(71, 0x68, 0x68, 0x48, NumLockMode, 0x0000'FF'FF, 1, Numpad8 , "8" )\ - X(72, 0x39, 0x39, 0x0A, 0, 0x0000'FF'FF, 1, Key9 , "9" )\ - X(73, 0x69, 0x69, 0x49, NumLockMode, 0x0000'FF'FF, 1, Numpad9 , "9" )\ - X(74, 0x2D, 0x2D, 0x52, ExtendedKey, 0x0100'00'FF, 1, KeyInsert , "Insert" )\ - X(75, 0x2D, 0x2D, 0x52, 0, 0x0100'00'FF, 1, NumpadInsert , "Insert" )\ - X(76, 0x2E, 0x2E, 0x53, ExtendedKey, 0x0100'00'FF, 1, KeyDelete , "Delete" )\ - X(77, 0x2E, 0x2E, 0x55, 0, 0x0100'00'FF, 1, NumpadDelete , "Delete" )\ - X(78, 0x0C, 0x0C, 0x4C, ExtendedKey, 0x0100'00'FF, 1, KeyClear , "Clear" )\ - X(79, 0x0C, 0x0C, 0x4C, 0, 0x0100'00'FF, 1, NumpadClear , "Clear" )\ - X(80, 0x6A, 0x6A, 0x09, 0, 0x0000'FF'FF, 1, KeyMultiply , "*" )\ - X(81, 0x6A, 0x6A, 0x37, 0, 0x0000'FF'FF, 1, NumpadMultiply , "*" )\ - X(82, 0x6B, 0x6B, 0x0D, 0, 0x0000'FF'FF, 1, KeyPlus , "Plus" )\ - X(83, 0x6B, 0x6B, 0x4E, 0, 0x0000'FF'FF, 1, NumpadPlus , "Plus" )\ - X(84, 0x6C, 0x6C, 0, 0, 0x0020'00'FF, 1, KeySeparator , "Separator" )\ - X(85, 0x6C, 0x6C, 0, NumLockMode, 0x0020'00'FF, 1, NumpadSeparator , "Separator" )\ - X(86, 0xBD, 0xBD, 0x0C, 0, 0x0000'00'FF, 1, KeyMinus , "Minus" )\ - X(87, 0x6D, 0x6D, 0x4A, 0, 0x0000'00'FF, 1, NumpadMinus , "Minus" )\ - X(88, 0xBE, 0xBE, 0x34, 0, 0x0000'00'FF, 1, KeyPeriod , "." )\ - X(89, 0x6E, 0x6E, 0x53, NumLockMode, 0x0000'00'FF, 1, NumpadDecimal , "." )\ - X(90, 0xBF, 0xBF, 0x35, 0, 0x0000'00'FF, 1, KeySlash , "/" )\ - X(91, 0x6F, 0x6F, 0x35, ExtendedKey, 0x0000'00'FF, 1, NumpadSlash , "/" )\ - X(92, 0xDC, 0xDC, 0x2B, 0, 0x0000'00'FF, 1, BackSlash , "BackSlash" )\ - X(94, 0xDB, 0xDB, 0x1A, 0, 0x0000'00'FF, 1, OpenBracket , "[" )\ - X(96, 0xDD, 0xDD, 0x1B, 0, 0x0000'00'FF, 1, ClosedBracket , "]" )\ - X(98, 0xBB, 0xBB, 0x0D, 0, 0x0000'00'FF, 1, Equal , "=" )\ - X(100, 0xC0, 0xC0, 0x29, 0, 0x0000'00'FF, 1, BackQuote , "`" )\ - X(102, 0xDE, 0xDE, 0x28, 0, 0x0000'00'FF, 1, SingleQuote , "'" )\ - X(104, 0xBC, 0xBC, 0x33, 0, 0x0000'00'FF, 1, Comma , "," )\ - X(106, 0xBA, 0xBA, 0x27, 0, 0x0000'00'FF, 1, Semicolon , ";" )\ - X(108, 0x70, 0x70, 0x3B, 0, 0x0000'00'FF, 1, F1 , "F1" )\ - X(110, 0x71, 0x71, 0x3C, 0, 0x0000'00'FF, 1, F2 , "F2" )\ - X(112, 0x72, 0x72, 0x3D, 0, 0x0000'00'FF, 1, F3 , "F3" )\ - X(114, 0x73, 0x73, 0x3E, 0, 0x0000'00'FF, 1, F4 , "F4" )\ - X(116, 0x74, 0x74, 0x3F, 0, 0x0000'00'FF, 1, F5 , "F5" )\ - X(118, 0x75, 0x75, 0x40, 0, 0x0000'00'FF, 1, F6 , "F6" )\ - X(120, 0x76, 0x76, 0x41, 0, 0x0000'00'FF, 1, F7 , "F7" )\ - X(122, 0x77, 0x77, 0x42, 0, 0x0000'00'FF, 1, F8 , "F8" )\ - X(124, 0x78, 0x78, 0x43, 0, 0x0000'00'FF, 1, F9 , "F9" )\ - X(126, 0x79, 0x79, 0x44, 0, 0x0000'00'FF, 1, F10 , "F10" )\ - X(128, 0x7A, 0x7A, 0x57, 0, 0x0000'00'FF, 1, F11 , "F11" )\ - X(130, 0x7B, 0x7B, 0x5B, 0, 0x0000'00'FF, 1, F12 , "F12" )\ - X(132, 0x7C, 0x7C, 0, 0, 0x0000'00'FF, 1, F13 , "F13" )\ - X(134, 0x7D, 0x7D, 0, 0, 0x0000'00'FF, 1, F14 , "F14" )\ - X(136, 0x7E, 0x7E, 0, 0, 0x0000'00'FF, 1, F15 , "F15" )\ - X(138, 0x7F, 0x7F, 0, 0, 0x0000'00'FF, 1, F16 , "F16" )\ - X(140, 0x80, 0x80, 0, 0, 0x0000'00'FF, 1, F17 , "F17" )\ - X(142, 0x81, 0x81, 0, 0, 0x0000'00'FF, 1, F18 , "F18" )\ - X(144, 0x82, 0x82, 0, 0, 0x0000'00'FF, 1, F19 , "F19" )\ - X(146, 0x83, 0x83, 0, 0, 0x0000'00'FF, 1, F20 , "F20" )\ - X(148, 0x84, 0x84, 0, 0, 0x0000'00'FF, 1, F21 , "F21" )\ - X(150, 0x85, 0x85, 0, 0, 0x0000'00'FF, 1, F22 , "F22" )\ - X(152, 0x86, 0x86, 0, 0, 0x0000'00'FF, 1, F23 , "F23" )\ - X(154, 0x87, 0x87, 0, 0, 0x0000'00'FF, 1, F24 , "F24" )\ - X(156, 0x41, 0x41, 0, 0, 0x0100'00'FF, 1, KeyA , "A" )\ - X(158, 0x42, 0x42, 0, 0, 0x0100'00'FF, 1, KeyB , "B" )\ - X(160, 0x43, 0x43, 0, 0, 0x0100'00'FF, 1, KeyC , "C" )\ - X(162, 0x44, 0x44, 0, 0, 0x0100'00'FF, 1, KeyD , "D" )\ - X(164, 0x45, 0x45, 0, 0, 0x0100'00'FF, 1, KeyE , "E" )\ - X(166, 0x46, 0x46, 0, 0, 0x0100'00'FF, 1, KeyF , "F" )\ - X(168, 0x47, 0x47, 0, 0, 0x0100'00'FF, 1, KeyG , "G" )\ - X(170, 0x48, 0x48, 0, 0, 0x0100'00'FF, 1, KeyH , "H" )\ - X(172, 0x49, 0x49, 0, 0, 0x0100'00'FF, 1, KeyI , "I" )\ - X(174, 0x4A, 0x4A, 0, 0, 0x0100'00'FF, 1, KeyJ , "J" )\ - X(176, 0x4B, 0x4B, 0, 0, 0x0100'00'FF, 1, KeyK , "K" )\ - X(178, 0x4C, 0x4C, 0, 0, 0x0100'00'FF, 1, KeyL , "L" )\ - X(180, 0x4D, 0x4D, 0, 0, 0x0100'00'FF, 1, KeyM , "M" )\ - X(182, 0x4E, 0x4E, 0, 0, 0x0100'00'FF, 1, KeyN , "N" )\ - X(184, 0x4F, 0x4F, 0, 0, 0x0100'00'FF, 1, KeyO , "O" )\ - X(186, 0x50, 0x50, 0, 0, 0x0100'00'FF, 1, KeyP , "P" )\ - X(188, 0x51, 0x51, 0, 0, 0x0100'00'FF, 1, KeyQ , "Q" )\ - X(190, 0x52, 0x52, 0, 0, 0x0100'00'FF, 1, KeyR , "R" )\ - X(192, 0x53, 0x53, 0, 0, 0x0100'00'FF, 1, KeyS , "S" )\ - X(194, 0x54, 0x54, 0, 0, 0x0100'00'FF, 1, KeyT , "T" )\ - X(196, 0x55, 0x55, 0, 0, 0x0100'00'FF, 1, KeyU , "U" )\ - X(198, 0x56, 0x56, 0, 0, 0x0100'00'FF, 1, KeyV , "V" )\ - X(200, 0x57, 0x57, 0, 0, 0x0100'00'FF, 1, KeyW , "W" )\ - X(202, 0x58, 0x58, 0, 0, 0x0100'00'FF, 1, KeyX , "X" )\ - X(204, 0x59, 0x59, 0, 0, 0x0100'00'FF, 1, KeyY , "Y" )\ - X(206, 0x5A, 0x5A, 0, 0, 0x0100'00'FF, 1, KeyZ , "Z" )\ - X(208, 0x5F, 0x5F, 0, ExtendedKey, 0x0100'00'FF, 0, Sleep , "Sleep" )\ - X(210, 0xB7, 0xB7, 0, ExtendedKey, 0x0100'00'FF, 0, Calculator , "Calculator" )\ - X(212, 0x48, 0x48, 0, ExtendedKey, 0x0100'00'FF, 0, Mail , "Mail" )\ - X(214, 0xAD, 0xAD, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolMute , "MediaVolMute" )\ - X(216, 0xAE, 0xAE, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolDown , "MediaVolDown" )\ - X(218, 0xAF, 0xAF, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolUp , "MediaVolUp" )\ - X(220, 0xB0, 0xB0, 0, ExtendedKey, 0x0100'00'FF, 0, MediaNext , "MediaNext" )\ - X(222, 0xB1, 0xB1, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPrev , "MediaPrev" )\ - X(224, 0xB2, 0xB2, 0, ExtendedKey, 0x0100'00'FF, 0, MediaStop , "MediaStop" )\ - X(226, 0xB3, 0xB3, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPlayPause , "MediaPlayPause" )\ - X(228, 0xB5, 0xB5, 0, ExtendedKey, 0x0100'00'FF, 0, MediaSelect , "MediaSelect" )\ - X(230, 0xA6, 0xA6, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserBack , "BrowserBack" )\ - X(232, 0xA7, 0xA7, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserForward , "BrowserForward" )\ - X(234, 0xA8, 0xA8, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserRefresh , "BrowserRefresh" )\ - X(236, 0xA9, 0xA9, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserStop , "BrowserStop" )\ - X(238, 0xAA, 0xAA, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserSearch , "BrowserSearch" )\ - X(240, 0xAB, 0xAB, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserFavorites, "BrowserFavorites")\ - X(242, 0xAC, 0xAC, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserHome , "BrowserHome" ) - - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName) \ - static constexpr auto Name = KeyId; - key_list - #undef X - static const auto keymap = std::unordered_map { #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName) \ @@ -348,11 +377,11 @@ namespace netxs::input #undef key_list // The bind record is a set of 16-bit words: 0x000a 0x000b ... 0xffff 0xa 0xfe0e - // 15 bit: 0 - virt code, 1 - scan code ('\x80'). - // 14 bit: 0 - pressed, 1 - released ('\x40'). - // 13 bit: 1 - all subsequent bytes form a grapheme cluster ('\x20'). - // 12 bit: 1 - mouse code ('\x10'). - // 0-11 bits: virt, scan or mouse code. For clusters it is set to '\x20FF'('\x60FF'). + // 15 bit: 0 - virt code, 1 - scan code (0x80'00). + // 14 bit: 0 - pressed, 1 - released (0x40'00). + // 13 bit: 1 - all subsequent bytes form a grapheme cluster (0x20'00). + // 12 bit: 1 - mouse code (0x10'00). + // 0-11 bits: virt (aka KeyId, keycode), scan or mouse code. For clusters it is set to '\x20FF'('\x60FF'). // Generic events: (12-15 bits on) (0xFn ' 00 00 00 00) -- (0xF0 & 4-bit tier ' 32-bit generic event_id). auto is_generic( byte sign) { return (sign & input::key::generic_sign) == input::key::generic_sign; } auto is_scancode(byte sign) { return sign & input::key::scancode_sign; } @@ -394,13 +423,19 @@ namespace netxs::input } static void push_keyid(bool ispressed, text& vkchord, si32 keyid) { - vkchord.push_back((byte)(ispressed ? 0x00 : input::key::unpressed_sign)); - vkchord.push_back((byte)keyid); + keyid &= 0x0FFF; // 12 bit max. + auto hi_12bit_keyid = (byte)(keyid >> 8); + auto lo_12bit_keyid = (byte)(keyid & 0xFF); + vkchord.push_back(hi_12bit_keyid | (byte)(ispressed ? 0x00 : input::key::unpressed_sign)); + vkchord.push_back(lo_12bit_keyid); } static void push_scode(bool ispressed, text& scchord, si32 scode) { - scchord.push_back((byte)((ispressed ? 0x00 : input::key::unpressed_sign) | input::key::scancode_sign | ((scode >> 8) & 0x01))); - scchord.push_back((byte)(scode & 0xFF)); + scode &= 0x0FFF; // 12 bit max. + auto hi_12bit_scode = (byte)((scode >> 8) & 0x01); + auto lo_12bit_scode = (byte)(scode & 0xFF); + scchord.push_back(hi_12bit_scode | (byte)((ispressed ? 0x00 : input::key::unpressed_sign) | input::key::scancode_sign)); + scchord.push_back(lo_12bit_scode); } static void push_cluster(bool ispressed, text& chchord, view cluster) { @@ -473,14 +508,14 @@ namespace netxs::input auto crop = text{}; while (chord.size() > 1) { - auto s = (byte)chord.pop_front(); - auto v = (byte)chord.pop_front(); + auto s = (si32)(byte)chord.pop_front(); + auto v = (si32)(byte)chord.pop_front(); if (crop.size() || s & input::key::unpressed_sign) crop += s & input::key::unpressed_sign ? '-' : '+'; if (s & input::key::scancode_sign) // Scancodes. { - auto value = v | (s & 0x01 ? 0x100 : 0); - auto length = value & 0xF00 ? 3 : 2; - crop += "0x" + utf::to_hex(value, length); + auto scancode = v | (s & 0x01 ? 0x100 : 0); + auto length = scancode & 0xF00 ? 3 : 2; + crop += "0x" + utf::to_hex(scancode, length); } else if (s & input::key::cluster_sign) // Cluster. { @@ -489,9 +524,10 @@ namespace netxs::input crop += '\'' + plain + '\''; chord.clear(); } - else // Keyids + else // 12-bit Keyid { - crop += generic ? input::key::map::data(v).generic : input::key::map::data(v).name; + auto keyid = v | ((s & 0x0F) << 8); + crop += generic ? input::key::map::data(keyid).generic : input::key::map::data(keyid).name; } } return crop; @@ -1331,6 +1367,10 @@ namespace netxs::input RShift = 1 << 5, // Right ⇧ Shift LWin = 1 << 6, // Left ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super RWin = 1 << 7, // Right ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super + LHyper = 1 << 8, // Left Hyper + RHyper = 1 << 9, // Right Hyper + // = 1 << 10, + // = 1 << 11, NumLock = 1 << 12, // ⇭ Num Lock CapsLock = 1 << 13, // ⇪ Caps Lock ScrlLock = 1 << 14, // ⇳ Scroll Lock (⤓) @@ -1341,7 +1381,19 @@ namespace netxs::input anyShift = LShift | RShift, anyCtrlAlt = anyAlt | anyCtrl, anyWin = LWin | RWin, - anyMod = anyAlt | anyCtrl | anyShift | anyWin, + anyHyper = LHyper | RHyper, + anyMod = anyAlt | anyCtrl | anyShift | anyWin | anyHyper, + }; + struct kkp + { + static constexpr auto shift = 0b1; // 1 + static constexpr auto alt = 0b10; // 2 + static constexpr auto ctrl = 0b100; // 4 + static constexpr auto super = 0b1000; // 8 + static constexpr auto hyper = 0b10000; // 16 + static constexpr auto meta = 0b100000; // 32 + static constexpr auto caps_lock = 0b1000000; // 64 + static constexpr auto num_lock = 0b10000000; // 128 }; static auto build_alone_key() @@ -1409,27 +1461,27 @@ namespace netxs::input { return std::unordered_map { - { key::KeyEnter | hids::anyCtrl << 8, { "\x0a" }}, - { key::Backspace | hids::anyCtrl << 8, { "\x08" }}, - { key::Backspace | hids::anyAlt << 8, { "\033\x7f" }}, - { key::Backspace | hids::anyCtrlAlt << 8, { "\033\x08" }}, - { key::Tab | hids::anyCtrl << 8, { "\t" }}, - { key::Tab | hids::anyShift << 8, { "\033[Z" }}, - { key::Tab | hids::anyAlt << 8, { "\033[1;3I" }}, - { key::Esc | hids::anyAlt << 8, { "\033\033" }}, - { key::Key1 | hids::anyCtrl << 8, { "1" }}, - { key::Key3 | hids::anyCtrl << 8, { "\x1b" }}, - { key::Key4 | hids::anyCtrl << 8, { "\x1c" }}, - { key::Key5 | hids::anyCtrl << 8, { "\x1d" }}, - { key::Key6 | hids::anyCtrl << 8, { "\x1e" }}, - { key::Key7 | hids::anyCtrl << 8, { "\x1f" }}, - { key::Key8 | hids::anyCtrl << 8, { "\x7f" }}, - { key::Key9 | hids::anyCtrl << 8, { "9" }}, - { key::KeySlash | hids::anyCtrl << 8, { "\x1f" }}, - { slash | hids::anyCtrlAlt << 8, { "\033\x1f" }}, - { slash | hids::anyCtrl << 8, { "\x1f" }}, - { quest | hids::anyCtrlAlt << 8, { "\033\x7f" }}, - { quest | hids::anyCtrl << 8, { "\x7f" }}, + { key::KeyEnter | (hids::anyCtrl << key::idbits), { "\x0a" }}, + { key::Backspace | (hids::anyCtrl << key::idbits), { "\x08" }}, + { key::Backspace | (hids::anyAlt << key::idbits), { "\033\x7f" }}, + { key::Backspace | (hids::anyCtrlAlt << key::idbits), { "\033\x08" }}, + { key::Tab | (hids::anyCtrl << key::idbits), { "\t" }}, + { key::Tab | (hids::anyShift << key::idbits), { "\033[Z" }}, + { key::Tab | (hids::anyAlt << key::idbits), { "\033[1;3I" }}, + { key::Esc | (hids::anyAlt << key::idbits), { "\033\033" }}, + { key::Key1 | (hids::anyCtrl << key::idbits), { "1" }}, + { key::Key3 | (hids::anyCtrl << key::idbits), { "\x1b" }}, + { key::Key4 | (hids::anyCtrl << key::idbits), { "\x1c" }}, + { key::Key5 | (hids::anyCtrl << key::idbits), { "\x1d" }}, + { key::Key6 | (hids::anyCtrl << key::idbits), { "\x1e" }}, + { key::Key7 | (hids::anyCtrl << key::idbits), { "\x1f" }}, + { key::Key8 | (hids::anyCtrl << key::idbits), { "\x7f" }}, + { key::Key9 | (hids::anyCtrl << key::idbits), { "9" }}, + { key::KeySlash | (hids::anyCtrl << key::idbits), { "\x1f" }}, + { slash | (hids::anyCtrlAlt << key::idbits), { "\033\x1f" }}, + { slash | (hids::anyCtrl << key::idbits), { "\x1f" }}, + { quest | (hids::anyCtrlAlt << key::idbits), { "\033\x7f" }}, + { quest | (hids::anyCtrl << key::idbits), { "\x7f" }}, }; } @@ -1572,9 +1624,9 @@ namespace netxs::input } tooltip{ *this }; // hids: Tooltips. - base& owner; - core const& idmap; // hids: Area of the main form. Primary or relative region of the mouse coverage. - bool alive; // hids: Whether event processing is complete. + base& owner; + core const& idmap; // hids: Area of the main form. Primary or relative region of the mouse coverage. + bool alive; // hids: Whether event processing is complete. ui::pro::timer& timer; // hids: . //todo unify @@ -1601,7 +1653,7 @@ namespace netxs::input alive{ faux }, timer{ base::plugin() }, gear_index{ indexer.take_gear_available_index(use_index) }, - other_key{ build_other_key(key::KeySlash, key::KeySlash | (hids::anyShift << 8)) }, // Defaults for US layout. + other_key{ build_other_key(key::KeySlash, key::KeySlash | (hids::anyShift << key::idbits)) }, // Defaults for US layout. multihome{ owner.base::property("multihome") } { mouse::prime = dot_mx; @@ -2126,7 +2178,7 @@ namespace netxs::input if (ctrl ) mods += 4; return it_shift->second; } - else if (auto it_other = other_key.find(v | (shift | alt | ctrl) << 8); it_other != other_key.end()) + else if (auto it_other = other_key.find(v | (shift | alt | ctrl) << key::idbits); it_other != other_key.end()) { return it_other->second; } diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 77c6a11a1c..7bae9cdccb 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -970,7 +970,7 @@ namespace netxs::os } template - auto kbstate(si32& modstate, T1 ms_ctrls, T2 scancode = {}, bool pressed = {}) + auto kbstate(si32& modstate, T1 ms_ctrls, T2 scancode, bool pressed, bool extflag) { auto prevstate = modstate; if (scancode == 0x2a) @@ -983,16 +983,26 @@ namespace netxs::os if (pressed) modstate |= input::hids::RShift; else modstate &=~input::hids::RShift; } - else if (scancode == 0x5b) + else if (scancode == 0x5b && extflag) { if (pressed) modstate |= input::hids::LWin; else modstate &=~input::hids::LWin; } - else if (scancode == 0x5c) + else if (scancode == 0x5c && extflag) { if (pressed) modstate |= input::hids::RWin; else modstate &=~input::hids::RWin; } + else if (scancode == 0x5b && !extflag) + { + if (pressed) modstate |= input::hids::LHyper; + else modstate &=~input::hids::LHyper; + } + else if (scancode == 0x5c && !extflag) + { + if (pressed) modstate |= input::hids::RHyper; + else modstate &=~input::hids::RHyper; + } if (!(modstate & input::hids::anyShift) && ms_ctrls & SHIFT_PRESSED) // Restore Shift after refocusing. { modstate |= input::hids::LShift; @@ -1001,6 +1011,8 @@ namespace netxs::os auto rshift = modstate & input::hids::RShift; auto lwin = modstate & input::hids::LWin; auto rwin = modstate & input::hids::RWin; + auto lhyper = modstate & input::hids::LHyper; + auto rhyper = modstate & input::hids::RHyper; bool lalt = ms_ctrls & LEFT_ALT_PRESSED; bool ralt = ms_ctrls & RIGHT_ALT_PRESSED; bool lctrl = ms_ctrls & LEFT_CTRL_PRESSED; @@ -1017,6 +1029,8 @@ namespace netxs::os if (rctrl ) state |= input::hids::RCtrl; if (lwin ) state |= input::hids::LWin; if (rwin ) state |= input::hids::RWin; + if (lhyper) state |= input::hids::LHyper; + if (rhyper) state |= input::hids::RHyper; if (nums ) state |= input::hids::NumLock; if (caps ) state |= input::hids::CapsLock; if (scrl ) state |= input::hids::ScrlLock; @@ -1032,15 +1046,17 @@ namespace netxs::os bool changed{}; // Modifiers state changed. bool repeats{}; // Modifier repeated. } stat; - stat.changed = kbstate(modstate, ms_ctrls, scancode, pressed); + stat.changed = kbstate(modstate, ms_ctrls, scancode, pressed, ms_ctrls & ENHANCED_KEY); if (!pressed) return stat; if (stat.changed) return stat; scancode |= ms_ctrls & ENHANCED_KEY; stat.repeats = scancode == 0x002a // input::hids::LShift || scancode == 0x0036 // input::hids::RShift (Windows command prompt) || scancode == 0x0136 // input::hids::RShift (Windows terminal) - || scancode == 0x005b // input::hids::LWin - || scancode == 0x005c // input::hids::RWin + || scancode == 0x015b // input::hids::LWin + || scancode == 0x015c // input::hids::RWin + || scancode == 0x005b // input::hids::LHyper + || scancode == 0x005c // input::hids::RHyper || scancode == 0x001d // input::hids::LCtrl || scancode == 0x011d // input::hids::RCtrl || scancode == 0x0038 // input::hids::LAlt @@ -4335,7 +4351,7 @@ namespace netxs::os if (os::stdin_fd != os::invalid_fd && os::stdout_fd != os::invalid_fd) { auto lock = netxs::generics::waitable{}; - io::send(os::stdout_fd, "\x1b[c"sv); // Send "\e[c" request. Primary device attributes (DA1). + io::send(os::stdout_fd, "\x1b[?u\x1b[c"sv); // Send "\e[?u\e[c" request. KKP + DA1. auto reading_thread = std::thread{ [&] { auto buffer = std::array{}; @@ -4348,6 +4364,10 @@ namespace netxs::os } if (answer.size()) { + if (answer.find("u\x1b[") != text::npos) // Check the answer for "\x1b[?...u\x1b[...c". KKP is available. + { + dtvt::vtmode |= ui::console::vt_KKP; + } if (answer.find("10060") != text::npos) // Check the answer for "\x1b[?1;2;10060c". { vtm_env = "1"; @@ -4388,6 +4408,9 @@ namespace netxs::os : dtvt::vtmode & ui::console::vt256 ? "xterm 256-color" : dtvt::vtmode & ui::console::vtrgb ? "xterm truecolor" : "xterm VT2D (TrueColor with 2D Character Geometry)"); + log(prompt::os, "Keybd mode: ", dtvt::vtmode & ui::console::nt ? "Win32 Console API" + : dtvt::vtmode & ui::console::vt_KKP ? "KKP" + : "VT-style"); log(prompt::os, "Mouse mode: ", dtvt::vtmode & ui::console::mouse ? "Kernel input device" : dtvt::vtmode & ui::console::nt ? "Win32 Console API" : "VT-style"); @@ -5584,6 +5607,7 @@ namespace netxs::os style, paste, mousevtim, + kkp, }; static const auto style_cmd = "\033[" + std::to_string(ansi::ccc_stl) + ":"; auto take_sequence = [](qiew& cache) @@ -5624,6 +5648,10 @@ namespace netxs::os { if (len > 3 && s[2] == '<') t = type::mouse; } + else if (os::dtvt::vtmode & ui::console::vt_KKP && "u~ABCDEFHPQS"s.find(c) != text::npos) // KKP + { + t = type::kkp; + } else if (c == 'p') { if (s.starts_with(style_cmd)) t = type::style; // "\033[33:"... @@ -5747,103 +5775,103 @@ namespace netxs::os }; auto m = utf::unordered_map> { - //{ "\033\x7f" , { "\x08", key::Backspace | hids::LAlt << 8 }}, - { "\033\x7f" , { "", key::KeySlash |(hids::LCtrl | hids::LAlt | hids::LShift) << 8 }}, - { "\033\x00"s , { "", key::Space | hids::LCtrlAlt << 8 }}, - { "\x00"s , { " ", key::Space | hids::LCtrl << 8 }}, - { "\x08" , { "\x7f", key::Backspace | hids::LCtrl << 8 }}, - { "\033\x08" , { "", key::Backspace | hids::LCtrlAlt << 8 }}, - { "\033[Z" , { "", key::Tab | hids::LShift << 8 }}, //todo: revise Alt+Shift+Z ? - { "\033[1;3I" , { "", key::Tab | hids::LAlt << 8 }}, - { "\033\033" , { "", key::Esc | hids::LAlt << 8 }}, - { "\x7f" , { "\x08", key::Backspace }}, - { "\x09" , { "\x09", key::Tab }}, - { "\x0d" , { "\x0d", key::KeyEnter }}, - { "\x0a" , { "\x0a", key::KeyEnter | hids::LCtrl << 8 }}, - - //{ "\x1a" , { "", key::Pause }}, - //{ "\x1a" , { "\x1a", key::KeyZ | hids::LCtrl << 8 }}, - { "\033" , { "\033", key::Esc }}, - { "\x1c" , { "", key::Key4 | hids::LCtrl << 8 }}, - { "\x1d" , { "", key::Key5 | hids::LCtrl << 8 }}, - { "\x1e" , { "", key::Key6 | hids::LCtrl << 8 }}, - { "\x1f" , { "", key::KeySlash | hids::LCtrl << 8 }}, - { "\033\x1f" , { "", key::KeySlash | hids::LCtrlAlt << 8 }}, - { "\x20" , { " ", key::Space }}, - { "\x21" , { "!", key::Key1 | hids::LShift << 8 }}, - { "\x22" , { "\"", key::SingleQuote | hids::LShift << 8 }}, - { "\x23" , { "#", key::Key3 | hids::LShift << 8 }}, - { "\x24" , { "$", key::Key4 | hids::LShift << 8 }}, - { "\x25" , { "%", key::Key5 | hids::LShift << 8 }}, - { "\x26" , { "&", key::Key7 | hids::LShift << 8 }}, - { "\x27" , { "'", key::SingleQuote }}, - { "\x28" , { "(", key::Key9 | hids::LShift << 8 }}, - { "\x29" , { ")", key::Key0 | hids::LShift << 8 }}, - { "\x2a" , { "*", key::KeyMultiply }}, - { "\x2b" , { "+", key::KeyPlus }}, - { "\x2c" , { ",", key::Comma }}, - { "\x2d" , { "-", key::KeyMinus }}, - { "\x2e" , { ".", key::KeyPeriod }}, - { "\x2f" , { "/", key::KeySlash }}, - - { "\x3a" , { ":", key::Semicolon | hids::LShift << 8 }}, - { "\x3b" , { ";", key::Semicolon }}, - { "\x3c" , { "<", key::Comma | hids::LShift << 8 }}, - { "\x3d" , { "=", key::Equal }}, - { "\x3e" , { ">", key::KeyPeriod | hids::LShift << 8 }}, - { "\x3f" , { "?", key::KeySlash | hids::LShift << 8 }}, - { "\x40" , { "@", key::Key2 | hids::LShift << 8 }}, - - { "\x5b" , { "[", key::OpenBracket }}, - { "\x5c" , { "\\", key::BackSlash }}, - { "\x5d" , { "]", key::ClosedBracket }}, - { "\x5e" , { "^", key::Key6 | hids::LShift << 8 }}, - { "\x5f" , { "_", key::KeyMinus | hids::LShift << 8 }}, - { "\x60" , { "`", key::BackQuote }}, - - { "\x7b" , { "{", key::OpenBracket | hids::LShift << 8 }}, - { "\x7c" , { "|", key::BackSlash | hids::LShift << 8 }}, - { "\x7d" , { "}", key::ClosedBracket | hids::LShift << 8 }}, - { "\x7e" , { "~", key::BackQuote | hids::LShift << 8 }}, - - { "\033[5~" , { "", key::KeyPageUp }}, - { "\033[6~" , { "", key::KeyPageDown }}, - { "\033[F" , { "", key::KeyEnd }}, - { "\033[H" , { "", key::KeyHome }}, - { "\033[D" , { "", key::KeyLeftArrow }}, - { "\033[A" , { "", key::KeyUpArrow }}, - { "\033[C" , { "", key::KeyRightArrow }}, - { "\033[B" , { "", key::KeyDownArrow }}, - { "\033[2~" , { "", key::KeyInsert }}, - { "\033[3~" , { "", key::KeyDelete }}, - { "\033OP" , { "", key::F1 }}, - { "\033OQ" , { "", key::F2 }}, - { "\033OR" , { "", key::F3 }}, - { "\033OS" , { "", key::F4 }}, - { "\033[15~" , { "", key::F5 }}, - { "\033[17~" , { "", key::F6 }}, - { "\033[18~" , { "", key::F7 }}, - { "\033[19~" , { "", key::F8 }}, - { "\033[20~" , { "", key::F9 }}, - { "\033[21~" , { "", key::F10 }}, - { "\033[23~" , { "", key::F11 }}, - { "\033[24~" , { "", key::F12 }}, + //{ "\033\x7f" , { "\x08", key::Backspace | (hids::LAlt << key::idbits) }}, + { "\033\x7f" , { "", key::KeySlash |((hids::LCtrl | hids::LAlt | hids::LShift) << key::idbits) }}, + { "\033\x00"s , { "", key::Space | (hids::LCtrlAlt << key::idbits) }}, + { "\x00"s , { " ", key::Space | (hids::LCtrl << key::idbits) }}, + { "\x08" , { "\x7f", key::Backspace | (hids::LCtrl << key::idbits) }}, + { "\033\x08" , { "", key::Backspace | (hids::LCtrlAlt << key::idbits) }}, + { "\033[Z" , { "", key::Tab | (hids::LShift << key::idbits) }}, //todo: revise Alt+Shift+Z ? + { "\033[1;3I" , { "", key::Tab | (hids::LAlt << key::idbits) }}, + { "\033\033" , { "", key::Esc | (hids::LAlt << key::idbits) }}, + { "\x7f" , { "\x08", key::Backspace }}, + { "\x09" , { "\x09", key::Tab }}, + { "\x0d" , { "\x0d", key::KeyEnter }}, + { "\x0a" , { "\x0a", key::KeyEnter | (hids::LCtrl << key::idbits) }}, + + //{ "\x1a" , { "", key::Pause }}, + //{ "\x1a" , { "\x1a", key::KeyZ | (hids::LCtrl << key::idbits) }}, + { "\033" , { "\033", key::Esc }}, + { "\x1c" , { "", key::Key4 | (hids::LCtrl << key::idbits) }}, + { "\x1d" , { "", key::Key5 | (hids::LCtrl << key::idbits) }}, + { "\x1e" , { "", key::Key6 | (hids::LCtrl << key::idbits) }}, + { "\x1f" , { "", key::KeySlash | (hids::LCtrl << key::idbits) }}, + { "\033\x1f" , { "", key::KeySlash | (hids::LCtrlAlt << key::idbits) }}, + { "\x20" , { " ", key::Space }}, + { "\x21" , { "!", key::Key1 | (hids::LShift << key::idbits) }}, + { "\x22" , { "\"", key::SingleQuote | (hids::LShift << key::idbits) }}, + { "\x23" , { "#", key::Key3 | (hids::LShift << key::idbits) }}, + { "\x24" , { "$", key::Key4 | (hids::LShift << key::idbits) }}, + { "\x25" , { "%", key::Key5 | (hids::LShift << key::idbits) }}, + { "\x26" , { "&", key::Key7 | (hids::LShift << key::idbits) }}, + { "\x27" , { "'", key::SingleQuote }}, + { "\x28" , { "(", key::Key9 | (hids::LShift << key::idbits) }}, + { "\x29" , { ")", key::Key0 | (hids::LShift << key::idbits) }}, + { "\x2a" , { "*", key::KeyMultiply }}, + { "\x2b" , { "+", key::KeyPlus }}, + { "\x2c" , { ",", key::Comma }}, + { "\x2d" , { "-", key::KeyMinus }}, + { "\x2e" , { ".", key::KeyPeriod }}, + { "\x2f" , { "/", key::KeySlash }}, + + { "\x3a" , { ":", key::Semicolon | (hids::LShift << key::idbits) }}, + { "\x3b" , { ";", key::Semicolon }}, + { "\x3c" , { "<", key::Comma | (hids::LShift << key::idbits) }}, + { "\x3d" , { "=", key::Equal }}, + { "\x3e" , { ">", key::KeyPeriod | (hids::LShift << key::idbits) }}, + { "\x3f" , { "?", key::KeySlash | (hids::LShift << key::idbits) }}, + { "\x40" , { "@", key::Key2 | (hids::LShift << key::idbits) }}, + + { "\x5b" , { "[", key::OpenBracket }}, + { "\x5c" , { "\\", key::BackSlash }}, + { "\x5d" , { "]", key::ClosedBracket }}, + { "\x5e" , { "^", key::Key6 | (hids::LShift << key::idbits) }}, + { "\x5f" , { "_", key::KeyMinus | (hids::LShift << key::idbits) }}, + { "\x60" , { "`", key::BackQuote }}, + + { "\x7b" , { "{", key::OpenBracket | (hids::LShift << key::idbits) }}, + { "\x7c" , { "|", key::BackSlash | (hids::LShift << key::idbits) }}, + { "\x7d" , { "}", key::ClosedBracket | (hids::LShift << key::idbits) }}, + { "\x7e" , { "~", key::BackQuote | (hids::LShift << key::idbits) }}, + + { "\033[5~" , { "", key::KeyPageUp }}, + { "\033[6~" , { "", key::KeyPageDown }}, + { "\033[F" , { "", key::KeyEnd }}, + { "\033[H" , { "", key::KeyHome }}, + { "\033[D" , { "", key::KeyLeftArrow }}, + { "\033[A" , { "", key::KeyUpArrow }}, + { "\033[C" , { "", key::KeyRightArrow }}, + { "\033[B" , { "", key::KeyDownArrow }}, + { "\033[2~" , { "", key::KeyInsert }}, + { "\033[3~" , { "", key::KeyDelete }}, + { "\033OP" , { "", key::F1 }}, + { "\033OQ" , { "", key::F2 }}, + { "\033OR" , { "", key::F3 }}, + { "\033OS" , { "", key::F4 }}, + { "\033[15~" , { "", key::F5 }}, + { "\033[17~" , { "", key::F6 }}, + { "\033[18~" , { "", key::F7 }}, + { "\033[19~" , { "", key::F8 }}, + { "\033[20~" , { "", key::F9 }}, + { "\033[21~" , { "", key::F10 }}, + { "\033[23~" , { "", key::F11 }}, + { "\033[24~" , { "", key::F12 }}, // Linux VGA Console special keys. - { "\033[1~" , { "", key::KeyHome }}, - { "\033[4~" , { "", key::KeyEnd }}, - { "\033[[A" , { "", key::F1 }}, - { "\033[[B" , { "", key::F2 }}, - { "\033[[C" , { "", key::F3 }}, - { "\033[[D" , { "", key::F4 }}, - { "\033[[E" , { "", key::F5 }}, - { "\033[25~" , { "", key::F1 | hids::LShift << 8 }}, - { "\033[26~" , { "", key::F2 | hids::LShift << 8 }}, - { "\033[28~" , { "", key::F3 | hids::LShift << 8 }}, - { "\033[29~" , { "", key::F4 | hids::LShift << 8 }}, - { "\033[31~" , { "", key::F5 | hids::LShift << 8 }}, - { "\033[32~" , { "", key::F6 | hids::LShift << 8 }}, - { "\033[33~" , { "", key::F7 | hids::LShift << 8 }}, - { "\033[34~" , { "", key::F8 | hids::LShift << 8 }}, + { "\033[1~" , { "", key::KeyHome }}, + { "\033[4~" , { "", key::KeyEnd }}, + { "\033[[A" , { "", key::F1 }}, + { "\033[[B" , { "", key::F2 }}, + { "\033[[C" , { "", key::F3 }}, + { "\033[[D" , { "", key::F4 }}, + { "\033[[E" , { "", key::F5 }}, + { "\033[25~" , { "", key::F1 | (hids::LShift << key::idbits) }}, + { "\033[26~" , { "", key::F2 | (hids::LShift << key::idbits) }}, + { "\033[28~" , { "", key::F3 | (hids::LShift << key::idbits) }}, + { "\033[29~" , { "", key::F4 | (hids::LShift << key::idbits) }}, + { "\033[31~" , { "", key::F5 | (hids::LShift << key::idbits) }}, + { "\033[32~" , { "", key::F6 | (hids::LShift << key::idbits) }}, + { "\033[33~" , { "", key::F7 | (hids::LShift << key::idbits) }}, + { "\033[34~" , { "", key::F8 | (hids::LShift << key::idbits) }}, }; for (auto i = 1; i < 8; i++) @@ -5856,12 +5884,12 @@ namespace netxs::os for (auto& [key, utf8] : keymask) { *++(utf8.rbegin()) = mods; - m[utf8] = { "", key | (ctls << 8) }; + m[utf8] = { "", key | (ctls << key::idbits) }; } } for (auto i = 0; i <= 'Z' - 'A'; i++) { - m[text(1, i + 'A')] = { text(1, i + 'A'), (key::KeyA + i * 2) | (hids::LShift << 8) }; + m[text(1, i + 'A')] = { text(1, i + 'A'), (key::KeyA + i * 2) | (hids::LShift << key::idbits) }; m[text(1, i + 'a')] = { text(1, i + 'a'), key::KeyA + i * 2 }; } for (auto i = 0; i < 10; i++) @@ -5870,6 +5898,182 @@ namespace netxs::os } return m; }(); + static auto kkp2key = [] + { + using namespace input; + auto m = std::unordered_map + { + // base key CSI-suffix input::key + { 57442 | ('u' << 16), key::LeftCtrl }, + { 57448 | ('u' << 16), key::RightCtrl }, + { 57443 | ('u' << 16), key::LeftAlt }, + { 57446 | ('u' << 16), key::LeftAlt }, // LEFT_META + { 57449 | ('u' << 16), key::RightAlt }, + { 57452 | ('u' << 16), key::RightAlt }, // RIGHT_META + { 57441 | ('u' << 16), key::LeftShift }, + { 57447 | ('u' << 16), key::RightShift }, + { 57444 | ('u' << 16), key::LeftWin }, // LEFT_SUPER + { 57450 | ('u' << 16), key::RightWin }, // RIGHT_SUPER + { 57445 | ('u' << 16), key::LeftHyper }, // LEFT_HYPER + { 57451 | ('u' << 16), key::RightHyper }, // RIGHT_HYPER + { 57363 | ('u' << 16), key::Apps }, // MENU + { 57360 | ('u' << 16), key::NumLock }, + { 57358 | ('u' << 16), key::CapsLock }, + { 57453 | ('u' << 16), key::IsoLevel3Shift }, // ISO_LEVEL3_SHIFT + { 57359 | ('u' << 16), key::ScrollLock }, + { 57454 | ('u' << 16), key::IsoLevel5Shift }, // ISO_LEVEL5_SHIFT + { 27 | ('u' << 16), key::Esc }, + { 32 | ('u' << 16), key::Space }, + { 127 | ('u' << 16), key::Backspace }, + { 9 | ('u' << 16), key::Tab }, + { 57362 | ('u' << 16), key::Pause }, + { 57361 | ('u' << 16), key::PrintScreen }, + { 13 | ('u' << 16), key::KeyEnter }, + { 57414 | ('u' << 16), key::NumpadEnter }, // KP_ENTER + { 5 | ('~' << 16), key::KeyPageUp }, + { 57421 | ('u' << 16), key::NumpadPageUp }, // KP_PAGE_UP + { 6 | ('~' << 16), key::KeyPageDown }, + { 57422 | ('u' << 16), key::NumpadPageDown }, // KP_PAGE_DOWN + { 1 | ('F' << 16), key::KeyEnd }, + { 8 | ('~' << 16), key::KeyEnd }, + { 57424 | ('u' << 16), key::NumpadEnd }, // KP_END + { 1 | ('H' << 16), key::KeyHome }, + { 7 | ('~' << 16), key::KeyHome }, + { 57423 | ('u' << 16), key::NumpadHome }, // KP_HOME + { 1 | ('D' << 16), key::KeyLeftArrow }, + { 57417 | ('u' << 16), key::NumpadLeftArrow }, // KP_LEFT + { 1 | ('C' << 16), key::KeyRightArrow }, + { 57418 | ('u' << 16), key::NumpadRightArrow }, // KP_RIGHT + { 1 | ('A' << 16), key::KeyUpArrow }, + { 57419 | ('u' << 16), key::NumpadUpArrow }, // KP_UP + { 1 | ('B' << 16), key::KeyDownArrow }, + { 57420 | ('u' << 16), key::NumpadDownArrow }, // KP_DOWN + { 48 | ('u' << 16), key::Key0 }, + { 57399 | ('u' << 16), key::Numpad0 }, + { 49 | ('u' << 16), key::Key1 }, + { 57400 | ('u' << 16), key::Numpad1 }, + { 50 | ('u' << 16), key::Key2 }, + { 57401 | ('u' << 16), key::Numpad2 }, + { 51 | ('u' << 16), key::Key3 }, + { 57402 | ('u' << 16), key::Numpad3 }, + { 52 | ('u' << 16), key::Key4 }, + { 57403 | ('u' << 16), key::Numpad4 }, + { 53 | ('u' << 16), key::Key5 }, + { 57404 | ('u' << 16), key::Numpad5 }, + { 54 | ('u' << 16), key::Key6 }, + { 57405 | ('u' << 16), key::Numpad6 }, + { 55 | ('u' << 16), key::Key7 }, + { 57406 | ('u' << 16), key::Numpad7 }, + { 56 | ('u' << 16), key::Key8 }, + { 57407 | ('u' << 16), key::Numpad8 }, + { 57 | ('u' << 16), key::Key9 }, + { 57408 | ('u' << 16), key::Numpad9 }, + { 2 | ('~' << 16), key::KeyInsert }, + { 57425 | ('u' << 16), key::NumpadInsert }, // KP_INSERT + { 3 | ('~' << 16), key::KeyDelete }, + { 57426 | ('u' << 16), key::NumpadDelete }, // KP_DELETE + { 1 | ('E' << 16), key::KeyClear }, // KP_BEGIN + { 57427 | ('~' << 16), key::NumpadClear }, // KP_BEGIN + { 57411 | ('u' << 16), key::NumpadMultiply }, // KP_MULTIPLY + { 43 | ('u' << 16), key::KeyPlus }, // KP_ADD + { 57413 | ('u' << 16), key::NumpadPlus }, // KP_ADD + { 57416 | ('u' << 16), key::NumpadSeparator }, // KP_SEPARATOR + { 45 | ('u' << 16), key::KeyMinus }, + { 57412 | ('u' << 16), key::NumpadMinus }, // KP_SUBTRACT + { 46 | ('u' << 16), key::KeyPeriod }, + { 57409 | ('u' << 16), key::NumpadDecimal }, + { 47 | ('u' << 16), key::KeySlash }, //KP_DIVIDE + { 57410 | ('u' << 16), key::NumpadSlash }, //KP_DIVIDE + { 92 | ('u' << 16), key::BackSlash }, + { 61 | ('u' << 16), key::Equal }, + { 57415 | ('u' << 16), key::NumpadEqual }, // KP_EQUAL + { 91 | ('u' << 16), key::OpenBracket }, + { 93 | ('u' << 16), key::ClosedBracket }, + { 61 | ('u' << 16), key::Equal }, + { 96 | ('u' << 16), key::BackQuote }, + { 39 | ('u' << 16), key::SingleQuote }, + { 44 | ('u' << 16), key::Comma }, + { 59 | ('u' << 16), key::Semicolon }, + { 1 | ('P' << 16), key::F1 }, + { 11 | ('~' << 16), key::F1 }, + { 1 | ('Q' << 16), key::F2 }, + { 12 | ('~' << 16), key::F2 }, + { 13 | ('~' << 16), key::F3 }, + { 1 | ('S' << 16), key::F4 }, + { 14 | ('~' << 16), key::F4 }, + { 15 | ('~' << 16), key::F5 }, + { 17 | ('~' << 16), key::F6 }, + { 18 | ('~' << 16), key::F7 }, + { 19 | ('~' << 16), key::F8 }, + { 20 | ('~' << 16), key::F9 }, + { 21 | ('~' << 16), key::F10 }, + { 23 | ('~' << 16), key::F11 }, + { 24 | ('~' << 16), key::F12 }, + { 57376 | ('u' << 16), key::F13 }, + { 57377 | ('u' << 16), key::F14 }, + { 57378 | ('u' << 16), key::F15 }, + { 57379 | ('u' << 16), key::F16 }, + { 57380 | ('u' << 16), key::F17 }, + { 57381 | ('u' << 16), key::F18 }, + { 57382 | ('u' << 16), key::F19 }, + { 57383 | ('u' << 16), key::F20 }, + { 57384 | ('u' << 16), key::F21 }, + { 57385 | ('u' << 16), key::F22 }, + { 57386 | ('u' << 16), key::F23 }, + { 57387 | ('u' << 16), key::F24 }, + { 57388 | ('u' << 16), key::F25 }, + { 57389 | ('u' << 16), key::F26 }, + { 57390 | ('u' << 16), key::F27 }, + { 57391 | ('u' << 16), key::F28 }, + { 57392 | ('u' << 16), key::F29 }, + { 57393 | ('u' << 16), key::F30 }, + { 57394 | ('u' << 16), key::F31 }, + { 57395 | ('u' << 16), key::F32 }, + { 57396 | ('u' << 16), key::F33 }, + { 57397 | ('u' << 16), key::F34 }, + { 57398 | ('u' << 16), key::F35 }, + { 97 | ('u' << 16), key::KeyA }, + { 98 | ('u' << 16), key::KeyB }, + { 99 | ('u' << 16), key::KeyC }, + { 100 | ('u' << 16), key::KeyD }, + { 101 | ('u' << 16), key::KeyE }, + { 102 | ('u' << 16), key::KeyF }, + { 103 | ('u' << 16), key::KeyG }, + { 104 | ('u' << 16), key::KeyH }, + { 105 | ('u' << 16), key::KeyI }, + { 106 | ('u' << 16), key::KeyJ }, + { 107 | ('u' << 16), key::KeyK }, + { 108 | ('u' << 16), key::KeyL }, + { 109 | ('u' << 16), key::KeyM }, + { 110 | ('u' << 16), key::KeyN }, + { 111 | ('u' << 16), key::KeyO }, + { 112 | ('u' << 16), key::KeyP }, + { 113 | ('u' << 16), key::KeyQ }, + { 114 | ('u' << 16), key::KeyR }, + { 115 | ('u' << 16), key::KeyS }, + { 116 | ('u' << 16), key::KeyT }, + { 117 | ('u' << 16), key::KeyU }, + { 118 | ('u' << 16), key::KeyV }, + { 119 | ('u' << 16), key::KeyW }, + { 120 | ('u' << 16), key::KeyX }, + { 121 | ('u' << 16), key::KeyY }, + { 122 | ('u' << 16), key::KeyZ }, + { 57428 | ('u' << 16), key::MediaPlay }, // MEDIA_PLAY + { 57429 | ('u' << 16), key::MediaPause }, // MEDIA_PAUSE + { 57430 | ('u' << 16), key::MediaPlayPause }, // MEDIA_PLAY_PAUSE + { 57431 | ('u' << 16), key::MediaReverse }, // MEDIA_REVERSE // case WM_APPCOMMAND: извлекая макросом GET_APPCOMMAND_LPARAM(lParam) + { 57432 | ('u' << 16), key::MediaStop }, // MEDIA_STOP + { 57433 | ('u' << 16), key::MediaFastForward }, // MEDIA_FAST_FORWARD // case WM_APPCOMMAND: извлекая макросом GET_APPCOMMAND_LPARAM(lParam) + { 57434 | ('u' << 16), key::MediaRewind }, // MEDIA_REWIND // case WM_APPCOMMAND: извлекая макросом GET_APPCOMMAND_LPARAM(lParam) + { 57435 | ('u' << 16), key::MediaNext }, // MEDIA_TRACK_NEXT + { 57436 | ('u' << 16), key::MediaPrev }, // MEDIA_TRACK_PREVIOUS + { 57437 | ('u' << 16), key::MediaRecord }, // MEDIA_RECORD // case WM_APPCOMMAND: извлекая макросом GET_APPCOMMAND_LPARAM(lParam) + { 57438 | ('u' << 16), key::MediaVolDown }, // LOWER_VOLUME + { 57439 | ('u' << 16), key::MediaVolUp }, // RAISE_VOLUME + { 57440 | ('u' << 16), key::MediaVolMute }, // MUTE_VOLUME + }; + return m; + }(); auto paste_data = [&](qiew cluster) { @@ -6006,6 +6210,69 @@ namespace netxs::os std::swap(k.scancod, scancod); } }; + auto detect_kkp = [&](qiew sequence) + { + // ESC [ unicode_code:shifted_key:base_key ; ctlstat:evtype ; codepoints suffix + log("KKP: ", ansi::hi(utf::debase(sequence))); + using namespace input; + sequence.remove_prefix(2); // Pop ESC [ + + auto q = ansi::fifo32{ ansi::ccc_nop }; // Reserve for the command type. + ansi::read_CSI(sequence, q, noop{}); + + auto suffix = q(ansi::ccc_nop); + auto unicode_code = q(1); + auto shifted_key = q.subarg(unicode_code); + auto base_key = q.subarg(unicode_code); + auto ctlstat = q(1); + auto evtype = q.subarg(1); + k.cluster = {}; + while (q) + { + auto codepoint = q(0); + if (codepoint == 0) break; + utf::to_utf_from_code(codepoint, k.cluster); + } + + k.keystat = evtype == 1 ? input::key::pressed + : evtype == 2 ? input::key::repeated + : input::key::released; + k.ctlstat = {}; + if (ctlstat) + { + ctlstat--; + if (ctlstat & hids::kkp::shift ) k.ctlstat |= hids::LShift; + if (ctlstat & hids::kkp::alt ) k.ctlstat |= hids::LAlt; + if (ctlstat & hids::kkp::ctrl ) k.ctlstat |= hids::LCtrl; + if (ctlstat & hids::kkp::super ) k.ctlstat |= hids::LWin; + if (ctlstat & hids::kkp::hyper ) k.ctlstat |= hids::LHyper; + if (ctlstat & hids::kkp::meta ) k.ctlstat |= hids::LAlt; + if (ctlstat & hids::kkp::caps_lock) k.ctlstat |= hids::CapsLock; + if (ctlstat & hids::kkp::num_lock ) k.ctlstat |= hids::NumLock; + } + auto traits = (suffix << 16) | base_key; + auto iter = kkp2key.find(traits); + if (iter != kkp2key.end()) + { + auto code = iter->second; + auto& rec = key::map::data(code); + k.keycode = code; + k.virtcod = rec.vkey; + k.scancod = rec.scan; + } + else + { + k.keycode = input::key::undef; + k.virtcod = base_key; //unicode_code;//base_key ? base_key + //: shifted_key ? shifted_key + //: != 1 ? unicode_code : 0; + k.scancod = {}; + } + log(" suffix='%%' unicode_code=%% shifted_key=%% base_key=%% ctlstat=%% evtype=%% cluster=%%", (char)suffix, unicode_code, shifted_key, base_key, ctlstat, evtype, ansi::hi(utf::debase(k.cluster))); + k.handled = {}; + chords.build(k); + keybd(k); + }; auto parser = [&](view accum) { input_buffer += accum; @@ -6208,6 +6475,10 @@ namespace netxs::os m.changed++; mouse(m); } + else if (t == type::kkp) // KKP: ESC [ ... u~ABCDEFHPQS + { + detect_kkp(s); + } else if (t == type::focus) // Focus report: ESC [ I/O { auto state = s.back() == 'I'; @@ -6592,8 +6863,8 @@ namespace netxs::os ok(::SetConsoleScreenBufferInfoEx(os::stdout_fd, &c16), "::SetConsoleScreenBufferInfoEx()", os::unexpected); } #else - auto vtrun = ansi::altbuf(true).bpmode(true).cursor(faux).vmouse(true).set_palette(dtvt::vtmode & ui::console::vt16); - auto vtend = ansi::scrn_reset().altbuf(faux).bpmode(faux).cursor(true).vmouse(faux).rst_palette(dtvt::vtmode & ui::console::vt16); + auto vtrun = ansi::altbuf(true).bpmode(true).cursor(faux).vmouse(true).set_palette(dtvt::vtmode & ui::console::vt16).kkp_on(dtvt::vtmode & ui::console::vt_KKP); + auto vtend = ansi::kkp_off(dtvt::vtmode & ui::console::vt_KKP).scrn_reset().altbuf(faux).bpmode(faux).cursor(true).vmouse(faux).rst_palette(dtvt::vtmode & ui::console::vt16); io::send(os::stdout_fd, vtrun); #endif @@ -6675,6 +6946,17 @@ namespace netxs::os struct readline { + struct actions + { + static constexpr auto _counter = __COUNTER__ + 1; + static constexpr auto ctrl_c = __COUNTER__ - _counter; + static constexpr auto ctrl_d = __COUNTER__ - _counter; + static constexpr auto ctrl_z = __COUNTER__ - _counter; + static constexpr auto backspace = __COUNTER__ - _counter; + static constexpr auto enter = __COUNTER__ - _counter; + static constexpr auto cluster = __COUNTER__ - _counter; + }; + std::thread thread; fire alarm; flag alive; @@ -6683,7 +6965,7 @@ namespace netxs::os : alive{ true } { auto redirected = dtvt::vtmode & ui::console::redirio - && os::stdin_fd != os::invalid_fd; + && os::stdin_fd != os::invalid_fd; if (redirected) thread = std::thread{ [&, send, shut] { auto line = text{}; @@ -6716,6 +6998,23 @@ namespace netxs::os }}; else thread = std::thread{ [&, send, shut] { + static const auto action_chords = [] + { + auto m = utf::unordered_map{}; + auto a = std::to_array>( + { + { actions::ctrl_c, input::key::kmap::chord_list("Ctrl+KeyC") }, + { actions::ctrl_d, input::key::kmap::chord_list("Ctrl+KeyD") }, + { actions::ctrl_z, input::key::kmap::chord_list("Ctrl+KeyZ") }, + { actions::backspace, input::key::kmap::chord_list("Backspace") }, + { actions::enter, input::key::kmap::chord_list("Enter") }, + }); + for (auto& [action, cs] : a) + { + for (auto& c : cs) m[c] = action; + } + return m; + }(); dtvt::scroll = true; auto osout = tty::cout; auto width = si32{}; @@ -6783,6 +7082,32 @@ namespace netxs::os else clear(utf8); } }); + auto do_it = [&](auto& guard, auto action) + { + switch (action) + { + case actions::ctrl_c: enter(ansi::err("Ctrl+C\r\n")); alarm.bell(); break; + case actions::ctrl_d: enter(ansi::err("Ctrl+D\r\n")); alarm.bell(); break; + case actions::ctrl_z: enter(ansi::err("Ctrl+Z\r\n")); alarm.bell(); break; + case actions::backspace: + if (block.size()) + { + block.pop_back(); + print(true); + } + break; + case actions::enter: + { + auto line = block + '\n'; + block.clear(); + clear(); + print(faux); + guard.unlock(); // Allow to use log() inside send(). + send(line); + break; + } + } + }; auto keybd = [&](auto& data) { auto guard = std::unique_lock{ mutex }; @@ -6794,33 +7119,37 @@ namespace netxs::os print(true); break; case input::keybd::type::keypress: - if (!data.keystat) return; + if (!alive || !data.keystat) return; + //if (dtvt::vtmode & ui::console::vt_KKP) + { + if (auto iter = action_chords.find(data.vkchord); iter != action_chords.end()) + { + auto action = iter->second; + do_it(guard, action); + break; + } + //else if (data.cluster.size()) + //{ + // block += data.cluster; + // print(true); + // break; + //} + } [[fallthrough]]; case input::keybd::type::imeinput: if (!alive || data.cluster.empty()) return; switch (data.cluster.front()) { - case 0x03: enter(ansi::err("Ctrl+C\r\n")); alarm.bell(); break; - case 0x04: enter(ansi::err("Ctrl+D\r\n")); alarm.bell(); break; - case 0x1A: enter(ansi::err("Ctrl+Z\r\n")); alarm.bell(); break; + case 0x03: do_it(guard, actions::ctrl_c); break; + case 0x04: do_it(guard, actions::ctrl_d); break; + case 0x1A: do_it(guard, actions::ctrl_z); break; case 0x08: // Backspace case 0x7F: // - if (block.size()) - { - block.pop_back(); - print(true); - } + do_it(guard, actions::backspace); break; case '\n': case '\r': // Enter - { - auto line = block + '\n'; - block.clear(); - clear(); - print(faux); - guard.unlock(); // Allow to use log() inside send(). - send(line); - } + do_it(guard, actions::enter); break; default: block += data.cluster; @@ -6848,7 +7177,8 @@ namespace netxs::os { { auto guard = std::lock_guard{ mutex }; - enter(ansi::styled(faux)); // Disable style reporting. + auto restore = ansi::styled(faux).kkp_off(dtvt::vtmode & ui::console::vt_KKP); + enter(restore); // Disable style reporting. } { auto lock = logger::globals(); // Sync with logger. @@ -6865,7 +7195,8 @@ namespace netxs::os }; { auto lock = logger::globals(); // Sync with logger. - enter(ansi::styled(true)); // Enable style reporting (wrapping). + auto init = ansi::styled(true).kkp_on(dtvt::vtmode & ui::console::vt_KKP); // Enable KKP and style reporting (wrapping). + enter(init); os::autosync = faux; // Synchronize viewport only when the vt-sequence "show caret" is received. std::swap(tty::cout, write); // Activate log proxy. } From ae9271dd9ab791118a1dc953776546617198e80a Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Tue, 2 Jun 2026 22:14:45 +0500 Subject: [PATCH 02/71] #943 WIP: KKP support (form input cluster) --- src/netxs/desktopio/system.hpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 7bae9cdccb..22df32b0b9 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -6212,8 +6212,8 @@ namespace netxs::os }; auto detect_kkp = [&](qiew sequence) { - // ESC [ unicode_code:shifted_key:base_key ; ctlstat:evtype ; codepoints suffix - log("KKP: ", ansi::hi(utf::debase(sequence))); + // ESC [ unicode_code:shifted_code:base_key ; ctlstat:evtype ; codepoints suffix + if constexpr (debugmode) log("KKP: ", ansi::hi(utf::debase(sequence))); using namespace input; sequence.remove_prefix(2); // Pop ESC [ @@ -6221,8 +6221,8 @@ namespace netxs::os ansi::read_CSI(sequence, q, noop{}); auto suffix = q(ansi::ccc_nop); - auto unicode_code = q(1); - auto shifted_key = q.subarg(unicode_code); + auto unicode_code = q(1); // Unshifted code. + auto shifted_code = q.subarg(unicode_code); auto base_key = q.subarg(unicode_code); auto ctlstat = q(1); auto evtype = q.subarg(1); @@ -6263,12 +6263,22 @@ namespace netxs::os else { k.keycode = input::key::undef; - k.virtcod = base_key; //unicode_code;//base_key ? base_key - //: shifted_key ? shifted_key - //: != 1 ? unicode_code : 0; + k.virtcod = base_key; k.scancod = {}; } - log(" suffix='%%' unicode_code=%% shifted_key=%% base_key=%% ctlstat=%% evtype=%% cluster=%%", (char)suffix, unicode_code, shifted_key, base_key, ctlstat, evtype, ansi::hi(utf::debase(k.cluster))); + if (k.cluster.empty() && suffix == 'u') // Form cluster. + { + auto c = utf::to_upper((char)base_key); + if (k.ctlstat & hids::anyCtrl && base_key < 128 && c >= 0x40 && c <= 0x5F) // Map @ABC...XYZ[\]^_ to C0 + { + k.cluster = text(1, c & 0b00011111); + } + else if (k.cluster.empty() && unicode_code > 0 && unicode_code < 57358) // Exclude any function keys. + { + utf::to_utf_from_code(k.ctlstat & hids::CapsLock ? unicode_code : shifted_code, k.cluster); + } + } + if constexpr (debugmode) log(" suffix='%%' unicode_code=%% shifted_code=%% base_key=%% ctlstat=%% evtype=%% cluster=%%", (char)suffix, unicode_code, shifted_code, base_key, ctlstat, evtype, ansi::hi(utf::debase(k.cluster))); k.handled = {}; chords.build(k); keybd(k); From 0471fc4b2ffc8e8115b2e7b8b18edfbc51b8c6f6 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Tue, 2 Jun 2026 23:33:51 +0500 Subject: [PATCH 03/71] #943 WIP: KKP support (unify lut) --- src/netxs/desktopio/input.hpp | 375 +++++++++++++++++---------------- src/netxs/desktopio/system.hpp | 178 ++-------------- 2 files changed, 203 insertions(+), 350 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index ca611e7266..e8c152eace 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -84,189 +84,189 @@ namespace netxs::input // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. #define key_list \ - /*Id Index Vkey Scan CtrlState Mask I Name GenericName */\ - X(0, 0, 0, 0, 0, 0x0000'00'FF, 1, undef , "undef" )\ - X(1, 0, 0xFF, 0xFF, 0, 0x0100'FF'FF, 0, config , "config" )\ - X(2, 0xA2, 0x11, 0x1D, 0, 0x0100'00'FF, 0, LeftCtrl , "Ctrl" )\ - X( 3, 0xA3, 0x11, 0x1D, ExtendedKey, 0x0100'00'FF, 0, RightCtrl , "Ctrl" )\ - X(4, 0xA4, 0x12, 0x38, 0, 0x0100'00'FF, 0, LeftAlt , "Alt" )\ - X( 5, 0xA5, 0x12, 0x38, ExtendedKey, 0x0100'00'FF, 0, RightAlt , "Alt" )\ - X(6, 0xA0, 0x10, 0x2A, 0, 0x0000'FF'FF, 0, LeftShift , "Shift" )\ - X( 7, 0xA1, 0x10, 0x36, 0, 0x0000'FF'FF, 0, RightShift , "Shift" )\ - X(8, 0x5B, 0x5B, 0x5B, ExtendedKey, 0x0100'00'FF, 0, LeftWin , "Win" )\ - X( 9, 0x5C, 0x5C, 0x5C, ExtendedKey, 0x0100'00'FF, 0, RightWin , "Win" )\ - X(10, 0x5B, 0x5B, 0x5B, 0, 0x0100'00'FF, 0, LeftHyper , "Hyper" )\ - X( 11, 0x5C, 0x5C, 0x5C, 0, 0x0100'00'FF, 0, RightHyper , "Hyper" )\ - X(12, 0x5D, 0x5D, 0x5D, ExtendedKey, 0x0000'00'FF, 0, Apps , "Apps" )\ - X(14, 0x90, 0x90, 0x45, 0, 0x0000'00'FF, 0, NumLock , "NumLock" )\ - X(16, 0x14, 0x14, 0x3A, 0, 0x0100'00'FF, 0, CapsLock , "CapsLock" )\ - X(18, 0x91, 0x91, 0x45, 0, 0x0100'00'FF, 0, ScrollLock , "ScrollLock" )\ - X(20, 0x14, 0x14, 0x3A, ExtendedKey, 0x0100'00'FF, 0, IsoLevel3Shift , "IsoLevel3Shift" )\ - X(22, 0x91, 0x91, 0x45, ExtendedKey, 0x0100'00'FF, 0, IsoLevel5Shift , "IsoLevel5Shift" )\ - X(24, 0x1B, 0x1B, 0x01, 0, 0x0000'00'FF, 1, Esc , "Esc" )\ - X(26, 0x20, 0x20, 0x39, 0, 0x0000'00'FF, 1, Space , "Space" )\ - X(28, 0x08, 0x08, 0x0E, 0, 0x0000'00'FF, 1, Backspace , "Backspace" )\ - X(30, 0x09, 0x09, 0x0F, 0, 0x0000'00'FF, 1, Tab , "Tab" )\ - X(32, 0x03, 0x03, 0x46, 0, 0x0000'FF'FF, 1, Break , "Break" )\ - X(34, 0x13, 0x13, 0x45, 0, 0x0000'FF'FF, 0, Pause , "Pause" )\ - X(36, 0x29, 0x29, 0, 0, 0x0000'00'FF, 0, Select , "Select" )\ - X(38, 0x2C, 0x2C, 0x54, 0, 0x0000'FF'FF, 1, SysRq , "SysRq" )\ - X(40, 0x2C, 0x2C, 0x37, ExtendedKey, 0x0100'FF'FF, 0, PrintScreen , "PrintScreen" )\ - X(42, 0x0D, 0x0D, 0x1C, 0, 0x0100'00'FF, 1, KeyEnter , "Enter" )\ - X( 43, 0x0D, 0x0D, 0x1C, ExtendedKey, 0x0100'00'FF, 1, NumpadEnter , "Enter" )\ - X(44, 0x21, 0x21, 0x49, ExtendedKey, 0x0100'00'FF, 1, KeyPageUp , "PageUp" )\ - X( 45, 0x21, 0x21, 0x49, 0, 0x0100'00'FF, 1, NumpadPageUp , "PageUp" )\ - X(46, 0x22, 0x22, 0x51, ExtendedKey, 0x0100'00'FF, 1, KeyPageDown , "PageDown" )\ - X( 47, 0x22, 0x22, 0x51, 0, 0x0100'00'FF, 1, NumpadPageDown , "PageDown" )\ - X(48, 0x23, 0x23, 0x4F, ExtendedKey, 0x0100'00'FF, 1, KeyEnd , "End" )/*don't reorder*/\ - X( 49, 0x23, 0x23, 0x4F, 0, 0x0100'00'FF, 1, NumpadEnd , "End" )/*don't reorder*/\ - X(50, 0x24, 0x24, 0x47, ExtendedKey, 0x0100'00'FF, 1, KeyHome , "Home" )/*don't reorder*/\ - X( 51, 0x24, 0x24, 0x47, 0, 0x0100'00'FF, 1, NumpadHome , "Home" )/*don't reorder*/\ - X(52, 0x25, 0x25, 0x4B, ExtendedKey, 0x0100'00'FF, 1, KeyLeftArrow , "LeftArrow" )/*don't reorder*/\ - X( 53, 0x25, 0x25, 0x4B, 0, 0x0100'00'FF, 1, NumpadLeftArrow , "LeftArrow" )/*don't reorder*/\ - X(54, 0x26, 0x26, 0x48, ExtendedKey, 0x0100'00'FF, 1, KeyUpArrow , "UpArrow" )/*don't reorder*/\ - X( 55, 0x26, 0x26, 0x48, 0, 0x0100'00'FF, 1, NumpadUpArrow , "UpArrow" )/*don't reorder*/\ - X(56, 0x27, 0x27, 0x4D, ExtendedKey, 0x0100'00'FF, 1, KeyRightArrow , "RightArrow" )/*don't reorder*/\ - X( 57, 0x27, 0x27, 0x4D, 0, 0x0100'00'FF, 1, NumpadRightArrow, "RightArrow" )/*don't reorder*/\ - X(58, 0x28, 0x28, 0x50, ExtendedKey, 0x0100'00'FF, 1, KeyDownArrow , "DownArrow" )/*don't reorder*/\ - X( 59, 0x28, 0x28, 0x50, 0, 0x0100'00'FF, 1, NumpadDownArrow , "DownArrow" )/*don't reorder*/\ - X(60, 0x30, 0x30, 0x0B, 0, 0x0000'FF'FF, 1, Key0 , "0" )\ - X( 61, 0x60, 0x60, 0x52, NumLockMode, 0x0000'FF'FF, 1, Numpad0 , "0" )\ - X(62, 0x31, 0x31, 0x02, 0, 0x0000'FF'FF, 1, Key1 , "1" )\ - X( 63, 0x61, 0x61, 0x4F, NumLockMode, 0x0000'FF'FF, 1, Numpad1 , "1" )\ - X(64, 0x32, 0x32, 0x03, 0, 0x0000'FF'FF, 1, Key2 , "2" )\ - X( 65, 0x62, 0x62, 0x50, NumLockMode, 0x0000'FF'FF, 1, Numpad2 , "2" )\ - X(66, 0x33, 0x33, 0x04, 0, 0x0000'FF'FF, 1, Key3 , "3" )\ - X( 67, 0x63, 0x63, 0x51, NumLockMode, 0x0000'FF'FF, 1, Numpad3 , "3" )\ - X(68, 0x34, 0x34, 0x05, 0, 0x0000'FF'FF, 1, Key4 , "4" )\ - X( 69, 0x64, 0x64, 0x4B, NumLockMode, 0x0000'FF'FF, 1, Numpad4 , "4" )\ - X(70, 0x35, 0x35, 0x06, 0, 0x0000'FF'FF, 1, Key5 , "5" )\ - X( 71, 0x65, 0x65, 0x4C, NumLockMode, 0x0000'FF'FF, 1, Numpad5 , "5" )\ - X(72, 0x36, 0x36, 0x07, 0, 0x0000'FF'FF, 1, Key6 , "6" )\ - X( 73, 0x66, 0x66, 0x4D, NumLockMode, 0x0000'FF'FF, 1, Numpad6 , "6" )\ - X(74, 0x37, 0x37, 0x08, 0, 0x0000'FF'FF, 1, Key7 , "7" )\ - X( 75, 0x67, 0x67, 0x47, NumLockMode, 0x0000'FF'FF, 1, Numpad7 , "7" )\ - X(76, 0x38, 0x38, 0x09, 0, 0x0000'FF'FF, 1, Key8 , "8" )\ - X( 77, 0x68, 0x68, 0x48, NumLockMode, 0x0000'FF'FF, 1, Numpad8 , "8" )\ - X(78, 0x39, 0x39, 0x0A, 0, 0x0000'FF'FF, 1, Key9 , "9" )\ - X( 79, 0x69, 0x69, 0x49, NumLockMode, 0x0000'FF'FF, 1, Numpad9 , "9" )\ - X(80, 0x2D, 0x2D, 0x52, ExtendedKey, 0x0100'00'FF, 1, KeyInsert , "Insert" )\ - X( 81, 0x2D, 0x2D, 0x52, 0, 0x0100'00'FF, 1, NumpadInsert , "Insert" )\ - X(82, 0x2E, 0x2E, 0x53, ExtendedKey, 0x0100'00'FF, 1, KeyDelete , "Delete" )\ - X( 83, 0x2E, 0x2E, 0x55, 0, 0x0100'00'FF, 1, NumpadDelete , "Delete" )\ - X(84, 0x0C, 0x0C, 0x4C, ExtendedKey, 0x0100'00'FF, 1, KeyClear , "Clear" )\ - X( 85, 0x0C, 0x0C, 0x4C, 0, 0x0100'00'FF, 1, NumpadClear , "Clear" )\ - X(86, 0x6A, 0x6A, 0x09, 0, 0x0000'FF'FF, 1, KeyMultiply , "*" )\ - X( 87, 0x6A, 0x6A, 0x37, 0, 0x0000'FF'FF, 1, NumpadMultiply , "*" )\ - X(88, 0x6B, 0x6B, 0x0D, 0, 0x0000'FF'FF, 1, KeyPlus , "Plus" )\ - X( 89, 0x6B, 0x6B, 0x4E, 0, 0x0000'FF'FF, 1, NumpadPlus , "Plus" )\ - X(90, 0x6C, 0x6C, 0, 0, 0x0020'00'FF, 1, KeySeparator , "Separator" )\ - X( 91, 0x6C, 0x6C, 0, NumLockMode, 0x0020'00'FF, 1, NumpadSeparator , "Separator" )\ - X(92, 0xBD, 0xBD, 0x0C, 0, 0x0000'00'FF, 1, KeyMinus , "Minus" )\ - X( 93, 0x6D, 0x6D, 0x4A, 0, 0x0000'00'FF, 1, NumpadMinus , "Minus" )\ - X(94, 0xBE, 0xBE, 0x34, 0, 0x0000'00'FF, 1, KeyPeriod , "." )\ - X( 95, 0x6E, 0x6E, 0x53, NumLockMode, 0x0000'00'FF, 1, NumpadDecimal , "." )\ - X(96, 0xBF, 0xBF, 0x35, 0, 0x0000'00'FF, 1, KeySlash , "/" )\ - X( 97, 0x6F, 0x6F, 0x35, ExtendedKey, 0x0000'00'FF, 1, NumpadSlash , "/" )\ - X(98, 0xBB, 0xBB, 0x0D, 0, 0x0100'00'FF, 1, Equal , "=" )\ - X( 99, 0xBB, 0xBB, 0x0D, ExtendedKey, 0x0100'00'FF, 1, NumpadEqual , "=" )\ - X(100, 0xDC, 0xDC, 0x2B, 0, 0x0000'00'FF, 1, BackSlash , "BackSlash" )\ - X(102, 0xDB, 0xDB, 0x1A, 0, 0x0000'00'FF, 1, OpenBracket , "[" )\ - X(104, 0xDD, 0xDD, 0x1B, 0, 0x0000'00'FF, 1, ClosedBracket , "]" )\ - X(106, 0xC0, 0xC0, 0x29, 0, 0x0000'00'FF, 1, BackQuote , "`" )\ - X(108, 0xDE, 0xDE, 0x28, 0, 0x0000'00'FF, 1, SingleQuote , "'" )\ - X(110, 0xBC, 0xBC, 0x33, 0, 0x0000'00'FF, 1, Comma , "," )\ - X(112, 0xBA, 0xBA, 0x27, 0, 0x0000'00'FF, 1, Semicolon , ";" )\ - X(114, 0x70, 0x70, 0x3B, 0, 0x0000'00'FF, 1, F1 , "F1" )\ - X(116, 0x71, 0x71, 0x3C, 0, 0x0000'00'FF, 1, F2 , "F2" )\ - X(118, 0x72, 0x72, 0x3D, 0, 0x0000'00'FF, 1, F3 , "F3" )\ - X(120, 0x73, 0x73, 0x3E, 0, 0x0000'00'FF, 1, F4 , "F4" )\ - X(122, 0x74, 0x74, 0x3F, 0, 0x0000'00'FF, 1, F5 , "F5" )\ - X(124, 0x75, 0x75, 0x40, 0, 0x0000'00'FF, 1, F6 , "F6" )\ - X(126, 0x76, 0x76, 0x41, 0, 0x0000'00'FF, 1, F7 , "F7" )\ - X(128, 0x77, 0x77, 0x42, 0, 0x0000'00'FF, 1, F8 , "F8" )\ - X(130, 0x78, 0x78, 0x43, 0, 0x0000'00'FF, 1, F9 , "F9" )\ - X(132, 0x79, 0x79, 0x44, 0, 0x0000'00'FF, 1, F10 , "F10" )\ - X(134, 0x7A, 0x7A, 0x57, 0, 0x0000'00'FF, 1, F11 , "F11" )\ - X(136, 0x7B, 0x7B, 0x5B, 0, 0x0000'00'FF, 1, F12 , "F12" )\ - X(138, 0x7C, 0x7C, 0, 0, 0x0000'00'FF, 1, F13 , "F13" )\ - X(140, 0x7D, 0x7D, 0, 0, 0x0100'00'FF, 1, F14 , "F14" )\ - X(142, 0x7E, 0x7E, 0, 0, 0x0100'00'FF, 1, F15 , "F15" )\ - X(144, 0x7F, 0x7F, 0, 0, 0x0100'00'FF, 1, F16 , "F16" )\ - X(146, 0x80, 0x80, 0, 0, 0x0100'00'FF, 1, F17 , "F17" )\ - X(148, 0x81, 0x81, 0, 0, 0x0100'00'FF, 1, F18 , "F18" )\ - X(150, 0x82, 0x82, 0, 0, 0x0100'00'FF, 1, F19 , "F19" )\ - X(152, 0x83, 0x83, 0, 0, 0x0100'00'FF, 1, F20 , "F20" )\ - X(154, 0x84, 0x84, 0, 0, 0x0100'00'FF, 1, F21 , "F21" )\ - X(156, 0x85, 0x85, 0, 0, 0x0100'00'FF, 1, F22 , "F22" )\ - X(158, 0x86, 0x86, 0, 0, 0x0100'00'FF, 1, F23 , "F23" )\ - X(160, 0x87, 0x87, 0, 0, 0x0100'00'FF, 1, F24 , "F24" )\ - X(162, 0x7D, 0x7D, 0, ExtendedKey, 0x0100'00'FF, 1, F25 , "F25" )\ - X(164, 0x7E, 0x7E, 0, ExtendedKey, 0x0100'00'FF, 1, F26 , "F26" )\ - X(166, 0x7F, 0x7F, 0, ExtendedKey, 0x0100'00'FF, 1, F27 , "F27" )\ - X(168, 0x80, 0x80, 0, ExtendedKey, 0x0100'00'FF, 1, F28 , "F28" )\ - X(170, 0x81, 0x81, 0, ExtendedKey, 0x0100'00'FF, 1, F29 , "F29" )\ - X(172, 0x82, 0x82, 0, ExtendedKey, 0x0100'00'FF, 1, F30 , "F30" )\ - X(174, 0x83, 0x83, 0, ExtendedKey, 0x0100'00'FF, 1, F31 , "F31" )\ - X(176, 0x84, 0x84, 0, ExtendedKey, 0x0100'00'FF, 1, F32 , "F32" )\ - X(178, 0x85, 0x85, 0, ExtendedKey, 0x0100'00'FF, 1, F33 , "F33" )\ - X(180, 0x86, 0x86, 0, ExtendedKey, 0x0100'00'FF, 1, F34 , "F34" )\ - X(182, 0x87, 0x87, 0, ExtendedKey, 0x0100'00'FF, 1, F35 , "F35" )\ - X(184, 0x41, 0x41, 0, 0, 0x0100'00'FF, 1, KeyA , "A" )\ - X(186, 0x42, 0x42, 0, 0, 0x0100'00'FF, 1, KeyB , "B" )\ - X(188, 0x43, 0x43, 0, 0, 0x0100'00'FF, 1, KeyC , "C" )\ - X(190, 0x44, 0x44, 0, 0, 0x0100'00'FF, 1, KeyD , "D" )\ - X(192, 0x45, 0x45, 0, 0, 0x0100'00'FF, 1, KeyE , "E" )\ - X(194, 0x46, 0x46, 0, 0, 0x0100'00'FF, 1, KeyF , "F" )\ - X(196, 0x47, 0x47, 0, 0, 0x0100'00'FF, 1, KeyG , "G" )\ - X(198, 0x48, 0x48, 0, 0, 0x0100'00'FF, 1, KeyH , "H" )\ - X(200, 0x49, 0x49, 0, 0, 0x0100'00'FF, 1, KeyI , "I" )\ - X(202, 0x4A, 0x4A, 0, 0, 0x0100'00'FF, 1, KeyJ , "J" )\ - X(204, 0x4B, 0x4B, 0, 0, 0x0100'00'FF, 1, KeyK , "K" )\ - X(206, 0x4C, 0x4C, 0, 0, 0x0100'00'FF, 1, KeyL , "L" )\ - X(208, 0x4D, 0x4D, 0, 0, 0x0100'00'FF, 1, KeyM , "M" )\ - X(210, 0x4E, 0x4E, 0, 0, 0x0100'00'FF, 1, KeyN , "N" )\ - X(212, 0x4F, 0x4F, 0, 0, 0x0100'00'FF, 1, KeyO , "O" )\ - X(214, 0x50, 0x50, 0, 0, 0x0100'00'FF, 1, KeyP , "P" )\ - X(216, 0x51, 0x51, 0, 0, 0x0100'00'FF, 1, KeyQ , "Q" )\ - X(218, 0x52, 0x52, 0, 0, 0x0100'00'FF, 1, KeyR , "R" )\ - X(220, 0x53, 0x53, 0, 0, 0x0100'00'FF, 1, KeyS , "S" )\ - X(222, 0x54, 0x54, 0, 0, 0x0100'00'FF, 1, KeyT , "T" )\ - X(224, 0x55, 0x55, 0, 0, 0x0100'00'FF, 1, KeyU , "U" )\ - X(226, 0x56, 0x56, 0, 0, 0x0100'00'FF, 1, KeyV , "V" )\ - X(228, 0x57, 0x57, 0, 0, 0x0100'00'FF, 1, KeyW , "W" )\ - X(230, 0x58, 0x58, 0, 0, 0x0100'00'FF, 1, KeyX , "X" )\ - X(232, 0x59, 0x59, 0, 0, 0x0100'00'FF, 1, KeyY , "Y" )\ - X(234, 0x5A, 0x5A, 0, 0, 0x0100'00'FF, 1, KeyZ , "Z" )\ - X(236, 0x5F, 0x5F, 0, ExtendedKey, 0x0100'00'FF, 0, Sleep , "Sleep" )\ - X(238, 0xB7, 0xB7, 0, ExtendedKey, 0x0100'00'FF, 0, Calculator , "Calculator" )\ - X(240, 0x48, 0x48, 0, ExtendedKey, 0x0100'00'FF, 0, Mail , "Mail" )\ - X(242, 0xAD, 0xAD, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolMute , "MediaVolMute" )\ - X(244, 0xAE, 0xAE, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolDown , "MediaVolDown" )\ - X(246, 0xAF, 0xAF, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolUp , "MediaVolUp" )\ - X(248, 0xB0, 0xB0, 0, ExtendedKey, 0x0100'00'FF, 0, MediaNext , "MediaNext" )\ - X(250, 0xB1, 0xB1, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPrev , "MediaPrev" )\ - X(252, 0xB2, 0xB2, 0, ExtendedKey, 0x0100'00'FF, 0, MediaStop , "MediaStop" )\ - X(254, 0xB2, 0xB2, 0, 0, 0x0100'00'FF, 0, MediaPause , "MediaPause" )\ - X(256, 0xB3, 0xB3, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPlayPause , "MediaPlayPause" )\ - X(258, 0xB3, 0xB3, 0, 0, 0x0100'00'FF, 0, MediaPlay , "MediaPlay" )\ - X(260, 0xB5, 0xB5, 0, ExtendedKey, 0x0100'00'FF, 0, MediaSelect , "MediaSelect" )\ - X(262, 0xB8, 0xB8, 0, ExtendedKey, 0x0100'00'FF, 0, MediaReverse , "MediaReverse" )\ - X(264, 0xB8, 0xB8, 0, 0, 0x0100'00'FF, 0, MediaRecord , "MediaRecord" )\ - X(266, 0xB9, 0xB9, 0, ExtendedKey, 0x0100'00'FF, 0, MediaFastForward, "MediaFastForward")\ - X(268, 0xB9, 0xB9, 0, 0, 0x0100'00'FF, 0, MediaRewind , "MediaRewind" )\ - X(270, 0xA6, 0xA6, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserBack , "BrowserBack" )\ - X(272, 0xA7, 0xA7, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserForward , "BrowserForward" )\ - X(274, 0xA8, 0xA8, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserRefresh , "BrowserRefresh" )\ - X(276, 0xA9, 0xA9, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserStop , "BrowserStop" )\ - X(278, 0xAA, 0xAA, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserSearch , "BrowserSearch" )\ - X(280, 0xAB, 0xAB, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserFavorites, "BrowserFavorites")\ - X(282, 0xAC, 0xAC, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserHome , "BrowserHome" )\ - X(284, 0xFF, 0xFF, 0xFF, ExtendedKey, 0x0100'FF'FF, 0, lastKey , "lastKey" ) + /*Id Index Vkey Scan CtrlState Mask I Name GenericName KKP base KKP suffix*/\ + X(0, 0, 0, 0, 0, 0x0000'00'FF, 1, undef , "undef" , 0 | ('u' << 16))\ + X(1, 0, 0xFF, 0xFF, 0, 0x0100'FF'FF, 0, config , "config" , 0 | ('u' << 16))\ + X(2, 0xA2, 0x11, 0x1D, 0, 0x0100'00'FF, 0, LeftCtrl , "Ctrl" , 57442 | ('u' << 16))\ + X( 3, 0xA3, 0x11, 0x1D, ExtendedKey, 0x0100'00'FF, 0, RightCtrl , "Ctrl" , 57448 | ('u' << 16))\ + X(4, 0xA4, 0x12, 0x38, 0, 0x0100'00'FF, 0, LeftAlt , "Alt" , 57443 | ('u' << 16))\ + X( 5, 0xA5, 0x12, 0x38, ExtendedKey, 0x0100'00'FF, 0, RightAlt , "Alt" , 57449 | ('u' << 16))\ + X(6, 0xA0, 0x10, 0x2A, 0, 0x0000'FF'FF, 0, LeftShift , "Shift" , 57441 | ('u' << 16))\ + X( 7, 0xA1, 0x10, 0x36, 0, 0x0000'FF'FF, 0, RightShift , "Shift" , 57447 | ('u' << 16))\ + X(8, 0x5B, 0x5B, 0x5B, ExtendedKey, 0x0100'00'FF, 0, LeftWin , "Win" , 57444 | ('u' << 16))\ + X( 9, 0x5C, 0x5C, 0x5C, ExtendedKey, 0x0100'00'FF, 0, RightWin , "Win" , 57450 | ('u' << 16))\ + X(10, 0x5B, 0x5B, 0x5B, 0, 0x0100'00'FF, 0, LeftHyper , "Hyper" , 57445 | ('u' << 16))\ + X( 11, 0x5C, 0x5C, 0x5C, 0, 0x0100'00'FF, 0, RightHyper , "Hyper" , 57451 | ('u' << 16))\ + X(12, 0x5D, 0x5D, 0x5D, ExtendedKey, 0x0000'00'FF, 0, Apps , "Apps" , 57363 | ('u' << 16))\ + X(14, 0x90, 0x90, 0x45, 0, 0x0000'00'FF, 0, NumLock , "NumLock" , 57360 | ('u' << 16))\ + X(16, 0x14, 0x14, 0x3A, 0, 0x0100'00'FF, 0, CapsLock , "CapsLock" , 57358 | ('u' << 16))\ + X(18, 0x91, 0x91, 0x45, 0, 0x0100'00'FF, 0, ScrollLock , "ScrollLock" , 57359 | ('u' << 16))\ + X(20, 0x14, 0x14, 0x3A, ExtendedKey, 0x0100'00'FF, 0, IsoLevel3Shift , "IsoLevel3Shift" , 57453 | ('u' << 16))\ + X(22, 0x91, 0x91, 0x45, ExtendedKey, 0x0100'00'FF, 0, IsoLevel5Shift , "IsoLevel5Shift" , 57454 | ('u' << 16))\ + X(24, 0x1B, 0x1B, 0x01, 0, 0x0000'00'FF, 1, Esc , "Esc" , 27 | ('u' << 16))\ + X(26, 0x20, 0x20, 0x39, 0, 0x0000'00'FF, 1, Space , "Space" , 32 | ('u' << 16))\ + X(28, 0x08, 0x08, 0x0E, 0, 0x0000'00'FF, 1, Backspace , "Backspace" , 127 | ('u' << 16))\ + X(30, 0x09, 0x09, 0x0F, 0, 0x0000'00'FF, 1, Tab , "Tab" , 9 | ('u' << 16))\ + X(32, 0x03, 0x03, 0x46, 0, 0x0000'FF'FF, 1, Break , "Break" , 0 | ('u' << 16))\ + X(34, 0x13, 0x13, 0x45, 0, 0x0000'FF'FF, 0, Pause , "Pause" , 57362 | ('u' << 16))\ + X(36, 0x29, 0x29, 0, 0, 0x0000'00'FF, 0, Select , "Select" , 0 | ('u' << 16))\ + X(38, 0x2C, 0x2C, 0x54, 0, 0x0000'FF'FF, 1, SysRq , "SysRq" , 0 | ('u' << 16))\ + X(40, 0x2C, 0x2C, 0x37, ExtendedKey, 0x0100'FF'FF, 0, PrintScreen , "PrintScreen" , 57361 | ('u' << 16))\ + X(42, 0x0D, 0x0D, 0x1C, 0, 0x0100'00'FF, 1, KeyEnter , "Enter" , 13 | ('u' << 16))\ + X( 43, 0x0D, 0x0D, 0x1C, ExtendedKey, 0x0100'00'FF, 1, NumpadEnter , "Enter" , 57414 | ('u' << 16))\ + X(44, 0x21, 0x21, 0x49, ExtendedKey, 0x0100'00'FF, 1, KeyPageUp , "PageUp" , 5 | ('~' << 16))\ + X( 45, 0x21, 0x21, 0x49, 0, 0x0100'00'FF, 1, NumpadPageUp , "PageUp" , 57421 | ('u' << 16))\ + X(46, 0x22, 0x22, 0x51, ExtendedKey, 0x0100'00'FF, 1, KeyPageDown , "PageDown" , 6 | ('~' << 16))\ + X( 47, 0x22, 0x22, 0x51, 0, 0x0100'00'FF, 1, NumpadPageDown , "PageDown" , 57422 | ('u' << 16))\ + X(48, 0x23, 0x23, 0x4F, ExtendedKey, 0x0100'00'FF, 1, KeyEnd , "End" , 8 | ('~' << 16))/*don't reorder*/\ + X( 49, 0x23, 0x23, 0x4F, 0, 0x0100'00'FF, 1, NumpadEnd , "End" , 57424 | ('u' << 16))/*don't reorder*/\ + X(50, 0x24, 0x24, 0x47, ExtendedKey, 0x0100'00'FF, 1, KeyHome , "Home" , 7 | ('~' << 16))/*don't reorder*/\ + X( 51, 0x24, 0x24, 0x47, 0, 0x0100'00'FF, 1, NumpadHome , "Home" , 57423 | ('u' << 16))/*don't reorder*/\ + X(52, 0x25, 0x25, 0x4B, ExtendedKey, 0x0100'00'FF, 1, KeyLeftArrow , "LeftArrow" , 1 | ('D' << 16))/*don't reorder*/\ + X( 53, 0x25, 0x25, 0x4B, 0, 0x0100'00'FF, 1, NumpadLeftArrow , "LeftArrow" , 57417 | ('u' << 16))/*don't reorder*/\ + X(54, 0x26, 0x26, 0x48, ExtendedKey, 0x0100'00'FF, 1, KeyUpArrow , "UpArrow" , 1 | ('A' << 16))/*don't reorder*/\ + X( 55, 0x26, 0x26, 0x48, 0, 0x0100'00'FF, 1, NumpadUpArrow , "UpArrow" , 57419 | ('u' << 16))/*don't reorder*/\ + X(56, 0x27, 0x27, 0x4D, ExtendedKey, 0x0100'00'FF, 1, KeyRightArrow , "RightArrow" , 1 | ('C' << 16))/*don't reorder*/\ + X( 57, 0x27, 0x27, 0x4D, 0, 0x0100'00'FF, 1, NumpadRightArrow, "RightArrow" , 57418 | ('u' << 16))/*don't reorder*/\ + X(58, 0x28, 0x28, 0x50, ExtendedKey, 0x0100'00'FF, 1, KeyDownArrow , "DownArrow" , 1 | ('B' << 16))/*don't reorder*/\ + X( 59, 0x28, 0x28, 0x50, 0, 0x0100'00'FF, 1, NumpadDownArrow , "DownArrow" , 57420 | ('u' << 16))/*don't reorder*/\ + X(60, 0x30, 0x30, 0x0B, 0, 0x0000'FF'FF, 1, Key0 , "0" , 48 | ('u' << 16))\ + X( 61, 0x60, 0x60, 0x52, NumLockMode, 0x0000'FF'FF, 1, Numpad0 , "0" , 57399 | ('u' << 16))\ + X(62, 0x31, 0x31, 0x02, 0, 0x0000'FF'FF, 1, Key1 , "1" , 49 | ('u' << 16))\ + X( 63, 0x61, 0x61, 0x4F, NumLockMode, 0x0000'FF'FF, 1, Numpad1 , "1" , 57400 | ('u' << 16))\ + X(64, 0x32, 0x32, 0x03, 0, 0x0000'FF'FF, 1, Key2 , "2" , 50 | ('u' << 16))\ + X( 65, 0x62, 0x62, 0x50, NumLockMode, 0x0000'FF'FF, 1, Numpad2 , "2" , 57401 | ('u' << 16))\ + X(66, 0x33, 0x33, 0x04, 0, 0x0000'FF'FF, 1, Key3 , "3" , 51 | ('u' << 16))\ + X( 67, 0x63, 0x63, 0x51, NumLockMode, 0x0000'FF'FF, 1, Numpad3 , "3" , 57402 | ('u' << 16))\ + X(68, 0x34, 0x34, 0x05, 0, 0x0000'FF'FF, 1, Key4 , "4" , 52 | ('u' << 16))\ + X( 69, 0x64, 0x64, 0x4B, NumLockMode, 0x0000'FF'FF, 1, Numpad4 , "4" , 57403 | ('u' << 16))\ + X(70, 0x35, 0x35, 0x06, 0, 0x0000'FF'FF, 1, Key5 , "5" , 53 | ('u' << 16))\ + X( 71, 0x65, 0x65, 0x4C, NumLockMode, 0x0000'FF'FF, 1, Numpad5 , "5" , 57404 | ('u' << 16))\ + X(72, 0x36, 0x36, 0x07, 0, 0x0000'FF'FF, 1, Key6 , "6" , 54 | ('u' << 16))\ + X( 73, 0x66, 0x66, 0x4D, NumLockMode, 0x0000'FF'FF, 1, Numpad6 , "6" , 57405 | ('u' << 16))\ + X(74, 0x37, 0x37, 0x08, 0, 0x0000'FF'FF, 1, Key7 , "7" , 55 | ('u' << 16))\ + X( 75, 0x67, 0x67, 0x47, NumLockMode, 0x0000'FF'FF, 1, Numpad7 , "7" , 57406 | ('u' << 16))\ + X(76, 0x38, 0x38, 0x09, 0, 0x0000'FF'FF, 1, Key8 , "8" , 56 | ('u' << 16))\ + X( 77, 0x68, 0x68, 0x48, NumLockMode, 0x0000'FF'FF, 1, Numpad8 , "8" , 57407 | ('u' << 16))\ + X(78, 0x39, 0x39, 0x0A, 0, 0x0000'FF'FF, 1, Key9 , "9" , 57 | ('u' << 16))\ + X( 79, 0x69, 0x69, 0x49, NumLockMode, 0x0000'FF'FF, 1, Numpad9 , "9" , 57408 | ('u' << 16))\ + X(80, 0x2D, 0x2D, 0x52, ExtendedKey, 0x0100'00'FF, 1, KeyInsert , "Insert" , 2 | ('~' << 16))\ + X( 81, 0x2D, 0x2D, 0x52, 0, 0x0100'00'FF, 1, NumpadInsert , "Insert" , 57425 | ('u' << 16))\ + X(82, 0x2E, 0x2E, 0x53, ExtendedKey, 0x0100'00'FF, 1, KeyDelete , "Delete" , 3 | ('~' << 16))\ + X( 83, 0x2E, 0x2E, 0x55, 0, 0x0100'00'FF, 1, NumpadDelete , "Delete" , 57426 | ('u' << 16))\ + X(84, 0x0C, 0x0C, 0x4C, ExtendedKey, 0x0100'00'FF, 1, KeyClear , "Clear" , 1 | ('E' << 16))\ + X( 85, 0x0C, 0x0C, 0x4C, 0, 0x0100'00'FF, 1, NumpadClear , "Clear" , 57427 | ('~' << 16))\ + X(86, 0x6A, 0x6A, 0x09, 0, 0x0000'FF'FF, 1, KeyMultiply , "*" , 0 | ('u' << 16))\ + X( 87, 0x6A, 0x6A, 0x37, 0, 0x0000'FF'FF, 1, NumpadMultiply , "*" , 57411 | ('u' << 16))\ + X(88, 0x6B, 0x6B, 0x0D, 0, 0x0000'FF'FF, 1, KeyPlus , "Plus" , 43 | ('u' << 16))\ + X( 89, 0x6B, 0x6B, 0x4E, 0, 0x0000'FF'FF, 1, NumpadPlus , "Plus" , 57413 | ('u' << 16))\ + X(90, 0x6C, 0x6C, 0, 0, 0x0020'00'FF, 1, KeySeparator , "Separator" , 0 | ('u' << 16))\ + X( 91, 0x6C, 0x6C, 0, NumLockMode, 0x0020'00'FF, 1, NumpadSeparator , "Separator" , 57416 | ('u' << 16))\ + X(92, 0xBD, 0xBD, 0x0C, 0, 0x0000'00'FF, 1, KeyMinus , "Minus" , 45 | ('u' << 16))\ + X( 93, 0x6D, 0x6D, 0x4A, 0, 0x0000'00'FF, 1, NumpadMinus , "Minus" , 57412 | ('u' << 16))\ + X(94, 0xBE, 0xBE, 0x34, 0, 0x0000'00'FF, 1, KeyPeriod , "." , 46 | ('u' << 16))\ + X( 95, 0x6E, 0x6E, 0x53, NumLockMode, 0x0000'00'FF, 1, NumpadDecimal , "." , 57409 | ('u' << 16))\ + X(96, 0xBF, 0xBF, 0x35, 0, 0x0000'00'FF, 1, KeySlash , "/" , 47 | ('u' << 16))\ + X( 97, 0x6F, 0x6F, 0x35, ExtendedKey, 0x0000'00'FF, 1, NumpadSlash , "/" , 57410 | ('u' << 16))\ + X(98, 0xBB, 0xBB, 0x0D, 0, 0x0100'00'FF, 1, Equal , "=" , 61 | ('u' << 16))\ + X( 99, 0xBB, 0xBB, 0x0D, ExtendedKey, 0x0100'00'FF, 1, NumpadEqual , "=" , 57415 | ('u' << 16))\ + X(100, 0xDC, 0xDC, 0x2B, 0, 0x0000'00'FF, 1, BackSlash , "BackSlash" , 92 | ('u' << 16))\ + X(102, 0xDB, 0xDB, 0x1A, 0, 0x0000'00'FF, 1, OpenBracket , "[" , 91 | ('u' << 16))\ + X(104, 0xDD, 0xDD, 0x1B, 0, 0x0000'00'FF, 1, ClosedBracket , "]" , 93 | ('u' << 16))\ + X(106, 0xC0, 0xC0, 0x29, 0, 0x0000'00'FF, 1, BackQuote , "`" , 96 | ('u' << 16))\ + X(108, 0xDE, 0xDE, 0x28, 0, 0x0000'00'FF, 1, SingleQuote , "'" , 39 | ('u' << 16))\ + X(110, 0xBC, 0xBC, 0x33, 0, 0x0000'00'FF, 1, Comma , "," , 44 | ('u' << 16))\ + X(112, 0xBA, 0xBA, 0x27, 0, 0x0000'00'FF, 1, Semicolon , ";" , 59 | ('u' << 16))\ + X(114, 0x70, 0x70, 0x3B, 0, 0x0000'00'FF, 1, F1 , "F1" , 11 | ('~' << 16))\ + X(116, 0x71, 0x71, 0x3C, 0, 0x0000'00'FF, 1, F2 , "F2" , 12 | ('~' << 16))\ + X(118, 0x72, 0x72, 0x3D, 0, 0x0000'00'FF, 1, F3 , "F3" , 13 | ('~' << 16))\ + X(120, 0x73, 0x73, 0x3E, 0, 0x0000'00'FF, 1, F4 , "F4" , 14 | ('~' << 16))\ + X(122, 0x74, 0x74, 0x3F, 0, 0x0000'00'FF, 1, F5 , "F5" , 15 | ('~' << 16))\ + X(124, 0x75, 0x75, 0x40, 0, 0x0000'00'FF, 1, F6 , "F6" , 17 | ('~' << 16))\ + X(126, 0x76, 0x76, 0x41, 0, 0x0000'00'FF, 1, F7 , "F7" , 18 | ('~' << 16))\ + X(128, 0x77, 0x77, 0x42, 0, 0x0000'00'FF, 1, F8 , "F8" , 19 | ('~' << 16))\ + X(130, 0x78, 0x78, 0x43, 0, 0x0000'00'FF, 1, F9 , "F9" , 20 | ('~' << 16))\ + X(132, 0x79, 0x79, 0x44, 0, 0x0000'00'FF, 1, F10 , "F10" , 21 | ('~' << 16))\ + X(134, 0x7A, 0x7A, 0x57, 0, 0x0000'00'FF, 1, F11 , "F11" , 23 | ('~' << 16))\ + X(136, 0x7B, 0x7B, 0x5B, 0, 0x0000'00'FF, 1, F12 , "F12" , 24 | ('~' << 16))\ + X(138, 0x7C, 0x7C, 0, 0, 0x0000'00'FF, 1, F13 , "F13" , 57376 | ('u' << 16))\ + X(140, 0x7D, 0x7D, 0, 0, 0x0100'00'FF, 1, F14 , "F14" , 57377 | ('u' << 16))\ + X(142, 0x7E, 0x7E, 0, 0, 0x0100'00'FF, 1, F15 , "F15" , 57378 | ('u' << 16))\ + X(144, 0x7F, 0x7F, 0, 0, 0x0100'00'FF, 1, F16 , "F16" , 57379 | ('u' << 16))\ + X(146, 0x80, 0x80, 0, 0, 0x0100'00'FF, 1, F17 , "F17" , 57380 | ('u' << 16))\ + X(148, 0x81, 0x81, 0, 0, 0x0100'00'FF, 1, F18 , "F18" , 57381 | ('u' << 16))\ + X(150, 0x82, 0x82, 0, 0, 0x0100'00'FF, 1, F19 , "F19" , 57382 | ('u' << 16))\ + X(152, 0x83, 0x83, 0, 0, 0x0100'00'FF, 1, F20 , "F20" , 57383 | ('u' << 16))\ + X(154, 0x84, 0x84, 0, 0, 0x0100'00'FF, 1, F21 , "F21" , 57384 | ('u' << 16))\ + X(156, 0x85, 0x85, 0, 0, 0x0100'00'FF, 1, F22 , "F22" , 57385 | ('u' << 16))\ + X(158, 0x86, 0x86, 0, 0, 0x0100'00'FF, 1, F23 , "F23" , 57386 | ('u' << 16))\ + X(160, 0x87, 0x87, 0, 0, 0x0100'00'FF, 1, F24 , "F24" , 57387 | ('u' << 16))\ + X(162, 0x7D, 0x7D, 0, ExtendedKey, 0x0100'00'FF, 1, F25 , "F25" , 57388 | ('u' << 16))\ + X(164, 0x7E, 0x7E, 0, ExtendedKey, 0x0100'00'FF, 1, F26 , "F26" , 57389 | ('u' << 16))\ + X(166, 0x7F, 0x7F, 0, ExtendedKey, 0x0100'00'FF, 1, F27 , "F27" , 57390 | ('u' << 16))\ + X(168, 0x80, 0x80, 0, ExtendedKey, 0x0100'00'FF, 1, F28 , "F28" , 57391 | ('u' << 16))\ + X(170, 0x81, 0x81, 0, ExtendedKey, 0x0100'00'FF, 1, F29 , "F29" , 57392 | ('u' << 16))\ + X(172, 0x82, 0x82, 0, ExtendedKey, 0x0100'00'FF, 1, F30 , "F30" , 57393 | ('u' << 16))\ + X(174, 0x83, 0x83, 0, ExtendedKey, 0x0100'00'FF, 1, F31 , "F31" , 57394 | ('u' << 16))\ + X(176, 0x84, 0x84, 0, ExtendedKey, 0x0100'00'FF, 1, F32 , "F32" , 57395 | ('u' << 16))\ + X(178, 0x85, 0x85, 0, ExtendedKey, 0x0100'00'FF, 1, F33 , "F33" , 57396 | ('u' << 16))\ + X(180, 0x86, 0x86, 0, ExtendedKey, 0x0100'00'FF, 1, F34 , "F34" , 57397 | ('u' << 16))\ + X(182, 0x87, 0x87, 0, ExtendedKey, 0x0100'00'FF, 1, F35 , "F35" , 57398 | ('u' << 16))\ + X(184, 0x41, 0x41, 0, 0, 0x0100'00'FF, 1, KeyA , "A" , 97 | ('u' << 16))\ + X(186, 0x42, 0x42, 0, 0, 0x0100'00'FF, 1, KeyB , "B" , 98 | ('u' << 16))\ + X(188, 0x43, 0x43, 0, 0, 0x0100'00'FF, 1, KeyC , "C" , 99 | ('u' << 16))\ + X(190, 0x44, 0x44, 0, 0, 0x0100'00'FF, 1, KeyD , "D" , 100 | ('u' << 16))\ + X(192, 0x45, 0x45, 0, 0, 0x0100'00'FF, 1, KeyE , "E" , 101 | ('u' << 16))\ + X(194, 0x46, 0x46, 0, 0, 0x0100'00'FF, 1, KeyF , "F" , 102 | ('u' << 16))\ + X(196, 0x47, 0x47, 0, 0, 0x0100'00'FF, 1, KeyG , "G" , 103 | ('u' << 16))\ + X(198, 0x48, 0x48, 0, 0, 0x0100'00'FF, 1, KeyH , "H" , 104 | ('u' << 16))\ + X(200, 0x49, 0x49, 0, 0, 0x0100'00'FF, 1, KeyI , "I" , 105 | ('u' << 16))\ + X(202, 0x4A, 0x4A, 0, 0, 0x0100'00'FF, 1, KeyJ , "J" , 106 | ('u' << 16))\ + X(204, 0x4B, 0x4B, 0, 0, 0x0100'00'FF, 1, KeyK , "K" , 107 | ('u' << 16))\ + X(206, 0x4C, 0x4C, 0, 0, 0x0100'00'FF, 1, KeyL , "L" , 108 | ('u' << 16))\ + X(208, 0x4D, 0x4D, 0, 0, 0x0100'00'FF, 1, KeyM , "M" , 109 | ('u' << 16))\ + X(210, 0x4E, 0x4E, 0, 0, 0x0100'00'FF, 1, KeyN , "N" , 110 | ('u' << 16))\ + X(212, 0x4F, 0x4F, 0, 0, 0x0100'00'FF, 1, KeyO , "O" , 111 | ('u' << 16))\ + X(214, 0x50, 0x50, 0, 0, 0x0100'00'FF, 1, KeyP , "P" , 112 | ('u' << 16))\ + X(216, 0x51, 0x51, 0, 0, 0x0100'00'FF, 1, KeyQ , "Q" , 113 | ('u' << 16))\ + X(218, 0x52, 0x52, 0, 0, 0x0100'00'FF, 1, KeyR , "R" , 114 | ('u' << 16))\ + X(220, 0x53, 0x53, 0, 0, 0x0100'00'FF, 1, KeyS , "S" , 115 | ('u' << 16))\ + X(222, 0x54, 0x54, 0, 0, 0x0100'00'FF, 1, KeyT , "T" , 116 | ('u' << 16))\ + X(224, 0x55, 0x55, 0, 0, 0x0100'00'FF, 1, KeyU , "U" , 117 | ('u' << 16))\ + X(226, 0x56, 0x56, 0, 0, 0x0100'00'FF, 1, KeyV , "V" , 118 | ('u' << 16))\ + X(228, 0x57, 0x57, 0, 0, 0x0100'00'FF, 1, KeyW , "W" , 119 | ('u' << 16))\ + X(230, 0x58, 0x58, 0, 0, 0x0100'00'FF, 1, KeyX , "X" , 120 | ('u' << 16))\ + X(232, 0x59, 0x59, 0, 0, 0x0100'00'FF, 1, KeyY , "Y" , 121 | ('u' << 16))\ + X(234, 0x5A, 0x5A, 0, 0, 0x0100'00'FF, 1, KeyZ , "Z" , 122 | ('u' << 16))\ + X(236, 0x5F, 0x5F, 0, ExtendedKey, 0x0100'00'FF, 0, Sleep , "Sleep" , 0 | ('u' << 16))\ + X(238, 0xB7, 0xB7, 0, ExtendedKey, 0x0100'00'FF, 0, Calculator , "Calculator" , 0 | ('u' << 16))\ + X(240, 0x48, 0x48, 0, ExtendedKey, 0x0100'00'FF, 0, Mail , "Mail" , 0 | ('u' << 16))\ + X(242, 0xAD, 0xAD, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440 | ('u' << 16))\ + X(244, 0xAE, 0xAE, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438 | ('u' << 16))\ + X(246, 0xAF, 0xAF, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439 | ('u' << 16))\ + X(248, 0xB0, 0xB0, 0, ExtendedKey, 0x0100'00'FF, 0, MediaNext , "MediaNext" , 57435 | ('u' << 16))\ + X(250, 0xB1, 0xB1, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPrev , "MediaPrev" , 57436 | ('u' << 16))\ + X(252, 0xB2, 0xB2, 0, ExtendedKey, 0x0100'00'FF, 0, MediaStop , "MediaStop" , 57432 | ('u' << 16))\ + X(254, 0xB2, 0xB2, 0, 0, 0x0100'00'FF, 0, MediaPause , "MediaPause" , 57429 | ('u' << 16))\ + X(256, 0xB3, 0xB3, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430 | ('u' << 16))\ + X(258, 0xB3, 0xB3, 0, 0, 0x0100'00'FF, 0, MediaPlay , "MediaPlay" , 57428 | ('u' << 16))\ + X(260, 0xB5, 0xB5, 0, ExtendedKey, 0x0100'00'FF, 0, MediaSelect , "MediaSelect" , 0 | ('u' << 16))\ + X(262, 0xB8, 0xB8, 0, ExtendedKey, 0x0100'00'FF, 0, MediaReverse , "MediaReverse" , 57431 | ('u' << 16))\ + X(264, 0xB8, 0xB8, 0, 0, 0x0100'00'FF, 0, MediaRecord , "MediaRecord" , 57437 | ('u' << 16))\ + X(266, 0xB9, 0xB9, 0, ExtendedKey, 0x0100'00'FF, 0, MediaFastForward, "MediaFastForward", 57433 | ('u' << 16))\ + X(268, 0xB9, 0xB9, 0, 0, 0x0100'00'FF, 0, MediaRewind , "MediaRewind" , 57434 | ('u' << 16))\ + X(270, 0xA6, 0xA6, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserBack , "BrowserBack" , 0 | ('u' << 16))\ + X(272, 0xA7, 0xA7, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserForward , "BrowserForward" , 0 | ('u' << 16))\ + X(274, 0xA8, 0xA8, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 | ('u' << 16))\ + X(276, 0xA9, 0xA9, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserStop , "BrowserStop" , 0 | ('u' << 16))\ + X(278, 0xAA, 0xAA, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 | ('u' << 16))\ + X(280, 0xAB, 0xAB, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserFavorites, "BrowserFavorites", 0 | ('u' << 16))\ + X(282, 0xAC, 0xAC, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserHome , "BrowserHome" , 0 | ('u' << 16))\ + X(284, 0xFF, 0xFF, 0xFF, ExtendedKey, 0x0100'FF'FF, 0, lastKey , "lastKey" , 0) // Max 12 bits for KeyId. static constexpr auto idbits = 12; - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName) \ + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ static constexpr auto Name = KeyId; key_list #undef X @@ -320,26 +320,33 @@ namespace netxs::input static const auto keymap = std::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName) \ + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ { map{ Vkey, Scan, CtrlState, Mask, #Name, GenericName, Input, Name }, Name }, key_list #undef X }; - + static const auto kkpmap = std::unordered_map + { + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ + { KKPDef, KeyId }, + key_list + #undef X + }; static const auto specific_names = utf::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName) \ + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ { utf::to_lower(#Name), KeyId }, key_list #undef X }; static const auto generic_names = utf::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName) \ + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ { utf::to_lower(GenericName), KeyId & -2 }, key_list #undef X }; + #define mouse_list \ X(MouseAny , 0x00, 0)\ X(MouseDown , 0x01, 0)X(LeftDown , 0x1, 0b001)X(RightDown , 0x1, 0b010)X(LeftRightDown , 0x1, 0b011)X(MiddleDown , 0x1, 0b100)\ diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 22df32b0b9..54a6e8883a 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5901,177 +5901,22 @@ namespace netxs::os static auto kkp2key = [] { using namespace input; - auto m = std::unordered_map + auto extra_defs = std::to_array>( { // base key CSI-suffix input::key - { 57442 | ('u' << 16), key::LeftCtrl }, - { 57448 | ('u' << 16), key::RightCtrl }, - { 57443 | ('u' << 16), key::LeftAlt }, { 57446 | ('u' << 16), key::LeftAlt }, // LEFT_META - { 57449 | ('u' << 16), key::RightAlt }, { 57452 | ('u' << 16), key::RightAlt }, // RIGHT_META - { 57441 | ('u' << 16), key::LeftShift }, - { 57447 | ('u' << 16), key::RightShift }, - { 57444 | ('u' << 16), key::LeftWin }, // LEFT_SUPER - { 57450 | ('u' << 16), key::RightWin }, // RIGHT_SUPER - { 57445 | ('u' << 16), key::LeftHyper }, // LEFT_HYPER - { 57451 | ('u' << 16), key::RightHyper }, // RIGHT_HYPER - { 57363 | ('u' << 16), key::Apps }, // MENU - { 57360 | ('u' << 16), key::NumLock }, - { 57358 | ('u' << 16), key::CapsLock }, - { 57453 | ('u' << 16), key::IsoLevel3Shift }, // ISO_LEVEL3_SHIFT - { 57359 | ('u' << 16), key::ScrollLock }, - { 57454 | ('u' << 16), key::IsoLevel5Shift }, // ISO_LEVEL5_SHIFT - { 27 | ('u' << 16), key::Esc }, - { 32 | ('u' << 16), key::Space }, - { 127 | ('u' << 16), key::Backspace }, - { 9 | ('u' << 16), key::Tab }, - { 57362 | ('u' << 16), key::Pause }, - { 57361 | ('u' << 16), key::PrintScreen }, - { 13 | ('u' << 16), key::KeyEnter }, - { 57414 | ('u' << 16), key::NumpadEnter }, // KP_ENTER - { 5 | ('~' << 16), key::KeyPageUp }, - { 57421 | ('u' << 16), key::NumpadPageUp }, // KP_PAGE_UP - { 6 | ('~' << 16), key::KeyPageDown }, - { 57422 | ('u' << 16), key::NumpadPageDown }, // KP_PAGE_DOWN - { 1 | ('F' << 16), key::KeyEnd }, - { 8 | ('~' << 16), key::KeyEnd }, - { 57424 | ('u' << 16), key::NumpadEnd }, // KP_END { 1 | ('H' << 16), key::KeyHome }, - { 7 | ('~' << 16), key::KeyHome }, - { 57423 | ('u' << 16), key::NumpadHome }, // KP_HOME - { 1 | ('D' << 16), key::KeyLeftArrow }, - { 57417 | ('u' << 16), key::NumpadLeftArrow }, // KP_LEFT - { 1 | ('C' << 16), key::KeyRightArrow }, - { 57418 | ('u' << 16), key::NumpadRightArrow }, // KP_RIGHT - { 1 | ('A' << 16), key::KeyUpArrow }, - { 57419 | ('u' << 16), key::NumpadUpArrow }, // KP_UP - { 1 | ('B' << 16), key::KeyDownArrow }, - { 57420 | ('u' << 16), key::NumpadDownArrow }, // KP_DOWN - { 48 | ('u' << 16), key::Key0 }, - { 57399 | ('u' << 16), key::Numpad0 }, - { 49 | ('u' << 16), key::Key1 }, - { 57400 | ('u' << 16), key::Numpad1 }, - { 50 | ('u' << 16), key::Key2 }, - { 57401 | ('u' << 16), key::Numpad2 }, - { 51 | ('u' << 16), key::Key3 }, - { 57402 | ('u' << 16), key::Numpad3 }, - { 52 | ('u' << 16), key::Key4 }, - { 57403 | ('u' << 16), key::Numpad4 }, - { 53 | ('u' << 16), key::Key5 }, - { 57404 | ('u' << 16), key::Numpad5 }, - { 54 | ('u' << 16), key::Key6 }, - { 57405 | ('u' << 16), key::Numpad6 }, - { 55 | ('u' << 16), key::Key7 }, - { 57406 | ('u' << 16), key::Numpad7 }, - { 56 | ('u' << 16), key::Key8 }, - { 57407 | ('u' << 16), key::Numpad8 }, - { 57 | ('u' << 16), key::Key9 }, - { 57408 | ('u' << 16), key::Numpad9 }, - { 2 | ('~' << 16), key::KeyInsert }, - { 57425 | ('u' << 16), key::NumpadInsert }, // KP_INSERT - { 3 | ('~' << 16), key::KeyDelete }, - { 57426 | ('u' << 16), key::NumpadDelete }, // KP_DELETE - { 1 | ('E' << 16), key::KeyClear }, // KP_BEGIN - { 57427 | ('~' << 16), key::NumpadClear }, // KP_BEGIN - { 57411 | ('u' << 16), key::NumpadMultiply }, // KP_MULTIPLY - { 43 | ('u' << 16), key::KeyPlus }, // KP_ADD - { 57413 | ('u' << 16), key::NumpadPlus }, // KP_ADD - { 57416 | ('u' << 16), key::NumpadSeparator }, // KP_SEPARATOR - { 45 | ('u' << 16), key::KeyMinus }, - { 57412 | ('u' << 16), key::NumpadMinus }, // KP_SUBTRACT - { 46 | ('u' << 16), key::KeyPeriod }, - { 57409 | ('u' << 16), key::NumpadDecimal }, - { 47 | ('u' << 16), key::KeySlash }, //KP_DIVIDE - { 57410 | ('u' << 16), key::NumpadSlash }, //KP_DIVIDE - { 92 | ('u' << 16), key::BackSlash }, - { 61 | ('u' << 16), key::Equal }, - { 57415 | ('u' << 16), key::NumpadEqual }, // KP_EQUAL - { 91 | ('u' << 16), key::OpenBracket }, - { 93 | ('u' << 16), key::ClosedBracket }, - { 61 | ('u' << 16), key::Equal }, - { 96 | ('u' << 16), key::BackQuote }, - { 39 | ('u' << 16), key::SingleQuote }, - { 44 | ('u' << 16), key::Comma }, - { 59 | ('u' << 16), key::Semicolon }, + { 1 | ('F' << 16), key::KeyEnd }, { 1 | ('P' << 16), key::F1 }, - { 11 | ('~' << 16), key::F1 }, { 1 | ('Q' << 16), key::F2 }, - { 12 | ('~' << 16), key::F2 }, - { 13 | ('~' << 16), key::F3 }, { 1 | ('S' << 16), key::F4 }, - { 14 | ('~' << 16), key::F4 }, - { 15 | ('~' << 16), key::F5 }, - { 17 | ('~' << 16), key::F6 }, - { 18 | ('~' << 16), key::F7 }, - { 19 | ('~' << 16), key::F8 }, - { 20 | ('~' << 16), key::F9 }, - { 21 | ('~' << 16), key::F10 }, - { 23 | ('~' << 16), key::F11 }, - { 24 | ('~' << 16), key::F12 }, - { 57376 | ('u' << 16), key::F13 }, - { 57377 | ('u' << 16), key::F14 }, - { 57378 | ('u' << 16), key::F15 }, - { 57379 | ('u' << 16), key::F16 }, - { 57380 | ('u' << 16), key::F17 }, - { 57381 | ('u' << 16), key::F18 }, - { 57382 | ('u' << 16), key::F19 }, - { 57383 | ('u' << 16), key::F20 }, - { 57384 | ('u' << 16), key::F21 }, - { 57385 | ('u' << 16), key::F22 }, - { 57386 | ('u' << 16), key::F23 }, - { 57387 | ('u' << 16), key::F24 }, - { 57388 | ('u' << 16), key::F25 }, - { 57389 | ('u' << 16), key::F26 }, - { 57390 | ('u' << 16), key::F27 }, - { 57391 | ('u' << 16), key::F28 }, - { 57392 | ('u' << 16), key::F29 }, - { 57393 | ('u' << 16), key::F30 }, - { 57394 | ('u' << 16), key::F31 }, - { 57395 | ('u' << 16), key::F32 }, - { 57396 | ('u' << 16), key::F33 }, - { 57397 | ('u' << 16), key::F34 }, - { 57398 | ('u' << 16), key::F35 }, - { 97 | ('u' << 16), key::KeyA }, - { 98 | ('u' << 16), key::KeyB }, - { 99 | ('u' << 16), key::KeyC }, - { 100 | ('u' << 16), key::KeyD }, - { 101 | ('u' << 16), key::KeyE }, - { 102 | ('u' << 16), key::KeyF }, - { 103 | ('u' << 16), key::KeyG }, - { 104 | ('u' << 16), key::KeyH }, - { 105 | ('u' << 16), key::KeyI }, - { 106 | ('u' << 16), key::KeyJ }, - { 107 | ('u' << 16), key::KeyK }, - { 108 | ('u' << 16), key::KeyL }, - { 109 | ('u' << 16), key::KeyM }, - { 110 | ('u' << 16), key::KeyN }, - { 111 | ('u' << 16), key::KeyO }, - { 112 | ('u' << 16), key::KeyP }, - { 113 | ('u' << 16), key::KeyQ }, - { 114 | ('u' << 16), key::KeyR }, - { 115 | ('u' << 16), key::KeyS }, - { 116 | ('u' << 16), key::KeyT }, - { 117 | ('u' << 16), key::KeyU }, - { 118 | ('u' << 16), key::KeyV }, - { 119 | ('u' << 16), key::KeyW }, - { 120 | ('u' << 16), key::KeyX }, - { 121 | ('u' << 16), key::KeyY }, - { 122 | ('u' << 16), key::KeyZ }, - { 57428 | ('u' << 16), key::MediaPlay }, // MEDIA_PLAY - { 57429 | ('u' << 16), key::MediaPause }, // MEDIA_PAUSE - { 57430 | ('u' << 16), key::MediaPlayPause }, // MEDIA_PLAY_PAUSE - { 57431 | ('u' << 16), key::MediaReverse }, // MEDIA_REVERSE // case WM_APPCOMMAND: извлекая макросом GET_APPCOMMAND_LPARAM(lParam) - { 57432 | ('u' << 16), key::MediaStop }, // MEDIA_STOP - { 57433 | ('u' << 16), key::MediaFastForward }, // MEDIA_FAST_FORWARD // case WM_APPCOMMAND: извлекая макросом GET_APPCOMMAND_LPARAM(lParam) - { 57434 | ('u' << 16), key::MediaRewind }, // MEDIA_REWIND // case WM_APPCOMMAND: извлекая макросом GET_APPCOMMAND_LPARAM(lParam) - { 57435 | ('u' << 16), key::MediaNext }, // MEDIA_TRACK_NEXT - { 57436 | ('u' << 16), key::MediaPrev }, // MEDIA_TRACK_PREVIOUS - { 57437 | ('u' << 16), key::MediaRecord }, // MEDIA_RECORD // case WM_APPCOMMAND: извлекая макросом GET_APPCOMMAND_LPARAM(lParam) - { 57438 | ('u' << 16), key::MediaVolDown }, // LOWER_VOLUME - { 57439 | ('u' << 16), key::MediaVolUp }, // RAISE_VOLUME - { 57440 | ('u' << 16), key::MediaVolMute }, // MUTE_VOLUME - }; + }); + auto m = input::key::kkpmap; + for (auto [KKPDef, keycode] : extra_defs) + { + m[KKPDef] = keycode; + } return m; }(); @@ -6226,12 +6071,13 @@ namespace netxs::os auto base_key = q.subarg(unicode_code); auto ctlstat = q(1); auto evtype = q.subarg(1); + auto codepoint = q(0); + k.cluster = {}; - while (q) + while (codepoint) // cpoint : cpoint : ... : cpoint { - auto codepoint = q(0); - if (codepoint == 0) break; utf::to_utf_from_code(codepoint, k.cluster); + codepoint = q.subarg(0); } k.keystat = evtype == 1 ? input::key::pressed From 1011a185e8c9f4bcef02d6af6d0801577017351f Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 4 Jun 2026 01:47:15 +0500 Subject: [PATCH 04/71] #943 WIP: KKP support (revise key2vt + shifted/unshifted) --- src/netxs/desktopio/directvt.hpp | 4 +- src/netxs/desktopio/gui.hpp | 30 +++ src/netxs/desktopio/input.hpp | 439 +++++++++++++++++-------------- src/netxs/desktopio/system.hpp | 22 +- 4 files changed, 288 insertions(+), 207 deletions(-) diff --git a/src/netxs/desktopio/directvt.hpp b/src/netxs/desktopio/directvt.hpp index 531e7e0309..88be708835 100644 --- a/src/netxs/desktopio/directvt.hpp +++ b/src/netxs/desktopio/directvt.hpp @@ -1044,7 +1044,9 @@ namespace netxs::directvt (text, cluster) // syskeybd: Generated string. (text, vkchord) // sysmouse: Key virtcode-based chord. (text, scchord) // sysmouse: Key scancode-based chord. - (text, chchord)) // sysmouse: Key virtcode+cluster-based chord. + (text, chchord) // sysmouse: Key virtcode+cluster-based chord. + (text, shifted) // syskeybd: Shifted key code (KKP). + (text, unshift)) // syskeybd: Unshifted key code (KKP). STRUCT_macro(sysmouse, (id_t, gear_id) // sysmouse: Device id. (si32, ctlstat) // sysmouse: Keybd modifiers. (time, timecod) // sysmouse: Event time code. diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 8ff372ac28..b8885f6bac 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3558,6 +3558,7 @@ namespace netxs::gui virtual void keybd_sync_state(si32 virtcod = 0) = 0; virtual void keybd_sync_layout() = 0; + virtual void keybd_peek_layout(si32 virtcod, si32 scancod, si32 cs, text& shifted, text& unshift) = 0; virtual void keybd_read_vkstat() = 0; virtual void keybd_wipe_vkstat() = 0; virtual bool keybd_read_input() = 0; @@ -4697,6 +4698,8 @@ namespace netxs::gui gear.keystat = keystat; gear.keycode = keycode; gear.cluster = cluster; + keybd_peek_layout(virtcod, scancod, cs, gear.shifted, gear.unshift); + if constexpr (debugmode) log("shifted='%%' unshift='%%'", gear.shifted, gear.unshift); auto repeat_ctrl = keystat == input::key::repeated && (virtcod == vkey::shift || virtcod == vkey::control || virtcod == vkey::alt || virtcod == vkey::capslock || virtcod == vkey::numlock || virtcod == vkey::scrllock || virtcod == vkey::lwin || virtcod == vkey::rwin); @@ -5543,6 +5546,32 @@ namespace netxs::gui ::EndDeferWindowPos(lock); } //todo static + void keybd_peek_layout(si32 virtcod, si32 scancod, si32 cs, text& shifted, text& unshift) + { + shifted.clear(); + unshift.clear(); + if (virtcod >= 0x30 && virtcod <= 0xE6) // Alphanumeric + punctuation. + { + auto buf = wide(8, 0); + auto current_layout = ::GetKeyboardLayout(0); + auto flags = cs & input::key::ExtendedKey ? 1u : 0u; + flags |= 2; // 2 PDT_SHAREABLE (don't touch our thread state). + auto vk_un = std::array{}; + auto rc = ::ToUnicodeEx(virtcod, scancod, vk_un.data(), buf.data(), 8, flags, current_layout); + if (rc > 0) + { + utf::to_utf(buf.data(), rc, unshift); + } + auto vk_sh = std::array{}; + vk_sh[vkey::shift ] = 0x80; + vk_sh[vkey::lshift] = 0x80; + rc = ::ToUnicodeEx(virtcod, scancod, vk_sh.data(), buf.data(), 8, flags, current_layout); + if (rc > 0) + { + utf::to_utf(buf.data(), rc, shifted); + } + } + } void layer_present(layer& s) { if (!s.hdc) return; @@ -6058,6 +6087,7 @@ namespace netxs::gui void keybd_read_vkstat() {} void keybd_send_block(view /*block*/) {} void keybd_sync_layout() {} + void keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, si32 /*cs*/, text& /*shifted*/, text& /*unshift*/) {} void keybd_sync_state(si32 /*virtcod*/) {} bool layer_create(layer& /*s*/, winbase* /*host_ptr*/ = nullptr, twod /*win_coord*/ = {}, twod /*grid_size*/ = {}, dent /*border_dent*/ = {}, twod /*cell_size*/ = {}) { return true; } void layer_move_all() {} diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index e8c152eace..181bc0f0aa 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -84,189 +84,189 @@ namespace netxs::input // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. #define key_list \ - /*Id Index Vkey Scan CtrlState Mask I Name GenericName KKP base KKP suffix*/\ - X(0, 0, 0, 0, 0, 0x0000'00'FF, 1, undef , "undef" , 0 | ('u' << 16))\ - X(1, 0, 0xFF, 0xFF, 0, 0x0100'FF'FF, 0, config , "config" , 0 | ('u' << 16))\ - X(2, 0xA2, 0x11, 0x1D, 0, 0x0100'00'FF, 0, LeftCtrl , "Ctrl" , 57442 | ('u' << 16))\ - X( 3, 0xA3, 0x11, 0x1D, ExtendedKey, 0x0100'00'FF, 0, RightCtrl , "Ctrl" , 57448 | ('u' << 16))\ - X(4, 0xA4, 0x12, 0x38, 0, 0x0100'00'FF, 0, LeftAlt , "Alt" , 57443 | ('u' << 16))\ - X( 5, 0xA5, 0x12, 0x38, ExtendedKey, 0x0100'00'FF, 0, RightAlt , "Alt" , 57449 | ('u' << 16))\ - X(6, 0xA0, 0x10, 0x2A, 0, 0x0000'FF'FF, 0, LeftShift , "Shift" , 57441 | ('u' << 16))\ - X( 7, 0xA1, 0x10, 0x36, 0, 0x0000'FF'FF, 0, RightShift , "Shift" , 57447 | ('u' << 16))\ - X(8, 0x5B, 0x5B, 0x5B, ExtendedKey, 0x0100'00'FF, 0, LeftWin , "Win" , 57444 | ('u' << 16))\ - X( 9, 0x5C, 0x5C, 0x5C, ExtendedKey, 0x0100'00'FF, 0, RightWin , "Win" , 57450 | ('u' << 16))\ - X(10, 0x5B, 0x5B, 0x5B, 0, 0x0100'00'FF, 0, LeftHyper , "Hyper" , 57445 | ('u' << 16))\ - X( 11, 0x5C, 0x5C, 0x5C, 0, 0x0100'00'FF, 0, RightHyper , "Hyper" , 57451 | ('u' << 16))\ - X(12, 0x5D, 0x5D, 0x5D, ExtendedKey, 0x0000'00'FF, 0, Apps , "Apps" , 57363 | ('u' << 16))\ - X(14, 0x90, 0x90, 0x45, 0, 0x0000'00'FF, 0, NumLock , "NumLock" , 57360 | ('u' << 16))\ - X(16, 0x14, 0x14, 0x3A, 0, 0x0100'00'FF, 0, CapsLock , "CapsLock" , 57358 | ('u' << 16))\ - X(18, 0x91, 0x91, 0x45, 0, 0x0100'00'FF, 0, ScrollLock , "ScrollLock" , 57359 | ('u' << 16))\ - X(20, 0x14, 0x14, 0x3A, ExtendedKey, 0x0100'00'FF, 0, IsoLevel3Shift , "IsoLevel3Shift" , 57453 | ('u' << 16))\ - X(22, 0x91, 0x91, 0x45, ExtendedKey, 0x0100'00'FF, 0, IsoLevel5Shift , "IsoLevel5Shift" , 57454 | ('u' << 16))\ - X(24, 0x1B, 0x1B, 0x01, 0, 0x0000'00'FF, 1, Esc , "Esc" , 27 | ('u' << 16))\ - X(26, 0x20, 0x20, 0x39, 0, 0x0000'00'FF, 1, Space , "Space" , 32 | ('u' << 16))\ - X(28, 0x08, 0x08, 0x0E, 0, 0x0000'00'FF, 1, Backspace , "Backspace" , 127 | ('u' << 16))\ - X(30, 0x09, 0x09, 0x0F, 0, 0x0000'00'FF, 1, Tab , "Tab" , 9 | ('u' << 16))\ - X(32, 0x03, 0x03, 0x46, 0, 0x0000'FF'FF, 1, Break , "Break" , 0 | ('u' << 16))\ - X(34, 0x13, 0x13, 0x45, 0, 0x0000'FF'FF, 0, Pause , "Pause" , 57362 | ('u' << 16))\ - X(36, 0x29, 0x29, 0, 0, 0x0000'00'FF, 0, Select , "Select" , 0 | ('u' << 16))\ - X(38, 0x2C, 0x2C, 0x54, 0, 0x0000'FF'FF, 1, SysRq , "SysRq" , 0 | ('u' << 16))\ - X(40, 0x2C, 0x2C, 0x37, ExtendedKey, 0x0100'FF'FF, 0, PrintScreen , "PrintScreen" , 57361 | ('u' << 16))\ - X(42, 0x0D, 0x0D, 0x1C, 0, 0x0100'00'FF, 1, KeyEnter , "Enter" , 13 | ('u' << 16))\ - X( 43, 0x0D, 0x0D, 0x1C, ExtendedKey, 0x0100'00'FF, 1, NumpadEnter , "Enter" , 57414 | ('u' << 16))\ - X(44, 0x21, 0x21, 0x49, ExtendedKey, 0x0100'00'FF, 1, KeyPageUp , "PageUp" , 5 | ('~' << 16))\ - X( 45, 0x21, 0x21, 0x49, 0, 0x0100'00'FF, 1, NumpadPageUp , "PageUp" , 57421 | ('u' << 16))\ - X(46, 0x22, 0x22, 0x51, ExtendedKey, 0x0100'00'FF, 1, KeyPageDown , "PageDown" , 6 | ('~' << 16))\ - X( 47, 0x22, 0x22, 0x51, 0, 0x0100'00'FF, 1, NumpadPageDown , "PageDown" , 57422 | ('u' << 16))\ - X(48, 0x23, 0x23, 0x4F, ExtendedKey, 0x0100'00'FF, 1, KeyEnd , "End" , 8 | ('~' << 16))/*don't reorder*/\ - X( 49, 0x23, 0x23, 0x4F, 0, 0x0100'00'FF, 1, NumpadEnd , "End" , 57424 | ('u' << 16))/*don't reorder*/\ - X(50, 0x24, 0x24, 0x47, ExtendedKey, 0x0100'00'FF, 1, KeyHome , "Home" , 7 | ('~' << 16))/*don't reorder*/\ - X( 51, 0x24, 0x24, 0x47, 0, 0x0100'00'FF, 1, NumpadHome , "Home" , 57423 | ('u' << 16))/*don't reorder*/\ - X(52, 0x25, 0x25, 0x4B, ExtendedKey, 0x0100'00'FF, 1, KeyLeftArrow , "LeftArrow" , 1 | ('D' << 16))/*don't reorder*/\ - X( 53, 0x25, 0x25, 0x4B, 0, 0x0100'00'FF, 1, NumpadLeftArrow , "LeftArrow" , 57417 | ('u' << 16))/*don't reorder*/\ - X(54, 0x26, 0x26, 0x48, ExtendedKey, 0x0100'00'FF, 1, KeyUpArrow , "UpArrow" , 1 | ('A' << 16))/*don't reorder*/\ - X( 55, 0x26, 0x26, 0x48, 0, 0x0100'00'FF, 1, NumpadUpArrow , "UpArrow" , 57419 | ('u' << 16))/*don't reorder*/\ - X(56, 0x27, 0x27, 0x4D, ExtendedKey, 0x0100'00'FF, 1, KeyRightArrow , "RightArrow" , 1 | ('C' << 16))/*don't reorder*/\ - X( 57, 0x27, 0x27, 0x4D, 0, 0x0100'00'FF, 1, NumpadRightArrow, "RightArrow" , 57418 | ('u' << 16))/*don't reorder*/\ - X(58, 0x28, 0x28, 0x50, ExtendedKey, 0x0100'00'FF, 1, KeyDownArrow , "DownArrow" , 1 | ('B' << 16))/*don't reorder*/\ - X( 59, 0x28, 0x28, 0x50, 0, 0x0100'00'FF, 1, NumpadDownArrow , "DownArrow" , 57420 | ('u' << 16))/*don't reorder*/\ - X(60, 0x30, 0x30, 0x0B, 0, 0x0000'FF'FF, 1, Key0 , "0" , 48 | ('u' << 16))\ - X( 61, 0x60, 0x60, 0x52, NumLockMode, 0x0000'FF'FF, 1, Numpad0 , "0" , 57399 | ('u' << 16))\ - X(62, 0x31, 0x31, 0x02, 0, 0x0000'FF'FF, 1, Key1 , "1" , 49 | ('u' << 16))\ - X( 63, 0x61, 0x61, 0x4F, NumLockMode, 0x0000'FF'FF, 1, Numpad1 , "1" , 57400 | ('u' << 16))\ - X(64, 0x32, 0x32, 0x03, 0, 0x0000'FF'FF, 1, Key2 , "2" , 50 | ('u' << 16))\ - X( 65, 0x62, 0x62, 0x50, NumLockMode, 0x0000'FF'FF, 1, Numpad2 , "2" , 57401 | ('u' << 16))\ - X(66, 0x33, 0x33, 0x04, 0, 0x0000'FF'FF, 1, Key3 , "3" , 51 | ('u' << 16))\ - X( 67, 0x63, 0x63, 0x51, NumLockMode, 0x0000'FF'FF, 1, Numpad3 , "3" , 57402 | ('u' << 16))\ - X(68, 0x34, 0x34, 0x05, 0, 0x0000'FF'FF, 1, Key4 , "4" , 52 | ('u' << 16))\ - X( 69, 0x64, 0x64, 0x4B, NumLockMode, 0x0000'FF'FF, 1, Numpad4 , "4" , 57403 | ('u' << 16))\ - X(70, 0x35, 0x35, 0x06, 0, 0x0000'FF'FF, 1, Key5 , "5" , 53 | ('u' << 16))\ - X( 71, 0x65, 0x65, 0x4C, NumLockMode, 0x0000'FF'FF, 1, Numpad5 , "5" , 57404 | ('u' << 16))\ - X(72, 0x36, 0x36, 0x07, 0, 0x0000'FF'FF, 1, Key6 , "6" , 54 | ('u' << 16))\ - X( 73, 0x66, 0x66, 0x4D, NumLockMode, 0x0000'FF'FF, 1, Numpad6 , "6" , 57405 | ('u' << 16))\ - X(74, 0x37, 0x37, 0x08, 0, 0x0000'FF'FF, 1, Key7 , "7" , 55 | ('u' << 16))\ - X( 75, 0x67, 0x67, 0x47, NumLockMode, 0x0000'FF'FF, 1, Numpad7 , "7" , 57406 | ('u' << 16))\ - X(76, 0x38, 0x38, 0x09, 0, 0x0000'FF'FF, 1, Key8 , "8" , 56 | ('u' << 16))\ - X( 77, 0x68, 0x68, 0x48, NumLockMode, 0x0000'FF'FF, 1, Numpad8 , "8" , 57407 | ('u' << 16))\ - X(78, 0x39, 0x39, 0x0A, 0, 0x0000'FF'FF, 1, Key9 , "9" , 57 | ('u' << 16))\ - X( 79, 0x69, 0x69, 0x49, NumLockMode, 0x0000'FF'FF, 1, Numpad9 , "9" , 57408 | ('u' << 16))\ - X(80, 0x2D, 0x2D, 0x52, ExtendedKey, 0x0100'00'FF, 1, KeyInsert , "Insert" , 2 | ('~' << 16))\ - X( 81, 0x2D, 0x2D, 0x52, 0, 0x0100'00'FF, 1, NumpadInsert , "Insert" , 57425 | ('u' << 16))\ - X(82, 0x2E, 0x2E, 0x53, ExtendedKey, 0x0100'00'FF, 1, KeyDelete , "Delete" , 3 | ('~' << 16))\ - X( 83, 0x2E, 0x2E, 0x55, 0, 0x0100'00'FF, 1, NumpadDelete , "Delete" , 57426 | ('u' << 16))\ - X(84, 0x0C, 0x0C, 0x4C, ExtendedKey, 0x0100'00'FF, 1, KeyClear , "Clear" , 1 | ('E' << 16))\ - X( 85, 0x0C, 0x0C, 0x4C, 0, 0x0100'00'FF, 1, NumpadClear , "Clear" , 57427 | ('~' << 16))\ - X(86, 0x6A, 0x6A, 0x09, 0, 0x0000'FF'FF, 1, KeyMultiply , "*" , 0 | ('u' << 16))\ - X( 87, 0x6A, 0x6A, 0x37, 0, 0x0000'FF'FF, 1, NumpadMultiply , "*" , 57411 | ('u' << 16))\ - X(88, 0x6B, 0x6B, 0x0D, 0, 0x0000'FF'FF, 1, KeyPlus , "Plus" , 43 | ('u' << 16))\ - X( 89, 0x6B, 0x6B, 0x4E, 0, 0x0000'FF'FF, 1, NumpadPlus , "Plus" , 57413 | ('u' << 16))\ - X(90, 0x6C, 0x6C, 0, 0, 0x0020'00'FF, 1, KeySeparator , "Separator" , 0 | ('u' << 16))\ - X( 91, 0x6C, 0x6C, 0, NumLockMode, 0x0020'00'FF, 1, NumpadSeparator , "Separator" , 57416 | ('u' << 16))\ - X(92, 0xBD, 0xBD, 0x0C, 0, 0x0000'00'FF, 1, KeyMinus , "Minus" , 45 | ('u' << 16))\ - X( 93, 0x6D, 0x6D, 0x4A, 0, 0x0000'00'FF, 1, NumpadMinus , "Minus" , 57412 | ('u' << 16))\ - X(94, 0xBE, 0xBE, 0x34, 0, 0x0000'00'FF, 1, KeyPeriod , "." , 46 | ('u' << 16))\ - X( 95, 0x6E, 0x6E, 0x53, NumLockMode, 0x0000'00'FF, 1, NumpadDecimal , "." , 57409 | ('u' << 16))\ - X(96, 0xBF, 0xBF, 0x35, 0, 0x0000'00'FF, 1, KeySlash , "/" , 47 | ('u' << 16))\ - X( 97, 0x6F, 0x6F, 0x35, ExtendedKey, 0x0000'00'FF, 1, NumpadSlash , "/" , 57410 | ('u' << 16))\ - X(98, 0xBB, 0xBB, 0x0D, 0, 0x0100'00'FF, 1, Equal , "=" , 61 | ('u' << 16))\ - X( 99, 0xBB, 0xBB, 0x0D, ExtendedKey, 0x0100'00'FF, 1, NumpadEqual , "=" , 57415 | ('u' << 16))\ - X(100, 0xDC, 0xDC, 0x2B, 0, 0x0000'00'FF, 1, BackSlash , "BackSlash" , 92 | ('u' << 16))\ - X(102, 0xDB, 0xDB, 0x1A, 0, 0x0000'00'FF, 1, OpenBracket , "[" , 91 | ('u' << 16))\ - X(104, 0xDD, 0xDD, 0x1B, 0, 0x0000'00'FF, 1, ClosedBracket , "]" , 93 | ('u' << 16))\ - X(106, 0xC0, 0xC0, 0x29, 0, 0x0000'00'FF, 1, BackQuote , "`" , 96 | ('u' << 16))\ - X(108, 0xDE, 0xDE, 0x28, 0, 0x0000'00'FF, 1, SingleQuote , "'" , 39 | ('u' << 16))\ - X(110, 0xBC, 0xBC, 0x33, 0, 0x0000'00'FF, 1, Comma , "," , 44 | ('u' << 16))\ - X(112, 0xBA, 0xBA, 0x27, 0, 0x0000'00'FF, 1, Semicolon , ";" , 59 | ('u' << 16))\ - X(114, 0x70, 0x70, 0x3B, 0, 0x0000'00'FF, 1, F1 , "F1" , 11 | ('~' << 16))\ - X(116, 0x71, 0x71, 0x3C, 0, 0x0000'00'FF, 1, F2 , "F2" , 12 | ('~' << 16))\ - X(118, 0x72, 0x72, 0x3D, 0, 0x0000'00'FF, 1, F3 , "F3" , 13 | ('~' << 16))\ - X(120, 0x73, 0x73, 0x3E, 0, 0x0000'00'FF, 1, F4 , "F4" , 14 | ('~' << 16))\ - X(122, 0x74, 0x74, 0x3F, 0, 0x0000'00'FF, 1, F5 , "F5" , 15 | ('~' << 16))\ - X(124, 0x75, 0x75, 0x40, 0, 0x0000'00'FF, 1, F6 , "F6" , 17 | ('~' << 16))\ - X(126, 0x76, 0x76, 0x41, 0, 0x0000'00'FF, 1, F7 , "F7" , 18 | ('~' << 16))\ - X(128, 0x77, 0x77, 0x42, 0, 0x0000'00'FF, 1, F8 , "F8" , 19 | ('~' << 16))\ - X(130, 0x78, 0x78, 0x43, 0, 0x0000'00'FF, 1, F9 , "F9" , 20 | ('~' << 16))\ - X(132, 0x79, 0x79, 0x44, 0, 0x0000'00'FF, 1, F10 , "F10" , 21 | ('~' << 16))\ - X(134, 0x7A, 0x7A, 0x57, 0, 0x0000'00'FF, 1, F11 , "F11" , 23 | ('~' << 16))\ - X(136, 0x7B, 0x7B, 0x5B, 0, 0x0000'00'FF, 1, F12 , "F12" , 24 | ('~' << 16))\ - X(138, 0x7C, 0x7C, 0, 0, 0x0000'00'FF, 1, F13 , "F13" , 57376 | ('u' << 16))\ - X(140, 0x7D, 0x7D, 0, 0, 0x0100'00'FF, 1, F14 , "F14" , 57377 | ('u' << 16))\ - X(142, 0x7E, 0x7E, 0, 0, 0x0100'00'FF, 1, F15 , "F15" , 57378 | ('u' << 16))\ - X(144, 0x7F, 0x7F, 0, 0, 0x0100'00'FF, 1, F16 , "F16" , 57379 | ('u' << 16))\ - X(146, 0x80, 0x80, 0, 0, 0x0100'00'FF, 1, F17 , "F17" , 57380 | ('u' << 16))\ - X(148, 0x81, 0x81, 0, 0, 0x0100'00'FF, 1, F18 , "F18" , 57381 | ('u' << 16))\ - X(150, 0x82, 0x82, 0, 0, 0x0100'00'FF, 1, F19 , "F19" , 57382 | ('u' << 16))\ - X(152, 0x83, 0x83, 0, 0, 0x0100'00'FF, 1, F20 , "F20" , 57383 | ('u' << 16))\ - X(154, 0x84, 0x84, 0, 0, 0x0100'00'FF, 1, F21 , "F21" , 57384 | ('u' << 16))\ - X(156, 0x85, 0x85, 0, 0, 0x0100'00'FF, 1, F22 , "F22" , 57385 | ('u' << 16))\ - X(158, 0x86, 0x86, 0, 0, 0x0100'00'FF, 1, F23 , "F23" , 57386 | ('u' << 16))\ - X(160, 0x87, 0x87, 0, 0, 0x0100'00'FF, 1, F24 , "F24" , 57387 | ('u' << 16))\ - X(162, 0x7D, 0x7D, 0, ExtendedKey, 0x0100'00'FF, 1, F25 , "F25" , 57388 | ('u' << 16))\ - X(164, 0x7E, 0x7E, 0, ExtendedKey, 0x0100'00'FF, 1, F26 , "F26" , 57389 | ('u' << 16))\ - X(166, 0x7F, 0x7F, 0, ExtendedKey, 0x0100'00'FF, 1, F27 , "F27" , 57390 | ('u' << 16))\ - X(168, 0x80, 0x80, 0, ExtendedKey, 0x0100'00'FF, 1, F28 , "F28" , 57391 | ('u' << 16))\ - X(170, 0x81, 0x81, 0, ExtendedKey, 0x0100'00'FF, 1, F29 , "F29" , 57392 | ('u' << 16))\ - X(172, 0x82, 0x82, 0, ExtendedKey, 0x0100'00'FF, 1, F30 , "F30" , 57393 | ('u' << 16))\ - X(174, 0x83, 0x83, 0, ExtendedKey, 0x0100'00'FF, 1, F31 , "F31" , 57394 | ('u' << 16))\ - X(176, 0x84, 0x84, 0, ExtendedKey, 0x0100'00'FF, 1, F32 , "F32" , 57395 | ('u' << 16))\ - X(178, 0x85, 0x85, 0, ExtendedKey, 0x0100'00'FF, 1, F33 , "F33" , 57396 | ('u' << 16))\ - X(180, 0x86, 0x86, 0, ExtendedKey, 0x0100'00'FF, 1, F34 , "F34" , 57397 | ('u' << 16))\ - X(182, 0x87, 0x87, 0, ExtendedKey, 0x0100'00'FF, 1, F35 , "F35" , 57398 | ('u' << 16))\ - X(184, 0x41, 0x41, 0, 0, 0x0100'00'FF, 1, KeyA , "A" , 97 | ('u' << 16))\ - X(186, 0x42, 0x42, 0, 0, 0x0100'00'FF, 1, KeyB , "B" , 98 | ('u' << 16))\ - X(188, 0x43, 0x43, 0, 0, 0x0100'00'FF, 1, KeyC , "C" , 99 | ('u' << 16))\ - X(190, 0x44, 0x44, 0, 0, 0x0100'00'FF, 1, KeyD , "D" , 100 | ('u' << 16))\ - X(192, 0x45, 0x45, 0, 0, 0x0100'00'FF, 1, KeyE , "E" , 101 | ('u' << 16))\ - X(194, 0x46, 0x46, 0, 0, 0x0100'00'FF, 1, KeyF , "F" , 102 | ('u' << 16))\ - X(196, 0x47, 0x47, 0, 0, 0x0100'00'FF, 1, KeyG , "G" , 103 | ('u' << 16))\ - X(198, 0x48, 0x48, 0, 0, 0x0100'00'FF, 1, KeyH , "H" , 104 | ('u' << 16))\ - X(200, 0x49, 0x49, 0, 0, 0x0100'00'FF, 1, KeyI , "I" , 105 | ('u' << 16))\ - X(202, 0x4A, 0x4A, 0, 0, 0x0100'00'FF, 1, KeyJ , "J" , 106 | ('u' << 16))\ - X(204, 0x4B, 0x4B, 0, 0, 0x0100'00'FF, 1, KeyK , "K" , 107 | ('u' << 16))\ - X(206, 0x4C, 0x4C, 0, 0, 0x0100'00'FF, 1, KeyL , "L" , 108 | ('u' << 16))\ - X(208, 0x4D, 0x4D, 0, 0, 0x0100'00'FF, 1, KeyM , "M" , 109 | ('u' << 16))\ - X(210, 0x4E, 0x4E, 0, 0, 0x0100'00'FF, 1, KeyN , "N" , 110 | ('u' << 16))\ - X(212, 0x4F, 0x4F, 0, 0, 0x0100'00'FF, 1, KeyO , "O" , 111 | ('u' << 16))\ - X(214, 0x50, 0x50, 0, 0, 0x0100'00'FF, 1, KeyP , "P" , 112 | ('u' << 16))\ - X(216, 0x51, 0x51, 0, 0, 0x0100'00'FF, 1, KeyQ , "Q" , 113 | ('u' << 16))\ - X(218, 0x52, 0x52, 0, 0, 0x0100'00'FF, 1, KeyR , "R" , 114 | ('u' << 16))\ - X(220, 0x53, 0x53, 0, 0, 0x0100'00'FF, 1, KeyS , "S" , 115 | ('u' << 16))\ - X(222, 0x54, 0x54, 0, 0, 0x0100'00'FF, 1, KeyT , "T" , 116 | ('u' << 16))\ - X(224, 0x55, 0x55, 0, 0, 0x0100'00'FF, 1, KeyU , "U" , 117 | ('u' << 16))\ - X(226, 0x56, 0x56, 0, 0, 0x0100'00'FF, 1, KeyV , "V" , 118 | ('u' << 16))\ - X(228, 0x57, 0x57, 0, 0, 0x0100'00'FF, 1, KeyW , "W" , 119 | ('u' << 16))\ - X(230, 0x58, 0x58, 0, 0, 0x0100'00'FF, 1, KeyX , "X" , 120 | ('u' << 16))\ - X(232, 0x59, 0x59, 0, 0, 0x0100'00'FF, 1, KeyY , "Y" , 121 | ('u' << 16))\ - X(234, 0x5A, 0x5A, 0, 0, 0x0100'00'FF, 1, KeyZ , "Z" , 122 | ('u' << 16))\ - X(236, 0x5F, 0x5F, 0, ExtendedKey, 0x0100'00'FF, 0, Sleep , "Sleep" , 0 | ('u' << 16))\ - X(238, 0xB7, 0xB7, 0, ExtendedKey, 0x0100'00'FF, 0, Calculator , "Calculator" , 0 | ('u' << 16))\ - X(240, 0x48, 0x48, 0, ExtendedKey, 0x0100'00'FF, 0, Mail , "Mail" , 0 | ('u' << 16))\ - X(242, 0xAD, 0xAD, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440 | ('u' << 16))\ - X(244, 0xAE, 0xAE, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438 | ('u' << 16))\ - X(246, 0xAF, 0xAF, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439 | ('u' << 16))\ - X(248, 0xB0, 0xB0, 0, ExtendedKey, 0x0100'00'FF, 0, MediaNext , "MediaNext" , 57435 | ('u' << 16))\ - X(250, 0xB1, 0xB1, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPrev , "MediaPrev" , 57436 | ('u' << 16))\ - X(252, 0xB2, 0xB2, 0, ExtendedKey, 0x0100'00'FF, 0, MediaStop , "MediaStop" , 57432 | ('u' << 16))\ - X(254, 0xB2, 0xB2, 0, 0, 0x0100'00'FF, 0, MediaPause , "MediaPause" , 57429 | ('u' << 16))\ - X(256, 0xB3, 0xB3, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430 | ('u' << 16))\ - X(258, 0xB3, 0xB3, 0, 0, 0x0100'00'FF, 0, MediaPlay , "MediaPlay" , 57428 | ('u' << 16))\ - X(260, 0xB5, 0xB5, 0, ExtendedKey, 0x0100'00'FF, 0, MediaSelect , "MediaSelect" , 0 | ('u' << 16))\ - X(262, 0xB8, 0xB8, 0, ExtendedKey, 0x0100'00'FF, 0, MediaReverse , "MediaReverse" , 57431 | ('u' << 16))\ - X(264, 0xB8, 0xB8, 0, 0, 0x0100'00'FF, 0, MediaRecord , "MediaRecord" , 57437 | ('u' << 16))\ - X(266, 0xB9, 0xB9, 0, ExtendedKey, 0x0100'00'FF, 0, MediaFastForward, "MediaFastForward", 57433 | ('u' << 16))\ - X(268, 0xB9, 0xB9, 0, 0, 0x0100'00'FF, 0, MediaRewind , "MediaRewind" , 57434 | ('u' << 16))\ - X(270, 0xA6, 0xA6, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserBack , "BrowserBack" , 0 | ('u' << 16))\ - X(272, 0xA7, 0xA7, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserForward , "BrowserForward" , 0 | ('u' << 16))\ - X(274, 0xA8, 0xA8, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 | ('u' << 16))\ - X(276, 0xA9, 0xA9, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserStop , "BrowserStop" , 0 | ('u' << 16))\ - X(278, 0xAA, 0xAA, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 | ('u' << 16))\ - X(280, 0xAB, 0xAB, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserFavorites, "BrowserFavorites", 0 | ('u' << 16))\ - X(282, 0xAC, 0xAC, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserHome , "BrowserHome" , 0 | ('u' << 16))\ - X(284, 0xFF, 0xFF, 0xFF, ExtendedKey, 0x0100'FF'FF, 0, lastKey , "lastKey" , 0) + /*Id Index Vkey Scan CtrlState Mask I Name GenericName KKP base,suffix,ascii,control */\ + X(0, 0, 0, 0, 0, 0x0000'00'FF, 1, undef , "undef" , 0 , 'u', -1 , -1 )\ + X(1, 0, 0xFF, 0xFF, 0, 0x0100'FF'FF, 0, config , "config" , 0 , 'u', -1 , -1 )\ + X(2, 0xA2, 0x11, 0x1D, 0, 0x0100'00'FF, 0, LeftCtrl , "Ctrl" , 57442, 'u', -1 , -1 )\ + X( 3, 0xA3, 0x11, 0x1D, ExtendedKey, 0x0100'00'FF, 0, RightCtrl , "Ctrl" , 57448, 'u', -1 , -1 )\ + X(4, 0xA4, 0x12, 0x38, 0, 0x0100'00'FF, 0, LeftAlt , "Alt" , 57443, 'u', -1 , -1 )\ + X( 5, 0xA5, 0x12, 0x38, ExtendedKey, 0x0100'00'FF, 0, RightAlt , "Alt" , 57449, 'u', -1 , -1 )\ + X(6, 0xA0, 0x10, 0x2A, 0, 0x0000'FF'FF, 0, LeftShift , "Shift" , 57441, 'u', -1 , -1 )\ + X( 7, 0xA1, 0x10, 0x36, 0, 0x0000'FF'FF, 0, RightShift , "Shift" , 57447, 'u', -1 , -1 )\ + X(8, 0x5B, 0x5B, 0x5B, ExtendedKey, 0x0100'00'FF, 0, LeftWin , "Win" , 57444, 'u', -1 , -1 )\ + X( 9, 0x5C, 0x5C, 0x5C, ExtendedKey, 0x0100'00'FF, 0, RightWin , "Win" , 57450, 'u', -1 , -1 )\ + X(10, 0x5B, 0x5B, 0x5B, 0, 0x0100'00'FF, 0, LeftHyper , "Hyper" , 57445, 'u', -1 , -1 )\ + X( 11, 0x5C, 0x5C, 0x5C, 0, 0x0100'00'FF, 0, RightHyper , "Hyper" , 57451, 'u', -1 , -1 )\ + X(12, 0x5D, 0x5D, 0x5D, ExtendedKey, 0x0000'00'FF, 0, Apps , "Apps" , 57363, 'u', -1 , -1 )\ + X(14, 0x90, 0x90, 0x45, 0, 0x0000'00'FF, 0, NumLock , "NumLock" , 57360, 'u', -1 , -1 )\ + X(16, 0x14, 0x14, 0x3A, 0, 0x0100'00'FF, 0, CapsLock , "CapsLock" , 57358, 'u', -1 , -1 )\ + X(18, 0x91, 0x91, 0x45, 0, 0x0100'00'FF, 0, ScrollLock , "ScrollLock" , 57359, 'u', -1 , -1 )\ + X(20, 0x14, 0x14, 0x3A, ExtendedKey, 0x0100'00'FF, 0, IsoLevel3Shift , "IsoLevel3Shift" , 57453, 'u', -1 , -1 )\ + X(22, 0x91, 0x91, 0x45, ExtendedKey, 0x0100'00'FF, 0, IsoLevel5Shift , "IsoLevel5Shift" , 57454, 'u', -1 , -1 )\ + X(24, 0x1B, 0x1B, 0x01, 0, 0x0000'00'FF, 1, Esc , "Esc" , 27 , 'u', '\x1b', '\x1b')\ + X(26, 0x20, 0x20, 0x39, 0, 0x0000'00'FF, 1, Space , "Space" , 32 , 'u', '\x20', '\0' )\ + X(28, 0x08, 0x08, 0x0E, 0, 0x0000'00'FF, 1, Backspace , "Backspace" , 127 , 'u', '\x7f', '\x08')\ + X(30, 0x09, 0x09, 0x0F, 0, 0x0000'00'FF, 1, Tab , "Tab" , 9 , 'u', '\x09', '\x09')\ + X(32, 0x03, 0x03, 0x46, 0, 0x0000'FF'FF, 1, Break , "Break" , 0 , 'u', '\x1a', '\x03')\ + X(34, 0x13, 0x13, 0x45, 0, 0x0000'FF'FF, 0, Pause , "Pause" , 57362, 'u', '\x1a', '\x03')\ + X(36, 0x29, 0x29, 0, 0, 0x0000'00'FF, 0, Select , "Select" , 0 , 'u', -1 , -1 )\ + X(38, 0x2C, 0x2C, 0x54, 0, 0x0000'FF'FF, 1, SysRq , "SysRq" , 0 , 'u', -1 , '\x03')\ + X(40, 0x2C, 0x2C, 0x37, ExtendedKey, 0x0100'FF'FF, 0, PrintScreen , "PrintScreen" , 57361, 'u', -1 , -1 )\ + X(42, 0x0D, 0x0D, 0x1C, 0, 0x0100'00'FF, 1, KeyEnter , "Enter" , 13 , 'u', '\x0d', '\x0a')\ + X( 43, 0x0D, 0x0D, 0x1C, ExtendedKey, 0x0100'00'FF, 1, NumpadEnter , "Enter" , 57414, 'u', '\x0d', '\x0a')\ + X(44, 0x21, 0x21, 0x49, ExtendedKey, 0x0100'00'FF, 1, KeyPageUp , "PageUp" , 5 , '~', -1 , -1 )\ + X( 45, 0x21, 0x21, 0x49, 0, 0x0100'00'FF, 1, NumpadPageUp , "PageUp" , 57421, 'u', -1 , -1 )\ + X(46, 0x22, 0x22, 0x51, ExtendedKey, 0x0100'00'FF, 1, KeyPageDown , "PageDown" , 6 , '~', -1 , -1 )\ + X( 47, 0x22, 0x22, 0x51, 0, 0x0100'00'FF, 1, NumpadPageDown , "PageDown" , 57422, 'u', -1 , -1 )\ + X(48, 0x23, 0x23, 0x4F, ExtendedKey, 0x0100'00'FF, 1, KeyEnd , "End" , 8 , '~', -1 , -1 )/*don't reorder*/\ + X( 49, 0x23, 0x23, 0x4F, 0, 0x0100'00'FF, 1, NumpadEnd , "End" , 57424, 'u', -1 , -1 )/*don't reorder*/\ + X(50, 0x24, 0x24, 0x47, ExtendedKey, 0x0100'00'FF, 1, KeyHome , "Home" , 7 , '~', -1 , -1 )/*don't reorder*/\ + X( 51, 0x24, 0x24, 0x47, 0, 0x0100'00'FF, 1, NumpadHome , "Home" , 57423, 'u', -1 , -1 )/*don't reorder*/\ + X(52, 0x25, 0x25, 0x4B, ExtendedKey, 0x0100'00'FF, 1, KeyLeftArrow , "LeftArrow" , 1 , 'D', -1 , -1 )/*don't reorder*/\ + X( 53, 0x25, 0x25, 0x4B, 0, 0x0100'00'FF, 1, NumpadLeftArrow , "LeftArrow" , 57417, 'u', -1 , -1 )/*don't reorder*/\ + X(54, 0x26, 0x26, 0x48, ExtendedKey, 0x0100'00'FF, 1, KeyUpArrow , "UpArrow" , 1 , 'A', -1 , -1 )/*don't reorder*/\ + X( 55, 0x26, 0x26, 0x48, 0, 0x0100'00'FF, 1, NumpadUpArrow , "UpArrow" , 57419, 'u', -1 , -1 )/*don't reorder*/\ + X(56, 0x27, 0x27, 0x4D, ExtendedKey, 0x0100'00'FF, 1, KeyRightArrow , "RightArrow" , 1 , 'C', -1 , -1 )/*don't reorder*/\ + X( 57, 0x27, 0x27, 0x4D, 0, 0x0100'00'FF, 1, NumpadRightArrow, "RightArrow" , 57418, 'u', -1 , -1 )/*don't reorder*/\ + X(58, 0x28, 0x28, 0x50, ExtendedKey, 0x0100'00'FF, 1, KeyDownArrow , "DownArrow" , 1 , 'B', -1 , -1 )/*don't reorder*/\ + X( 59, 0x28, 0x28, 0x50, 0, 0x0100'00'FF, 1, NumpadDownArrow , "DownArrow" , 57420, 'u', -1 , -1 )/*don't reorder*/\ + X(60, 0x30, 0x30, 0x0B, 0, 0x0000'FF'FF, 1, Key0 , "0" , 48 , 'u', '0' , '0' )\ + X( 61, 0x60, 0x60, 0x52, NumLockMode, 0x0000'FF'FF, 1, Numpad0 , "0" , 57399, 'u', '0' , '0' )\ + X(62, 0x31, 0x31, 0x02, 0, 0x0000'FF'FF, 1, Key1 , "1" , 49 , 'u', '1' , '1' )\ + X( 63, 0x61, 0x61, 0x4F, NumLockMode, 0x0000'FF'FF, 1, Numpad1 , "1" , 57400, 'u', '1' , '1' )\ + X(64, 0x32, 0x32, 0x03, 0, 0x0000'FF'FF, 1, Key2 , "2" , 50 , 'u', '2' , '\0' )\ + X( 65, 0x62, 0x62, 0x50, NumLockMode, 0x0000'FF'FF, 1, Numpad2 , "2" , 57401, 'u', '2' , '\0' )\ + X(66, 0x33, 0x33, 0x04, 0, 0x0000'FF'FF, 1, Key3 , "3" , 51 , 'u', '3' , '\x1b')\ + X( 67, 0x63, 0x63, 0x51, NumLockMode, 0x0000'FF'FF, 1, Numpad3 , "3" , 57402, 'u', '3' , '\x1b')\ + X(68, 0x34, 0x34, 0x05, 0, 0x0000'FF'FF, 1, Key4 , "4" , 52 , 'u', '4' , '\x1c')\ + X( 69, 0x64, 0x64, 0x4B, NumLockMode, 0x0000'FF'FF, 1, Numpad4 , "4" , 57403, 'u', '4' , '\x1c')\ + X(70, 0x35, 0x35, 0x06, 0, 0x0000'FF'FF, 1, Key5 , "5" , 53 , 'u', '5' , '\x1d')\ + X( 71, 0x65, 0x65, 0x4C, NumLockMode, 0x0000'FF'FF, 1, Numpad5 , "5" , 57404, 'u', '5' , '\x1d')\ + X(72, 0x36, 0x36, 0x07, 0, 0x0000'FF'FF, 1, Key6 , "6" , 54 , 'u', '6' , '\x1e')\ + X( 73, 0x66, 0x66, 0x4D, NumLockMode, 0x0000'FF'FF, 1, Numpad6 , "6" , 57405, 'u', '6' , '\x1e')\ + X(74, 0x37, 0x37, 0x08, 0, 0x0000'FF'FF, 1, Key7 , "7" , 55 , 'u', '7' , '\x1f')\ + X( 75, 0x67, 0x67, 0x47, NumLockMode, 0x0000'FF'FF, 1, Numpad7 , "7" , 57406, 'u', '7' , '\x1f')\ + X(76, 0x38, 0x38, 0x09, 0, 0x0000'FF'FF, 1, Key8 , "8" , 56 , 'u', '8' , '\x7f')\ + X( 77, 0x68, 0x68, 0x48, NumLockMode, 0x0000'FF'FF, 1, Numpad8 , "8" , 57407, 'u', '8' , '\x7f')\ + X(78, 0x39, 0x39, 0x0A, 0, 0x0000'FF'FF, 1, Key9 , "9" , 57 , 'u', '9' , '9' )\ + X( 79, 0x69, 0x69, 0x49, NumLockMode, 0x0000'FF'FF, 1, Numpad9 , "9" , 57408, 'u', '9' , '9' )\ + X(80, 0x2D, 0x2D, 0x52, ExtendedKey, 0x0100'00'FF, 1, KeyInsert , "Insert" , 2 , '~', -1 , -1 )\ + X( 81, 0x2D, 0x2D, 0x52, 0, 0x0100'00'FF, 1, NumpadInsert , "Insert" , 57425, 'u', -1 , -1 )\ + X(82, 0x2E, 0x2E, 0x53, ExtendedKey, 0x0100'00'FF, 1, KeyDelete , "Delete" , 3 , '~', -1 , -1 )\ + X( 83, 0x2E, 0x2E, 0x55, 0, 0x0100'00'FF, 1, NumpadDelete , "Delete" , 57426, 'u', -1 , -1 )\ + X(84, 0x0C, 0x0C, 0x4C, ExtendedKey, 0x0100'00'FF, 1, KeyClear , "Clear" , 1 , 'E', -1 , -1 )\ + X( 85, 0x0C, 0x0C, 0x4C, 0, 0x0100'00'FF, 1, NumpadClear , "Clear" , 57427, '~', -1 , -1 )\ + X(86, 0x6A, 0x6A, 0x09, 0, 0x0000'FF'FF, 1, KeyMultiply , "*" , 0 , 'u', '*' , '*' )\ + X( 87, 0x6A, 0x6A, 0x37, 0, 0x0000'FF'FF, 1, NumpadMultiply , "*" , 57411, 'u', '*' , '*' )\ + X(88, 0x6B, 0x6B, 0x0D, 0, 0x0000'FF'FF, 1, KeyPlus , "Plus" , 43 , 'u', '+' , '+' )\ + X( 89, 0x6B, 0x6B, 0x4E, 0, 0x0000'FF'FF, 1, NumpadPlus , "Plus" , 57413, 'u', '+' , '+' )\ + X(90, 0x6C, 0x6C, 0, 0, 0x0020'00'FF, 1, KeySeparator , "Separator" , 0 , 'u', ',' , ',' )\ + X( 91, 0x6C, 0x6C, 0, NumLockMode, 0x0020'00'FF, 1, NumpadSeparator , "Separator" , 57416, 'u', ',' , ',' )\ + X(92, 0xBD, 0xBD, 0x0C, 0, 0x0000'00'FF, 1, KeyMinus , "Minus" , 45 , 'u', '-' , '-' )\ + X( 93, 0x6D, 0x6D, 0x4A, 0, 0x0000'00'FF, 1, NumpadMinus , "Minus" , 57412, 'u', '-' , '-' )\ + X(94, 0xBE, 0xBE, 0x34, 0, 0x0000'00'FF, 1, KeyPeriod , "." , 46 , 'u', '.' , '.' )\ + X( 95, 0x6E, 0x6E, 0x53, NumLockMode, 0x0000'00'FF, 1, NumpadDecimal , "." , 57409, 'u', '.' , '.' )\ + X(96, 0xBF, 0xBF, 0x35, 0, 0x0000'00'FF, 1, KeySlash , "/" , 47 , 'u', '/' , '\x1f')\ + X( 97, 0x6F, 0x6F, 0x35, ExtendedKey, 0x0000'00'FF, 1, NumpadSlash , "/" , 57410, 'u', '/' , '\x1f')\ + X(98, 0xBB, 0xBB, 0x0D, 0, 0x0100'00'FF, 1, Equal , "=" , 61 , 'u', '=' , '=' )\ + X( 99, 0xBB, 0xBB, 0x0D, ExtendedKey, 0x0100'00'FF, 1, NumpadEqual , "=" , 57415, 'u', '=' , '=' )\ + X(100, 0xDC, 0xDC, 0x2B, 0, 0x0000'00'FF, 1, BackSlash , "BackSlash" , 92 , 'u', '\\' , '\x1c')\ + X(102, 0xDB, 0xDB, 0x1A, 0, 0x0000'00'FF, 1, OpenBracket , "[" , 91 , 'u', '[' , '\x1b')\ + X(104, 0xDD, 0xDD, 0x1B, 0, 0x0000'00'FF, 1, ClosedBracket , "]" , 93 , 'u', ']' , '\x1d')\ + X(106, 0xC0, 0xC0, 0x29, 0, 0x0000'00'FF, 1, BackQuote , "`" , 96 , 'u', '`' , '`' )\ + X(108, 0xDE, 0xDE, 0x28, 0, 0x0000'00'FF, 1, SingleQuote , "'" , 39 , 'u', '\'' , '\'' )\ + X(110, 0xBC, 0xBC, 0x33, 0, 0x0000'00'FF, 1, Comma , "," , 44 , 'u', ',' , ',' )\ + X(112, 0xBA, 0xBA, 0x27, 0, 0x0000'00'FF, 1, Semicolon , ";" , 59 , 'u', ';' , ';' )\ + X(114, 0x70, 0x70, 0x3B, 0, 0x0000'00'FF, 1, F1 , "F1" , 11 , '~', -1 , -1 )\ + X(116, 0x71, 0x71, 0x3C, 0, 0x0000'00'FF, 1, F2 , "F2" , 12 , '~', -1 , -1 )\ + X(118, 0x72, 0x72, 0x3D, 0, 0x0000'00'FF, 1, F3 , "F3" , 13 , '~', -1 , -1 )\ + X(120, 0x73, 0x73, 0x3E, 0, 0x0000'00'FF, 1, F4 , "F4" , 14 , '~', -1 , -1 )\ + X(122, 0x74, 0x74, 0x3F, 0, 0x0000'00'FF, 1, F5 , "F5" , 15 , '~', -1 , -1 )\ + X(124, 0x75, 0x75, 0x40, 0, 0x0000'00'FF, 1, F6 , "F6" , 17 , '~', -1 , -1 )\ + X(126, 0x76, 0x76, 0x41, 0, 0x0000'00'FF, 1, F7 , "F7" , 18 , '~', -1 , -1 )\ + X(128, 0x77, 0x77, 0x42, 0, 0x0000'00'FF, 1, F8 , "F8" , 19 , '~', -1 , -1 )\ + X(130, 0x78, 0x78, 0x43, 0, 0x0000'00'FF, 1, F9 , "F9" , 20 , '~', -1 , -1 )\ + X(132, 0x79, 0x79, 0x44, 0, 0x0000'00'FF, 1, F10 , "F10" , 21 , '~', -1 , -1 )\ + X(134, 0x7A, 0x7A, 0x57, 0, 0x0000'00'FF, 1, F11 , "F11" , 23 , '~', -1 , -1 )\ + X(136, 0x7B, 0x7B, 0x5B, 0, 0x0000'00'FF, 1, F12 , "F12" , 24 , '~', -1 , -1 )\ + X(138, 0x7C, 0x7C, 0, 0, 0x0000'00'FF, 1, F13 , "F13" , 57376, 'u', -1 , -1 )\ + X(140, 0x7D, 0x7D, 0, 0, 0x0100'00'FF, 1, F14 , "F14" , 57377, 'u', -1 , -1 )\ + X(142, 0x7E, 0x7E, 0, 0, 0x0100'00'FF, 1, F15 , "F15" , 57378, 'u', -1 , -1 )\ + X(144, 0x7F, 0x7F, 0, 0, 0x0100'00'FF, 1, F16 , "F16" , 57379, 'u', -1 , -1 )\ + X(146, 0x80, 0x80, 0, 0, 0x0100'00'FF, 1, F17 , "F17" , 57380, 'u', -1 , -1 )\ + X(148, 0x81, 0x81, 0, 0, 0x0100'00'FF, 1, F18 , "F18" , 57381, 'u', -1 , -1 )\ + X(150, 0x82, 0x82, 0, 0, 0x0100'00'FF, 1, F19 , "F19" , 57382, 'u', -1 , -1 )\ + X(152, 0x83, 0x83, 0, 0, 0x0100'00'FF, 1, F20 , "F20" , 57383, 'u', -1 , -1 )\ + X(154, 0x84, 0x84, 0, 0, 0x0100'00'FF, 1, F21 , "F21" , 57384, 'u', -1 , -1 )\ + X(156, 0x85, 0x85, 0, 0, 0x0100'00'FF, 1, F22 , "F22" , 57385, 'u', -1 , -1 )\ + X(158, 0x86, 0x86, 0, 0, 0x0100'00'FF, 1, F23 , "F23" , 57386, 'u', -1 , -1 )\ + X(160, 0x87, 0x87, 0, 0, 0x0100'00'FF, 1, F24 , "F24" , 57387, 'u', -1 , -1 )\ + X(162, 0x7D, 0x7D, 0, ExtendedKey, 0x0100'00'FF, 1, F25 , "F25" , 57388, 'u', -1 , -1 )\ + X(164, 0x7E, 0x7E, 0, ExtendedKey, 0x0100'00'FF, 1, F26 , "F26" , 57389, 'u', -1 , -1 )\ + X(166, 0x7F, 0x7F, 0, ExtendedKey, 0x0100'00'FF, 1, F27 , "F27" , 57390, 'u', -1 , -1 )\ + X(168, 0x80, 0x80, 0, ExtendedKey, 0x0100'00'FF, 1, F28 , "F28" , 57391, 'u', -1 , -1 )\ + X(170, 0x81, 0x81, 0, ExtendedKey, 0x0100'00'FF, 1, F29 , "F29" , 57392, 'u', -1 , -1 )\ + X(172, 0x82, 0x82, 0, ExtendedKey, 0x0100'00'FF, 1, F30 , "F30" , 57393, 'u', -1 , -1 )\ + X(174, 0x83, 0x83, 0, ExtendedKey, 0x0100'00'FF, 1, F31 , "F31" , 57394, 'u', -1 , -1 )\ + X(176, 0x84, 0x84, 0, ExtendedKey, 0x0100'00'FF, 1, F32 , "F32" , 57395, 'u', -1 , -1 )\ + X(178, 0x85, 0x85, 0, ExtendedKey, 0x0100'00'FF, 1, F33 , "F33" , 57396, 'u', -1 , -1 )\ + X(180, 0x86, 0x86, 0, ExtendedKey, 0x0100'00'FF, 1, F34 , "F34" , 57397, 'u', -1 , -1 )\ + X(182, 0x87, 0x87, 0, ExtendedKey, 0x0100'00'FF, 1, F35 , "F35" , 57398, 'u', -1 , -1 )\ + X(184, 0x41, 0x41, 0, 0, 0x0100'00'FF, 1, KeyA , "A" , 97 , 'u', 'a' , '\x01')\ + X(186, 0x42, 0x42, 0, 0, 0x0100'00'FF, 1, KeyB , "B" , 98 , 'u', 'b' , '\x02')\ + X(188, 0x43, 0x43, 0, 0, 0x0100'00'FF, 1, KeyC , "C" , 99 , 'u', 'c' , '\x03')\ + X(190, 0x44, 0x44, 0, 0, 0x0100'00'FF, 1, KeyD , "D" , 100 , 'u', 'd' , '\x04')\ + X(192, 0x45, 0x45, 0, 0, 0x0100'00'FF, 1, KeyE , "E" , 101 , 'u', 'e' , '\x05')\ + X(194, 0x46, 0x46, 0, 0, 0x0100'00'FF, 1, KeyF , "F" , 102 , 'u', 'f' , '\x06')\ + X(196, 0x47, 0x47, 0, 0, 0x0100'00'FF, 1, KeyG , "G" , 103 , 'u', 'g' , '\x07')\ + X(198, 0x48, 0x48, 0, 0, 0x0100'00'FF, 1, KeyH , "H" , 104 , 'u', 'h' , '\x08')\ + X(200, 0x49, 0x49, 0, 0, 0x0100'00'FF, 1, KeyI , "I" , 105 , 'u', 'i' , '\x09')\ + X(202, 0x4A, 0x4A, 0, 0, 0x0100'00'FF, 1, KeyJ , "J" , 106 , 'u', 'j' , '\x0a')\ + X(204, 0x4B, 0x4B, 0, 0, 0x0100'00'FF, 1, KeyK , "K" , 107 , 'u', 'k' , '\x0b')\ + X(206, 0x4C, 0x4C, 0, 0, 0x0100'00'FF, 1, KeyL , "L" , 108 , 'u', 'l' , '\x0c')\ + X(208, 0x4D, 0x4D, 0, 0, 0x0100'00'FF, 1, KeyM , "M" , 109 , 'u', 'm' , '\x0d')\ + X(210, 0x4E, 0x4E, 0, 0, 0x0100'00'FF, 1, KeyN , "N" , 110 , 'u', 'n' , '\x0e')\ + X(212, 0x4F, 0x4F, 0, 0, 0x0100'00'FF, 1, KeyO , "O" , 111 , 'u', 'o' , '\x0f')\ + X(214, 0x50, 0x50, 0, 0, 0x0100'00'FF, 1, KeyP , "P" , 112 , 'u', 'p' , '\x10')\ + X(216, 0x51, 0x51, 0, 0, 0x0100'00'FF, 1, KeyQ , "Q" , 113 , 'u', 'q' , '\x11')\ + X(218, 0x52, 0x52, 0, 0, 0x0100'00'FF, 1, KeyR , "R" , 114 , 'u', 'r' , '\x12')\ + X(220, 0x53, 0x53, 0, 0, 0x0100'00'FF, 1, KeyS , "S" , 115 , 'u', 's' , '\x13')\ + X(222, 0x54, 0x54, 0, 0, 0x0100'00'FF, 1, KeyT , "T" , 116 , 'u', 't' , '\x14')\ + X(224, 0x55, 0x55, 0, 0, 0x0100'00'FF, 1, KeyU , "U" , 117 , 'u', 'u' , '\x15')\ + X(226, 0x56, 0x56, 0, 0, 0x0100'00'FF, 1, KeyV , "V" , 118 , 'u', 'v' , '\x16')\ + X(228, 0x57, 0x57, 0, 0, 0x0100'00'FF, 1, KeyW , "W" , 119 , 'u', 'w' , '\x17')\ + X(230, 0x58, 0x58, 0, 0, 0x0100'00'FF, 1, KeyX , "X" , 120 , 'u', 'x' , '\x18')\ + X(232, 0x59, 0x59, 0, 0, 0x0100'00'FF, 1, KeyY , "Y" , 121 , 'u', 'y' , '\x19')\ + X(234, 0x5A, 0x5A, 0, 0, 0x0100'00'FF, 1, KeyZ , "Z" , 122 , 'u', 'z' , '\x1a')\ + X(236, 0x5F, 0x5F, 0, ExtendedKey, 0x0100'00'FF, 0, Sleep , "Sleep" , 0 , 'u', -1 , -1 )\ + X(238, 0xB7, 0xB7, 0, ExtendedKey, 0x0100'00'FF, 0, Calculator , "Calculator" , 0 , 'u', -1 , -1 )\ + X(240, 0x48, 0x48, 0, ExtendedKey, 0x0100'00'FF, 0, Mail , "Mail" , 0 , 'u', -1 , -1 )\ + X(242, 0xAD, 0xAD, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440, 'u', -1 , -1 )\ + X(244, 0xAE, 0xAE, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438, 'u', -1 , -1 )\ + X(246, 0xAF, 0xAF, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439, 'u', -1 , -1 )\ + X(248, 0xB0, 0xB0, 0, ExtendedKey, 0x0100'00'FF, 0, MediaNext , "MediaNext" , 57435, 'u', -1 , -1 )\ + X(250, 0xB1, 0xB1, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPrev , "MediaPrev" , 57436, 'u', -1 , -1 )\ + X(252, 0xB2, 0xB2, 0, ExtendedKey, 0x0100'00'FF, 0, MediaStop , "MediaStop" , 57432, 'u', -1 , -1 )\ + X(254, 0xB2, 0xB2, 0, 0, 0x0100'00'FF, 0, MediaPause , "MediaPause" , 57429, 'u', -1 , -1 )\ + X(256, 0xB3, 0xB3, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430, 'u', -1 , -1 )\ + X(258, 0xB3, 0xB3, 0, 0, 0x0100'00'FF, 0, MediaPlay , "MediaPlay" , 57428, 'u', -1 , -1 )\ + X(260, 0xB5, 0xB5, 0, ExtendedKey, 0x0100'00'FF, 0, MediaSelect , "MediaSelect" , 0 , 'u', -1 , -1 )\ + X(262, 0xB8, 0xB8, 0, ExtendedKey, 0x0100'00'FF, 0, MediaReverse , "MediaReverse" , 57431, 'u', -1 , -1 )\ + X(264, 0xB8, 0xB8, 0, 0, 0x0100'00'FF, 0, MediaRecord , "MediaRecord" , 57437, 'u', -1 , -1 )\ + X(266, 0xB9, 0xB9, 0, ExtendedKey, 0x0100'00'FF, 0, MediaFastForward, "MediaFastForward", 57433, 'u', -1 , -1 )\ + X(268, 0xB9, 0xB9, 0, 0, 0x0100'00'FF, 0, MediaRewind , "MediaRewind" , 57434, 'u', -1 , -1 )\ + X(270, 0xA6, 0xA6, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserBack , "BrowserBack" , 0 , 'u', -1 , -1 )\ + X(272, 0xA7, 0xA7, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserForward , "BrowserForward" , 0 , 'u', -1 , -1 )\ + X(274, 0xA8, 0xA8, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 , 'u', -1 , -1 )\ + X(276, 0xA9, 0xA9, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserStop , "BrowserStop" , 0 , 'u', -1 , -1 )\ + X(278, 0xAA, 0xAA, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 , 'u', -1 , -1 )\ + X(280, 0xAB, 0xAB, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserFavorites, "BrowserFavorites", 0 , 'u', -1 , -1 )\ + X(282, 0xAC, 0xAC, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserHome , "BrowserHome" , 0 , 'u', -1 , -1 )\ + X(284, 0xFF, 0xFF, 0xFF, ExtendedKey, 0x0100'FF'FF, 0, lastKey , "lastKey" , 0 , 0 , -1 , -1 ) // Max 12 bits for KeyId. static constexpr auto idbits = 12; - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ static constexpr auto Name = KeyId; key_list #undef X @@ -293,6 +293,10 @@ namespace netxs::input si32 vkey; si32 scan; si32 edit; + si32 KKPDef; + si32 KKPSuffix; + si32 KKPAscii; + si32 KKPCtl; }; static auto data = std::vector(input::key::lastKey); return data[std::clamp(keycode, 0, input::key::lastKey - 1)]; @@ -301,10 +305,19 @@ namespace netxs::input map(si32 vk, si32 sc, si32 cs) : hash{ (sz_t)(mask(vk) & (vk | (sc << 8) | (cs << 16))) } { } - map(si32 vk, si32 sc, si32 cs, si32 keymask, view keyname, view generic_keyname, si32 doinput, si32 id) + map(si32 vk, si32 sc, si32 cs, si32 keymask, view keyname, view generic_keyname, si32 doinput, si32 id, + si32 KKPDef, si32 KKPSuffix, si32 KKPAscii, si32 KKPCtl) { mask(vk) = keymask; - data(id) = { .name = keyname, .generic = generic_keyname, .vkey = vk, .scan = sc, .edit = doinput }; + data(id) = { .name = keyname, + .generic = generic_keyname, + .vkey = vk, + .scan = sc, + .edit = doinput, + .KKPDef = KKPDef, + .KKPSuffix = KKPSuffix, + .KKPAscii = KKPAscii, + .KKPCtl = KKPCtl }; hash = (sz_t)(keymask & (vk | (sc << 8) | (cs << 16))); } @@ -320,28 +333,28 @@ namespace netxs::input static const auto keymap = std::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ - { map{ Vkey, Scan, CtrlState, Mask, #Name, GenericName, Input, Name }, Name }, + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ + { map{ Vkey, Scan, CtrlState, Mask, #Name, GenericName, Input, KeyId, KKPDef, KKPSuffix, KKPAscii, KKPCtl }, Name }, key_list #undef X }; static const auto kkpmap = std::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ - { KKPDef, KeyId }, + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ + { KKPDef | (KKPSuffix << 16), KeyId }, key_list #undef X }; static const auto specific_names = utf::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ { utf::to_lower(#Name), KeyId }, key_list #undef X }; static const auto generic_names = utf::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef) \ + #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ { utf::to_lower(GenericName), KeyId & -2 }, key_list #undef X @@ -1144,6 +1157,8 @@ namespace netxs::input text vkchord{}; text scchord{}; text chchord{}; + text shifted{}; + text unshift{}; byte payload{}; // keybd: Payload type. hint vkevent{}; // In-process keybd virtcod chord identifier. @@ -2156,6 +2171,7 @@ namespace netxs::input auto v = keybd::keycode & -2; // Generic keys only auto c = keybd::cluster.empty() ? 0 : (byte)keybd::cluster.front(); + if (v < 0 || v >= input::key::lastKey) v = 0; if (s & hids::AltGr || (s & hids::LCtrl && s & hids::RAlt)) // This combination is already translated. { s &= ~(hids::LCtrl | hids::RAlt); @@ -2166,16 +2182,6 @@ namespace netxs::input auto ctrl = s & hids::anyCtrl ? hids::anyCtrl : 0; if (shift || alt || ctrl) { - if (ctrl && alt) // c == 0 for ctrl+alt+key combinationsons on windows. - { - if (c == 0) // Chars and vkeys for ' '(0x20),'A'-'Z'(0x41-5a) are the same on windows. - { - if (v >= key::KeyA && v <= key::KeyZ) return "\033"s + (char)((0x41 + (v - key::KeyA) / 2) & 0b00011111);//generate('\033', (wchr)( a & 0b00011111)); // Alt causes to prepend '\033'. Ctrl trims by 0b00011111. - else if (v == key::Space || v == keybd::nullkey) return "\033\0"s; //'\033' + (wchr)('@' & 0b00011111)); // Map ctrl+alt+@ to ^[^@; - } - else if (c == 0x20 || (c >= 'A' && c <= 'Z')) return "\033"s + (char)(c & 0b00011111);//generate('\033', (wchr)( a & 0b00011111)); // Alt causes to prepend '\033'. Ctrl trims by 0b00011111. - } - if (auto it_shift = shift_key.find(v); it_shift != shift_key.end()) { auto& mods = *++(it_shift->second.rbegin()); @@ -2189,11 +2195,40 @@ namespace netxs::input { return it_other->second; } - else if (!ctrl && alt && c) return text{ '\033' + keybd::cluster }; - else if ( ctrl && !alt) + auto& rec = input::key::map::data(v); + if (!shift) + { + if (ctrl && alt) + { + if (rec.KKPCtl != -1 ) return "\x1b"s + (char)rec.KKPCtl; + else if (c > 0 && c <= 127) return "\x1b"s + (char)(c & 31); // ^[^@; + } + else if (ctrl) + { + if (rec.KKPCtl != -1 ) return ""s + (char)rec.KKPCtl; + else if (c > 0 && c <= 127) return ""s + (char)(c & 31); // ^@; + } + else if (alt) + { + if (rec.KKPAscii != -1) return "\x1b"s + (char)rec.KKPAscii; // Ignore kb layout. + } + } + else + { + if (ctrl && alt) + { + if (rec.KKPCtl != -1 ) return "\x1b"s + (char)rec.KKPCtl; + else if (c > 0 && c <= 127) return "\x1b"s + (char)(c & 31); + } + else if (ctrl) + { + if (rec.KKPCtl != -1 ) return ""s + (char)rec.KKPCtl; + else if (c > 0 && c <= 127) return ""s + (char)(c & 31); + } + } + if (alt && c) { - if (c == 0x20 || (c == 0x00 && v == keybd::nullkey)) return text(1, '@' & 0b00011111); // Detect ctrl+@ and ctrl+space. - else if (c == 0x00 && (v >= key::KeyA && v <= key::KeyZ)) return text(1, (0x41 + (v - key::KeyA) / 2) & 0b00011111); // Emulate ctrl+key mapping to C0 if current kb layout does not contain it. + return text{ '\x1b' + keybd::cluster }; } } diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 54a6e8883a..bb600e53ca 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -6112,14 +6112,28 @@ namespace netxs::os k.virtcod = base_key; k.scancod = {}; } + if (suffix == 'u') + { + k.shifted = utf::to_utf_from_code(shifted_code); + k.unshift = utf::to_utf_from_code(unicode_code); + } + else + { + k.shifted.clear(); + k.unshift.clear(); + } if (k.cluster.empty() && suffix == 'u') // Form cluster. { - auto c = utf::to_upper((char)base_key); - if (k.ctlstat & hids::anyCtrl && base_key < 128 && c >= 0x40 && c <= 0x5F) // Map @ABC...XYZ[\]^_ to C0 + auto& rec = input::key::map::data(k.keycode); + if (k.ctlstat & hids::anyCtrl && rec.KKPCtl != -1) + { + k.cluster = text(1, (char)rec.KKPCtl); + } + else if (k.ctlstat & hids::anyCtrl && unicode_code > 0 && unicode_code < 128) { - k.cluster = text(1, c & 0b00011111); + k.cluster = text(1, (char)(unicode_code & 31)); } - else if (k.cluster.empty() && unicode_code > 0 && unicode_code < 57358) // Exclude any function keys. + else if (unicode_code > 0 && unicode_code < 57358) // Exclude any function keys. { utf::to_utf_from_code(k.ctlstat & hids::CapsLock ? unicode_code : shifted_code, k.cluster); } From a83314b521734874e236fed6bfb136475f680adf Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 4 Jun 2026 23:11:29 +0500 Subject: [PATCH 05/71] #943 WIP: KKP support (revise key2vt + deadkeys + fix custom kb layouts) --- src/netxs/desktopio/gui.hpp | 16 +++++++-- src/netxs/desktopio/input.hpp | 61 ++++++++++++++++++++++++++++++++-- src/netxs/desktopio/system.hpp | 45 ++++++++++++++++--------- src/netxs/desktopio/utf.hpp | 4 +++ 4 files changed, 106 insertions(+), 20 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index b8885f6bac..ee06f6f494 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3513,6 +3513,7 @@ namespace netxs::gui kmap chords; // winbase: Pressed key table (key chord). bool fake_ctrl; // winbase: Fake ctrl key event on AltGr press/release (non-US kb layouts). bool wait_ralt; // winbase: Wait RightAlt right after the fake LeftCtrl. + si32 last_deadkey_vkey = {}; // winbase: Virtual code for deadkey tracking. winbase(auth& indexer, cfg_t& config, twod grip_cell) : base{ indexer }, @@ -5550,7 +5551,7 @@ namespace netxs::gui { shifted.clear(); unshift.clear(); - if (virtcod >= 0x30 && virtcod <= 0xE6) // Alphanumeric + punctuation. + if (scancod && virtcod >= 0x30 && virtcod <= 0xE6 && virtcod != last_deadkey_vkey) // Alphanumeric + punctuation (excluding deadkeys). { auto buf = wide(8, 0); auto current_layout = ::GetKeyboardLayout(0); @@ -5686,7 +5687,13 @@ namespace netxs::gui } } ::GetKeyboardState(vkstat.data()); // Sync with thread kb state. - if (keytype != 2) // Do not notify dead keys. + auto is_deadkey_released = last_deadkey_vkey && (keystat == input::key::released) && (virtcod == last_deadkey_vkey); + if (is_deadkey_released) // Do not notify dead keys. + { + last_deadkey_vkey = {}; + //if constexpr (debugmode) log("deadkey released"); + } + else if (keytype != 2) { toUTF8.clear(); if (keytype == 1) @@ -5703,6 +5710,11 @@ namespace netxs::gui } keybd_send_state(virtcod, keystat, scancod, extflag, toUTF8); } + else + { + last_deadkey_vkey = virtcod; + //if constexpr (debugmode) log("deadkey pressed"); + } toWIDE.clear(); //print_vkstat("keybd_read_input"); return true; diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 181bc0f0aa..eb9fbadd53 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -359,6 +359,55 @@ namespace netxs::input key_list #undef X }; + static constexpr auto ctrl_lut = [] // Ctrl+Key lookup table. + { + auto lut = std::array{ -1 }; + auto pairs = std::to_array>( + { + { 127, 8 }, { 8, 127 }, + { 9, 9 }, { 13, 10 }, { 27, 27 }, + { '`', '`' }, { '!', '!' }, { '"', '"' }, { '#', '#' }, { '$', '$' }, { '%', '%' }, { '&', '&' }, + { '\'', '\'' }, + { '(', '(' }, { ')', ')' }, { '*', '*' }, { '+', '+' }, { '=', '=' }, { ',', ',' }, { '.', '.' }, + { ':', ':' }, { ';', ';' }, { '<', '<' }, { '>', '>' }, + { '@', 0 }, { ' ', 0 }, + { 'a', 1 }, { 'f', 6 }, { 'k', 11 }, { 'p', 16 }, { 'u', 21 }, + { 'b', 2 }, { 'g', 7 }, { 'l', 12 }, { 'q', 17 }, { 'v', 22 }, + { 'c', 3 }, { 'h', 8 }, { 'm', 13 }, { 'r', 18 }, { 'w', 23 }, + { 'd', 4 }, { 'i', 9 }, { 'n', 14 }, { 's', 19 }, { 'x', 24 }, + { 'e', 5 }, { 'j', 10 }, { 'o', 15 }, { 't', 20 }, { 'y', 25 }, { 'z', 26 }, + { 'A', 1 }, { 'F', 6 }, { 'K', 11 }, { 'P', 16 }, { 'U', 21 }, + { 'B', 2 }, { 'G', 7 }, { 'L', 12 }, { 'Q', 17 }, { 'V', 22 }, + { 'C', 3 }, { 'H', 8 }, { 'M', 13 }, { 'R', 18 }, { 'W', 23 }, + { 'D', 4 }, { 'I', 9 }, { 'N', 14 }, { 'S', 19 }, { 'X', 24 }, + { 'E', 5 }, { 'J', 10 }, { 'O', 15 }, { 'T', 20 }, { 'Y', 25 }, { 'Z', 26 }, + { '[', 27 }, { '{', 27 }, // { '{', '{' }, ??? + { '\\',28 }, { '|', 28 }, // { '|', '|' }, ??? + { ']', 29 }, { '}', 29 }, // { '}', '}' }, ??? + { '~', 30 }, { '^', 30 }, + { '/', 31 }, { '_', 31 }, + { '-', 31 }, // { '-', '-' }, ??? + { '?', 127 }, + { '0', '0' }, { '2', 0 }, { '4', 28 }, { '6', 30 }, { '8', 127 }, + { '1', '1' }, { '3', 27 }, { '5', 29 }, { '7', 31 }, { '9', '9' }, + }); + for (auto [asc, c] : pairs) lut[asc] = c; + return lut; + }(); + text interpret_ctrl(auto& k, bool ctrl, bool shift) + { + auto crop = text{}; + auto asc = utf::to_code(shift ? k.shifted : k.unshift); + if (ctrl && asc > 0 && asc < 128) + { + auto converted_char = input::key::ctrl_lut[asc]; + if (converted_char != -1) + { + crop += (char)converted_char; + } + } + return crop; + } #define mouse_list \ X(MouseAny , 0x00, 0)\ @@ -1489,9 +1538,10 @@ namespace netxs::input { key::Backspace | (hids::anyCtrlAlt << key::idbits), { "\033\x08" }}, { key::Tab | (hids::anyCtrl << key::idbits), { "\t" }}, { key::Tab | (hids::anyShift << key::idbits), { "\033[Z" }}, - { key::Tab | (hids::anyAlt << key::idbits), { "\033[1;3I" }}, + { key::Tab | (hids::anyAlt << key::idbits), { "\033\t" }}, { key::Esc | (hids::anyAlt << key::idbits), { "\033\033" }}, { key::Key1 | (hids::anyCtrl << key::idbits), { "1" }}, + { key::Key2 | (hids::anyCtrl << key::idbits), { "\x00" }}, { key::Key3 | (hids::anyCtrl << key::idbits), { "\x1b" }}, { key::Key4 | (hids::anyCtrl << key::idbits), { "\x1c" }}, { key::Key5 | (hids::anyCtrl << key::idbits), { "\x1d" }}, @@ -2160,7 +2210,7 @@ namespace netxs::input focus::state ? owner.base::signal(tier::release, input::events::focus::set::on, { .gear_id = id, .just_activate_only = true, .treeid = focus::treeid, .digest = focus::digest }) : owner.base::signal(tier::release, input::events::focus::set::off, { .gear_id = id, .treeid = focus::treeid, .digest = focus::digest }); } - text interpret(bool decckm) + text interpret(bool decckm) const { static auto alone_key = build_alone_key(); static auto shift_key = build_shift_key(); @@ -2191,7 +2241,12 @@ namespace netxs::input if (ctrl ) mods += 4; return it_shift->second; } - else if (auto it_other = other_key.find(v | (shift | alt | ctrl) << key::idbits); it_other != other_key.end()) + if (auto crop = input::key::interpret_ctrl(*this, ctrl, shift); crop.size()) + { + if (alt) crop = '\x1b' + crop; + return crop; + } + if (auto it_other = other_key.find(v | (shift | alt | ctrl) << key::idbits); it_other != other_key.end()) { return it_other->second; } diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index bb600e53ca..72db5ac2f3 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -6057,7 +6057,7 @@ namespace netxs::os }; auto detect_kkp = [&](qiew sequence) { - // ESC [ unicode_code:shifted_code:base_key ; ctlstat:evtype ; codepoints suffix + // ESC [ unshift_code:shifted_code:base_key ; ctlstat:evtype ; codepoints suffix if constexpr (debugmode) log("KKP: ", ansi::hi(utf::debase(sequence))); using namespace input; sequence.remove_prefix(2); // Pop ESC [ @@ -6066,13 +6066,21 @@ namespace netxs::os ansi::read_CSI(sequence, q, noop{}); auto suffix = q(ansi::ccc_nop); - auto unicode_code = q(1); // Unshifted code. - auto shifted_code = q.subarg(unicode_code); - auto base_key = q.subarg(unicode_code); + auto unshift_code = q(1); // Unshifted code. + auto shifted_code = q.subarg(unshift_code); + auto base_key = q.subarg(unshift_code); auto ctlstat = q(1); auto evtype = q.subarg(1); auto codepoint = q(0); + if (unshift_code >= 'a' && unshift_code <= 'z') // Fix for custom kb layouts (QWERTZ, AZERTY, Dvorak, etc). + { + if (unshift_code != base_key) + { + base_key = unshift_code; + } + } + k.cluster = {}; while (codepoint) // cpoint : cpoint : ... : cpoint { @@ -6115,7 +6123,7 @@ namespace netxs::os if (suffix == 'u') { k.shifted = utf::to_utf_from_code(shifted_code); - k.unshift = utf::to_utf_from_code(unicode_code); + k.unshift = utf::to_utf_from_code(unshift_code); } else { @@ -6124,21 +6132,28 @@ namespace netxs::os } if (k.cluster.empty() && suffix == 'u') // Form cluster. { - auto& rec = input::key::map::data(k.keycode); - if (k.ctlstat & hids::anyCtrl && rec.KKPCtl != -1) - { - k.cluster = text(1, (char)rec.KKPCtl); - } - else if (k.ctlstat & hids::anyCtrl && unicode_code > 0 && unicode_code < 128) + if (auto crop = input::key::interpret_ctrl(k, k.ctlstat & hids::anyCtrl, k.ctlstat & hids::anyShift); crop.size()) { - k.cluster = text(1, (char)(unicode_code & 31)); + k.cluster = crop; } - else if (unicode_code > 0 && unicode_code < 57358) // Exclude any function keys. + else { - utf::to_utf_from_code(k.ctlstat & hids::CapsLock ? unicode_code : shifted_code, k.cluster); + auto& rec = input::key::map::data(k.keycode); + if (k.ctlstat & hids::anyCtrl && rec.KKPCtl != -1) + { + k.cluster = text(1, (char)rec.KKPCtl); + } + else if (k.ctlstat & hids::anyCtrl && unshift_code > 0 && unshift_code < 128) + { + k.cluster = text(1, (char)(unshift_code & 31)); + } + else if (unshift_code > 0 && unshift_code < 57358) // Exclude any function keys. + { + utf::to_utf_from_code(k.ctlstat & hids::CapsLock ? unshift_code : shifted_code, k.cluster); + } } } - if constexpr (debugmode) log(" suffix='%%' unicode_code=%% shifted_code=%% base_key=%% ctlstat=%% evtype=%% cluster=%%", (char)suffix, unicode_code, shifted_code, base_key, ctlstat, evtype, ansi::hi(utf::debase(k.cluster))); + if constexpr (debugmode) log(" suffix='%%' unshift_code=%% shifted_code=%% base_key=%% ctlstat=%% evtype=%% cluster=%%", (char)suffix, unshift_code, shifted_code, base_key, ctlstat, evtype, ansi::hi(utf::debase(k.cluster))); k.handled = {}; chords.build(k); keybd(k); diff --git a/src/netxs/desktopio/utf.hpp b/src/netxs/desktopio/utf.hpp index e5fe5fa7f1..b2a3ed45df 100644 --- a/src/netxs/desktopio/utf.hpp +++ b/src/netxs/desktopio/utf.hpp @@ -1372,6 +1372,10 @@ namespace netxs::utf } return !first_part; } + utfx to_code(qiew utf8) + { + return utf::cpit{ utf8 }.take().cdpoint; + } namespace { void _to_utf(utfx code, auto push) From 458fd46e3333c49778db999d0b3766e67a91ea67 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 5 Jun 2026 00:17:02 +0500 Subject: [PATCH 06/71] #943 WIP: KKP support (make literal shortcuts more clear) --- src/netxs/desktopio/input.hpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index eb9fbadd53..b7ae049094 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -477,6 +477,8 @@ namespace netxs::input k.vkchord.clear(); k.scchord.clear(); k.chchord.clear(); + k.shifted.clear(); + k.unshift.clear(); pushed.clear(); keyout = {}; } @@ -553,10 +555,16 @@ namespace netxs::input return is_released; }); auto sign = !!k.keystat; - if (k.cluster.size() && k.cluster.front() != '\0') + auto shift_state = k.ctlstat & hids::anyShift; + auto has_cluster = k.cluster.size() && k.cluster.front(); + auto has_unshift = k.unshift.size() && k.unshift.front() && !shift_state; + auto has_shifted = k.shifted.size() && k.shifted.front() && shift_state; + if (has_cluster || has_unshift || has_shifted) // Try to keep national key names. { k.chchord = k.vkchord; // The main part of the chchord is the same as in vkchord. - push_cluster(sign, k.chchord, k.cluster); + if (has_unshift) push_cluster(sign, k.chchord, k.unshift); + else if (has_shifted) push_cluster(sign, k.chchord, k.shifted); + else push_cluster(sign, k.chchord, k.cluster); } push_keyid(sign, k.vkchord, k.keycode); push_scode(sign, k.scchord, k.scancod | (k.extflag ? 0x100 : 0)); From a34dfbcf69d2508091f3c6a404fd8c10c0891449 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 5 Jun 2026 00:18:01 +0500 Subject: [PATCH 07/71] v2026.06.04 --- src/netxs/desktopio/application.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/netxs/desktopio/application.hpp b/src/netxs/desktopio/application.hpp index 766f561109..93f1d49701 100644 --- a/src/netxs/desktopio/application.hpp +++ b/src/netxs/desktopio/application.hpp @@ -22,7 +22,7 @@ namespace netxs::app namespace netxs::app::shared { - static const auto version = "v2026.05.30"; + static const auto version = "v2026.06.04"; static const auto repository = "https://github.com/directvt/vtm"; static const auto usr_config = "~/.config/vtm/settings.xml"s; static const auto sys_config = "/etc/vtm/settings.xml"s; From d2878f7750698decf332b542a19b2bcdf6737c65 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 5 Jun 2026 00:37:12 +0500 Subject: [PATCH 08/71] #943 WIP: KKP support (fix AltGr mapping) --- src/netxs/desktopio/input.hpp | 848 +++++++++++++++++----------------- 1 file changed, 426 insertions(+), 422 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index b7ae049094..82af9ca380 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -445,383 +445,6 @@ namespace netxs::input #undef mouse_list #undef key_list - // The bind record is a set of 16-bit words: 0x000a 0x000b ... 0xffff 0xa 0xfe0e - // 15 bit: 0 - virt code, 1 - scan code (0x80'00). - // 14 bit: 0 - pressed, 1 - released (0x40'00). - // 13 bit: 1 - all subsequent bytes form a grapheme cluster (0x20'00). - // 12 bit: 1 - mouse code (0x10'00). - // 0-11 bits: virt (aka KeyId, keycode), scan or mouse code. For clusters it is set to '\x20FF'('\x60FF'). - // Generic events: (12-15 bits on) (0xFn ' 00 00 00 00) -- (0xF0 & 4-bit tier ' 32-bit generic event_id). - auto is_generic( byte sign) { return (sign & input::key::generic_sign) == input::key::generic_sign; } - auto is_scancode(byte sign) { return sign & input::key::scancode_sign; } - auto is_pressed( byte sign) { return !(sign & input::key::unpressed_sign); } - auto is_cluster( byte sign) { return sign & input::key::cluster_sign; } - auto is_mouse( byte sign) { return (sign & input::key::generic_sign) == input::key::mouse_sign; } - - struct kmap - { - struct chord_item_t - { - si32 index; - si32 scode; - time stamp; - }; - - using cmap = std::map; // std::unordered_map doesn't sort items. - - cmap pushed{}; // kmap: Pushed key map. - bool keyout{}; // kmap: Some key has left the key chord. - - void reset(auto& k) - { - k.vkchord.clear(); - k.scchord.clear(); - k.chchord.clear(); - k.shifted.clear(); - k.unshift.clear(); - pushed.clear(); - keyout = {}; - } - auto exist(si32 keyid) - { - auto iter = pushed.find(keyid); - return iter != pushed.end(); - } - static void push_generic(si32 sign, si32 event_id, text& g_chord) - { - g_chord += (byte)sign; - g_chord += view{ (char*)&event_id, sizeof(event_id) }; - } - static void push_keyid(bool ispressed, text& vkchord, si32 keyid) - { - keyid &= 0x0FFF; // 12 bit max. - auto hi_12bit_keyid = (byte)(keyid >> 8); - auto lo_12bit_keyid = (byte)(keyid & 0xFF); - vkchord.push_back(hi_12bit_keyid | (byte)(ispressed ? 0x00 : input::key::unpressed_sign)); - vkchord.push_back(lo_12bit_keyid); - } - static void push_scode(bool ispressed, text& scchord, si32 scode) - { - scode &= 0x0FFF; // 12 bit max. - auto hi_12bit_scode = (byte)((scode >> 8) & 0x01); - auto lo_12bit_scode = (byte)(scode & 0xFF); - scchord.push_back(hi_12bit_scode | (byte)((ispressed ? 0x00 : input::key::unpressed_sign) | input::key::scancode_sign)); - scchord.push_back(lo_12bit_scode); - } - static void push_cluster(bool ispressed, text& chchord, view cluster) - { - chchord += (byte)((ispressed ? 0x00 : input::key::unpressed_sign) | input::key::cluster_sign); - chchord += '\xFF'; - chchord += cluster; - } - static void push_mouse(si32 sign, si32 action_id, si32 button_id, text& m_chord) - { - m_chord += (byte)sign; - m_chord += (byte)action_id; - m_chord += (byte)button_id; - } - template - void build(auto& k, P test_key_released = {}) - { - if (k.keystat != input::key::repeated) - { - //log("key=%% pressed=%%", input::key::map::data(k.keycode).name, k.keystat); - if (k.keystat == input::key::released) - { - pushed.erase(k.keycode); - } - k.vkchord.clear(); - k.scchord.clear(); - k.chchord.clear(); - auto vk_valid = k.keycode > input::key::config; - auto sc_valid = k.scancod > 0; - if (!keyout || k.keystat != input::key::released) - { - keyout = k.keystat == input::key::released; - //log(" erasing %%", k.keystat == input::key::released ? "key::released" : k.keystat == input::key::pressed ? "key::pressed" : "key::repeated"); - std::erase_if(pushed, [&](auto& rec) - { - auto& [keyid, val] = rec; - //log("\tcheck keyid=%%", input::key::map::data(keyid).name); - auto is_released = test_key_released(val.index); // Check if it is still pressed. - if (!is_released && keyid != k.keycode/*exclude repeated key*/) - { - if (keyid <= input::key::config) vk_valid = faux; - if (val.scode == 0) sc_valid = faux; - push_keyid(true, k.vkchord, keyid); - push_scode(true, k.scchord, val.scode); - } - //else if (is_released) log("\tkeyid=%% released", input::key::map::data(keyid).name); - return is_released; - }); - auto sign = !!k.keystat; - auto shift_state = k.ctlstat & hids::anyShift; - auto has_cluster = k.cluster.size() && k.cluster.front(); - auto has_unshift = k.unshift.size() && k.unshift.front() && !shift_state; - auto has_shifted = k.shifted.size() && k.shifted.front() && shift_state; - if (has_cluster || has_unshift || has_shifted) // Try to keep national key names. - { - k.chchord = k.vkchord; // The main part of the chchord is the same as in vkchord. - if (has_unshift) push_cluster(sign, k.chchord, k.unshift); - else if (has_shifted) push_cluster(sign, k.chchord, k.shifted); - else push_cluster(sign, k.chchord, k.cluster); - } - push_keyid(sign, k.vkchord, k.keycode); - push_scode(sign, k.scchord, k.scancod | (k.extflag ? 0x100 : 0)); - if (!vk_valid) k.vkchord.clear(); - if (!sc_valid) k.scchord.clear(); - } - if (k.keystat == input::key::pressed) - { - auto& key = pushed[k.keycode]; - key.scode = k.scancod | (k.extflag ? 0x100 : 0); // Store the scan code of a pressed key. - key.index = k.virtcod; // Store the virtual code to check later that it is still pressed. - key.stamp = datetime::now(); - } - } - } - static auto to_string(qiew chord, bool generic) - { - auto crop = text{}; - while (chord.size() > 1) - { - auto s = (si32)(byte)chord.pop_front(); - auto v = (si32)(byte)chord.pop_front(); - if (crop.size() || s & input::key::unpressed_sign) crop += s & input::key::unpressed_sign ? '-' : '+'; - if (s & input::key::scancode_sign) // Scancodes. - { - auto scancode = v | (s & 0x01 ? 0x100 : 0); - auto length = scancode & 0xF00 ? 3 : 2; - crop += "0x" + utf::to_hex(scancode, length); - } - else if (s & input::key::cluster_sign) // Cluster. - { - auto plain = utf::debase(chord); - utf::replace_all(plain, "'", "\\'"); - crop += '\'' + plain + '\''; - chord.clear(); - } - else // 12-bit Keyid - { - auto keyid = v | ((s & 0x0F) << 8); - crop += generic ? input::key::map::data(keyid).generic : input::key::map::data(keyid).name; - } - } - return crop; - } - static constexpr auto any_key = qiew{ "\0"sv }; - static auto chord_list(qiew chord) - { - struct key_t - { - byte sign; - si32 code1; // Left (or specific) key code. - si32 code2; // Right (if chord is generic) key code - text utf8; - }; - auto keys = std::vector{}; - auto crop = std::vector{}; - //todo reimplement chord_list - if (auto anytest = utf::to_lower(chord); - (anytest.starts_with("any") && !anytest.starts_with(tier::str[tier::anycast])) || - (anytest.starts_with(tier::str[tier::preview]) - && utf::get_trimmed((view{ anytest }.substr(tier::str[tier::preview].size())), ": ").starts_with("any"))) - { - crop.push_back(any_key); - return crop; - } - auto take = [](qiew& chord) - { - auto k = key_t{}; - utf::trim(chord, netxs::whitespaces); - if (chord.empty()) return k; - if (auto pos = chord.find("::"); pos != text::npos) // Environment event. - { - auto event_tier = chord.starts_with(tier::str[tier::preview]) ? tier::preview - : chord.starts_with(tier::str[tier::release]) ? tier::release - : chord.starts_with(tier::str[tier::general]) ? tier::general - : chord.starts_with(tier::str[tier::anycast]) ? tier::anycast - : chord.starts_with(tier::str[tier::request]) ? tier::request - : tier::unknown; - if (event_tier != tier::unknown) - { - auto event_str = chord; - event_str.remove_prefix(tier::str[event_tier].size()); - utf::trim(event_str, netxs::whitespaces_and<':'>); - auto& rtti = netxs::events::rtti(); - auto iter = rtti.find(event_str); - if (iter != rtti.end()) - { - auto metadata = iter->second; - k.sign = (byte)(input::key::generic_sign | event_tier); - k.code1 = metadata.event_id; - if constexpr (debugmode) log("generic event: event_str=%% event_id=%% param_typename=%% tier=%%", event_str, metadata.event_id, metadata.param_typename, tier::str[event_tier]); - } - else - { - log("generic event: unknown event '%%'", chord); - } - } - chord = {}; - return k; - } - if (chord.starts_with(tier::str[tier::preview])) // Drop the "preview:" prefix (it is not used here). - { - chord.remove_prefix(tier::str[tier::preview].size()); - utf::trim_front(chord, netxs::whitespaces_and<':'>); - } - auto c = chord.front(); - if (c != '-') // Is pressed. - { - if (c == '+') - { - chord.pop_front(); // Pop '+'. - utf::trim(chord, netxs::whitespaces); - if (chord.empty()) return k; - c = chord.front(); - } - } - else if (chord.size() > 1) - { - k.sign |= input::key::unpressed_sign; - chord.pop_front(); // Pop '-'. - utf::trim(chord, netxs::whitespaces); - if (chord.empty()) return k; - c = chord.front(); - } - utf::trim(chord, netxs::whitespaces); - if (chord.empty()) return k; - if (auto isscancode = chord.starts_with("0x") || chord.starts_with("0X"); isscancode) - { - chord.remove_prefix(2); - if (auto v = utf::to_int(chord)) - { - k.sign |= input::key::scancode_sign; - k.code1 = v.value(); - } - } - else if (chord.size() > 2 && chord.front() == chord.back() && (chord.front() == '\'' || chord.front() == '\"')) // The literal key must be the last key in a sequence. - { - k.sign |= input::key::cluster_sign; - k.utf8 = utf::unescape(chord.substr(1, chord.size() - 2)); - k.code1 = 0xFF; - chord.clear(); - } - else if (auto key_name = qiew{ utf::get_word(chord, "+- ") }) - { - auto name = utf::to_lower(key_name); - auto name_shadow = qiew{ name }; - auto digits = utf::pop_back_chars(name_shadow, netxs::onlydigits); - if (auto iter_m = input::key::mouse_names.find(name_shadow); iter_m != input::key::mouse_names.end()) // Mouse events. - { - auto [action_index, button_index] = iter_m->second; - if (digits.size()) - { - auto d = digits.front(); - if (d == '0' || d == '1') // MouseClick001 binary format. - { - auto str = text{ digits }; - std::reverse(str.begin(), str.end()); - if (auto v = utf::to_int(str)) - { - button_index = v.value(); - } - } - else // MouseClick3 decimal format. B1 to B8 mouse buttons. - { - button_index = 1 << std::min(7, d - '0' - 1); - } - } - k.sign = (byte)(input::key::mouse_sign); - k.code1 = action_index; - k.code2 = button_index; - //log("mouse event=%%", ansi::hi(utf::to_hex_0x((k.sign<<8)|k.code1))); - } - else if (auto iter = input::key::generic_names.find(name); iter == input::key::generic_names.end()) // Is specific. - { - auto iter2 = input::key::specific_names.find(name); - if (iter2 != input::key::specific_names.end()) - { - k.code1 = iter2->second; - } - } - else // Is generic. - { - auto code = iter->second & -2; - auto n1 = input::key::map::data(code).name.size(); - auto n2 = input::key::map::data(code + 1).name.size(); - k.code1 = n1 ? code : 0; - k.code2 = n2 ? code + 1 : 0; - } - } - utf::trim(chord, netxs::whitespaces); - return k; - }; - // Split. - while (chord) - { - auto k = take(chord); // Unfold. - if (!input::key::is_mouse(k.sign) && !k.code1) return crop; // Unknown key or generic event. - keys.push_back(k); - } - if (keys.empty() || keys.size() > 8) - { - if (keys.size()) log("%%A maximum of eight keys are allowed per chord", prompt::hids); - return crop; - } - if (auto& k = keys.front(); input::key::is_generic(k.sign)) // It is generic event. - { - auto& g_chord = crop.emplace_back(); - push_generic(k.sign, k.code1, g_chord); - return crop; - } - if (auto& k = keys.front(); input::key::is_mouse(k.sign)) // It is mouse event. - { - auto& m_chord = crop.emplace_back(); - push_mouse(k.sign, k.code1, k.code2, m_chord); - return crop; - } - // Sort all but last. - std::sort(keys.begin(), std::prev(keys.end()), [](auto& l, auto& r){ return l.code1 < r.code1; }); - // Generate. - auto count = 1 << keys.size(); - auto temp = text{}; - while (count--) - { - auto bits = count; - for (auto& k : keys) - { - if (auto code = bits & 1 ? k.code1 : k.code2) - { - auto sign = input::key::is_pressed(k.sign); - if (input::key::is_scancode(k.sign)) - { - push_scode(sign, temp, code); - } - else if (input::key::is_cluster(k.sign)) - { - push_cluster(sign, temp, k.utf8); - break; - } - else - { - push_keyid(sign, temp, code); - } - } - else - { - temp.clear(); - break; - } - bits >>= 1; - } - if (temp.size()) crop.push_back(temp); - temp.clear(); - } - return crop; - } - }; - template auto xlat(Args&&... args) { @@ -2240,77 +1863,458 @@ namespace netxs::input auto ctrl = s & hids::anyCtrl ? hids::anyCtrl : 0; if (shift || alt || ctrl) { - if (auto it_shift = shift_key.find(v); it_shift != shift_key.end()) + if (auto it_shift = shift_key.find(v); it_shift != shift_key.end()) + { + auto& mods = *++(it_shift->second.rbegin()); + mods = '1'; + if (shift) mods += 1; + if (alt ) mods += 2; + if (ctrl ) mods += 4; + return it_shift->second; + } + if (auto crop = input::key::interpret_ctrl(*this, ctrl, shift); crop.size()) + { + if (alt) crop = '\x1b' + crop; + return crop; + } + if (auto it_other = other_key.find(v | (shift | alt | ctrl) << key::idbits); it_other != other_key.end()) + { + return it_other->second; + } + auto& rec = input::key::map::data(v); + if (!shift) + { + if (ctrl && alt) + { + if (rec.KKPCtl != -1 ) return "\x1b"s + (char)rec.KKPCtl; + else if (c > 0 && c <= 127) return "\x1b"s + (char)(c & 31); // ^[^@; + } + else if (ctrl) + { + if (rec.KKPCtl != -1 ) return ""s + (char)rec.KKPCtl; + else if (c > 0 && c <= 127) return ""s + (char)(c & 31); // ^@; + } + else if (alt) + { + if (rec.KKPAscii != -1) return "\x1b"s + (char)rec.KKPAscii; // Ignore kb layout. + } + } + else + { + if (ctrl && alt) + { + if (rec.KKPCtl != -1 ) return "\x1b"s + (char)rec.KKPCtl; + else if (c > 0 && c <= 127) return "\x1b"s + (char)(c & 31); + } + else if (ctrl) + { + if (rec.KKPCtl != -1 ) return ""s + (char)rec.KKPCtl; + else if (c > 0 && c <= 127) return ""s + (char)(c & 31); + } + } + if (alt && c) + { + return text{ '\x1b' + keybd::cluster }; + } + } + + if (auto it_alone = alone_key.find(v); it_alone != alone_key.end()) + { + if (v >= key::KeyEnd && v <= key::KeyDownArrow) + { + it_alone->second[1] = decckm ? 'O' : '['; + } + return it_alone->second; + } + else if (c) + { + return keybd::cluster; + } + } + return text{}; + } + }; + + namespace key + { + // The bind record is a set of 16-bit words: 0x000a 0x000b ... 0xffff 0xa 0xfe0e + // 15 bit: 0 - virt code, 1 - scan code (0x80'00). + // 14 bit: 0 - pressed, 1 - released (0x40'00). + // 13 bit: 1 - all subsequent bytes form a grapheme cluster (0x20'00). + // 12 bit: 1 - mouse code (0x10'00). + // 0-11 bits: virt (aka KeyId, keycode), scan or mouse code. For clusters it is set to '\x20FF'('\x60FF'). + // Generic events: (12-15 bits on) (0xFn ' 00 00 00 00) -- (0xF0 & 4-bit tier ' 32-bit generic event_id). + auto is_generic( byte sign) { return (sign & input::key::generic_sign) == input::key::generic_sign; } + auto is_scancode(byte sign) { return sign & input::key::scancode_sign; } + auto is_pressed( byte sign) { return !(sign & input::key::unpressed_sign); } + auto is_cluster( byte sign) { return sign & input::key::cluster_sign; } + auto is_mouse( byte sign) { return (sign & input::key::generic_sign) == input::key::mouse_sign; } + + struct kmap + { + struct chord_item_t + { + si32 index; + si32 scode; + time stamp; + }; + + using cmap = std::map; // std::unordered_map doesn't sort items. + + cmap pushed{}; // kmap: Pushed key map. + bool keyout{}; // kmap: Some key has left the key chord. + + void reset(auto& k) + { + k.vkchord.clear(); + k.scchord.clear(); + k.chchord.clear(); + k.shifted.clear(); + k.unshift.clear(); + pushed.clear(); + keyout = {}; + } + auto exist(si32 keyid) + { + auto iter = pushed.find(keyid); + return iter != pushed.end(); + } + static void push_generic(si32 sign, si32 event_id, text& g_chord) + { + g_chord += (byte)sign; + g_chord += view{ (char*)&event_id, sizeof(event_id) }; + } + static void push_keyid(bool ispressed, text& vkchord, si32 keyid) + { + keyid &= 0x0FFF; // 12 bit max. + auto hi_12bit_keyid = (byte)(keyid >> 8); + auto lo_12bit_keyid = (byte)(keyid & 0xFF); + vkchord.push_back(hi_12bit_keyid | (byte)(ispressed ? 0x00 : input::key::unpressed_sign)); + vkchord.push_back(lo_12bit_keyid); + } + static void push_scode(bool ispressed, text& scchord, si32 scode) + { + scode &= 0x0FFF; // 12 bit max. + auto hi_12bit_scode = (byte)((scode >> 8) & 0x01); + auto lo_12bit_scode = (byte)(scode & 0xFF); + scchord.push_back(hi_12bit_scode | (byte)((ispressed ? 0x00 : input::key::unpressed_sign) | input::key::scancode_sign)); + scchord.push_back(lo_12bit_scode); + } + static void push_cluster(bool ispressed, text& chchord, view cluster) + { + chchord += (byte)((ispressed ? 0x00 : input::key::unpressed_sign) | input::key::cluster_sign); + chchord += '\xFF'; + chchord += cluster; + } + static void push_mouse(si32 sign, si32 action_id, si32 button_id, text& m_chord) + { + m_chord += (byte)sign; + m_chord += (byte)action_id; + m_chord += (byte)button_id; + } + template + void build(auto& k, P test_key_released = {}) + { + if (k.keystat != input::key::repeated) + { + //log("key=%% pressed=%%", input::key::map::data(k.keycode).name, k.keystat); + if (k.keystat == input::key::released) + { + pushed.erase(k.keycode); + } + k.vkchord.clear(); + k.scchord.clear(); + k.chchord.clear(); + auto vk_valid = k.keycode > input::key::config; + auto sc_valid = k.scancod > 0; + if (!keyout || k.keystat != input::key::released) + { + keyout = k.keystat == input::key::released; + //log(" erasing %%", k.keystat == input::key::released ? "key::released" : k.keystat == input::key::pressed ? "key::pressed" : "key::repeated"); + std::erase_if(pushed, [&](auto& rec) + { + auto& [keyid, val] = rec; + //log("\tcheck keyid=%%", input::key::map::data(keyid).name); + auto is_released = test_key_released(val.index); // Check if it is still pressed. + if (!is_released && keyid != k.keycode/*exclude repeated key*/) + { + if (keyid <= input::key::config) vk_valid = faux; + if (val.scode == 0) sc_valid = faux; + push_keyid(true, k.vkchord, keyid); + push_scode(true, k.scchord, val.scode); + } + //else if (is_released) log("\tkeyid=%% released", input::key::map::data(keyid).name); + return is_released; + }); + auto sign = !!k.keystat; + auto shift_state = k.ctlstat & hids::anyShift; + auto altgr_state = k.ctlstat & hids::AltGr; + auto has_cluster = k.cluster.size() && k.cluster.front(); + auto has_unshift = k.unshift.size() && k.unshift.front() && !altgr_state && !shift_state; + auto has_shifted = k.shifted.size() && k.shifted.front() && !altgr_state && shift_state; + if (has_cluster || has_unshift || has_shifted) // Try to keep national key names. + { + k.chchord = k.vkchord; // The main part of the chchord is the same as in vkchord. + if (has_unshift) push_cluster(sign, k.chchord, k.unshift); + else if (has_shifted) push_cluster(sign, k.chchord, k.shifted); + else push_cluster(sign, k.chchord, k.cluster); + } + push_keyid(sign, k.vkchord, k.keycode); + push_scode(sign, k.scchord, k.scancod | (k.extflag ? 0x100 : 0)); + if (!vk_valid) k.vkchord.clear(); + if (!sc_valid) k.scchord.clear(); + } + if (k.keystat == input::key::pressed) + { + auto& key = pushed[k.keycode]; + key.scode = k.scancod | (k.extflag ? 0x100 : 0); // Store the scan code of a pressed key. + key.index = k.virtcod; // Store the virtual code to check later that it is still pressed. + key.stamp = datetime::now(); + } + } + } + static auto to_string(qiew chord, bool generic) + { + auto crop = text{}; + while (chord.size() > 1) + { + auto s = (si32)(byte)chord.pop_front(); + auto v = (si32)(byte)chord.pop_front(); + if (crop.size() || s & input::key::unpressed_sign) crop += s & input::key::unpressed_sign ? '-' : '+'; + if (s & input::key::scancode_sign) // Scancodes. { - auto& mods = *++(it_shift->second.rbegin()); - mods = '1'; - if (shift) mods += 1; - if (alt ) mods += 2; - if (ctrl ) mods += 4; - return it_shift->second; + auto scancode = v | (s & 0x01 ? 0x100 : 0); + auto length = scancode & 0xF00 ? 3 : 2; + crop += "0x" + utf::to_hex(scancode, length); } - if (auto crop = input::key::interpret_ctrl(*this, ctrl, shift); crop.size()) + else if (s & input::key::cluster_sign) // Cluster. { - if (alt) crop = '\x1b' + crop; - return crop; + auto plain = utf::debase(chord); + utf::replace_all(plain, "'", "\\'"); + crop += '\'' + plain + '\''; + chord.clear(); } - if (auto it_other = other_key.find(v | (shift | alt | ctrl) << key::idbits); it_other != other_key.end()) + else // 12-bit Keyid { - return it_other->second; + auto keyid = v | ((s & 0x0F) << 8); + crop += generic ? input::key::map::data(keyid).generic : input::key::map::data(keyid).name; } - auto& rec = input::key::map::data(v); - if (!shift) + } + return crop; + } + static constexpr auto any_key = qiew{ "\0"sv }; + static auto chord_list(qiew chord) + { + struct key_t + { + byte sign; + si32 code1; // Left (or specific) key code. + si32 code2; // Right (if chord is generic) key code + text utf8; + }; + auto keys = std::vector{}; + auto crop = std::vector{}; + //todo reimplement chord_list + if (auto anytest = utf::to_lower(chord); + (anytest.starts_with("any") && !anytest.starts_with(tier::str[tier::anycast])) || + (anytest.starts_with(tier::str[tier::preview]) + && utf::get_trimmed((view{ anytest }.substr(tier::str[tier::preview].size())), ": ").starts_with("any"))) + { + crop.push_back(any_key); + return crop; + } + auto take = [](qiew& chord) + { + auto k = key_t{}; + utf::trim(chord, netxs::whitespaces); + if (chord.empty()) return k; + if (auto pos = chord.find("::"); pos != text::npos) // Environment event. { - if (ctrl && alt) + auto event_tier = chord.starts_with(tier::str[tier::preview]) ? tier::preview + : chord.starts_with(tier::str[tier::release]) ? tier::release + : chord.starts_with(tier::str[tier::general]) ? tier::general + : chord.starts_with(tier::str[tier::anycast]) ? tier::anycast + : chord.starts_with(tier::str[tier::request]) ? tier::request + : tier::unknown; + if (event_tier != tier::unknown) { - if (rec.KKPCtl != -1 ) return "\x1b"s + (char)rec.KKPCtl; - else if (c > 0 && c <= 127) return "\x1b"s + (char)(c & 31); // ^[^@; + auto event_str = chord; + event_str.remove_prefix(tier::str[event_tier].size()); + utf::trim(event_str, netxs::whitespaces_and<':'>); + auto& rtti = netxs::events::rtti(); + auto iter = rtti.find(event_str); + if (iter != rtti.end()) + { + auto metadata = iter->second; + k.sign = (byte)(input::key::generic_sign | event_tier); + k.code1 = metadata.event_id; + if constexpr (debugmode) log("generic event: event_str=%% event_id=%% param_typename=%% tier=%%", event_str, metadata.event_id, metadata.param_typename, tier::str[event_tier]); + } + else + { + log("generic event: unknown event '%%'", chord); + } } - else if (ctrl) + chord = {}; + return k; + } + if (chord.starts_with(tier::str[tier::preview])) // Drop the "preview:" prefix (it is not used here). + { + chord.remove_prefix(tier::str[tier::preview].size()); + utf::trim_front(chord, netxs::whitespaces_and<':'>); + } + auto c = chord.front(); + if (c != '-') // Is pressed. + { + if (c == '+') { - if (rec.KKPCtl != -1 ) return ""s + (char)rec.KKPCtl; - else if (c > 0 && c <= 127) return ""s + (char)(c & 31); // ^@; + chord.pop_front(); // Pop '+'. + utf::trim(chord, netxs::whitespaces); + if (chord.empty()) return k; + c = chord.front(); } - else if (alt) + } + else if (chord.size() > 1) + { + k.sign |= input::key::unpressed_sign; + chord.pop_front(); // Pop '-'. + utf::trim(chord, netxs::whitespaces); + if (chord.empty()) return k; + c = chord.front(); + } + utf::trim(chord, netxs::whitespaces); + if (chord.empty()) return k; + if (auto isscancode = chord.starts_with("0x") || chord.starts_with("0X"); isscancode) + { + chord.remove_prefix(2); + if (auto v = utf::to_int(chord)) { - if (rec.KKPAscii != -1) return "\x1b"s + (char)rec.KKPAscii; // Ignore kb layout. + k.sign |= input::key::scancode_sign; + k.code1 = v.value(); } } - else + else if (chord.size() > 2 && chord.front() == chord.back() && (chord.front() == '\'' || chord.front() == '\"')) // The literal key must be the last key in a sequence. { - if (ctrl && alt) + k.sign |= input::key::cluster_sign; + k.utf8 = utf::unescape(chord.substr(1, chord.size() - 2)); + k.code1 = 0xFF; + chord.clear(); + } + else if (auto key_name = qiew{ utf::get_word(chord, "+- ") }) + { + auto name = utf::to_lower(key_name); + auto name_shadow = qiew{ name }; + auto digits = utf::pop_back_chars(name_shadow, netxs::onlydigits); + if (auto iter_m = input::key::mouse_names.find(name_shadow); iter_m != input::key::mouse_names.end()) // Mouse events. { - if (rec.KKPCtl != -1 ) return "\x1b"s + (char)rec.KKPCtl; - else if (c > 0 && c <= 127) return "\x1b"s + (char)(c & 31); + auto [action_index, button_index] = iter_m->second; + if (digits.size()) + { + auto d = digits.front(); + if (d == '0' || d == '1') // MouseClick001 binary format. + { + auto str = text{ digits }; + std::reverse(str.begin(), str.end()); + if (auto v = utf::to_int(str)) + { + button_index = v.value(); + } + } + else // MouseClick3 decimal format. B1 to B8 mouse buttons. + { + button_index = 1 << std::min(7, d - '0' - 1); + } + } + k.sign = (byte)(input::key::mouse_sign); + k.code1 = action_index; + k.code2 = button_index; + //log("mouse event=%%", ansi::hi(utf::to_hex_0x((k.sign<<8)|k.code1))); } - else if (ctrl) + else if (auto iter = input::key::generic_names.find(name); iter == input::key::generic_names.end()) // Is specific. { - if (rec.KKPCtl != -1 ) return ""s + (char)rec.KKPCtl; - else if (c > 0 && c <= 127) return ""s + (char)(c & 31); + auto iter2 = input::key::specific_names.find(name); + if (iter2 != input::key::specific_names.end()) + { + k.code1 = iter2->second; + } + } + else // Is generic. + { + auto code = iter->second & -2; + auto n1 = input::key::map::data(code).name.size(); + auto n2 = input::key::map::data(code + 1).name.size(); + k.code1 = n1 ? code : 0; + k.code2 = n2 ? code + 1 : 0; } } - if (alt && c) - { - return text{ '\x1b' + keybd::cluster }; - } + utf::trim(chord, netxs::whitespaces); + return k; + }; + // Split. + while (chord) + { + auto k = take(chord); // Unfold. + if (!input::key::is_mouse(k.sign) && !k.code1) return crop; // Unknown key or generic event. + keys.push_back(k); } - - if (auto it_alone = alone_key.find(v); it_alone != alone_key.end()) + if (keys.empty() || keys.size() > 8) { - if (v >= key::KeyEnd && v <= key::KeyDownArrow) - { - it_alone->second[1] = decckm ? 'O' : '['; - } - return it_alone->second; + if (keys.size()) log("%%A maximum of eight keys are allowed per chord", prompt::hids); + return crop; } - else if (c) + if (auto& k = keys.front(); input::key::is_generic(k.sign)) // It is generic event. { - return keybd::cluster; + auto& g_chord = crop.emplace_back(); + push_generic(k.sign, k.code1, g_chord); + return crop; + } + if (auto& k = keys.front(); input::key::is_mouse(k.sign)) // It is mouse event. + { + auto& m_chord = crop.emplace_back(); + push_mouse(k.sign, k.code1, k.code2, m_chord); + return crop; + } + // Sort all but last. + std::sort(keys.begin(), std::prev(keys.end()), [](auto& l, auto& r){ return l.code1 < r.code1; }); + // Generate. + auto count = 1 << keys.size(); + auto temp = text{}; + while (count--) + { + auto bits = count; + for (auto& k : keys) + { + if (auto code = bits & 1 ? k.code1 : k.code2) + { + auto sign = input::key::is_pressed(k.sign); + if (input::key::is_scancode(k.sign)) + { + push_scode(sign, temp, code); + } + else if (input::key::is_cluster(k.sign)) + { + push_cluster(sign, temp, k.utf8); + break; + } + else + { + push_keyid(sign, temp, code); + } + } + else + { + temp.clear(); + break; + } + bits >>= 1; + } + if (temp.size()) crop.push_back(temp); + temp.clear(); } + return crop; } - return text{}; - } - }; + }; + } namespace bindings { From fb6b2cb9a766febed137218c0b1e0188914b4c14 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 5 Jun 2026 04:01:25 +0500 Subject: [PATCH 09/71] #943 WIP: KKP support (try to fix QWERTZ, AZERTY, Dvorak, BEPO) --- src/netxs/desktopio/input.hpp | 175 ++++++++++++++++++++++++++++++++- src/netxs/desktopio/system.hpp | 33 +++++-- 2 files changed, 198 insertions(+), 10 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 82af9ca380..41b5757be3 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -80,7 +80,6 @@ namespace netxs::input //todo check non-us kb layouts with key::Slash // Notes: - // IsoLevel3Shift: It is effectively AltGR. // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. #define key_list \ @@ -101,7 +100,7 @@ namespace netxs::input X(14, 0x90, 0x90, 0x45, 0, 0x0000'00'FF, 0, NumLock , "NumLock" , 57360, 'u', -1 , -1 )\ X(16, 0x14, 0x14, 0x3A, 0, 0x0100'00'FF, 0, CapsLock , "CapsLock" , 57358, 'u', -1 , -1 )\ X(18, 0x91, 0x91, 0x45, 0, 0x0100'00'FF, 0, ScrollLock , "ScrollLock" , 57359, 'u', -1 , -1 )\ - X(20, 0x14, 0x14, 0x3A, ExtendedKey, 0x0100'00'FF, 0, IsoLevel3Shift , "IsoLevel3Shift" , 57453, 'u', -1 , -1 )\ + X(20, 0x14, 0x14, 0x3A, ExtendedKey, 0x0100'00'FF, 0, AltGR , "AltGr" , 57453, 'u', -1 , -1 )/*IsoLevel3Shift*/\ X(22, 0x91, 0x91, 0x45, ExtendedKey, 0x0100'00'FF, 0, IsoLevel5Shift , "IsoLevel5Shift" , 57454, 'u', -1 , -1 )\ X(24, 0x1B, 0x1B, 0x01, 0, 0x0000'00'FF, 1, Esc , "Esc" , 27 , 'u', '\x1b', '\x1b')\ X(26, 0x20, 0x20, 0x39, 0, 0x0000'00'FF, 1, Space , "Space" , 32 , 'u', '\x20', '\0' )\ @@ -2046,12 +2045,17 @@ namespace netxs::input //else if (is_released) log("\tkeyid=%% released", input::key::map::data(keyid).name); return is_released; }); + auto valid_codepoint = [](view utf8) + { + auto codepoint = utf::to_code(utf8); + return codepoint > 0 && (codepoint < 57358 || codepoint > 57454); + }; auto sign = !!k.keystat; auto shift_state = k.ctlstat & hids::anyShift; auto altgr_state = k.ctlstat & hids::AltGr; auto has_cluster = k.cluster.size() && k.cluster.front(); - auto has_unshift = k.unshift.size() && k.unshift.front() && !altgr_state && !shift_state; - auto has_shifted = k.shifted.size() && k.shifted.front() && !altgr_state && shift_state; + auto has_unshift = k.unshift.size() && valid_codepoint(k.unshift) && !altgr_state && !shift_state; + auto has_shifted = k.shifted.size() && valid_codepoint(k.shifted) && !altgr_state && shift_state; if (has_cluster || has_unshift || has_shifted) // Try to keep national key names. { k.chchord = k.vkchord; // The main part of the chchord is the same as in vkchord. @@ -2314,6 +2318,169 @@ namespace netxs::input return crop; } }; + struct layout + { + static constexpr auto _counter = __COUNTER__ + 1; + static constexpr auto undef = __COUNTER__ - _counter; + static constexpr auto qwerty = __COUNTER__ - _counter; + static constexpr auto qwertz = __COUNTER__ - _counter; + static constexpr auto azerty = __COUNTER__ - _counter; + static constexpr auto dvorak = __COUNTER__ - _counter; + static constexpr auto bepo = __COUNTER__ - _counter; + }; + //todo use lut + auto detect_layout(si32 unshift, si32 base) + { + // QWERTY: + if (unshift == base) + { + if ((unshift >= 'a' && unshift <= 'z') || unshift == ',' || unshift == '.') + { + if (unshift != 'a' && unshift != 'm' && unshift != 'u' + && unshift != 'i' && unshift != 'o' && unshift != 'p' + && unshift != 'h' && unshift != 'j' && unshift != 'k' && unshift != 'l') + { + return layout::qwerty; + } + } + } + //if (unshift == 'q' && base == 'q') return layout::qwerty; + //if (unshift == 'w' && base == 'w') return layout::qwerty; + //if (unshift == 'y' && base == 'y') return layout::qwerty; + //if (unshift == 'z' && base == 'z') return layout::qwerty; + //if (unshift == ',' && base == ',') return layout::qwerty; + //if (unshift == '.' && base == '.') return layout::qwerty; + // QWERTZ: + if (unshift == 'z' && base == 'y') return layout::qwertz; + if (unshift == 'y' && base == 'z') return layout::qwertz; + // AZERTY: + if (unshift == 'a' && base == 'q') return layout::azerty; + if (unshift == 'q' && base == 'a') return layout::azerty; + if (unshift == 'w' && base == 'z') return layout::azerty; + if (unshift == 'z' && base == 'w') return layout::azerty; + if (unshift == 'm' && base == ';') return layout::azerty; + // DVORAK: + if (unshift == ',' && base == 'w') return layout::dvorak; + if (unshift == '.' && base == 'e') return layout::dvorak; + if (unshift == 'p' && base == 'r') return layout::dvorak; + if (unshift == 'o' && base == 's') return layout::dvorak; + if (unshift == 'e' && base == 'd') return layout::dvorak; + if (unshift == 'u' && base == 'f') return layout::dvorak; + if (unshift == 'i' && base == 'g') return layout::dvorak; + if (unshift == 'd' && base == 'h') return layout::dvorak; + // BEPO: + if (unshift == 'w' && base == ']') return layout::bepo; + if (unshift == 'v' && base == 'k') return layout::bepo; + if (unshift == 'p' && base == 'l') return layout::bepo; + if (unshift == 'o' && base == 'r') return layout::bepo; + if (unshift == 'u' && base == 'i') return layout::bepo; + if (unshift == 'b' && base == 'q') return layout::bepo; + if (unshift == 'i' && base == 'd') return layout::bepo; + return layout::undef; + } + void remap_bepo(si32& base) + { + switch (base) + { + // Digit row (punctuation.) + case '1': base = '"'; break; + case '2': base = 171; break; // « + case '3': base = 187; break; // » + case '4': base = '('; break; + case '5': base = ')'; break; + case '6': base = '@'; break; + case '7': base = '+'; break; + case '8': base = '-'; break; + case '9': base = '/'; break; + case '0': base = '*'; break; + case '-': base = '='; break; + case '=': base = '%'; break; + // Top row + case 'q': base = 'b'; break; + case 'w': base = 233; break; // é + case 'e': base = 'p'; break; + case 'r': base = 'o'; break; + case 't': base = 232; break; // è + case 'y': base = '!'; break; + case 'u': base = 'v'; break; + case 'i': base = 'd'; break; + case 'o': base = 'l'; break; + case 'p': base = 'j'; break; + case '[': base = 'z'; break; + case ']': base = 'w'; break; + // Home Row + //case 'a': base = 'a'; break; // same + case 's': base = 'u'; break; + case 'd': base = 'i'; break; + case 'f': base = 'e'; break; + case 'g': base = ','; break; + case 'h': base = 't'; break; + case 'j': base = 's'; break; + case 'k': base = 'r'; break; + case 'l': base = 'n'; break; + case ';': base = 'm'; break; + case '\'': base = 231; break; // ç (ANSI) + case '\\': base = 231; break; // ç (ISO) + // Bottom row + case 'z': base = 234; break; // ê + case 'x': base = 224; break; // à + case 'c': base = 'y'; break; + case 'v': base = 'x'; break; + case 'b': base = 'k'; break; + case 'n': base = '\''; break; + case 'm': base = 'q'; break; + case ',': base = 'g'; break; + case '.': base = 'h'; break; + case '/': base = 'f'; break; + default: break; + } + } + void remap_dvorak(si32& base) + { + switch (base) + { + // Digits + case '-': base = '['; break; + case '=': base = ']'; break; + // Top + case 'q': base = '\''; break; + case 'w': base = ','; break; + case 'e': base = '.'; break; + case 'r': base = 'p'; break; + case 't': base = 'y'; break; + case 'y': base = 'f'; break; + case 'u': base = 'g'; break; + case 'i': base = 'c'; break; + case 'o': base = 'r'; break; + case 'p': base = 'l'; break; + case '[': base = '/'; break; + case ']': base = '='; break; + // Home Row + //case 'a': base = 'a'; break; // same + case 's': base = 'o'; break; + case 'd': base = 'e'; break; + case 'f': base = 'u'; break; + case 'g': base = 'i'; break; + case 'h': base = 'd'; break; + case 'j': base = 'h'; break; + case 'k': base = 't'; break; + case 'l': base = 'n'; break; + case ';': base = 's'; break; + case '\'': base = '-'; break; + // Bottom row + case 'z': base = ';'; break; + case 'x': base = 'q'; break; + case 'c': base = 'j'; break; + case 'v': base = 'k'; break; + case 'b': base = 'x'; break; + case 'n': base = 'b'; break; + //case 'm': base = 'm'; break; // same + case ',': base = 'w'; break; + case '.': base = 'v'; break; + case '/': base = 'z'; break; + default: break; + } + } } namespace bindings diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 72db5ac2f3..d7d8d837ac 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -6055,6 +6055,7 @@ namespace netxs::os std::swap(k.scancod, scancod); } }; + auto current_layout = input::key::layout::undef; auto detect_kkp = [&](qiew sequence) { // ESC [ unshift_code:shifted_code:base_key ; ctlstat:evtype ; codepoints suffix @@ -6073,12 +6074,32 @@ namespace netxs::os auto evtype = q.subarg(1); auto codepoint = q(0); - if (unshift_code >= 'a' && unshift_code <= 'z') // Fix for custom kb layouts (QWERTZ, AZERTY, Dvorak, etc). - { - if (unshift_code != base_key) - { - base_key = unshift_code; - } + // Fix for custom kb layouts (QWERTZ, AZERTY, Dvorak, BEPO). + auto detected = input::key::detect_layout(unshift_code, base_key); + if (detected != input::key::layout::undef) + { + current_layout = detected; + } + switch (current_layout) + { + case input::key::layout::undef: + case input::key::layout::qwerty: + break; + case input::key::layout::qwertz: + if (base_key == 'y') base_key = 'z'; + else if (base_key == 'z') base_key = 'y'; + break; + case input::key::layout::azerty: + if (base_key == 'q') base_key = 'a'; + else if (base_key == 'a') base_key = 'q'; + else if (base_key == 'z') base_key = 'w'; + break; + case input::key::layout::dvorak: + input::key::remap_dvorak(base_key); + break; + case input::key::layout::bepo: + input::key::remap_bepo(base_key); + break; } k.cluster = {}; From b5d735b7f6a768075ffb88b81a1819ca2021e3c5 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 5 Jun 2026 04:24:09 +0500 Subject: [PATCH 10/71] #943 WIP: KKP support (try to fix QWERTZ, AZERTY, Dvorak, BEPO) --- src/netxs/desktopio/input.hpp | 46 +++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 41b5757be3..402b22e70e 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -2334,7 +2334,8 @@ namespace netxs::input // QWERTY: if (unshift == base) { - if ((unshift >= 'a' && unshift <= 'z') || unshift == ',' || unshift == '.') + if ((unshift >= 'a' && unshift <= 'z') || unshift == ',' || unshift == '.' || unshift == '-' + || (unshift >= '1' && unshift <= '9')) { if (unshift != 'a' && unshift != 'm' && unshift != 'u' && unshift != 'i' && unshift != 'o' && unshift != 'p' @@ -2359,6 +2360,16 @@ namespace netxs::input if (unshift == 'w' && base == 'z') return layout::azerty; if (unshift == 'z' && base == 'w') return layout::azerty; if (unshift == 'm' && base == ';') return layout::azerty; + if (unshift == '&' && base == '1') return layout::azerty; + if (unshift == 233 && base == '2') return layout::azerty; // é + if (unshift == '"' && base == '3') return layout::azerty; + if (unshift =='\'' && base == '4') return layout::azerty; + if (unshift == '(' && base == '5') return layout::azerty; + if (unshift == '-' && base == '6') return layout::azerty; + if (unshift == 232 && base == '7') return layout::azerty; // è + if (unshift == '_' && base == '8') return layout::azerty; + if (unshift == 231 && base == '9') return layout::azerty; // ç + if (unshift == 224 && base == '0') return layout::azerty; // à // DVORAK: if (unshift == ',' && base == 'w') return layout::dvorak; if (unshift == '.' && base == 'e') return layout::dvorak; @@ -2369,13 +2380,32 @@ namespace netxs::input if (unshift == 'i' && base == 'g') return layout::dvorak; if (unshift == 'd' && base == 'h') return layout::dvorak; // BEPO: - if (unshift == 'w' && base == ']') return layout::bepo; - if (unshift == 'v' && base == 'k') return layout::bepo; - if (unshift == 'p' && base == 'l') return layout::bepo; - if (unshift == 'o' && base == 'r') return layout::bepo; - if (unshift == 'u' && base == 'i') return layout::bepo; - if (unshift == 'b' && base == 'q') return layout::bepo; - if (unshift == 'i' && base == 'd') return layout::bepo; + if (unshift == '"' && base == '1') return layout::bepo; + if (unshift == 171 && base == '2') return layout::bepo; // « + if (unshift == 187 && base == '3') return layout::bepo; // » + if (unshift == '(' && base == '4') return layout::bepo; + if (unshift == ')' && base == '5') return layout::bepo; + if (unshift == '@' && base == '6') return layout::bepo; + if (unshift == '+' && base == '7') return layout::bepo; + if (unshift == '-' && base == '8') return layout::bepo; + if (unshift == '/' && base == '9') return layout::bepo; + if (unshift == '*' && base == '0') return layout::bepo; + if (unshift == '=' && base == '-') return layout::bepo; + if (unshift == '%' && base == '=') return layout::bepo; + if (unshift == 'w' && base == ']') return layout::bepo; // ']' -> 'w' + if (unshift == 'b' && base == 'q') return layout::bepo; // 'Q' -> 'b' + if (unshift == 233 && base == 'w') return layout::bepo; // 'W' -> 'é' + if (unshift == 'p' && base == 'e') return layout::bepo; // 'E' -> 'p' + if (unshift == 'o' && base == 'r') return layout::bepo; // 'R' -> 'o' + if (unshift == 232 && base == 't') return layout::bepo; // 'T' -> 'è' + if (unshift == 'v' && base == 'u') return layout::bepo; // 'U' -> 'v' + if (unshift == 'u' && base == 'i') return layout::bepo; // 'I' -> 'u' + if (unshift == 'i' && base == 'd') return layout::bepo; // 'D' -> 'i' + if (unshift == 234 && base == 'z') return layout::bepo; // 'Z' -> 'ê' + if (unshift == 224 && base == 'x') return layout::bepo; // 'X' -> 'à' + if (unshift == 'y' && base == 'c') return layout::bepo; // 'C' -> 'y' + if (unshift == 'x' && base == 'v') return layout::bepo; // 'V' -> 'x' + if (unshift == 'k' && base == 'b') return layout::bepo; // 'B' -> 'k' return layout::undef; } void remap_bepo(si32& base) From e7f7afeb07c5852e8e448ca18e8006a43f9ebd63 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 5 Jun 2026 22:36:48 +0500 Subject: [PATCH 11/71] #943 WIP: KKP support (track kb layout + expand the key set with physical keys of existing Latin-based layouts) --- src/netxs/desktopio/consrv.hpp | 12 +- src/netxs/desktopio/directvt.hpp | 1 + src/netxs/desktopio/gui.hpp | 32 +- src/netxs/desktopio/input.hpp | 502 ++++++++++++++++++------------- src/netxs/desktopio/system.hpp | 14 +- 5 files changed, 339 insertions(+), 222 deletions(-) diff --git a/src/netxs/desktopio/consrv.hpp b/src/netxs/desktopio/consrv.hpp index 25c80ee608..4beac8d3a0 100644 --- a/src/netxs/desktopio/consrv.hpp +++ b/src/netxs/desktopio/consrv.hpp @@ -546,6 +546,7 @@ struct impl : consrv hist inputs; // evnt: Input history per process name storage. mbtn dclick; // evnt: Mouse double-click tracker. si32 mstate; // evnt: Mouse button last state. + si32 layout; // evnt: Current keyboard layout id. evnt(impl& serv) : server{ serv }, @@ -554,7 +555,8 @@ struct impl : consrv leader{ }, ctrl_c{ faux }, fstate{ true }, - mstate{ } + mstate{ }, + layout{ } { } auto& ref_history(text& exe) @@ -1088,6 +1090,14 @@ struct impl : consrv void keybd(input::hids& gear, bool decckm) { auto lock = std::lock_guard{ locker }; + + if (gear.xlayout != layout) // Sync kb layout. + { + layout = gear.xlayout; + auto data = nt::console::layout_input{ .klid = layout }; + stream.emplace_back(*reinterpret_cast(&data)); + } + toWIDE.clear(); utf::to_utf(gear.cluster, toWIDE); if (toWIDE.empty()) toWIDE.push_back(0); diff --git a/src/netxs/desktopio/directvt.hpp b/src/netxs/desktopio/directvt.hpp index 88be708835..0db1ba36dc 100644 --- a/src/netxs/desktopio/directvt.hpp +++ b/src/netxs/desktopio/directvt.hpp @@ -1037,6 +1037,7 @@ namespace netxs::directvt (si32, scancod) // syskeybd: Scancode. (si32, keystat) // syskeybd: Key state: unknown, pressed, repeated, released. (si32, keycode) // syskeybd: Key id. + (si32, xlayout) // syskeybd: Keyboard layout ID (KLID). (byte, payload) // syskeybd: Payload type. (bool, extflag) // syskeybd: Win32 extflag. (bool, handled) // syskeybd: Key event is handled. diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index ee06f6f494..4740099460 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3514,6 +3514,7 @@ namespace netxs::gui bool fake_ctrl; // winbase: Fake ctrl key event on AltGr press/release (non-US kb layouts). bool wait_ralt; // winbase: Wait RightAlt right after the fake LeftCtrl. si32 last_deadkey_vkey = {}; // winbase: Virtual code for deadkey tracking. + si32 xlayout; // winbase: Current keyboard layout (KLID). winbase(auth& indexer, cfg_t& config, twod grip_cell) : base{ indexer }, @@ -3546,7 +3547,8 @@ namespace netxs::gui wdelta{ 24.f }, stream{ *this, *os::dtvt::client }, fake_ctrl{ faux }, - wait_ralt{ faux } + wait_ralt{ faux }, + xlayout{ input::key::klid::k00000409 } { } virtual bool layer_create(layer& s, winbase* host_ptr = nullptr, twod win_coord = {}, twod grid_size = {}, dent border_dent = {}, twod cell_size = {}) = 0; @@ -3559,7 +3561,7 @@ namespace netxs::gui virtual void keybd_sync_state(si32 virtcod = 0) = 0; virtual void keybd_sync_layout() = 0; - virtual void keybd_peek_layout(si32 virtcod, si32 scancod, si32 cs, text& shifted, text& unshift) = 0; + virtual void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) = 0; virtual void keybd_read_vkstat() = 0; virtual void keybd_wipe_vkstat() = 0; virtual bool keybd_read_input() = 0; @@ -4694,12 +4696,13 @@ namespace netxs::gui gear.extflag = extflag; gear.virtcod = virtcod; gear.scancod = scancod; - auto keycode = input::key::xlat(virtcod, scancod, cs); + auto keycode = input::key::xlat(virtcod, scancod, cs, xlayout); if ((gear.keystat == input::key::released || keycode != gear.keycode) && keystat == input::key::repeated) keystat = input::key::pressed; // LeftMod+RightMod press is treated by the OS as a repeated LeftMod. gear.keystat = keystat; gear.keycode = keycode; + gear.xlayout = xlayout; gear.cluster = cluster; - keybd_peek_layout(virtcod, scancod, cs, gear.shifted, gear.unshift); + keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); if constexpr (debugmode) log("shifted='%%' unshift='%%'", gear.shifted, gear.unshift); auto repeat_ctrl = keystat == input::key::repeated && (virtcod == vkey::shift || virtcod == vkey::control || virtcod == vkey::alt || virtcod == vkey::capslock || virtcod == vkey::numlock || virtcod == vkey::scrllock @@ -5547,7 +5550,7 @@ namespace netxs::gui ::EndDeferWindowPos(lock); } //todo static - void keybd_peek_layout(si32 virtcod, si32 scancod, si32 cs, text& shifted, text& unshift) + void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) { shifted.clear(); unshift.clear(); @@ -5555,7 +5558,7 @@ namespace netxs::gui { auto buf = wide(8, 0); auto current_layout = ::GetKeyboardLayout(0); - auto flags = cs & input::key::ExtendedKey ? 1u : 0u; + auto flags = extflag ? 1u : 0u; flags |= 2; // 2 PDT_SHAREABLE (don't touch our thread state). auto vk_un = std::array{}; auto rc = ::ToUnicodeEx(virtcod, scancod, vk_un.data(), buf.data(), 8, flags, current_layout); @@ -5773,11 +5776,15 @@ namespace netxs::gui void keybd_sync_layout() { keybd_sync_state(); - //todo sync kb layout - //auto hkl = ::GetKeyboardLayout(0); - auto kblayout = wide(KL_NAMELENGTH, '\0'); - ::GetKeyboardLayoutNameW(kblayout.data()); - log("%%Keyboard layout changed to ", prompt::gui, utf::to_utf(kblayout));//, " lo(hkl),langid=", lo((arch)hkl), " hi(hkl),handle=", hi((arch)hkl)); + auto klid_buf = wide(KL_NAMELENGTH, '\0'); + ::GetKeyboardLayoutNameW(klid_buf.data()); + xlayout = 0; + for(auto i = 0; i < 8; ++i) + { + xlayout = (xlayout << 4) | (klid_buf[i] >= 'a' ? klid_buf[i] - 'a' + 10 : + klid_buf[i] >= 'A' ? klid_buf[i] - 'A' + 10 : klid_buf[i] - '0'); + } + log("%%Keyboard layout changed to ", prompt::gui, utf::to_hex_0x(xlayout)); } void window_make_focused() { restore_if_minimized(); ::SetFocus((HWND)master.hWnd); } // Calls WM_KILLFOCOS(prev) + WM_ACTIVATEAPP(next) + WM_SETFOCUS(next). void window_make_exposed() { ::SetWindowPos((HWND)master.hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOACTIVATE); } @@ -5891,6 +5898,7 @@ namespace netxs::gui ::AddClipboardFormatListener((HWND)master.hWnd); // It posts WM_CLIPBOARDUPDATE to sync clipboard anyway. sync_clipboard(); // Clipboard should be in sync at (before) startup. window_make_foreground(); + keybd_sync_layout(); // Sync keyboad layout id. } //todo static @@ -6099,7 +6107,7 @@ namespace netxs::gui void keybd_read_vkstat() {} void keybd_send_block(view /*block*/) {} void keybd_sync_layout() {} - void keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, si32 /*cs*/, text& /*shifted*/, text& /*unshift*/) {} + void keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, bool /*extflag*/, text& /*shifted*/, text& /*unshift*/) {} void keybd_sync_state(si32 /*virtcod*/) {} bool layer_create(layer& /*s*/, winbase* /*host_ptr*/ = nullptr, twod /*win_coord*/ = {}, twod /*grid_size*/ = {}, dent /*border_dent*/ = {}, twod /*cell_size*/ = {}) { return true; } void layer_move_all() {} diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 402b22e70e..116178f5ff 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -63,8 +63,8 @@ namespace netxs::input namespace key { - static constexpr auto ExtendedKey = 0x0100; - static constexpr auto NumLockMode = 0x0020; + static constexpr auto ExtendedKey = 0x0100; // ENHANCED_KEY + static constexpr auto NumLockMode = 0x0020; // NUMLOCK_ON static constexpr auto _counter = __COUNTER__ + 1; static constexpr auto released = __COUNTER__ - _counter; @@ -78,205 +78,300 @@ namespace netxs::input static constexpr auto cluster_sign = 0x20; static constexpr auto mouse_sign = 0x10; - //todo check non-us kb layouts with key::Slash + struct layout + { + static constexpr auto _counter = __COUNTER__ + 1; + static constexpr auto undef = __COUNTER__ - _counter; + static constexpr auto qwerty = __COUNTER__ - _counter; + static constexpr auto qwertz = __COUNTER__ - _counter; + static constexpr auto azerty = __COUNTER__ - _counter; + static constexpr auto dvorak = __COUNTER__ - _counter; + static constexpr auto colemak = __COUNTER__ - _counter; + static constexpr auto bepo = __COUNTER__ - _counter; + }; + + struct klid // Latin-based Keyboard Layouts (20 klids). + { + static constexpr auto k00000409 = 0x00000409; // English (US) | United States Standard | `qwerty` + static constexpr auto k00000407 = 0x00000407; // German (Germany) | Germany Standard | `qwertz` + static constexpr auto k00010407 = 0x00010407; // German (Germany) | Germany (IBM) | `qwertz` + static constexpr auto k00000C07 = 0x00000C07; // German (Austria) | Austrian Standard | `qwertz` + static constexpr auto k0000040C = 0x0000040C; // French (France) | France Standard | `azerty` + static constexpr auto k0000080C = 0x0000080C; // French (Belgium) | Belgian Standard | `azerty` + static constexpr auto k0005040C = 0x0005040C; // French (France) | French BÉPO Layout | `bepo` + static constexpr auto k00010409 = 0x00010409; // English (US) | United States-Dvorak | `dvorak` + static constexpr auto k00020409 = 0x00020409; // English (US) | United States-Dvorak (Left hand) | `dvorak` + static constexpr auto k00030409 = 0x00030409; // English (US) | United States-Dvorak (Right hand) | `dvorak` + static constexpr auto k00060409 = 0x00060409; // English (US) | Colemak NATIVE (Win 11 24H2+) | `colemak` + static constexpr auto k00000405 = 0x00000405; // Czech (Czechia) | Czech QWERTZ | `qwertz` + static constexpr auto k00010405 = 0x00010405; // Czech (Czechia) | Czech QWERTY | `qwerty` + static constexpr auto k0000041B = 0x0000041B; // Slovak (Slovakia) | Slovak QWERTZ | `qwertz` + static constexpr auto k0001041B = 0x0001041B; // Slovak (Slovakia) | Slovak QWERTY | `qwerty` + static constexpr auto k0000040E = 0x0000040E; // Hungarian (Hungary) | Hungarian Standard | `qwertz` + static constexpr auto k0000041A = 0x0000041A; // Croatian | Croatian Standard (South Slavic) | `qwertz` + static constexpr auto k00000424 = 0x00000424; // Slovenian | Slovenian Standard (South Slavic) | `qwertz` + static constexpr auto k00000415 = 0x00000415; // Polish (Poland) | Polish (Programmers) | `qwerty` + static constexpr auto k00000418 = 0x00000418; // Romanian | Romanian Standard | `qwertz` + }; + auto get_layout_type(si32 klid) + { + if (klid == 0x00000409 || klid == 0) return layout::qwerty; + if (klid == 0x00010409) return layout::dvorak; // US Dvorak Standard + if (klid == 0x00020409) return layout::dvorak; // US Dvorak Left-Hand + if (klid == 0x00030409) return layout::dvorak; // US Dvorak Right-Hand + if (klid == 0x00000419) return layout::undef; + if (klid == 0x00000405 || klid == 0x00010405) return layout::qwertz; // Czech + if (klid == 0x00000407 || klid == 0x00010407) return layout::qwertz; // German (Austria) + if (klid == 0x0000040c || klid == 0x0000080c) return layout::azerty; // French (Belgium) + if (klid == 0x0005040c) return layout::bepo; // French BEPO + if (klid == 0x0000040e) return layout::qwertz; // Hungarian + if (klid == 0x0000041a) return layout::qwertz; // Croatian + if (klid == 0x0000041b) return layout::qwertz; // Slovak + return layout::qwerty; + } + // Notes: // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. #define key_list \ - /*Id Index Vkey Scan CtrlState Mask I Name GenericName KKP base,suffix,ascii,control */\ - X(0, 0, 0, 0, 0, 0x0000'00'FF, 1, undef , "undef" , 0 , 'u', -1 , -1 )\ - X(1, 0, 0xFF, 0xFF, 0, 0x0100'FF'FF, 0, config , "config" , 0 , 'u', -1 , -1 )\ - X(2, 0xA2, 0x11, 0x1D, 0, 0x0100'00'FF, 0, LeftCtrl , "Ctrl" , 57442, 'u', -1 , -1 )\ - X( 3, 0xA3, 0x11, 0x1D, ExtendedKey, 0x0100'00'FF, 0, RightCtrl , "Ctrl" , 57448, 'u', -1 , -1 )\ - X(4, 0xA4, 0x12, 0x38, 0, 0x0100'00'FF, 0, LeftAlt , "Alt" , 57443, 'u', -1 , -1 )\ - X( 5, 0xA5, 0x12, 0x38, ExtendedKey, 0x0100'00'FF, 0, RightAlt , "Alt" , 57449, 'u', -1 , -1 )\ - X(6, 0xA0, 0x10, 0x2A, 0, 0x0000'FF'FF, 0, LeftShift , "Shift" , 57441, 'u', -1 , -1 )\ - X( 7, 0xA1, 0x10, 0x36, 0, 0x0000'FF'FF, 0, RightShift , "Shift" , 57447, 'u', -1 , -1 )\ - X(8, 0x5B, 0x5B, 0x5B, ExtendedKey, 0x0100'00'FF, 0, LeftWin , "Win" , 57444, 'u', -1 , -1 )\ - X( 9, 0x5C, 0x5C, 0x5C, ExtendedKey, 0x0100'00'FF, 0, RightWin , "Win" , 57450, 'u', -1 , -1 )\ - X(10, 0x5B, 0x5B, 0x5B, 0, 0x0100'00'FF, 0, LeftHyper , "Hyper" , 57445, 'u', -1 , -1 )\ - X( 11, 0x5C, 0x5C, 0x5C, 0, 0x0100'00'FF, 0, RightHyper , "Hyper" , 57451, 'u', -1 , -1 )\ - X(12, 0x5D, 0x5D, 0x5D, ExtendedKey, 0x0000'00'FF, 0, Apps , "Apps" , 57363, 'u', -1 , -1 )\ - X(14, 0x90, 0x90, 0x45, 0, 0x0000'00'FF, 0, NumLock , "NumLock" , 57360, 'u', -1 , -1 )\ - X(16, 0x14, 0x14, 0x3A, 0, 0x0100'00'FF, 0, CapsLock , "CapsLock" , 57358, 'u', -1 , -1 )\ - X(18, 0x91, 0x91, 0x45, 0, 0x0100'00'FF, 0, ScrollLock , "ScrollLock" , 57359, 'u', -1 , -1 )\ - X(20, 0x14, 0x14, 0x3A, ExtendedKey, 0x0100'00'FF, 0, AltGR , "AltGr" , 57453, 'u', -1 , -1 )/*IsoLevel3Shift*/\ - X(22, 0x91, 0x91, 0x45, ExtendedKey, 0x0100'00'FF, 0, IsoLevel5Shift , "IsoLevel5Shift" , 57454, 'u', -1 , -1 )\ - X(24, 0x1B, 0x1B, 0x01, 0, 0x0000'00'FF, 1, Esc , "Esc" , 27 , 'u', '\x1b', '\x1b')\ - X(26, 0x20, 0x20, 0x39, 0, 0x0000'00'FF, 1, Space , "Space" , 32 , 'u', '\x20', '\0' )\ - X(28, 0x08, 0x08, 0x0E, 0, 0x0000'00'FF, 1, Backspace , "Backspace" , 127 , 'u', '\x7f', '\x08')\ - X(30, 0x09, 0x09, 0x0F, 0, 0x0000'00'FF, 1, Tab , "Tab" , 9 , 'u', '\x09', '\x09')\ - X(32, 0x03, 0x03, 0x46, 0, 0x0000'FF'FF, 1, Break , "Break" , 0 , 'u', '\x1a', '\x03')\ - X(34, 0x13, 0x13, 0x45, 0, 0x0000'FF'FF, 0, Pause , "Pause" , 57362, 'u', '\x1a', '\x03')\ - X(36, 0x29, 0x29, 0, 0, 0x0000'00'FF, 0, Select , "Select" , 0 , 'u', -1 , -1 )\ - X(38, 0x2C, 0x2C, 0x54, 0, 0x0000'FF'FF, 1, SysRq , "SysRq" , 0 , 'u', -1 , '\x03')\ - X(40, 0x2C, 0x2C, 0x37, ExtendedKey, 0x0100'FF'FF, 0, PrintScreen , "PrintScreen" , 57361, 'u', -1 , -1 )\ - X(42, 0x0D, 0x0D, 0x1C, 0, 0x0100'00'FF, 1, KeyEnter , "Enter" , 13 , 'u', '\x0d', '\x0a')\ - X( 43, 0x0D, 0x0D, 0x1C, ExtendedKey, 0x0100'00'FF, 1, NumpadEnter , "Enter" , 57414, 'u', '\x0d', '\x0a')\ - X(44, 0x21, 0x21, 0x49, ExtendedKey, 0x0100'00'FF, 1, KeyPageUp , "PageUp" , 5 , '~', -1 , -1 )\ - X( 45, 0x21, 0x21, 0x49, 0, 0x0100'00'FF, 1, NumpadPageUp , "PageUp" , 57421, 'u', -1 , -1 )\ - X(46, 0x22, 0x22, 0x51, ExtendedKey, 0x0100'00'FF, 1, KeyPageDown , "PageDown" , 6 , '~', -1 , -1 )\ - X( 47, 0x22, 0x22, 0x51, 0, 0x0100'00'FF, 1, NumpadPageDown , "PageDown" , 57422, 'u', -1 , -1 )\ - X(48, 0x23, 0x23, 0x4F, ExtendedKey, 0x0100'00'FF, 1, KeyEnd , "End" , 8 , '~', -1 , -1 )/*don't reorder*/\ - X( 49, 0x23, 0x23, 0x4F, 0, 0x0100'00'FF, 1, NumpadEnd , "End" , 57424, 'u', -1 , -1 )/*don't reorder*/\ - X(50, 0x24, 0x24, 0x47, ExtendedKey, 0x0100'00'FF, 1, KeyHome , "Home" , 7 , '~', -1 , -1 )/*don't reorder*/\ - X( 51, 0x24, 0x24, 0x47, 0, 0x0100'00'FF, 1, NumpadHome , "Home" , 57423, 'u', -1 , -1 )/*don't reorder*/\ - X(52, 0x25, 0x25, 0x4B, ExtendedKey, 0x0100'00'FF, 1, KeyLeftArrow , "LeftArrow" , 1 , 'D', -1 , -1 )/*don't reorder*/\ - X( 53, 0x25, 0x25, 0x4B, 0, 0x0100'00'FF, 1, NumpadLeftArrow , "LeftArrow" , 57417, 'u', -1 , -1 )/*don't reorder*/\ - X(54, 0x26, 0x26, 0x48, ExtendedKey, 0x0100'00'FF, 1, KeyUpArrow , "UpArrow" , 1 , 'A', -1 , -1 )/*don't reorder*/\ - X( 55, 0x26, 0x26, 0x48, 0, 0x0100'00'FF, 1, NumpadUpArrow , "UpArrow" , 57419, 'u', -1 , -1 )/*don't reorder*/\ - X(56, 0x27, 0x27, 0x4D, ExtendedKey, 0x0100'00'FF, 1, KeyRightArrow , "RightArrow" , 1 , 'C', -1 , -1 )/*don't reorder*/\ - X( 57, 0x27, 0x27, 0x4D, 0, 0x0100'00'FF, 1, NumpadRightArrow, "RightArrow" , 57418, 'u', -1 , -1 )/*don't reorder*/\ - X(58, 0x28, 0x28, 0x50, ExtendedKey, 0x0100'00'FF, 1, KeyDownArrow , "DownArrow" , 1 , 'B', -1 , -1 )/*don't reorder*/\ - X( 59, 0x28, 0x28, 0x50, 0, 0x0100'00'FF, 1, NumpadDownArrow , "DownArrow" , 57420, 'u', -1 , -1 )/*don't reorder*/\ - X(60, 0x30, 0x30, 0x0B, 0, 0x0000'FF'FF, 1, Key0 , "0" , 48 , 'u', '0' , '0' )\ - X( 61, 0x60, 0x60, 0x52, NumLockMode, 0x0000'FF'FF, 1, Numpad0 , "0" , 57399, 'u', '0' , '0' )\ - X(62, 0x31, 0x31, 0x02, 0, 0x0000'FF'FF, 1, Key1 , "1" , 49 , 'u', '1' , '1' )\ - X( 63, 0x61, 0x61, 0x4F, NumLockMode, 0x0000'FF'FF, 1, Numpad1 , "1" , 57400, 'u', '1' , '1' )\ - X(64, 0x32, 0x32, 0x03, 0, 0x0000'FF'FF, 1, Key2 , "2" , 50 , 'u', '2' , '\0' )\ - X( 65, 0x62, 0x62, 0x50, NumLockMode, 0x0000'FF'FF, 1, Numpad2 , "2" , 57401, 'u', '2' , '\0' )\ - X(66, 0x33, 0x33, 0x04, 0, 0x0000'FF'FF, 1, Key3 , "3" , 51 , 'u', '3' , '\x1b')\ - X( 67, 0x63, 0x63, 0x51, NumLockMode, 0x0000'FF'FF, 1, Numpad3 , "3" , 57402, 'u', '3' , '\x1b')\ - X(68, 0x34, 0x34, 0x05, 0, 0x0000'FF'FF, 1, Key4 , "4" , 52 , 'u', '4' , '\x1c')\ - X( 69, 0x64, 0x64, 0x4B, NumLockMode, 0x0000'FF'FF, 1, Numpad4 , "4" , 57403, 'u', '4' , '\x1c')\ - X(70, 0x35, 0x35, 0x06, 0, 0x0000'FF'FF, 1, Key5 , "5" , 53 , 'u', '5' , '\x1d')\ - X( 71, 0x65, 0x65, 0x4C, NumLockMode, 0x0000'FF'FF, 1, Numpad5 , "5" , 57404, 'u', '5' , '\x1d')\ - X(72, 0x36, 0x36, 0x07, 0, 0x0000'FF'FF, 1, Key6 , "6" , 54 , 'u', '6' , '\x1e')\ - X( 73, 0x66, 0x66, 0x4D, NumLockMode, 0x0000'FF'FF, 1, Numpad6 , "6" , 57405, 'u', '6' , '\x1e')\ - X(74, 0x37, 0x37, 0x08, 0, 0x0000'FF'FF, 1, Key7 , "7" , 55 , 'u', '7' , '\x1f')\ - X( 75, 0x67, 0x67, 0x47, NumLockMode, 0x0000'FF'FF, 1, Numpad7 , "7" , 57406, 'u', '7' , '\x1f')\ - X(76, 0x38, 0x38, 0x09, 0, 0x0000'FF'FF, 1, Key8 , "8" , 56 , 'u', '8' , '\x7f')\ - X( 77, 0x68, 0x68, 0x48, NumLockMode, 0x0000'FF'FF, 1, Numpad8 , "8" , 57407, 'u', '8' , '\x7f')\ - X(78, 0x39, 0x39, 0x0A, 0, 0x0000'FF'FF, 1, Key9 , "9" , 57 , 'u', '9' , '9' )\ - X( 79, 0x69, 0x69, 0x49, NumLockMode, 0x0000'FF'FF, 1, Numpad9 , "9" , 57408, 'u', '9' , '9' )\ - X(80, 0x2D, 0x2D, 0x52, ExtendedKey, 0x0100'00'FF, 1, KeyInsert , "Insert" , 2 , '~', -1 , -1 )\ - X( 81, 0x2D, 0x2D, 0x52, 0, 0x0100'00'FF, 1, NumpadInsert , "Insert" , 57425, 'u', -1 , -1 )\ - X(82, 0x2E, 0x2E, 0x53, ExtendedKey, 0x0100'00'FF, 1, KeyDelete , "Delete" , 3 , '~', -1 , -1 )\ - X( 83, 0x2E, 0x2E, 0x55, 0, 0x0100'00'FF, 1, NumpadDelete , "Delete" , 57426, 'u', -1 , -1 )\ - X(84, 0x0C, 0x0C, 0x4C, ExtendedKey, 0x0100'00'FF, 1, KeyClear , "Clear" , 1 , 'E', -1 , -1 )\ - X( 85, 0x0C, 0x0C, 0x4C, 0, 0x0100'00'FF, 1, NumpadClear , "Clear" , 57427, '~', -1 , -1 )\ - X(86, 0x6A, 0x6A, 0x09, 0, 0x0000'FF'FF, 1, KeyMultiply , "*" , 0 , 'u', '*' , '*' )\ - X( 87, 0x6A, 0x6A, 0x37, 0, 0x0000'FF'FF, 1, NumpadMultiply , "*" , 57411, 'u', '*' , '*' )\ - X(88, 0x6B, 0x6B, 0x0D, 0, 0x0000'FF'FF, 1, KeyPlus , "Plus" , 43 , 'u', '+' , '+' )\ - X( 89, 0x6B, 0x6B, 0x4E, 0, 0x0000'FF'FF, 1, NumpadPlus , "Plus" , 57413, 'u', '+' , '+' )\ - X(90, 0x6C, 0x6C, 0, 0, 0x0020'00'FF, 1, KeySeparator , "Separator" , 0 , 'u', ',' , ',' )\ - X( 91, 0x6C, 0x6C, 0, NumLockMode, 0x0020'00'FF, 1, NumpadSeparator , "Separator" , 57416, 'u', ',' , ',' )\ - X(92, 0xBD, 0xBD, 0x0C, 0, 0x0000'00'FF, 1, KeyMinus , "Minus" , 45 , 'u', '-' , '-' )\ - X( 93, 0x6D, 0x6D, 0x4A, 0, 0x0000'00'FF, 1, NumpadMinus , "Minus" , 57412, 'u', '-' , '-' )\ - X(94, 0xBE, 0xBE, 0x34, 0, 0x0000'00'FF, 1, KeyPeriod , "." , 46 , 'u', '.' , '.' )\ - X( 95, 0x6E, 0x6E, 0x53, NumLockMode, 0x0000'00'FF, 1, NumpadDecimal , "." , 57409, 'u', '.' , '.' )\ - X(96, 0xBF, 0xBF, 0x35, 0, 0x0000'00'FF, 1, KeySlash , "/" , 47 , 'u', '/' , '\x1f')\ - X( 97, 0x6F, 0x6F, 0x35, ExtendedKey, 0x0000'00'FF, 1, NumpadSlash , "/" , 57410, 'u', '/' , '\x1f')\ - X(98, 0xBB, 0xBB, 0x0D, 0, 0x0100'00'FF, 1, Equal , "=" , 61 , 'u', '=' , '=' )\ - X( 99, 0xBB, 0xBB, 0x0D, ExtendedKey, 0x0100'00'FF, 1, NumpadEqual , "=" , 57415, 'u', '=' , '=' )\ - X(100, 0xDC, 0xDC, 0x2B, 0, 0x0000'00'FF, 1, BackSlash , "BackSlash" , 92 , 'u', '\\' , '\x1c')\ - X(102, 0xDB, 0xDB, 0x1A, 0, 0x0000'00'FF, 1, OpenBracket , "[" , 91 , 'u', '[' , '\x1b')\ - X(104, 0xDD, 0xDD, 0x1B, 0, 0x0000'00'FF, 1, ClosedBracket , "]" , 93 , 'u', ']' , '\x1d')\ - X(106, 0xC0, 0xC0, 0x29, 0, 0x0000'00'FF, 1, BackQuote , "`" , 96 , 'u', '`' , '`' )\ - X(108, 0xDE, 0xDE, 0x28, 0, 0x0000'00'FF, 1, SingleQuote , "'" , 39 , 'u', '\'' , '\'' )\ - X(110, 0xBC, 0xBC, 0x33, 0, 0x0000'00'FF, 1, Comma , "," , 44 , 'u', ',' , ',' )\ - X(112, 0xBA, 0xBA, 0x27, 0, 0x0000'00'FF, 1, Semicolon , ";" , 59 , 'u', ';' , ';' )\ - X(114, 0x70, 0x70, 0x3B, 0, 0x0000'00'FF, 1, F1 , "F1" , 11 , '~', -1 , -1 )\ - X(116, 0x71, 0x71, 0x3C, 0, 0x0000'00'FF, 1, F2 , "F2" , 12 , '~', -1 , -1 )\ - X(118, 0x72, 0x72, 0x3D, 0, 0x0000'00'FF, 1, F3 , "F3" , 13 , '~', -1 , -1 )\ - X(120, 0x73, 0x73, 0x3E, 0, 0x0000'00'FF, 1, F4 , "F4" , 14 , '~', -1 , -1 )\ - X(122, 0x74, 0x74, 0x3F, 0, 0x0000'00'FF, 1, F5 , "F5" , 15 , '~', -1 , -1 )\ - X(124, 0x75, 0x75, 0x40, 0, 0x0000'00'FF, 1, F6 , "F6" , 17 , '~', -1 , -1 )\ - X(126, 0x76, 0x76, 0x41, 0, 0x0000'00'FF, 1, F7 , "F7" , 18 , '~', -1 , -1 )\ - X(128, 0x77, 0x77, 0x42, 0, 0x0000'00'FF, 1, F8 , "F8" , 19 , '~', -1 , -1 )\ - X(130, 0x78, 0x78, 0x43, 0, 0x0000'00'FF, 1, F9 , "F9" , 20 , '~', -1 , -1 )\ - X(132, 0x79, 0x79, 0x44, 0, 0x0000'00'FF, 1, F10 , "F10" , 21 , '~', -1 , -1 )\ - X(134, 0x7A, 0x7A, 0x57, 0, 0x0000'00'FF, 1, F11 , "F11" , 23 , '~', -1 , -1 )\ - X(136, 0x7B, 0x7B, 0x5B, 0, 0x0000'00'FF, 1, F12 , "F12" , 24 , '~', -1 , -1 )\ - X(138, 0x7C, 0x7C, 0, 0, 0x0000'00'FF, 1, F13 , "F13" , 57376, 'u', -1 , -1 )\ - X(140, 0x7D, 0x7D, 0, 0, 0x0100'00'FF, 1, F14 , "F14" , 57377, 'u', -1 , -1 )\ - X(142, 0x7E, 0x7E, 0, 0, 0x0100'00'FF, 1, F15 , "F15" , 57378, 'u', -1 , -1 )\ - X(144, 0x7F, 0x7F, 0, 0, 0x0100'00'FF, 1, F16 , "F16" , 57379, 'u', -1 , -1 )\ - X(146, 0x80, 0x80, 0, 0, 0x0100'00'FF, 1, F17 , "F17" , 57380, 'u', -1 , -1 )\ - X(148, 0x81, 0x81, 0, 0, 0x0100'00'FF, 1, F18 , "F18" , 57381, 'u', -1 , -1 )\ - X(150, 0x82, 0x82, 0, 0, 0x0100'00'FF, 1, F19 , "F19" , 57382, 'u', -1 , -1 )\ - X(152, 0x83, 0x83, 0, 0, 0x0100'00'FF, 1, F20 , "F20" , 57383, 'u', -1 , -1 )\ - X(154, 0x84, 0x84, 0, 0, 0x0100'00'FF, 1, F21 , "F21" , 57384, 'u', -1 , -1 )\ - X(156, 0x85, 0x85, 0, 0, 0x0100'00'FF, 1, F22 , "F22" , 57385, 'u', -1 , -1 )\ - X(158, 0x86, 0x86, 0, 0, 0x0100'00'FF, 1, F23 , "F23" , 57386, 'u', -1 , -1 )\ - X(160, 0x87, 0x87, 0, 0, 0x0100'00'FF, 1, F24 , "F24" , 57387, 'u', -1 , -1 )\ - X(162, 0x7D, 0x7D, 0, ExtendedKey, 0x0100'00'FF, 1, F25 , "F25" , 57388, 'u', -1 , -1 )\ - X(164, 0x7E, 0x7E, 0, ExtendedKey, 0x0100'00'FF, 1, F26 , "F26" , 57389, 'u', -1 , -1 )\ - X(166, 0x7F, 0x7F, 0, ExtendedKey, 0x0100'00'FF, 1, F27 , "F27" , 57390, 'u', -1 , -1 )\ - X(168, 0x80, 0x80, 0, ExtendedKey, 0x0100'00'FF, 1, F28 , "F28" , 57391, 'u', -1 , -1 )\ - X(170, 0x81, 0x81, 0, ExtendedKey, 0x0100'00'FF, 1, F29 , "F29" , 57392, 'u', -1 , -1 )\ - X(172, 0x82, 0x82, 0, ExtendedKey, 0x0100'00'FF, 1, F30 , "F30" , 57393, 'u', -1 , -1 )\ - X(174, 0x83, 0x83, 0, ExtendedKey, 0x0100'00'FF, 1, F31 , "F31" , 57394, 'u', -1 , -1 )\ - X(176, 0x84, 0x84, 0, ExtendedKey, 0x0100'00'FF, 1, F32 , "F32" , 57395, 'u', -1 , -1 )\ - X(178, 0x85, 0x85, 0, ExtendedKey, 0x0100'00'FF, 1, F33 , "F33" , 57396, 'u', -1 , -1 )\ - X(180, 0x86, 0x86, 0, ExtendedKey, 0x0100'00'FF, 1, F34 , "F34" , 57397, 'u', -1 , -1 )\ - X(182, 0x87, 0x87, 0, ExtendedKey, 0x0100'00'FF, 1, F35 , "F35" , 57398, 'u', -1 , -1 )\ - X(184, 0x41, 0x41, 0, 0, 0x0100'00'FF, 1, KeyA , "A" , 97 , 'u', 'a' , '\x01')\ - X(186, 0x42, 0x42, 0, 0, 0x0100'00'FF, 1, KeyB , "B" , 98 , 'u', 'b' , '\x02')\ - X(188, 0x43, 0x43, 0, 0, 0x0100'00'FF, 1, KeyC , "C" , 99 , 'u', 'c' , '\x03')\ - X(190, 0x44, 0x44, 0, 0, 0x0100'00'FF, 1, KeyD , "D" , 100 , 'u', 'd' , '\x04')\ - X(192, 0x45, 0x45, 0, 0, 0x0100'00'FF, 1, KeyE , "E" , 101 , 'u', 'e' , '\x05')\ - X(194, 0x46, 0x46, 0, 0, 0x0100'00'FF, 1, KeyF , "F" , 102 , 'u', 'f' , '\x06')\ - X(196, 0x47, 0x47, 0, 0, 0x0100'00'FF, 1, KeyG , "G" , 103 , 'u', 'g' , '\x07')\ - X(198, 0x48, 0x48, 0, 0, 0x0100'00'FF, 1, KeyH , "H" , 104 , 'u', 'h' , '\x08')\ - X(200, 0x49, 0x49, 0, 0, 0x0100'00'FF, 1, KeyI , "I" , 105 , 'u', 'i' , '\x09')\ - X(202, 0x4A, 0x4A, 0, 0, 0x0100'00'FF, 1, KeyJ , "J" , 106 , 'u', 'j' , '\x0a')\ - X(204, 0x4B, 0x4B, 0, 0, 0x0100'00'FF, 1, KeyK , "K" , 107 , 'u', 'k' , '\x0b')\ - X(206, 0x4C, 0x4C, 0, 0, 0x0100'00'FF, 1, KeyL , "L" , 108 , 'u', 'l' , '\x0c')\ - X(208, 0x4D, 0x4D, 0, 0, 0x0100'00'FF, 1, KeyM , "M" , 109 , 'u', 'm' , '\x0d')\ - X(210, 0x4E, 0x4E, 0, 0, 0x0100'00'FF, 1, KeyN , "N" , 110 , 'u', 'n' , '\x0e')\ - X(212, 0x4F, 0x4F, 0, 0, 0x0100'00'FF, 1, KeyO , "O" , 111 , 'u', 'o' , '\x0f')\ - X(214, 0x50, 0x50, 0, 0, 0x0100'00'FF, 1, KeyP , "P" , 112 , 'u', 'p' , '\x10')\ - X(216, 0x51, 0x51, 0, 0, 0x0100'00'FF, 1, KeyQ , "Q" , 113 , 'u', 'q' , '\x11')\ - X(218, 0x52, 0x52, 0, 0, 0x0100'00'FF, 1, KeyR , "R" , 114 , 'u', 'r' , '\x12')\ - X(220, 0x53, 0x53, 0, 0, 0x0100'00'FF, 1, KeyS , "S" , 115 , 'u', 's' , '\x13')\ - X(222, 0x54, 0x54, 0, 0, 0x0100'00'FF, 1, KeyT , "T" , 116 , 'u', 't' , '\x14')\ - X(224, 0x55, 0x55, 0, 0, 0x0100'00'FF, 1, KeyU , "U" , 117 , 'u', 'u' , '\x15')\ - X(226, 0x56, 0x56, 0, 0, 0x0100'00'FF, 1, KeyV , "V" , 118 , 'u', 'v' , '\x16')\ - X(228, 0x57, 0x57, 0, 0, 0x0100'00'FF, 1, KeyW , "W" , 119 , 'u', 'w' , '\x17')\ - X(230, 0x58, 0x58, 0, 0, 0x0100'00'FF, 1, KeyX , "X" , 120 , 'u', 'x' , '\x18')\ - X(232, 0x59, 0x59, 0, 0, 0x0100'00'FF, 1, KeyY , "Y" , 121 , 'u', 'y' , '\x19')\ - X(234, 0x5A, 0x5A, 0, 0, 0x0100'00'FF, 1, KeyZ , "Z" , 122 , 'u', 'z' , '\x1a')\ - X(236, 0x5F, 0x5F, 0, ExtendedKey, 0x0100'00'FF, 0, Sleep , "Sleep" , 0 , 'u', -1 , -1 )\ - X(238, 0xB7, 0xB7, 0, ExtendedKey, 0x0100'00'FF, 0, Calculator , "Calculator" , 0 , 'u', -1 , -1 )\ - X(240, 0x48, 0x48, 0, ExtendedKey, 0x0100'00'FF, 0, Mail , "Mail" , 0 , 'u', -1 , -1 )\ - X(242, 0xAD, 0xAD, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440, 'u', -1 , -1 )\ - X(244, 0xAE, 0xAE, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438, 'u', -1 , -1 )\ - X(246, 0xAF, 0xAF, 0, ExtendedKey, 0x0100'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439, 'u', -1 , -1 )\ - X(248, 0xB0, 0xB0, 0, ExtendedKey, 0x0100'00'FF, 0, MediaNext , "MediaNext" , 57435, 'u', -1 , -1 )\ - X(250, 0xB1, 0xB1, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPrev , "MediaPrev" , 57436, 'u', -1 , -1 )\ - X(252, 0xB2, 0xB2, 0, ExtendedKey, 0x0100'00'FF, 0, MediaStop , "MediaStop" , 57432, 'u', -1 , -1 )\ - X(254, 0xB2, 0xB2, 0, 0, 0x0100'00'FF, 0, MediaPause , "MediaPause" , 57429, 'u', -1 , -1 )\ - X(256, 0xB3, 0xB3, 0, ExtendedKey, 0x0100'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430, 'u', -1 , -1 )\ - X(258, 0xB3, 0xB3, 0, 0, 0x0100'00'FF, 0, MediaPlay , "MediaPlay" , 57428, 'u', -1 , -1 )\ - X(260, 0xB5, 0xB5, 0, ExtendedKey, 0x0100'00'FF, 0, MediaSelect , "MediaSelect" , 0 , 'u', -1 , -1 )\ - X(262, 0xB8, 0xB8, 0, ExtendedKey, 0x0100'00'FF, 0, MediaReverse , "MediaReverse" , 57431, 'u', -1 , -1 )\ - X(264, 0xB8, 0xB8, 0, 0, 0x0100'00'FF, 0, MediaRecord , "MediaRecord" , 57437, 'u', -1 , -1 )\ - X(266, 0xB9, 0xB9, 0, ExtendedKey, 0x0100'00'FF, 0, MediaFastForward, "MediaFastForward", 57433, 'u', -1 , -1 )\ - X(268, 0xB9, 0xB9, 0, 0, 0x0100'00'FF, 0, MediaRewind , "MediaRewind" , 57434, 'u', -1 , -1 )\ - X(270, 0xA6, 0xA6, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserBack , "BrowserBack" , 0 , 'u', -1 , -1 )\ - X(272, 0xA7, 0xA7, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserForward , "BrowserForward" , 0 , 'u', -1 , -1 )\ - X(274, 0xA8, 0xA8, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 , 'u', -1 , -1 )\ - X(276, 0xA9, 0xA9, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserStop , "BrowserStop" , 0 , 'u', -1 , -1 )\ - X(278, 0xAA, 0xAA, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 , 'u', -1 , -1 )\ - X(280, 0xAB, 0xAB, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserFavorites, "BrowserFavorites", 0 , 'u', -1 , -1 )\ - X(282, 0xAC, 0xAC, 0, ExtendedKey, 0x0100'00'FF, 0, BrowserHome , "BrowserHome" , 0 , 'u', -1 , -1 )\ - X(284, 0xFF, 0xFF, 0xFF, ExtendedKey, 0x0100'FF'FF, 0, lastKey , "lastKey" , 0 , 0 , -1 , -1 ) + /*Id Index Vkey Scan KLID CS Mask CS KLID VK SC I Name GenericName KKP base,suffix,ascii,w\ctrl*/\ + X(0, 0, 0, 0, 0x00000, 0, 0x0000'00000'00'FF, 1, undef , "undef" , 0 , 'u', -1 , -1 )\ + X(1, 0, 0xFF, 0xFF, 0x00409, 0, 0x0100'00000'FF'FF, 0, config , "config" , 0 , 'u', -1 , -1 )\ + X(2, 0xA2, 0x11, 0x1D, 0x00409, 0, 0x0100'00000'00'FF, 0, LeftCtrl , "Ctrl" , 57442, 'u', -1 , -1 )\ + X( 3, 0xA3, 0x11, 0x1D, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, RightCtrl , "Ctrl" , 57448, 'u', -1 , -1 )\ + X(4, 0xA4, 0x12, 0x38, 0x00409, 0, 0x0100'00000'00'FF, 0, LeftAlt , "Alt" , 57443, 'u', -1 , -1 )\ + X( 5, 0xA5, 0x12, 0x38, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, RightAlt , "Alt" , 57449, 'u', -1 , -1 )\ + X(6, 0xA0, 0x10, 0x2A, 0x00409, 0, 0x0000'00000'FF'FF, 0, LeftShift , "Shift" , 57441, 'u', -1 , -1 )\ + X( 7, 0xA1, 0x10, 0x36, 0x00409, 0, 0x0000'00000'FF'FF, 0, RightShift , "Shift" , 57447, 'u', -1 , -1 )\ + X(8, 0x5B, 0x5B, 0x5B, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, LeftWin , "Win" , 57444, 'u', -1 , -1 )\ + X( 9, 0x5C, 0x5C, 0x5C, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, RightWin , "Win" , 57450, 'u', -1 , -1 )\ + X(10, 0x5B, 0x5B, 0x5B, 0x00409, 0, 0x0100'00000'00'FF, 0, LeftHyper , "Hyper" , 57445, 'u', -1 , -1 )\ + X( 11, 0x5C, 0x5C, 0x5C, 0x00409, 0, 0x0100'00000'00'FF, 0, RightHyper , "Hyper" , 57451, 'u', -1 , -1 )\ + X(12, 0x5D, 0x5D, 0x5D, 0x00409, ExtendedKey, 0x0000'00000'00'FF, 0, Apps , "Apps" , 57363, 'u', -1 , -1 )\ + X(14, 0x90, 0x90, 0x45, 0x00409, 0, 0x0000'00000'00'FF, 0, NumLock , "NumLock" , 57360, 'u', -1 , -1 )\ + X(16, 0x14, 0x14, 0x3A, 0x00409, 0, 0x0100'00000'00'FF, 0, CapsLock , "CapsLock" , 57358, 'u', -1 , -1 )\ + X(18, 0x91, 0x91, 0x45, 0x00409, 0, 0x0100'00000'00'FF, 0, ScrollLock , "ScrollLock" , 57359, 'u', -1 , -1 )\ + X(20, 0x14, 0x14, 0x3A, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, AltGR , "AltGr" , 57453, 'u', -1 , -1 )/*IsoLevel3Shift*/\ + X(22, 0x91, 0x91, 0x45, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, IsoLevel5Shift , "IsoLevel5Shift" , 57454, 'u', -1 , -1 )\ + X(24, 0x1B, 0x1B, 0x01, 0x00409, 0, 0x0000'00000'00'FF, 1, Esc , "Esc" , 27 , 'u', '\x1b', '\x1b')\ + X(26, 0x20, 0x20, 0x39, 0x00409, 0, 0x0000'00000'00'FF, 1, Space , "Space" , 32 , 'u', '\x20', '\0' )\ + X(28, 0x08, 0x08, 0x0E, 0x00409, 0, 0x0000'00000'00'FF, 1, Backspace , "Backspace" , 127 , 'u', '\x7f', '\x08')\ + X(30, 0x09, 0x09, 0x0F, 0x00409, 0, 0x0000'00000'00'FF, 1, Tab , "Tab" , 9 , 'u', '\x09', '\x09')\ + X(32, 0x03, 0x03, 0x46, 0x00409, 0, 0x0000'00000'FF'FF, 1, Break , "Break" , 0 , 'u', '\x1a', '\x03')\ + X(34, 0x13, 0x13, 0x45, 0x00409, 0, 0x0000'00000'FF'FF, 0, Pause , "Pause" , 57362, 'u', '\x1a', '\x03')\ + X(36, 0x29, 0x29, 0, 0x00409, 0, 0x0000'00000'00'FF, 0, Select , "Select" , 0 , 'u', -1 , -1 )\ + X(38, 0x2C, 0x2C, 0x54, 0x00409, 0, 0x0000'00000'FF'FF, 1, SysRq , "SysRq" , 0 , 'u', -1 , '\x03')\ + X(40, 0x2C, 0x2C, 0x37, 0x00409, ExtendedKey, 0x0100'00000'FF'FF, 0, PrintScreen , "PrintScreen" , 57361, 'u', -1 , -1 )\ + X(42, 0x0D, 0x0D, 0x1C, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyEnter , "Enter" , 13 , 'u', '\x0d', '\x0a')\ + X( 43, 0x0D, 0x0D, 0x1C, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, NumpadEnter , "Enter" , 57414, 'u', '\x0d', '\x0a')\ + X(44, 0x21, 0x21, 0x49, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyPageUp , "PageUp" , 5 , '~', -1 , -1 )\ + X( 45, 0x21, 0x21, 0x49, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadPageUp , "PageUp" , 57421, 'u', -1 , -1 )\ + X(46, 0x22, 0x22, 0x51, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyPageDown , "PageDown" , 6 , '~', -1 , -1 )\ + X( 47, 0x22, 0x22, 0x51, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadPageDown , "PageDown" , 57422, 'u', -1 , -1 )\ + X(48, 0x23, 0x23, 0x4F, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyEnd , "End" , 8 , '~', -1 , -1 )/*don't reorder*/\ + X( 49, 0x23, 0x23, 0x4F, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadEnd , "End" , 57424, 'u', -1 , -1 )/*don't reorder*/\ + X(50, 0x24, 0x24, 0x47, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyHome , "Home" , 7 , '~', -1 , -1 )/*don't reorder*/\ + X( 51, 0x24, 0x24, 0x47, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadHome , "Home" , 57423, 'u', -1 , -1 )/*don't reorder*/\ + X(52, 0x25, 0x25, 0x4B, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyLeftArrow , "LeftArrow" , 1 , 'D', -1 , -1 )/*don't reorder*/\ + X( 53, 0x25, 0x25, 0x4B, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadLeftArrow , "LeftArrow" , 57417, 'u', -1 , -1 )/*don't reorder*/\ + X(54, 0x26, 0x26, 0x48, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyUpArrow , "UpArrow" , 1 , 'A', -1 , -1 )/*don't reorder*/\ + X( 55, 0x26, 0x26, 0x48, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadUpArrow , "UpArrow" , 57419, 'u', -1 , -1 )/*don't reorder*/\ + X(56, 0x27, 0x27, 0x4D, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyRightArrow , "RightArrow" , 1 , 'C', -1 , -1 )/*don't reorder*/\ + X( 57, 0x27, 0x27, 0x4D, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadRightArrow , "RightArrow" , 57418, 'u', -1 , -1 )/*don't reorder*/\ + X(58, 0x28, 0x28, 0x50, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyDownArrow , "DownArrow" , 1 , 'B', -1 , -1 )/*don't reorder*/\ + X( 59, 0x28, 0x28, 0x50, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadDownArrow , "DownArrow" , 57420, 'u', -1 , -1 )/*don't reorder*/\ + X(60, 0x30, 0x30, 0x0B, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key0 , "0" , 48 , 'u', '0' , '0' )\ + X( 61, 0x60, 0x60, 0x52, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad0 , "0" , 57399, 'u', '0' , '0' )\ + X(62, 0x31, 0x31, 0x02, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key1 , "1" , 49 , 'u', '1' , '1' )\ + X( 63, 0x61, 0x61, 0x4F, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad1 , "1" , 57400, 'u', '1' , '1' )\ + X(64, 0x32, 0x32, 0x03, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key2 , "2" , 50 , 'u', '2' , '\0' )\ + X( 65, 0x62, 0x62, 0x50, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad2 , "2" , 57401, 'u', '2' , '\0' )\ + X(66, 0x33, 0x33, 0x04, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key3 , "3" , 51 , 'u', '3' , '\x1b')\ + X( 67, 0x63, 0x63, 0x51, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad3 , "3" , 57402, 'u', '3' , '\x1b')\ + X(68, 0x34, 0x34, 0x05, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key4 , "4" , 52 , 'u', '4' , '\x1c')\ + X( 69, 0x64, 0x64, 0x4B, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad4 , "4" , 57403, 'u', '4' , '\x1c')\ + X(70, 0x35, 0x35, 0x06, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key5 , "5" , 53 , 'u', '5' , '\x1d')\ + X( 71, 0x65, 0x65, 0x4C, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad5 , "5" , 57404, 'u', '5' , '\x1d')\ + X(72, 0x36, 0x36, 0x07, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key6 , "6" , 54 , 'u', '6' , '\x1e')\ + X( 73, 0x66, 0x66, 0x4D, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad6 , "6" , 57405, 'u', '6' , '\x1e')\ + X(74, 0x37, 0x37, 0x08, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key7 , "7" , 55 , 'u', '7' , '\x1f')\ + X( 75, 0x67, 0x67, 0x47, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad7 , "7" , 57406, 'u', '7' , '\x1f')\ + X(76, 0x38, 0x38, 0x09, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key8 , "8" , 56 , 'u', '8' , '\x7f')\ + X( 77, 0x68, 0x68, 0x48, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad8 , "8" , 57407, 'u', '8' , '\x7f')\ + X(78, 0x39, 0x39, 0x0A, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key9 , "9" , 57 , 'u', '9' , '9' )\ + X( 79, 0x69, 0x69, 0x49, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad9 , "9" , 57408, 'u', '9' , '9' )\ + X(80, 0x2D, 0x2D, 0x52, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyInsert , "Insert" , 2 , '~', -1 , -1 )\ + X( 81, 0x2D, 0x2D, 0x52, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadInsert , "Insert" , 57425, 'u', -1 , -1 )\ + X(82, 0x2E, 0x2E, 0x53, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyDelete , "Delete" , 3 , '~', -1 , -1 )\ + X( 83, 0x2E, 0x2E, 0x55, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadDelete , "Delete" , 57426, 'u', -1 , -1 )\ + X(84, 0x0C, 0x0C, 0x4C, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyClear , "Clear" , 1 , 'E', -1 , -1 )\ + X( 85, 0x0C, 0x0C, 0x4C, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadClear , "Clear" , 57427, '~', -1 , -1 )\ + X(86, 0x6A, 0x6A, 0x09, 0x00409, 0, 0x0000'00000'FF'FF, 1, KeyMultiply , "*" , 0 , 'u', '*' , '*' )\ + X( 87, 0x6A, 0x6A, 0x37, 0x00409, 0, 0x0000'00000'FF'FF, 1, NumpadMultiply , "*" , 57411, 'u', '*' , '*' )\ + X(88, 0x6B, 0x6B, 0x0D, 0x00409, 0, 0x0000'00000'FF'FF, 1, KeyPlus , "Plus" , 43 , 'u', '+' , '+' )\ + X( 89, 0x6B, 0x6B, 0x4E, 0x00409, 0, 0x0000'00000'FF'FF, 1, NumpadPlus , "Plus" , 57413, 'u', '+' , '+' )\ + X(90, 0x6C, 0x6C, 0, 0x00409, 0, 0x0020'00000'00'FF, 1, KeySeparator , "Separator" , 0 , 'u', ',' , ',' )\ + X( 91, 0x6C, 0x6C, 0, 0x00409, NumLockMode, 0x0020'00000'00'FF, 1, NumpadSeparator , "Separator" , 57416, 'u', ',' , ',' )\ + X(92, 0xBD, 0xBD, 0x0C, 0x00409, 0, 0x0000'00000'00'FF, 1, KeyMinus , "Minus" , 45 , 'u', '-' , '-' )\ + X( 93, 0x6D, 0x6D, 0x4A, 0x00409, 0, 0x0000'00000'00'FF, 1, NumpadMinus , "Minus" , 57412, 'u', '-' , '-' )\ + X(94, 0xBE, 0xBE, 0x34, 0x00409, 0, 0x0000'00000'00'FF, 1, KeyPeriod , "." , 46 , 'u', '.' , '.' )\ + X( 95, 0x6E, 0x6E, 0x53, 0x00409, NumLockMode, 0x0000'00000'00'FF, 1, NumpadDecimal , "." , 57409, 'u', '.' , '.' )\ + X(96, 0xBF, 0xBF, 0x35, 0x00409, 0, 0x0000'00000'00'FF, 1, KeySlash , "/" , 47 , 'u', '/' , '\x1f')\ + X( 97, 0x6F, 0x6F, 0x35, 0x00409, ExtendedKey, 0x0000'00000'00'FF, 1, NumpadSlash , "/" , 57410, 'u', '/' , '\x1f')\ + X(98, 0xBB, 0xBB, 0x0D, 0x00409, 0, 0x0100'00000'00'FF, 1, Equal , "=" , 61 , 'u', '=' , '=' )\ + X( 99, 0xBB, 0xBB, 0x0D, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, NumpadEqual , "=" , 57415, 'u', '=' , '=' )\ + X(100, 0xDC, 0xDC, 0x2B, 0x00409, 0, 0x0000'00000'00'FF, 1, BackSlash , "BackSlash" , 92 , 'u', '\\' , '\x1c')\ + X(102, 0xDB, 0xDB, 0x1A, 0x00409, 0, 0x0000'00000'00'FF, 1, OpenBracket , "[" , 91 , 'u', '[' , '\x1b')\ + X(104, 0xDD, 0xDD, 0x1B, 0x00409, 0, 0x0000'00000'00'FF, 1, ClosedBracket , "]" , 93 , 'u', ']' , '\x1d')\ + X(106, 0xC0, 0xC0, 0x29, 0x00409, 0, 0x0000'00000'00'FF, 1, BackQuote , "`" , 96 , 'u', '`' , '`' )\ + X(108, 0xDE, 0xDE, 0x28, 0x00409, 0, 0x0000'00000'00'FF, 1, SingleQuote , "'" , 39 , 'u', '\'' , '\'' )\ + X(110, 0xBC, 0xBC, 0x33, 0x00409, 0, 0x0000'00000'00'FF, 1, Comma , "," , 44 , 'u', ',' , ',' )\ + X(112, 0xBA, 0xBA, 0x27, 0x00409, 0, 0x0000'00000'00'FF, 1, Semicolon , ";" , 59 , 'u', ';' , ';' )\ + X(114, 0xBC, 0xBC, 0x33, 0x00415, 0, 0x0000'FFFFF'00'FF, 1, LessThan , "<" , 60 , 'u', ';' , ';' )/*bepo */\ + X(116, 0xBE, 0xBE, 0x34, 0x00418, 0, 0x0000'FFFFF'00'FF, 1, GreaterThan , ">" , 62 , 'u', ';' , ';' )/*bepo */\ + X(118, 0xC0, 0xC0, 0x29, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DegreeSign , "°" , 176 , 'u', '"' , '"' )/*qwertz Hungarian*/\ + X(120, 0x33, 0x33, 0x04, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, DoubleQuote , "\"" , 34 , 'u', '"' , '"' )/*azerty*/\ + X(122, 0x35, 0x35, 0x06, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, OpenRoundBracket , "(" , 40 , 'u', '(' , '(' )/*azerty*/\ + X(124, 0x38, 0x38, 0x2D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, ClosedRoundBracket , ")" , 41 , 'u', ')' , ')' )/*azerty*/\ + X(126, 0x36, 0x36, 0x07, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, AtSign , "@" , 64 , 'u', '@' , '\0' )/*bepo */\ + X(128, 0xDD, 0xDD, 0x0D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Percent , "%" , 37 , 'u', '%' , '%' )/*bepo */\ + X(130, 0xDF, 0xDF, 0x35, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, ExclamationMark , "!" , 33 , 'u', '!' , '!' )/*azerty*/\ + X(132, 0x31, 0x31, 0x02, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Ampersand , "&" , 38 , 'u', '&' , '&' )/*azerty*/\ + X(134, 0x38, 0x38, 0x09, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Underscore , "_" , 95 , 'u', '_' , '\x1f')/*azerty*/\ + X(136, 0x32, 0x32, 0x03, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, LeftDoubleAngleQuote , "«" , 171 , 'u', -1 , -1 )/*bepo */\ + X(138, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, RightDoubleAngleQuote, "»" , 187 , 'u', -1 , -1 )/*bepo */\ + X(140, 0xDB, 0xDB, 0x2D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Eszett , "ß" , 223 , 'u', -1 , -1 )/*qwertz*/\ + X(142, 0x38, 0x38, 0x09, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteA , "á" , 225 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(144, 0x32, 0x32, 0x03, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteE , "é" , 233 , 'u', -1 , -1 )/*azerty*/\ + X(146, 0x39, 0x39, 0x0A, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteI , "í" , 237 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(148, 0x38, 0x38, 0x09, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteO , "ó" , 243 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(150, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteU , "ú" , 250 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(152, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteY , "ý" , 253 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(154, 0x34, 0x34, 0x05, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DoubleAcuteO , "ő" , 337 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(156, 0x39, 0x39, 0x0A, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CedillaC , "ç" , 231 , 'u', -1 , -1 )/*azerty*/\ + X(158, 0x5A, 0x5A, 0x2C, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CircumflexE , "ê" , 234 , 'u', -1 , -1 )/*bepo */\ + X(160, 0x32, 0x32, 0x03, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, CaronE , "ě" , 283 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(162, 0x33, 0x33, 0x04, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, CaronS , "š" , 353 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(164, 0x34, 0x34, 0x05, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronC , "č" , 269 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(166, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronR , "ř" , 345 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(168, 0x36, 0x36, 0x07, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronZ , "ž" , 282 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(170, 0x32, 0x32, 0x03, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronL , "ľ" , 318 , 'u', -1 , -1 )/*qwertz Slovak*/\ + X(172, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronT , "ť" , 357 , 'u', -1 , -1 )/*qwertz Slovak*/\ + X(174, 0x30, 0x30, 0x0B, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, GraveA , "à" , 224 , 'u', -1 , -1 )/*azerty*/\ + X(176, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, GraveE , "è" , 232 , 'u', -1 , -1 )/*azerty*/\ + X(178, 0xDE, 0xDE, 0x28, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, UmlautA , "ä" , 228 , 'u', -1 , -1 )/*qwertz*/\ + X(180, 0xBF, 0xBF, 0x27, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautO , "ö" , 246 , 'u', -1 , -1 )/*qwertz*/\ + X(182, 0xBA, 0xBA, 0x1A, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautU , "ü" , 252 , 'u', -1 , -1 )/*qwertz*/\ + X(184, 0xBA, 0xBA, 0x27, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, RingU , "ů" , 367 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(186, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, Circumflex , "^" , 94 , 'u', -1 , -1 )/*qwertz*/\ + X(188, 0xDD, 0xDD, 0x0D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, AcuteAccent , "´" , 180 , 'u', -1 , -1 )/*qwertz*/\ + X(190, 0xC0, 0xC0, 0x29, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, GraveAccent , "`" , 96 , 'u', -1 , -1 )/*bepo */\ + X(192, 0xDD, 0xDD, 0x1A, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, Umlaut , "¨" , 168 , 'u', -1 , -1 )/*azerty*/\ + X(194, 0x4E, 0x4E, 0x31, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningTilde , "~" , 771 , 'u', -1 , -1 )/*bepo */\ + X(196, 0xDC, 0xDC, 0x29, 0x0040E, 0, 0x0000'FFFFF'00'FF, 0, CombiningCaron , "ˇ" , 780 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(198, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningBreve , "˘" , 774 , 'u', -1 , -1 )/*bepo French*/\ + X(200, 0xDE, 0xDE, 0x28, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningOgonek , "˛" , 731 , 'u', -1 , -1 )/*bepo French*/\ + X(202, 0x70, 0x70, 0x3B, 0x00409, 0, 0x0000'00000'00'FF, 1, F1 , "F1" , 11 , '~', -1 , -1 )\ + X(204, 0x71, 0x71, 0x3C, 0x00409, 0, 0x0000'00000'00'FF, 1, F2 , "F2" , 12 , '~', -1 , -1 )\ + X(206, 0x72, 0x72, 0x3D, 0x00409, 0, 0x0000'00000'00'FF, 1, F3 , "F3" , 13 , '~', -1 , -1 )\ + X(208, 0x73, 0x73, 0x3E, 0x00409, 0, 0x0000'00000'00'FF, 1, F4 , "F4" , 14 , '~', -1 , -1 )\ + X(210, 0x74, 0x74, 0x3F, 0x00409, 0, 0x0000'00000'00'FF, 1, F5 , "F5" , 15 , '~', -1 , -1 )\ + X(212, 0x75, 0x75, 0x40, 0x00409, 0, 0x0000'00000'00'FF, 1, F6 , "F6" , 17 , '~', -1 , -1 )\ + X(214, 0x76, 0x76, 0x41, 0x00409, 0, 0x0000'00000'00'FF, 1, F7 , "F7" , 18 , '~', -1 , -1 )\ + X(216, 0x77, 0x77, 0x42, 0x00409, 0, 0x0000'00000'00'FF, 1, F8 , "F8" , 19 , '~', -1 , -1 )\ + X(218, 0x78, 0x78, 0x43, 0x00409, 0, 0x0000'00000'00'FF, 1, F9 , "F9" , 20 , '~', -1 , -1 )\ + X(220, 0x79, 0x79, 0x44, 0x00409, 0, 0x0000'00000'00'FF, 1, F10 , "F10" , 21 , '~', -1 , -1 )\ + X(222, 0x7A, 0x7A, 0x57, 0x00409, 0, 0x0000'00000'00'FF, 1, F11 , "F11" , 23 , '~', -1 , -1 )\ + X(224, 0x7B, 0x7B, 0x5B, 0x00409, 0, 0x0000'00000'00'FF, 1, F12 , "F12" , 24 , '~', -1 , -1 )\ + X(226, 0x7C, 0x7C, 0, 0x00409, 0, 0x0000'00000'00'FF, 1, F13 , "F13" , 57376, 'u', -1 , -1 )\ + X(228, 0x7D, 0x7D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F14 , "F14" , 57377, 'u', -1 , -1 )\ + X(230, 0x7E, 0x7E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F15 , "F15" , 57378, 'u', -1 , -1 )\ + X(232, 0x7F, 0x7F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F16 , "F16" , 57379, 'u', -1 , -1 )\ + X(234, 0x80, 0x80, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F17 , "F17" , 57380, 'u', -1 , -1 )\ + X(236, 0x81, 0x81, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F18 , "F18" , 57381, 'u', -1 , -1 )\ + X(238, 0x82, 0x82, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F19 , "F19" , 57382, 'u', -1 , -1 )\ + X(240, 0x83, 0x83, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F20 , "F20" , 57383, 'u', -1 , -1 )\ + X(242, 0x84, 0x84, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F21 , "F21" , 57384, 'u', -1 , -1 )\ + X(244, 0x85, 0x85, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F22 , "F22" , 57385, 'u', -1 , -1 )\ + X(246, 0x86, 0x86, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F23 , "F23" , 57386, 'u', -1 , -1 )\ + X(248, 0x87, 0x87, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F24 , "F24" , 57387, 'u', -1 , -1 )\ + X(250, 0x7D, 0x7D, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F25 , "F25" , 57388, 'u', -1 , -1 )\ + X(252, 0x7E, 0x7E, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F26 , "F26" , 57389, 'u', -1 , -1 )\ + X(254, 0x7F, 0x7F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F27 , "F27" , 57390, 'u', -1 , -1 )\ + X(256, 0x80, 0x80, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F28 , "F28" , 57391, 'u', -1 , -1 )\ + X(258, 0x81, 0x81, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F29 , "F29" , 57392, 'u', -1 , -1 )\ + X(260, 0x82, 0x82, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F30 , "F30" , 57393, 'u', -1 , -1 )\ + X(262, 0x83, 0x83, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F31 , "F31" , 57394, 'u', -1 , -1 )\ + X(264, 0x84, 0x84, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F32 , "F32" , 57395, 'u', -1 , -1 )\ + X(266, 0x85, 0x85, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F33 , "F33" , 57396, 'u', -1 , -1 )\ + X(268, 0x86, 0x86, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F34 , "F34" , 57397, 'u', -1 , -1 )\ + X(270, 0x87, 0x87, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F35 , "F35" , 57398, 'u', -1 , -1 )\ + X(272, 0x41, 0x41, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyA , "A" , 97 , 'u', 'a' , '\x01')\ + X(274, 0x42, 0x42, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyB , "B" , 98 , 'u', 'b' , '\x02')\ + X(276, 0x43, 0x43, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyC , "C" , 99 , 'u', 'c' , '\x03')\ + X(278, 0x44, 0x44, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyD , "D" , 100 , 'u', 'd' , '\x04')\ + X(280, 0x45, 0x45, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyE , "E" , 101 , 'u', 'e' , '\x05')\ + X(282, 0x46, 0x46, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyF , "F" , 102 , 'u', 'f' , '\x06')\ + X(284, 0x47, 0x47, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyG , "G" , 103 , 'u', 'g' , '\x07')\ + X(286, 0x48, 0x48, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyH , "H" , 104 , 'u', 'h' , '\x08')\ + X(288, 0x49, 0x49, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyI , "I" , 105 , 'u', 'i' , '\x09')\ + X(290, 0x4A, 0x4A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyJ , "J" , 106 , 'u', 'j' , '\x0a')\ + X(292, 0x4B, 0x4B, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyK , "K" , 107 , 'u', 'k' , '\x0b')\ + X(294, 0x4C, 0x4C, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyL , "L" , 108 , 'u', 'l' , '\x0c')\ + X(296, 0x4D, 0x4D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyM , "M" , 109 , 'u', 'm' , '\x0d')\ + X(298, 0x4E, 0x4E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyN , "N" , 110 , 'u', 'n' , '\x0e')\ + X(300, 0x4F, 0x4F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyO , "O" , 111 , 'u', 'o' , '\x0f')\ + X(302, 0x50, 0x50, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyP , "P" , 112 , 'u', 'p' , '\x10')\ + X(304, 0x51, 0x51, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyQ , "Q" , 113 , 'u', 'q' , '\x11')\ + X(306, 0x52, 0x52, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyR , "R" , 114 , 'u', 'r' , '\x12')\ + X(308, 0x53, 0x53, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyS , "S" , 115 , 'u', 's' , '\x13')\ + X(310, 0x54, 0x54, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyT , "T" , 116 , 'u', 't' , '\x14')\ + X(312, 0x55, 0x55, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyU , "U" , 117 , 'u', 'u' , '\x15')\ + X(314, 0x56, 0x56, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyV , "V" , 118 , 'u', 'v' , '\x16')\ + X(316, 0x57, 0x57, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyW , "W" , 119 , 'u', 'w' , '\x17')\ + X(318, 0x58, 0x58, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyX , "X" , 120 , 'u', 'x' , '\x18')\ + X(320, 0x59, 0x59, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyY , "Y" , 121 , 'u', 'y' , '\x19')\ + X(322, 0x5A, 0x5A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyZ , "Z" , 122 , 'u', 'z' , '\x1a')\ + X(324, 0x5F, 0x5F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Sleep , "Sleep" , 0 , 'u', -1 , -1 )\ + X(326, 0xB7, 0xB7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Calculator , "Calculator" , 0 , 'u', -1 , -1 )\ + X(328, 0x48, 0x48, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Mail , "Mail" , 0 , 'u', -1 , -1 )\ + X(330, 0xAD, 0xAD, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440, 'u', -1 , -1 )\ + X(332, 0xAE, 0xAE, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438, 'u', -1 , -1 )\ + X(334, 0xAF, 0xAF, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439, 'u', -1 , -1 )\ + X(336, 0xB0, 0xB0, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaNext , "MediaNext" , 57435, 'u', -1 , -1 )\ + X(338, 0xB1, 0xB1, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPrev , "MediaPrev" , 57436, 'u', -1 , -1 )\ + X(340, 0xB2, 0xB2, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaStop , "MediaStop" , 57432, 'u', -1 , -1 )\ + X(342, 0xB2, 0xB2, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPause , "MediaPause" , 57429, 'u', -1 , -1 )\ + X(344, 0xB3, 0xB3, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430, 'u', -1 , -1 )\ + X(346, 0xB3, 0xB3, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPlay , "MediaPlay" , 57428, 'u', -1 , -1 )\ + X(348, 0xB5, 0xB5, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaSelect , "MediaSelect" , 0 , 'u', -1 , -1 )\ + X(350, 0xB8, 0xB8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaReverse , "MediaReverse" , 57431, 'u', -1 , -1 )\ + X(352, 0xB8, 0xB8, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRecord , "MediaRecord" , 57437, 'u', -1 , -1 )\ + X(354, 0xB9, 0xB9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaFastForward , "MediaFastForward", 57433, 'u', -1 , -1 )\ + X(356, 0xB9, 0xB9, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRewind , "MediaRewind" , 57434, 'u', -1 , -1 )\ + X(368, 0xA6, 0xA6, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserBack , "BrowserBack" , 0 , 'u', -1 , -1 )\ + X(360, 0xA7, 0xA7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserForward , "BrowserForward" , 0 , 'u', -1 , -1 )\ + X(362, 0xA8, 0xA8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 , 'u', -1 , -1 )\ + X(364, 0xA9, 0xA9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserStop , "BrowserStop" , 0 , 'u', -1 , -1 )\ + X(366, 0xAA, 0xAA, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 , 'u', -1 , -1 )\ + X(368, 0xAB, 0xAB, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserFavorites , "BrowserFavorites", 0 , 'u', -1 , -1 )\ + X(370, 0xAC, 0xAC, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserHome , "BrowserHome" , 0 , 'u', -1 , -1 )\ + X(372, 0xFF, 0xFF, 0xFF, 0x00000, ExtendedKey, 0x0100'FFFFF'FF'FF, 0, lastKey , "lastKey" , 0 , 0 , -1 , -1 ) // Max 12 bits for KeyId. static constexpr auto idbits = 12; - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ + #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ static constexpr auto Name = KeyId; key_list #undef X struct map { - sz_t hash; // map: Key hash. + si64 hash; // map: Key hash. static auto& mask() { - static auto m = std::vector(input::key::lastKey); + static auto m = std::vector(input::key::lastKey); return m; } static auto& mask(si32 vk) @@ -291,6 +386,7 @@ namespace netxs::input view generic; si32 vkey; si32 scan; + si32 klid; si32 edit; si32 KKPDef; si32 KKPSuffix; @@ -301,23 +397,24 @@ namespace netxs::input return data[std::clamp(keycode, 0, input::key::lastKey - 1)]; } - map(si32 vk, si32 sc, si32 cs) - : hash{ (sz_t)(mask(vk) & (vk | (sc << 8) | (cs << 16))) } + map(si32 vk, si32 sc, si32 cs, si32 klid) + : hash{ (si64)(mask(vk) & (vk | (sc << 8) | (klid << 16) | ((si64)cs << 36))) } { } - map(si32 vk, si32 sc, si32 cs, si32 keymask, view keyname, view generic_keyname, si32 doinput, si32 id, + map(si32 vk, si32 sc, si32 klid, si32 cs, si64 keymask, view keyname, view generic_keyname, si32 doinput, si32 id, si32 KKPDef, si32 KKPSuffix, si32 KKPAscii, si32 KKPCtl) { mask(vk) = keymask; data(id) = { .name = keyname, .generic = generic_keyname, - .vkey = vk, + .vkey = vk, .scan = sc, + .klid = klid, .edit = doinput, .KKPDef = KKPDef, .KKPSuffix = KKPSuffix, .KKPAscii = KKPAscii, .KKPCtl = KKPCtl }; - hash = (sz_t)(keymask & (vk | (sc << 8) | (cs << 16))); + hash = (si64)(keymask & (vk | (sc << 8) | (klid << 16) | ((si64)cs << 36))); } bool operator == (map const& m) const = default; @@ -332,28 +429,28 @@ namespace netxs::input static const auto keymap = std::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ - { map{ Vkey, Scan, CtrlState, Mask, #Name, GenericName, Input, KeyId, KKPDef, KKPSuffix, KKPAscii, KKPCtl }, Name }, + #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ + { map{ Vkey, Scan, Klid, CtrlState, Mask, #Name, GenericName, Input, KeyId, KKPDef, KKPSuffix, KKPAscii, KKPCtl }, Name }, key_list #undef X }; static const auto kkpmap = std::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ + #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ { KKPDef | (KKPSuffix << 16), KeyId }, key_list #undef X }; static const auto specific_names = utf::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ + #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ { utf::to_lower(#Name), KeyId }, key_list #undef X }; static const auto generic_names = utf::unordered_map { - #define X(KeyId, Index, Vkey, Scan, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ + #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ { utf::to_lower(GenericName), KeyId & -2 }, key_list #undef X @@ -829,6 +926,7 @@ namespace netxs::input si32 virtcod{}; si32 scancod{}; si32 keycode{}; + si32 xlayout{}; bool extflag{}; bool handled{}; si64 touched{}; @@ -1075,7 +1173,7 @@ namespace netxs::input NumLock = 1 << 12, // ⇭ Num Lock CapsLock = 1 << 13, // ⇪ Caps Lock ScrlLock = 1 << 14, // ⇳ Scroll Lock (⤓) - AltGr = 1 << 15, // AltGr on non-us keyboard + AltGr = 1 << 15, // AltGr on non-US keyboards LCtrlAlt = LAlt | LCtrl, anyCtrl = LCtrl | RCtrl, anyAlt = LAlt | RAlt, @@ -2318,16 +2416,6 @@ namespace netxs::input return crop; } }; - struct layout - { - static constexpr auto _counter = __COUNTER__ + 1; - static constexpr auto undef = __COUNTER__ - _counter; - static constexpr auto qwerty = __COUNTER__ - _counter; - static constexpr auto qwertz = __COUNTER__ - _counter; - static constexpr auto azerty = __COUNTER__ - _counter; - static constexpr auto dvorak = __COUNTER__ - _counter; - static constexpr auto bepo = __COUNTER__ - _counter; - }; //todo use lut auto detect_layout(si32 unshift, si32 base) { @@ -2439,7 +2527,7 @@ namespace netxs::input case '[': base = 'z'; break; case ']': base = 'w'; break; // Home Row - //case 'a': base = 'a'; break; // same + //case 'a': base = 'a'; break; // same case 's': base = 'u'; break; case 'd': base = 'i'; break; case 'f': base = 'e'; break; diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index d7d8d837ac..3331dd4fbf 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -556,6 +556,7 @@ namespace netxs::os static constexpr auto paste_begin = 1; static constexpr auto paste_end = 2; static constexpr auto fp2d_mouse = 3; + static constexpr auto kb_layout = 5; } struct fp2d_mouse_input { @@ -569,6 +570,12 @@ namespace netxs::os ui32 id = event::custom | event::style; si32 format; // Style format command. }; + struct layout_input + { + ui32 EventType = MENU_EVENT; + ui32 id = event::custom | event::kb_layout; + si32 klid; // Keyboard layout id. + }; namespace op { static constexpr auto read_io = CTL_CODE(FILE_DEVICE_CONSOLE, 1, METHOD_OUT_DIRECT, FILE_ANY_ACCESS); @@ -5383,7 +5390,7 @@ namespace netxs::os k.extflag = r.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY; k.virtcod = r.Event.KeyEvent.wVirtualKeyCode; k.scancod = r.Event.KeyEvent.wVirtualScanCode; - k.keycode = input::key::xlat(k.virtcod, k.scancod, (si32)r.Event.KeyEvent.dwControlKeyState); + k.keycode = input::key::xlat(k.virtcod, k.scancod, (si32)r.Event.KeyEvent.dwControlKeyState, k.xlayout); k.keystat = r.Event.KeyEvent.bKeyDown ? (chords.exist(k.keycode) ? input::key::repeated : input::key::pressed) : input::key::released; k.cluster = toutf; chords.build(k); @@ -5410,7 +5417,7 @@ namespace netxs::os k.virtcod = r.Event.KeyEvent.wVirtualKeyCode; k.scancod = r.Event.KeyEvent.wVirtualScanCode; k.cluster = toutf; - k.keycode = input::key::xlat(k.virtcod, k.scancod, (si32)r.Event.KeyEvent.dwControlKeyState); + k.keycode = input::key::xlat(k.virtcod, k.scancod, (si32)r.Event.KeyEvent.dwControlKeyState, k.xlayout); if (r.Event.KeyEvent.wRepeatCount-- > 0) { k.keystat = input::key::pressed; @@ -5445,6 +5452,9 @@ namespace netxs::os mouse(m); } break; + case nt::console::event::kb_layout: + k.xlayout = reinterpret_cast(&r)->klid; + break; case nt::console::event::style: style(deco{ reinterpret_cast(&r)->format }); break; From 7cafda1775faa63747a59ef9b7eb6bb05fb3a31e Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sat, 6 Jun 2026 01:11:52 +0500 Subject: [PATCH 12/71] #943 WIP: KKP support (play with layouts) --- src/netxs/desktopio/input.hpp | 262 +++++++++++++++++---------------- src/netxs/desktopio/system.hpp | 15 +- 2 files changed, 148 insertions(+), 129 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 116178f5ff..e08cd1acc5 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -236,127 +236,128 @@ namespace netxs::input X(126, 0x36, 0x36, 0x07, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, AtSign , "@" , 64 , 'u', '@' , '\0' )/*bepo */\ X(128, 0xDD, 0xDD, 0x0D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Percent , "%" , 37 , 'u', '%' , '%' )/*bepo */\ X(130, 0xDF, 0xDF, 0x35, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, ExclamationMark , "!" , 33 , 'u', '!' , '!' )/*azerty*/\ - X(132, 0x31, 0x31, 0x02, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Ampersand , "&" , 38 , 'u', '&' , '&' )/*azerty*/\ - X(134, 0x38, 0x38, 0x09, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Underscore , "_" , 95 , 'u', '_' , '\x1f')/*azerty*/\ - X(136, 0x32, 0x32, 0x03, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, LeftDoubleAngleQuote , "«" , 171 , 'u', -1 , -1 )/*bepo */\ - X(138, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, RightDoubleAngleQuote, "»" , 187 , 'u', -1 , -1 )/*bepo */\ - X(140, 0xDB, 0xDB, 0x2D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Eszett , "ß" , 223 , 'u', -1 , -1 )/*qwertz*/\ - X(142, 0x38, 0x38, 0x09, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteA , "á" , 225 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(144, 0x32, 0x32, 0x03, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteE , "é" , 233 , 'u', -1 , -1 )/*azerty*/\ - X(146, 0x39, 0x39, 0x0A, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteI , "í" , 237 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(148, 0x38, 0x38, 0x09, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteO , "ó" , 243 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(150, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteU , "ú" , 250 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(152, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteY , "ý" , 253 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(154, 0x34, 0x34, 0x05, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DoubleAcuteO , "ő" , 337 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(156, 0x39, 0x39, 0x0A, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CedillaC , "ç" , 231 , 'u', -1 , -1 )/*azerty*/\ - X(158, 0x5A, 0x5A, 0x2C, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CircumflexE , "ê" , 234 , 'u', -1 , -1 )/*bepo */\ - X(160, 0x32, 0x32, 0x03, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, CaronE , "ě" , 283 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(162, 0x33, 0x33, 0x04, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, CaronS , "š" , 353 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(164, 0x34, 0x34, 0x05, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronC , "č" , 269 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(166, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronR , "ř" , 345 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(168, 0x36, 0x36, 0x07, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronZ , "ž" , 282 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(170, 0x32, 0x32, 0x03, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronL , "ľ" , 318 , 'u', -1 , -1 )/*qwertz Slovak*/\ - X(172, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronT , "ť" , 357 , 'u', -1 , -1 )/*qwertz Slovak*/\ - X(174, 0x30, 0x30, 0x0B, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, GraveA , "à" , 224 , 'u', -1 , -1 )/*azerty*/\ - X(176, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, GraveE , "è" , 232 , 'u', -1 , -1 )/*azerty*/\ - X(178, 0xDE, 0xDE, 0x28, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, UmlautA , "ä" , 228 , 'u', -1 , -1 )/*qwertz*/\ - X(180, 0xBF, 0xBF, 0x27, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautO , "ö" , 246 , 'u', -1 , -1 )/*qwertz*/\ - X(182, 0xBA, 0xBA, 0x1A, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautU , "ü" , 252 , 'u', -1 , -1 )/*qwertz*/\ - X(184, 0xBA, 0xBA, 0x27, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, RingU , "ů" , 367 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(186, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, Circumflex , "^" , 94 , 'u', -1 , -1 )/*qwertz*/\ - X(188, 0xDD, 0xDD, 0x0D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, AcuteAccent , "´" , 180 , 'u', -1 , -1 )/*qwertz*/\ - X(190, 0xC0, 0xC0, 0x29, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, GraveAccent , "`" , 96 , 'u', -1 , -1 )/*bepo */\ - X(192, 0xDD, 0xDD, 0x1A, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, Umlaut , "¨" , 168 , 'u', -1 , -1 )/*azerty*/\ - X(194, 0x4E, 0x4E, 0x31, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningTilde , "~" , 771 , 'u', -1 , -1 )/*bepo */\ - X(196, 0xDC, 0xDC, 0x29, 0x0040E, 0, 0x0000'FFFFF'00'FF, 0, CombiningCaron , "ˇ" , 780 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(198, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningBreve , "˘" , 774 , 'u', -1 , -1 )/*bepo French*/\ - X(200, 0xDE, 0xDE, 0x28, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningOgonek , "˛" , 731 , 'u', -1 , -1 )/*bepo French*/\ - X(202, 0x70, 0x70, 0x3B, 0x00409, 0, 0x0000'00000'00'FF, 1, F1 , "F1" , 11 , '~', -1 , -1 )\ - X(204, 0x71, 0x71, 0x3C, 0x00409, 0, 0x0000'00000'00'FF, 1, F2 , "F2" , 12 , '~', -1 , -1 )\ - X(206, 0x72, 0x72, 0x3D, 0x00409, 0, 0x0000'00000'00'FF, 1, F3 , "F3" , 13 , '~', -1 , -1 )\ - X(208, 0x73, 0x73, 0x3E, 0x00409, 0, 0x0000'00000'00'FF, 1, F4 , "F4" , 14 , '~', -1 , -1 )\ - X(210, 0x74, 0x74, 0x3F, 0x00409, 0, 0x0000'00000'00'FF, 1, F5 , "F5" , 15 , '~', -1 , -1 )\ - X(212, 0x75, 0x75, 0x40, 0x00409, 0, 0x0000'00000'00'FF, 1, F6 , "F6" , 17 , '~', -1 , -1 )\ - X(214, 0x76, 0x76, 0x41, 0x00409, 0, 0x0000'00000'00'FF, 1, F7 , "F7" , 18 , '~', -1 , -1 )\ - X(216, 0x77, 0x77, 0x42, 0x00409, 0, 0x0000'00000'00'FF, 1, F8 , "F8" , 19 , '~', -1 , -1 )\ - X(218, 0x78, 0x78, 0x43, 0x00409, 0, 0x0000'00000'00'FF, 1, F9 , "F9" , 20 , '~', -1 , -1 )\ - X(220, 0x79, 0x79, 0x44, 0x00409, 0, 0x0000'00000'00'FF, 1, F10 , "F10" , 21 , '~', -1 , -1 )\ - X(222, 0x7A, 0x7A, 0x57, 0x00409, 0, 0x0000'00000'00'FF, 1, F11 , "F11" , 23 , '~', -1 , -1 )\ - X(224, 0x7B, 0x7B, 0x5B, 0x00409, 0, 0x0000'00000'00'FF, 1, F12 , "F12" , 24 , '~', -1 , -1 )\ - X(226, 0x7C, 0x7C, 0, 0x00409, 0, 0x0000'00000'00'FF, 1, F13 , "F13" , 57376, 'u', -1 , -1 )\ - X(228, 0x7D, 0x7D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F14 , "F14" , 57377, 'u', -1 , -1 )\ - X(230, 0x7E, 0x7E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F15 , "F15" , 57378, 'u', -1 , -1 )\ - X(232, 0x7F, 0x7F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F16 , "F16" , 57379, 'u', -1 , -1 )\ - X(234, 0x80, 0x80, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F17 , "F17" , 57380, 'u', -1 , -1 )\ - X(236, 0x81, 0x81, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F18 , "F18" , 57381, 'u', -1 , -1 )\ - X(238, 0x82, 0x82, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F19 , "F19" , 57382, 'u', -1 , -1 )\ - X(240, 0x83, 0x83, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F20 , "F20" , 57383, 'u', -1 , -1 )\ - X(242, 0x84, 0x84, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F21 , "F21" , 57384, 'u', -1 , -1 )\ - X(244, 0x85, 0x85, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F22 , "F22" , 57385, 'u', -1 , -1 )\ - X(246, 0x86, 0x86, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F23 , "F23" , 57386, 'u', -1 , -1 )\ - X(248, 0x87, 0x87, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F24 , "F24" , 57387, 'u', -1 , -1 )\ - X(250, 0x7D, 0x7D, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F25 , "F25" , 57388, 'u', -1 , -1 )\ - X(252, 0x7E, 0x7E, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F26 , "F26" , 57389, 'u', -1 , -1 )\ - X(254, 0x7F, 0x7F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F27 , "F27" , 57390, 'u', -1 , -1 )\ - X(256, 0x80, 0x80, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F28 , "F28" , 57391, 'u', -1 , -1 )\ - X(258, 0x81, 0x81, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F29 , "F29" , 57392, 'u', -1 , -1 )\ - X(260, 0x82, 0x82, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F30 , "F30" , 57393, 'u', -1 , -1 )\ - X(262, 0x83, 0x83, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F31 , "F31" , 57394, 'u', -1 , -1 )\ - X(264, 0x84, 0x84, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F32 , "F32" , 57395, 'u', -1 , -1 )\ - X(266, 0x85, 0x85, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F33 , "F33" , 57396, 'u', -1 , -1 )\ - X(268, 0x86, 0x86, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F34 , "F34" , 57397, 'u', -1 , -1 )\ - X(270, 0x87, 0x87, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F35 , "F35" , 57398, 'u', -1 , -1 )\ - X(272, 0x41, 0x41, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyA , "A" , 97 , 'u', 'a' , '\x01')\ - X(274, 0x42, 0x42, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyB , "B" , 98 , 'u', 'b' , '\x02')\ - X(276, 0x43, 0x43, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyC , "C" , 99 , 'u', 'c' , '\x03')\ - X(278, 0x44, 0x44, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyD , "D" , 100 , 'u', 'd' , '\x04')\ - X(280, 0x45, 0x45, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyE , "E" , 101 , 'u', 'e' , '\x05')\ - X(282, 0x46, 0x46, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyF , "F" , 102 , 'u', 'f' , '\x06')\ - X(284, 0x47, 0x47, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyG , "G" , 103 , 'u', 'g' , '\x07')\ - X(286, 0x48, 0x48, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyH , "H" , 104 , 'u', 'h' , '\x08')\ - X(288, 0x49, 0x49, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyI , "I" , 105 , 'u', 'i' , '\x09')\ - X(290, 0x4A, 0x4A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyJ , "J" , 106 , 'u', 'j' , '\x0a')\ - X(292, 0x4B, 0x4B, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyK , "K" , 107 , 'u', 'k' , '\x0b')\ - X(294, 0x4C, 0x4C, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyL , "L" , 108 , 'u', 'l' , '\x0c')\ - X(296, 0x4D, 0x4D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyM , "M" , 109 , 'u', 'm' , '\x0d')\ - X(298, 0x4E, 0x4E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyN , "N" , 110 , 'u', 'n' , '\x0e')\ - X(300, 0x4F, 0x4F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyO , "O" , 111 , 'u', 'o' , '\x0f')\ - X(302, 0x50, 0x50, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyP , "P" , 112 , 'u', 'p' , '\x10')\ - X(304, 0x51, 0x51, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyQ , "Q" , 113 , 'u', 'q' , '\x11')\ - X(306, 0x52, 0x52, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyR , "R" , 114 , 'u', 'r' , '\x12')\ - X(308, 0x53, 0x53, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyS , "S" , 115 , 'u', 's' , '\x13')\ - X(310, 0x54, 0x54, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyT , "T" , 116 , 'u', 't' , '\x14')\ - X(312, 0x55, 0x55, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyU , "U" , 117 , 'u', 'u' , '\x15')\ - X(314, 0x56, 0x56, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyV , "V" , 118 , 'u', 'v' , '\x16')\ - X(316, 0x57, 0x57, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyW , "W" , 119 , 'u', 'w' , '\x17')\ - X(318, 0x58, 0x58, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyX , "X" , 120 , 'u', 'x' , '\x18')\ - X(320, 0x59, 0x59, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyY , "Y" , 121 , 'u', 'y' , '\x19')\ - X(322, 0x5A, 0x5A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyZ , "Z" , 122 , 'u', 'z' , '\x1a')\ - X(324, 0x5F, 0x5F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Sleep , "Sleep" , 0 , 'u', -1 , -1 )\ - X(326, 0xB7, 0xB7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Calculator , "Calculator" , 0 , 'u', -1 , -1 )\ - X(328, 0x48, 0x48, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Mail , "Mail" , 0 , 'u', -1 , -1 )\ - X(330, 0xAD, 0xAD, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440, 'u', -1 , -1 )\ - X(332, 0xAE, 0xAE, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438, 'u', -1 , -1 )\ - X(334, 0xAF, 0xAF, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439, 'u', -1 , -1 )\ - X(336, 0xB0, 0xB0, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaNext , "MediaNext" , 57435, 'u', -1 , -1 )\ - X(338, 0xB1, 0xB1, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPrev , "MediaPrev" , 57436, 'u', -1 , -1 )\ - X(340, 0xB2, 0xB2, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaStop , "MediaStop" , 57432, 'u', -1 , -1 )\ - X(342, 0xB2, 0xB2, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPause , "MediaPause" , 57429, 'u', -1 , -1 )\ - X(344, 0xB3, 0xB3, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430, 'u', -1 , -1 )\ - X(346, 0xB3, 0xB3, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPlay , "MediaPlay" , 57428, 'u', -1 , -1 )\ - X(348, 0xB5, 0xB5, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaSelect , "MediaSelect" , 0 , 'u', -1 , -1 )\ - X(350, 0xB8, 0xB8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaReverse , "MediaReverse" , 57431, 'u', -1 , -1 )\ - X(352, 0xB8, 0xB8, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRecord , "MediaRecord" , 57437, 'u', -1 , -1 )\ - X(354, 0xB9, 0xB9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaFastForward , "MediaFastForward", 57433, 'u', -1 , -1 )\ - X(356, 0xB9, 0xB9, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRewind , "MediaRewind" , 57434, 'u', -1 , -1 )\ - X(368, 0xA6, 0xA6, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserBack , "BrowserBack" , 0 , 'u', -1 , -1 )\ - X(360, 0xA7, 0xA7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserForward , "BrowserForward" , 0 , 'u', -1 , -1 )\ - X(362, 0xA8, 0xA8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 , 'u', -1 , -1 )\ - X(364, 0xA9, 0xA9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserStop , "BrowserStop" , 0 , 'u', -1 , -1 )\ - X(366, 0xAA, 0xAA, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 , 'u', -1 , -1 )\ - X(368, 0xAB, 0xAB, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserFavorites , "BrowserFavorites", 0 , 'u', -1 , -1 )\ - X(370, 0xAC, 0xAC, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserHome , "BrowserHome" , 0 , 'u', -1 , -1 )\ - X(372, 0xFF, 0xFF, 0xFF, 0x00000, ExtendedKey, 0x0100'FFFFF'FF'FF, 0, lastKey , "lastKey" , 0 , 0 , -1 , -1 ) + X(132, 0xBF, 0xBF, 0x2B, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, NumberSign , "#" , 35 , 'u', '#' , '#' )/*qwertz*/\ + X(134, 0x31, 0x31, 0x02, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Ampersand , "&" , 38 , 'u', '&' , '&' )/*azerty*/\ + X(136, 0x38, 0x38, 0x09, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Underscore , "_" , 95 , 'u', '_' , '\x1f')/*azerty*/\ + X(138, 0x32, 0x32, 0x03, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, LeftDoubleAngleQuote , "«" , 171 , 'u', -1 , -1 )/*bepo */\ + X(140, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, RightDoubleAngleQuote, "»" , 187 , 'u', -1 , -1 )/*bepo */\ + X(142, 0xDB, 0xDB, 0x2D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Eszett , "ß" , 223 , 'u', -1 , -1 )/*qwertz*/\ + X(144, 0x38, 0x38, 0x09, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteA , "á" , 225 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(146, 0x32, 0x32, 0x03, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteE , "é" , 233 , 'u', -1 , -1 )/*azerty*/\ + X(148, 0x39, 0x39, 0x0A, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteI , "í" , 237 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(150, 0x38, 0x38, 0x09, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteO , "ó" , 243 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(152, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteU , "ú" , 250 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(154, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteY , "ý" , 253 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(156, 0x34, 0x34, 0x05, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DoubleAcuteO , "ő" , 337 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(158, 0x39, 0x39, 0x0A, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CedillaC , "ç" , 231 , 'u', -1 , -1 )/*azerty*/\ + X(160, 0x5A, 0x5A, 0x2C, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CircumflexE , "ê" , 234 , 'u', -1 , -1 )/*bepo */\ + X(162, 0x32, 0x32, 0x03, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, CaronE , "ě" , 283 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(164, 0x33, 0x33, 0x04, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, CaronS , "š" , 353 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(166, 0x34, 0x34, 0x05, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronC , "č" , 269 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(168, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronR , "ř" , 345 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(170, 0x36, 0x36, 0x07, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronZ , "ž" , 282 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(172, 0x32, 0x32, 0x03, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronL , "ľ" , 318 , 'u', -1 , -1 )/*qwertz Slovak*/\ + X(174, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronT , "ť" , 357 , 'u', -1 , -1 )/*qwertz Slovak*/\ + X(176, 0x30, 0x30, 0x0B, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, GraveA , "à" , 224 , 'u', -1 , -1 )/*azerty*/\ + X(178, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, GraveE , "è" , 232 , 'u', -1 , -1 )/*azerty*/\ + X(180, 0xDE, 0xDE, 0x28, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, UmlautA , "ä" , 228 , 'u', -1 , -1 )/*qwertz*/\ + X(182, 0xBF, 0xBF, 0x27, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautO , "ö" , 246 , 'u', -1 , -1 )/*qwertz*/\ + X(184, 0xBA, 0xBA, 0x1A, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautU , "ü" , 252 , 'u', -1 , -1 )/*qwertz*/\ + X(186, 0xBA, 0xBA, 0x27, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, RingU , "ů" , 367 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(188, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, Circumflex , "^" , 94 , 'u', -1 , -1 )/*qwertz*/\ + X(190, 0xDD, 0xDD, 0x0D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, AcuteAccent , "´" , 180 , 'u', -1 , -1 )/*qwertz*/\ + X(192, 0xC0, 0xC0, 0x29, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, GraveAccent , "`" , 96 , 'u', -1 , -1 )/*bepo */\ + X(194, 0xDD, 0xDD, 0x1A, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, Umlaut , "¨" , 168 , 'u', -1 , -1 )/*azerty*/\ + X(196, 0x4E, 0x4E, 0x31, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningTilde , "~" , 771 , 'u', -1 , -1 )/*bepo */\ + X(198, 0xDC, 0xDC, 0x29, 0x0040E, 0, 0x0000'FFFFF'00'FF, 0, CombiningCaron , "ˇ" , 780 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(200, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningBreve , "˘" , 774 , 'u', -1 , -1 )/*bepo French*/\ + X(202, 0xDE, 0xDE, 0x28, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningOgonek , "˛" , 731 , 'u', -1 , -1 )/*bepo French*/\ + X(204, 0x70, 0x70, 0x3B, 0x00409, 0, 0x0000'00000'00'FF, 1, F1 , "F1" , 11 , '~', -1 , -1 )\ + X(206, 0x71, 0x71, 0x3C, 0x00409, 0, 0x0000'00000'00'FF, 1, F2 , "F2" , 12 , '~', -1 , -1 )\ + X(208, 0x72, 0x72, 0x3D, 0x00409, 0, 0x0000'00000'00'FF, 1, F3 , "F3" , 13 , '~', -1 , -1 )\ + X(210, 0x73, 0x73, 0x3E, 0x00409, 0, 0x0000'00000'00'FF, 1, F4 , "F4" , 14 , '~', -1 , -1 )\ + X(212, 0x74, 0x74, 0x3F, 0x00409, 0, 0x0000'00000'00'FF, 1, F5 , "F5" , 15 , '~', -1 , -1 )\ + X(214, 0x75, 0x75, 0x40, 0x00409, 0, 0x0000'00000'00'FF, 1, F6 , "F6" , 17 , '~', -1 , -1 )\ + X(216, 0x76, 0x76, 0x41, 0x00409, 0, 0x0000'00000'00'FF, 1, F7 , "F7" , 18 , '~', -1 , -1 )\ + X(218, 0x77, 0x77, 0x42, 0x00409, 0, 0x0000'00000'00'FF, 1, F8 , "F8" , 19 , '~', -1 , -1 )\ + X(220, 0x78, 0x78, 0x43, 0x00409, 0, 0x0000'00000'00'FF, 1, F9 , "F9" , 20 , '~', -1 , -1 )\ + X(222, 0x79, 0x79, 0x44, 0x00409, 0, 0x0000'00000'00'FF, 1, F10 , "F10" , 21 , '~', -1 , -1 )\ + X(224, 0x7A, 0x7A, 0x57, 0x00409, 0, 0x0000'00000'00'FF, 1, F11 , "F11" , 23 , '~', -1 , -1 )\ + X(226, 0x7B, 0x7B, 0x5B, 0x00409, 0, 0x0000'00000'00'FF, 1, F12 , "F12" , 24 , '~', -1 , -1 )\ + X(228, 0x7C, 0x7C, 0, 0x00409, 0, 0x0000'00000'00'FF, 1, F13 , "F13" , 57376, 'u', -1 , -1 )\ + X(230, 0x7D, 0x7D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F14 , "F14" , 57377, 'u', -1 , -1 )\ + X(232, 0x7E, 0x7E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F15 , "F15" , 57378, 'u', -1 , -1 )\ + X(234, 0x7F, 0x7F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F16 , "F16" , 57379, 'u', -1 , -1 )\ + X(236, 0x80, 0x80, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F17 , "F17" , 57380, 'u', -1 , -1 )\ + X(238, 0x81, 0x81, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F18 , "F18" , 57381, 'u', -1 , -1 )\ + X(240, 0x82, 0x82, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F19 , "F19" , 57382, 'u', -1 , -1 )\ + X(242, 0x83, 0x83, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F20 , "F20" , 57383, 'u', -1 , -1 )\ + X(244, 0x84, 0x84, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F21 , "F21" , 57384, 'u', -1 , -1 )\ + X(246, 0x85, 0x85, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F22 , "F22" , 57385, 'u', -1 , -1 )\ + X(248, 0x86, 0x86, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F23 , "F23" , 57386, 'u', -1 , -1 )\ + X(250, 0x87, 0x87, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F24 , "F24" , 57387, 'u', -1 , -1 )\ + X(252, 0x7D, 0x7D, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F25 , "F25" , 57388, 'u', -1 , -1 )\ + X(254, 0x7E, 0x7E, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F26 , "F26" , 57389, 'u', -1 , -1 )\ + X(256, 0x7F, 0x7F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F27 , "F27" , 57390, 'u', -1 , -1 )\ + X(258, 0x80, 0x80, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F28 , "F28" , 57391, 'u', -1 , -1 )\ + X(260, 0x81, 0x81, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F29 , "F29" , 57392, 'u', -1 , -1 )\ + X(262, 0x82, 0x82, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F30 , "F30" , 57393, 'u', -1 , -1 )\ + X(264, 0x83, 0x83, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F31 , "F31" , 57394, 'u', -1 , -1 )\ + X(266, 0x84, 0x84, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F32 , "F32" , 57395, 'u', -1 , -1 )\ + X(268, 0x85, 0x85, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F33 , "F33" , 57396, 'u', -1 , -1 )\ + X(270, 0x86, 0x86, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F34 , "F34" , 57397, 'u', -1 , -1 )\ + X(272, 0x87, 0x87, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F35 , "F35" , 57398, 'u', -1 , -1 )\ + X(274, 0x41, 0x41, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyA , "A" , 97 , 'u', 'a' , '\x01')\ + X(276, 0x42, 0x42, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyB , "B" , 98 , 'u', 'b' , '\x02')\ + X(278, 0x43, 0x43, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyC , "C" , 99 , 'u', 'c' , '\x03')\ + X(280, 0x44, 0x44, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyD , "D" , 100 , 'u', 'd' , '\x04')\ + X(282, 0x45, 0x45, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyE , "E" , 101 , 'u', 'e' , '\x05')\ + X(284, 0x46, 0x46, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyF , "F" , 102 , 'u', 'f' , '\x06')\ + X(286, 0x47, 0x47, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyG , "G" , 103 , 'u', 'g' , '\x07')\ + X(288, 0x48, 0x48, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyH , "H" , 104 , 'u', 'h' , '\x08')\ + X(290, 0x49, 0x49, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyI , "I" , 105 , 'u', 'i' , '\x09')\ + X(292, 0x4A, 0x4A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyJ , "J" , 106 , 'u', 'j' , '\x0a')\ + X(294, 0x4B, 0x4B, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyK , "K" , 107 , 'u', 'k' , '\x0b')\ + X(296, 0x4C, 0x4C, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyL , "L" , 108 , 'u', 'l' , '\x0c')\ + X(298, 0x4D, 0x4D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyM , "M" , 109 , 'u', 'm' , '\x0d')\ + X(300, 0x4E, 0x4E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyN , "N" , 110 , 'u', 'n' , '\x0e')\ + X(302, 0x4F, 0x4F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyO , "O" , 111 , 'u', 'o' , '\x0f')\ + X(304, 0x50, 0x50, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyP , "P" , 112 , 'u', 'p' , '\x10')\ + X(306, 0x51, 0x51, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyQ , "Q" , 113 , 'u', 'q' , '\x11')\ + X(308, 0x52, 0x52, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyR , "R" , 114 , 'u', 'r' , '\x12')\ + X(310, 0x53, 0x53, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyS , "S" , 115 , 'u', 's' , '\x13')\ + X(312, 0x54, 0x54, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyT , "T" , 116 , 'u', 't' , '\x14')\ + X(314, 0x55, 0x55, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyU , "U" , 117 , 'u', 'u' , '\x15')\ + X(316, 0x56, 0x56, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyV , "V" , 118 , 'u', 'v' , '\x16')\ + X(318, 0x57, 0x57, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyW , "W" , 119 , 'u', 'w' , '\x17')\ + X(320, 0x58, 0x58, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyX , "X" , 120 , 'u', 'x' , '\x18')\ + X(322, 0x59, 0x59, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyY , "Y" , 121 , 'u', 'y' , '\x19')\ + X(324, 0x5A, 0x5A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyZ , "Z" , 122 , 'u', 'z' , '\x1a')\ + X(326, 0x5F, 0x5F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Sleep , "Sleep" , 0 , 'u', -1 , -1 )\ + X(328, 0xB7, 0xB7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Calculator , "Calculator" , 0 , 'u', -1 , -1 )\ + X(330, 0x48, 0x48, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Mail , "Mail" , 0 , 'u', -1 , -1 )\ + X(332, 0xAD, 0xAD, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440, 'u', -1 , -1 )\ + X(334, 0xAE, 0xAE, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438, 'u', -1 , -1 )\ + X(336, 0xAF, 0xAF, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439, 'u', -1 , -1 )\ + X(338, 0xB0, 0xB0, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaNext , "MediaNext" , 57435, 'u', -1 , -1 )\ + X(340, 0xB1, 0xB1, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPrev , "MediaPrev" , 57436, 'u', -1 , -1 )\ + X(342, 0xB2, 0xB2, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaStop , "MediaStop" , 57432, 'u', -1 , -1 )\ + X(344, 0xB2, 0xB2, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPause , "MediaPause" , 57429, 'u', -1 , -1 )\ + X(346, 0xB3, 0xB3, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430, 'u', -1 , -1 )\ + X(348, 0xB3, 0xB3, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPlay , "MediaPlay" , 57428, 'u', -1 , -1 )\ + X(350, 0xB5, 0xB5, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaSelect , "MediaSelect" , 0 , 'u', -1 , -1 )\ + X(352, 0xB8, 0xB8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaReverse , "MediaReverse" , 57431, 'u', -1 , -1 )\ + X(354, 0xB8, 0xB8, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRecord , "MediaRecord" , 57437, 'u', -1 , -1 )\ + X(356, 0xB9, 0xB9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaFastForward , "MediaFastForward", 57433, 'u', -1 , -1 )\ + X(368, 0xB9, 0xB9, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRewind , "MediaRewind" , 57434, 'u', -1 , -1 )\ + X(360, 0xA6, 0xA6, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserBack , "BrowserBack" , 0 , 'u', -1 , -1 )\ + X(362, 0xA7, 0xA7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserForward , "BrowserForward" , 0 , 'u', -1 , -1 )\ + X(364, 0xA8, 0xA8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 , 'u', -1 , -1 )\ + X(366, 0xA9, 0xA9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserStop , "BrowserStop" , 0 , 'u', -1 , -1 )\ + X(368, 0xAA, 0xAA, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 , 'u', -1 , -1 )\ + X(370, 0xAB, 0xAB, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserFavorites , "BrowserFavorites", 0 , 'u', -1 , -1 )\ + X(372, 0xAC, 0xAC, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserHome , "BrowserHome" , 0 , 'u', -1 , -1 )\ + X(374, 0xFF, 0xFF, 0xFF, 0x00000, ExtendedKey, 0x0100'FFFFF'FF'FF, 0, lastKey , "lastKey" , 0 , 0 , -1 , -1 ) // Max 12 bits for KeyId. static constexpr auto idbits = 12; @@ -2433,15 +2434,20 @@ namespace netxs::input } } } - //if (unshift == 'q' && base == 'q') return layout::qwerty; - //if (unshift == 'w' && base == 'w') return layout::qwerty; - //if (unshift == 'y' && base == 'y') return layout::qwerty; - //if (unshift == 'z' && base == 'z') return layout::qwerty; - //if (unshift == ',' && base == ',') return layout::qwerty; - //if (unshift == '.' && base == '.') return layout::qwerty; // QWERTZ: if (unshift == 'z' && base == 'y') return layout::qwertz; if (unshift == 'y' && base == 'z') return layout::qwertz; + if (unshift == '+' && base == ']') return layout::qwertz; + if (unshift == '-' && base == '/') return layout::qwertz; + if (unshift == '^' && base == '`') return layout::qwertz; + if (unshift == '#' && base =='\\') return layout::qwertz; // # <- \ // + if (unshift == 180 && base == '=') return layout::qwertz; // ´ <- = Deadkey + if (unshift == 228 && base =='\'') return layout::qwertz; // ä <- ' + if (unshift == 223 && base == '-') return layout::qwertz; // ß <- - + if (unshift == 252 && base == '[') return layout::qwertz; // ü <- [ + if (unshift == 367 && base == ';') return layout::qwertz; // ů <- ; Czech QWERTZ + if (unshift == 246 && base == ';') return layout::qwertz; // ö <- ; + if (unshift == 337 && base == '4') return layout::qwertz; // ő <- 4 Hungarian // AZERTY: if (unshift == 'a' && base == 'q') return layout::azerty; if (unshift == 'q' && base == 'a') return layout::azerty; @@ -2453,6 +2459,7 @@ namespace netxs::input if (unshift == '"' && base == '3') return layout::azerty; if (unshift =='\'' && base == '4') return layout::azerty; if (unshift == '(' && base == '5') return layout::azerty; + if (unshift == ')' && base == '-') return layout::azerty; if (unshift == '-' && base == '6') return layout::azerty; if (unshift == 232 && base == '7') return layout::azerty; // è if (unshift == '_' && base == '8') return layout::azerty; @@ -2467,6 +2474,7 @@ namespace netxs::input if (unshift == 'u' && base == 'f') return layout::dvorak; if (unshift == 'i' && base == 'g') return layout::dvorak; if (unshift == 'd' && base == 'h') return layout::dvorak; + if (unshift =='\'' && base == 'q') return layout::dvorak; // BEPO: if (unshift == '"' && base == '1') return layout::bepo; if (unshift == 171 && base == '2') return layout::bepo; // « diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 3331dd4fbf..fe074fc7d9 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -6096,8 +6096,19 @@ namespace netxs::os case input::key::layout::qwerty: break; case input::key::layout::qwertz: - if (base_key == 'y') base_key = 'z'; - else if (base_key == 'z') base_key = 'y'; + if (unshift_code == 'z' && base_key == 'y') base_key = unshift_code; + else if (unshift_code == 'y' && base_key == 'z') base_key = unshift_code; + else if (unshift_code == '+' && base_key == ']') base_key = unshift_code; + else if (unshift_code == '-' && base_key == '/') base_key = unshift_code; + else if (unshift_code == '^' && base_key == '`') base_key = unshift_code; + else if (unshift_code == '#' && base_key =='\\') base_key = unshift_code; // # <- \ // + else if (unshift_code == 180 && base_key == '=') base_key = unshift_code; // ´ <- = + else if (unshift_code == 228 && base_key =='\'') base_key = unshift_code; // ä <- ' + else if (unshift_code == 223 && base_key == '-') base_key = unshift_code; // ß <- - + else if (unshift_code == 252 && base_key == '[') base_key = unshift_code; // ü <- [ + else if (unshift_code == 367 && base_key == ';') base_key = unshift_code; // ů <- ; Czech QWERTZ + else if (unshift_code == 246 && base_key == ';') base_key = unshift_code; // ö <- ; + else if (unshift_code == 337 && base_key == '4') base_key = unshift_code; // ő <- 4 Hungarian break; case input::key::layout::azerty: if (base_key == 'q') base_key = 'a'; From 2bccd565a0c52b74f690cd69d38f9d13338bcf1e Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Wed, 10 Jun 2026 00:38:15 +0500 Subject: [PATCH 13/71] #943 WIP: KKP support (rename Left/RightWin to Left/RightSuper) +selection_cancel --- doc/vt-input-mode.md | 4 +- src/netxs/apps/desk.hpp | 2 +- src/netxs/desktopio/gui.hpp | 16 +- src/netxs/desktopio/input.hpp | 284 ++++++++++++++++--------------- src/netxs/desktopio/intmath.hpp | 37 ++-- src/netxs/desktopio/system.hpp | 30 ++-- src/netxs/desktopio/terminal.hpp | 6 +- 7 files changed, 202 insertions(+), 177 deletions(-) diff --git a/doc/vt-input-mode.md b/doc/vt-input-mode.md index 1ab37f4bb1..ff0fda9850 100644 --- a/doc/vt-input-mode.md +++ b/doc/vt-input-mode.md @@ -215,8 +215,8 @@ Key ID | Name | Generic Name | Scan Code | Notes 5 | `RightAlt` | `Alt` | `0x0138` | 6 | `LeftShift` | `Shift` | `0x002A` | 7 | `RightShift` | `Shift` | `0x0036` | -8 | `LeftWin` | `Win` | `0x015B` | -9 | `RightWin` | `Win` | `0x015C` | +8 | `LeftSuper` | `Super` | `0x015B` | +9 | `RightSuper` | `Super` | `0x015C` | 10 | `Apps` | `Apps` | `0x015D` | 12 | `NumLock` | `NumLock` | `0x0045` | 14 | `CapsLock` | `CapsLock` | `0x003A` | diff --git a/src/netxs/apps/desk.hpp b/src/netxs/apps/desk.hpp index 51da1d8d83..78d9acdf5b 100644 --- a/src/netxs/apps/desk.hpp +++ b/src/netxs/apps/desk.hpp @@ -344,7 +344,7 @@ namespace netxs::app::desk }); boss.on(tier::mouserelease, input::key::LeftClick, [&, inst_id, group_focus = faux](hids& gear) mutable { - if (gear.meta(hids::anyCtrl | hids::anyAlt | hids::anyShift | hids::anyWin)) // Not supported with any modifier but Ctrl. + if (gear.meta(hids::anyCtrl | hids::anyAlt | hids::anyShift | hids::anySuper | hids::anyHyper)) // Not supported with any modifier but Ctrl. { if (gear.meta(hids::anyCtrl)) // Toggle group focus. { diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 4740099460..a8591cd210 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3032,8 +3032,8 @@ namespace netxs::gui static constexpr auto rcontrol = 0xA3; // VK_RCONTROL; static constexpr auto lalt = 0xA4; // VK_LMENU; static constexpr auto ralt = 0xA5; // VK_RMENU; - static constexpr auto lwin = 0x5B; // VK_LWIN; - static constexpr auto rwin = 0x5C; // VK_RWIN; + static constexpr auto lsuper = 0x5B; // VK_LWIN; + static constexpr auto rsuper = 0x5C; // VK_RWIN; static constexpr auto enter = 0x0D; // VK_RETURN; static constexpr auto left = 0x25; // VK_LEFT; @@ -4288,8 +4288,8 @@ namespace netxs::gui if (keybd_read_pressed(vkey::rcontrol)) state |= input::hids::RCtrl; if (keybd_read_pressed(vkey::lalt )) state |= input::hids::LAlt; if (keybd_read_pressed(vkey::ralt )) state |= input::hids::RAlt; - if (keybd_read_pressed(vkey::lwin )) state |= input::hids::LWin; - if (keybd_read_pressed(vkey::rwin )) state |= input::hids::RWin; + if (keybd_read_pressed(vkey::lsuper )) state |= input::hids::LSuper; + if (keybd_read_pressed(vkey::rsuper )) state |= input::hids::RSuper; if (keybd_read_toggled(vkey::capslock)) state |= input::hids::CapsLock; if (keybd_read_toggled(vkey::scrllock)) state |= input::hids::ScrlLock; if (keybd_read_toggled(vkey::numlock )) state |= input::hids::NumLock; @@ -4595,8 +4595,8 @@ namespace netxs::gui if (keybd_test_pressed(vkey::rcontrol)) state |= input::hids::RCtrl; if (keybd_test_pressed(vkey::lalt )) state |= input::hids::LAlt; if (keybd_test_pressed(vkey::ralt )) state |= input::hids::RAlt; - if (keybd_test_pressed(vkey::lwin )) state |= input::hids::LWin; - if (keybd_test_pressed(vkey::rwin )) state |= input::hids::RWin; + if (keybd_test_pressed(vkey::lsuper )) state |= input::hids::LSuper; + if (keybd_test_pressed(vkey::rsuper )) state |= input::hids::RSuper; if (keybd_test_pressed(vkey::control )) mouse_capture(by::keybd); // Capture mouse if Ctrl modifier is pressed (to catch Ctrl+AnyClick outside the window). else mouse_release(by::keybd); auto old_ls = keymod & input::hids::LShift; @@ -4706,7 +4706,7 @@ namespace netxs::gui if constexpr (debugmode) log("shifted='%%' unshift='%%'", gear.shifted, gear.unshift); auto repeat_ctrl = keystat == input::key::repeated && (virtcod == vkey::shift || virtcod == vkey::control || virtcod == vkey::alt || virtcod == vkey::capslock || virtcod == vkey::numlock || virtcod == vkey::scrllock - || virtcod == vkey::lwin || virtcod == vkey::rwin); + || virtcod == vkey::lsuper || virtcod == vkey::rsuper); //print_vkstat("keybd_send_state"); if (changed || (!repeat_ctrl && (scancod != 0 || !cluster.empty()))) // We don't send repeated modifiers. { @@ -5736,7 +5736,7 @@ namespace netxs::gui } else { - if (keybd_test_pressed(vkey::rwin) || keybd_test_pressed(vkey::lwin)) keybd_sync_state(); // Hack: Unstick the Win key when switching to the same keyboard layout using Win+Space. + if (keybd_test_pressed(vkey::rsuper) || keybd_test_pressed(vkey::lsuper)) keybd_sync_state(); // Hack: Unstick the Win key when switching to the same keyboard layout using Win+Space. ::DispatchMessageW(&winmsg); } } diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index e08cd1acc5..8c7efd83cf 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -143,8 +143,8 @@ namespace netxs::input X( 5, 0xA5, 0x12, 0x38, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, RightAlt , "Alt" , 57449, 'u', -1 , -1 )\ X(6, 0xA0, 0x10, 0x2A, 0x00409, 0, 0x0000'00000'FF'FF, 0, LeftShift , "Shift" , 57441, 'u', -1 , -1 )\ X( 7, 0xA1, 0x10, 0x36, 0x00409, 0, 0x0000'00000'FF'FF, 0, RightShift , "Shift" , 57447, 'u', -1 , -1 )\ - X(8, 0x5B, 0x5B, 0x5B, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, LeftWin , "Win" , 57444, 'u', -1 , -1 )\ - X( 9, 0x5C, 0x5C, 0x5C, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, RightWin , "Win" , 57450, 'u', -1 , -1 )\ + X(8, 0x5B, 0x5B, 0x5B, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, LeftSuper , "Super" , 57444, 'u', -1 , -1 )\ + X( 9, 0x5C, 0x5C, 0x5C, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, RightSuper , "Super" , 57450, 'u', -1 , -1 )\ X(10, 0x5B, 0x5B, 0x5B, 0x00409, 0, 0x0100'00000'00'FF, 0, LeftHyper , "Hyper" , 57445, 'u', -1 , -1 )\ X( 11, 0x5C, 0x5C, 0x5C, 0x00409, 0, 0x0100'00000'00'FF, 0, RightHyper , "Hyper" , 57451, 'u', -1 , -1 )\ X(12, 0x5D, 0x5D, 0x5D, 0x00409, ExtendedKey, 0x0000'00000'00'FF, 0, Apps , "Apps" , 57363, 'u', -1 , -1 )\ @@ -222,142 +222,156 @@ namespace netxs::input X( 99, 0xBB, 0xBB, 0x0D, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, NumpadEqual , "=" , 57415, 'u', '=' , '=' )\ X(100, 0xDC, 0xDC, 0x2B, 0x00409, 0, 0x0000'00000'00'FF, 1, BackSlash , "BackSlash" , 92 , 'u', '\\' , '\x1c')\ X(102, 0xDB, 0xDB, 0x1A, 0x00409, 0, 0x0000'00000'00'FF, 1, OpenBracket , "[" , 91 , 'u', '[' , '\x1b')\ - X(104, 0xDD, 0xDD, 0x1B, 0x00409, 0, 0x0000'00000'00'FF, 1, ClosedBracket , "]" , 93 , 'u', ']' , '\x1d')\ + X(104, 0xDD, 0xDD, 0x1B, 0x00409, 0, 0x0000'00000'00'FF, 1, CloseBracket , "]" , 93 , 'u', ']' , '\x1d')\ X(106, 0xC0, 0xC0, 0x29, 0x00409, 0, 0x0000'00000'00'FF, 1, BackQuote , "`" , 96 , 'u', '`' , '`' )\ X(108, 0xDE, 0xDE, 0x28, 0x00409, 0, 0x0000'00000'00'FF, 1, SingleQuote , "'" , 39 , 'u', '\'' , '\'' )\ X(110, 0xBC, 0xBC, 0x33, 0x00409, 0, 0x0000'00000'00'FF, 1, Comma , "," , 44 , 'u', ',' , ',' )\ X(112, 0xBA, 0xBA, 0x27, 0x00409, 0, 0x0000'00000'00'FF, 1, Semicolon , ";" , 59 , 'u', ';' , ';' )\ X(114, 0xBC, 0xBC, 0x33, 0x00415, 0, 0x0000'FFFFF'00'FF, 1, LessThan , "<" , 60 , 'u', ';' , ';' )/*bepo */\ X(116, 0xBE, 0xBE, 0x34, 0x00418, 0, 0x0000'FFFFF'00'FF, 1, GreaterThan , ">" , 62 , 'u', ';' , ';' )/*bepo */\ - X(118, 0xC0, 0xC0, 0x29, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DegreeSign , "°" , 176 , 'u', '"' , '"' )/*qwertz Hungarian*/\ + X(118, 0xC0, 0xC0, 0x29, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DeadRing , "°" , 176 , 'u', '"' , '"' )/*qwertz Hungarian*/\ X(120, 0x33, 0x33, 0x04, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, DoubleQuote , "\"" , 34 , 'u', '"' , '"' )/*azerty*/\ - X(122, 0x35, 0x35, 0x06, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, OpenRoundBracket , "(" , 40 , 'u', '(' , '(' )/*azerty*/\ - X(124, 0x38, 0x38, 0x2D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, ClosedRoundBracket , ")" , 41 , 'u', ')' , ')' )/*azerty*/\ - X(126, 0x36, 0x36, 0x07, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, AtSign , "@" , 64 , 'u', '@' , '\0' )/*bepo */\ - X(128, 0xDD, 0xDD, 0x0D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Percent , "%" , 37 , 'u', '%' , '%' )/*bepo */\ - X(130, 0xDF, 0xDF, 0x35, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, ExclamationMark , "!" , 33 , 'u', '!' , '!' )/*azerty*/\ - X(132, 0xBF, 0xBF, 0x2B, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, NumberSign , "#" , 35 , 'u', '#' , '#' )/*qwertz*/\ - X(134, 0x31, 0x31, 0x02, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Ampersand , "&" , 38 , 'u', '&' , '&' )/*azerty*/\ - X(136, 0x38, 0x38, 0x09, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Underscore , "_" , 95 , 'u', '_' , '\x1f')/*azerty*/\ - X(138, 0x32, 0x32, 0x03, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, LeftDoubleAngleQuote , "«" , 171 , 'u', -1 , -1 )/*bepo */\ - X(140, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, RightDoubleAngleQuote, "»" , 187 , 'u', -1 , -1 )/*bepo */\ - X(142, 0xDB, 0xDB, 0x2D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Eszett , "ß" , 223 , 'u', -1 , -1 )/*qwertz*/\ - X(144, 0x38, 0x38, 0x09, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteA , "á" , 225 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(146, 0x32, 0x32, 0x03, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteE , "é" , 233 , 'u', -1 , -1 )/*azerty*/\ - X(148, 0x39, 0x39, 0x0A, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteI , "í" , 237 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(150, 0x38, 0x38, 0x09, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteO , "ó" , 243 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(152, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteU , "ú" , 250 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(154, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteY , "ý" , 253 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(156, 0x34, 0x34, 0x05, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DoubleAcuteO , "ő" , 337 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(158, 0x39, 0x39, 0x0A, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CedillaC , "ç" , 231 , 'u', -1 , -1 )/*azerty*/\ - X(160, 0x5A, 0x5A, 0x2C, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CircumflexE , "ê" , 234 , 'u', -1 , -1 )/*bepo */\ - X(162, 0x32, 0x32, 0x03, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, CaronE , "ě" , 283 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(164, 0x33, 0x33, 0x04, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, CaronS , "š" , 353 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(166, 0x34, 0x34, 0x05, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronC , "č" , 269 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(168, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronR , "ř" , 345 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(170, 0x36, 0x36, 0x07, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronZ , "ž" , 282 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(172, 0x32, 0x32, 0x03, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronL , "ľ" , 318 , 'u', -1 , -1 )/*qwertz Slovak*/\ - X(174, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronT , "ť" , 357 , 'u', -1 , -1 )/*qwertz Slovak*/\ - X(176, 0x30, 0x30, 0x0B, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, GraveA , "à" , 224 , 'u', -1 , -1 )/*azerty*/\ - X(178, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, GraveE , "è" , 232 , 'u', -1 , -1 )/*azerty*/\ - X(180, 0xDE, 0xDE, 0x28, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, UmlautA , "ä" , 228 , 'u', -1 , -1 )/*qwertz*/\ - X(182, 0xBF, 0xBF, 0x27, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautO , "ö" , 246 , 'u', -1 , -1 )/*qwertz*/\ - X(184, 0xBA, 0xBA, 0x1A, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautU , "ü" , 252 , 'u', -1 , -1 )/*qwertz*/\ - X(186, 0xBA, 0xBA, 0x27, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, RingU , "ů" , 367 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(188, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, Circumflex , "^" , 94 , 'u', -1 , -1 )/*qwertz*/\ - X(190, 0xDD, 0xDD, 0x0D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, AcuteAccent , "´" , 180 , 'u', -1 , -1 )/*qwertz*/\ - X(192, 0xC0, 0xC0, 0x29, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, GraveAccent , "`" , 96 , 'u', -1 , -1 )/*bepo */\ - X(194, 0xDD, 0xDD, 0x1A, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, Umlaut , "¨" , 168 , 'u', -1 , -1 )/*azerty*/\ - X(196, 0x4E, 0x4E, 0x31, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningTilde , "~" , 771 , 'u', -1 , -1 )/*bepo */\ - X(198, 0xDC, 0xDC, 0x29, 0x0040E, 0, 0x0000'FFFFF'00'FF, 0, CombiningCaron , "ˇ" , 780 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(200, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningBreve , "˘" , 774 , 'u', -1 , -1 )/*bepo French*/\ - X(202, 0xDE, 0xDE, 0x28, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, CombiningOgonek , "˛" , 731 , 'u', -1 , -1 )/*bepo French*/\ - X(204, 0x70, 0x70, 0x3B, 0x00409, 0, 0x0000'00000'00'FF, 1, F1 , "F1" , 11 , '~', -1 , -1 )\ - X(206, 0x71, 0x71, 0x3C, 0x00409, 0, 0x0000'00000'00'FF, 1, F2 , "F2" , 12 , '~', -1 , -1 )\ - X(208, 0x72, 0x72, 0x3D, 0x00409, 0, 0x0000'00000'00'FF, 1, F3 , "F3" , 13 , '~', -1 , -1 )\ - X(210, 0x73, 0x73, 0x3E, 0x00409, 0, 0x0000'00000'00'FF, 1, F4 , "F4" , 14 , '~', -1 , -1 )\ - X(212, 0x74, 0x74, 0x3F, 0x00409, 0, 0x0000'00000'00'FF, 1, F5 , "F5" , 15 , '~', -1 , -1 )\ - X(214, 0x75, 0x75, 0x40, 0x00409, 0, 0x0000'00000'00'FF, 1, F6 , "F6" , 17 , '~', -1 , -1 )\ - X(216, 0x76, 0x76, 0x41, 0x00409, 0, 0x0000'00000'00'FF, 1, F7 , "F7" , 18 , '~', -1 , -1 )\ - X(218, 0x77, 0x77, 0x42, 0x00409, 0, 0x0000'00000'00'FF, 1, F8 , "F8" , 19 , '~', -1 , -1 )\ - X(220, 0x78, 0x78, 0x43, 0x00409, 0, 0x0000'00000'00'FF, 1, F9 , "F9" , 20 , '~', -1 , -1 )\ - X(222, 0x79, 0x79, 0x44, 0x00409, 0, 0x0000'00000'00'FF, 1, F10 , "F10" , 21 , '~', -1 , -1 )\ - X(224, 0x7A, 0x7A, 0x57, 0x00409, 0, 0x0000'00000'00'FF, 1, F11 , "F11" , 23 , '~', -1 , -1 )\ - X(226, 0x7B, 0x7B, 0x5B, 0x00409, 0, 0x0000'00000'00'FF, 1, F12 , "F12" , 24 , '~', -1 , -1 )\ - X(228, 0x7C, 0x7C, 0, 0x00409, 0, 0x0000'00000'00'FF, 1, F13 , "F13" , 57376, 'u', -1 , -1 )\ - X(230, 0x7D, 0x7D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F14 , "F14" , 57377, 'u', -1 , -1 )\ - X(232, 0x7E, 0x7E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F15 , "F15" , 57378, 'u', -1 , -1 )\ - X(234, 0x7F, 0x7F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F16 , "F16" , 57379, 'u', -1 , -1 )\ - X(236, 0x80, 0x80, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F17 , "F17" , 57380, 'u', -1 , -1 )\ - X(238, 0x81, 0x81, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F18 , "F18" , 57381, 'u', -1 , -1 )\ - X(240, 0x82, 0x82, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F19 , "F19" , 57382, 'u', -1 , -1 )\ - X(242, 0x83, 0x83, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F20 , "F20" , 57383, 'u', -1 , -1 )\ - X(244, 0x84, 0x84, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F21 , "F21" , 57384, 'u', -1 , -1 )\ - X(246, 0x85, 0x85, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F22 , "F22" , 57385, 'u', -1 , -1 )\ - X(248, 0x86, 0x86, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F23 , "F23" , 57386, 'u', -1 , -1 )\ - X(250, 0x87, 0x87, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F24 , "F24" , 57387, 'u', -1 , -1 )\ - X(252, 0x7D, 0x7D, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F25 , "F25" , 57388, 'u', -1 , -1 )\ - X(254, 0x7E, 0x7E, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F26 , "F26" , 57389, 'u', -1 , -1 )\ - X(256, 0x7F, 0x7F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F27 , "F27" , 57390, 'u', -1 , -1 )\ - X(258, 0x80, 0x80, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F28 , "F28" , 57391, 'u', -1 , -1 )\ - X(260, 0x81, 0x81, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F29 , "F29" , 57392, 'u', -1 , -1 )\ - X(262, 0x82, 0x82, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F30 , "F30" , 57393, 'u', -1 , -1 )\ - X(264, 0x83, 0x83, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F31 , "F31" , 57394, 'u', -1 , -1 )\ - X(266, 0x84, 0x84, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F32 , "F32" , 57395, 'u', -1 , -1 )\ - X(268, 0x85, 0x85, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F33 , "F33" , 57396, 'u', -1 , -1 )\ - X(270, 0x86, 0x86, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F34 , "F34" , 57397, 'u', -1 , -1 )\ - X(272, 0x87, 0x87, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F35 , "F35" , 57398, 'u', -1 , -1 )\ - X(274, 0x41, 0x41, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyA , "A" , 97 , 'u', 'a' , '\x01')\ - X(276, 0x42, 0x42, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyB , "B" , 98 , 'u', 'b' , '\x02')\ - X(278, 0x43, 0x43, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyC , "C" , 99 , 'u', 'c' , '\x03')\ - X(280, 0x44, 0x44, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyD , "D" , 100 , 'u', 'd' , '\x04')\ - X(282, 0x45, 0x45, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyE , "E" , 101 , 'u', 'e' , '\x05')\ - X(284, 0x46, 0x46, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyF , "F" , 102 , 'u', 'f' , '\x06')\ - X(286, 0x47, 0x47, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyG , "G" , 103 , 'u', 'g' , '\x07')\ - X(288, 0x48, 0x48, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyH , "H" , 104 , 'u', 'h' , '\x08')\ - X(290, 0x49, 0x49, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyI , "I" , 105 , 'u', 'i' , '\x09')\ - X(292, 0x4A, 0x4A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyJ , "J" , 106 , 'u', 'j' , '\x0a')\ - X(294, 0x4B, 0x4B, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyK , "K" , 107 , 'u', 'k' , '\x0b')\ - X(296, 0x4C, 0x4C, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyL , "L" , 108 , 'u', 'l' , '\x0c')\ - X(298, 0x4D, 0x4D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyM , "M" , 109 , 'u', 'm' , '\x0d')\ - X(300, 0x4E, 0x4E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyN , "N" , 110 , 'u', 'n' , '\x0e')\ - X(302, 0x4F, 0x4F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyO , "O" , 111 , 'u', 'o' , '\x0f')\ - X(304, 0x50, 0x50, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyP , "P" , 112 , 'u', 'p' , '\x10')\ - X(306, 0x51, 0x51, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyQ , "Q" , 113 , 'u', 'q' , '\x11')\ - X(308, 0x52, 0x52, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyR , "R" , 114 , 'u', 'r' , '\x12')\ - X(310, 0x53, 0x53, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyS , "S" , 115 , 'u', 's' , '\x13')\ - X(312, 0x54, 0x54, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyT , "T" , 116 , 'u', 't' , '\x14')\ - X(314, 0x55, 0x55, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyU , "U" , 117 , 'u', 'u' , '\x15')\ - X(316, 0x56, 0x56, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyV , "V" , 118 , 'u', 'v' , '\x16')\ - X(318, 0x57, 0x57, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyW , "W" , 119 , 'u', 'w' , '\x17')\ - X(320, 0x58, 0x58, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyX , "X" , 120 , 'u', 'x' , '\x18')\ - X(322, 0x59, 0x59, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyY , "Y" , 121 , 'u', 'y' , '\x19')\ - X(324, 0x5A, 0x5A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyZ , "Z" , 122 , 'u', 'z' , '\x1a')\ - X(326, 0x5F, 0x5F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Sleep , "Sleep" , 0 , 'u', -1 , -1 )\ - X(328, 0xB7, 0xB7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Calculator , "Calculator" , 0 , 'u', -1 , -1 )\ - X(330, 0x48, 0x48, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Mail , "Mail" , 0 , 'u', -1 , -1 )\ - X(332, 0xAD, 0xAD, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440, 'u', -1 , -1 )\ - X(334, 0xAE, 0xAE, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438, 'u', -1 , -1 )\ - X(336, 0xAF, 0xAF, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439, 'u', -1 , -1 )\ - X(338, 0xB0, 0xB0, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaNext , "MediaNext" , 57435, 'u', -1 , -1 )\ - X(340, 0xB1, 0xB1, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPrev , "MediaPrev" , 57436, 'u', -1 , -1 )\ - X(342, 0xB2, 0xB2, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaStop , "MediaStop" , 57432, 'u', -1 , -1 )\ - X(344, 0xB2, 0xB2, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPause , "MediaPause" , 57429, 'u', -1 , -1 )\ - X(346, 0xB3, 0xB3, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430, 'u', -1 , -1 )\ - X(348, 0xB3, 0xB3, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPlay , "MediaPlay" , 57428, 'u', -1 , -1 )\ - X(350, 0xB5, 0xB5, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaSelect , "MediaSelect" , 0 , 'u', -1 , -1 )\ - X(352, 0xB8, 0xB8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaReverse , "MediaReverse" , 57431, 'u', -1 , -1 )\ - X(354, 0xB8, 0xB8, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRecord , "MediaRecord" , 57437, 'u', -1 , -1 )\ - X(356, 0xB9, 0xB9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaFastForward , "MediaFastForward", 57433, 'u', -1 , -1 )\ - X(368, 0xB9, 0xB9, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRewind , "MediaRewind" , 57434, 'u', -1 , -1 )\ - X(360, 0xA6, 0xA6, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserBack , "BrowserBack" , 0 , 'u', -1 , -1 )\ - X(362, 0xA7, 0xA7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserForward , "BrowserForward" , 0 , 'u', -1 , -1 )\ - X(364, 0xA8, 0xA8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 , 'u', -1 , -1 )\ - X(366, 0xA9, 0xA9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserStop , "BrowserStop" , 0 , 'u', -1 , -1 )\ - X(368, 0xAA, 0xAA, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 , 'u', -1 , -1 )\ - X(370, 0xAB, 0xAB, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserFavorites , "BrowserFavorites", 0 , 'u', -1 , -1 )\ - X(372, 0xAC, 0xAC, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserHome , "BrowserHome" , 0 , 'u', -1 , -1 )\ - X(374, 0xFF, 0xFF, 0xFF, 0x00000, ExtendedKey, 0x0100'FFFFF'FF'FF, 0, lastKey , "lastKey" , 0 , 0 , -1 , -1 ) + X(122, 0x33, 0x29, 0xC0, 0x0081A, 0, 0x0000'FFFFF'00'FF, 1, LowQuote , "‚" , 8218 , 'u', -1 , -1 )\ + X(124, 0x33, 0x29, 0xC0, 0x10418, 0, 0x0000'FFFFF'00'FF, 1, DoubleLowQuote , "„" , 8222 , 'u', -1 , -1 )\ + X(126, 0x35, 0x35, 0x06, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, OpenRoundBracket , "(" , 40 , 'u', '(' , '(' )/*azerty*/\ + X(128, 0x38, 0x38, 0x2D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, CloseRoundBracket , ")" , 41 , 'u', ')' , ')' )/*azerty*/\ + X(130, 0x36, 0x36, 0x07, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, AtSign , "@" , 64 , 'u', '@' , '\0' )/*bepo */\ + X(132, 0xDD, 0xDD, 0x0D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Percent , "%" , 37 , 'u', '%' , '%' )/*bepo */\ + X(134, 0xDF, 0xDF, 0x35, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, Exclamation , "!" , 33 , 'u', '!' , '!' )/*azerty*/\ + X(136, 0xBF, 0xBF, 0x2B, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Hash , "#" , 35 , 'u', '#' , '#' )/*qwertz*/\ + X(138, 0x31, 0x31, 0x02, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Ampersand , "&" , 38 , 'u', '&' , '&' )/*azerty*/\ + X(140, 0x38, 0x38, 0x09, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Underscore , "_" , 95 , 'u', '_' , '\x1f')/*azerty*/\ + X(142, 0x32, 0x32, 0x03, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, LeftGuillemet , "«" , 171 , 'u', -1 , -1 )/*bepo */\ + X(144, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, RightGuillemet , "»" , 187 , 'u', -1 , -1 )/*bepo */\ + X(146, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Dollar , "$" , '$' , 'u', '$' , '$' )\ + X(148, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, PoundSign , "£" , 163 , 'u', -1 , -1 )\ + X(150, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Paragraph , "§" , 167 , 'u', -1 , -1 )\ + X(152, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, MicroSign , "µ" , 181 , 'u', -1 , -1 )\ + X(154, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, AeLigature , "æ" , 230 , 'u', -1 , -1 )\ + X(156, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, TildeO , "õ" , 245 , 'u', -1 , -1 )\ + X(158, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, StrokeO , "ø" , 248 , 'u', -1 , -1 )\ + X(160, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, CrossedD , "đ" , 273 , 'u', -1 , -1 )\ + X(162, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, RingA , "å" , 229 , 'u', -1 , -1 )\ + X(164, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, GraveO , "ò" , 242 , 'u', -1 , -1 )\ + X(166, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, AcuteC , "ć" , 263 , 'u', -1 , -1 )\ + X(168, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, GraveU , "ù" , 249 , 'u', -1 , -1 )\ + X(170, 0xDB, 0xDB, 0x2D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Eszett , "ß" , 223 , 'u', -1 , -1 )/*qwertz*/\ + X(172, 0x38, 0x38, 0x09, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteA , "á" , 225 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(174, 0x32, 0x32, 0x03, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteE , "é" , 233 , 'u', -1 , -1 )/*azerty*/\ + X(176, 0x39, 0x39, 0x0A, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteI , "í" , 237 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(178, 0x38, 0x38, 0x09, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteO , "ó" , 243 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(180, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteU , "ú" , 250 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(182, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteY , "ý" , 253 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(184, 0x34, 0x34, 0x05, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DoubleAcuteO , "ő" , 337 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(186, 0x39, 0x39, 0x0A, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CedillaC , "ç" , 231 , 'u', -1 , -1 )/*azerty*/\ + X(188, 0x5A, 0x5A, 0x2C, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CircumflexE , "ê" , 234 , 'u', -1 , -1 )/*bepo */\ + X(190, 0x32, 0x32, 0x03, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, CaronE , "ě" , 283 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(192, 0x33, 0x33, 0x04, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, CaronS , "š" , 353 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(194, 0x34, 0x34, 0x05, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronC , "č" , 269 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(196, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronR , "ř" , 345 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(198, 0x36, 0x36, 0x07, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronZ , "ž" , 282 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(200, 0x32, 0x32, 0x03, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronL , "ľ" , 318 , 'u', -1 , -1 )/*qwertz Slovak*/\ + X(202, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronT , "ť" , 357 , 'u', -1 , -1 )/*qwertz Slovak*/\ + X(204, 0x30, 0x30, 0x0B, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, GraveA , "à" , 224 , 'u', -1 , -1 )/*azerty*/\ + X(206, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, GraveE , "è" , 232 , 'u', -1 , -1 )/*azerty*/\ + X(208, 0xDE, 0xDE, 0x28, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, UmlautA , "ä" , 228 , 'u', -1 , -1 )/*qwertz*/\ + X(210, 0xBF, 0xBF, 0x27, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautO , "ö" , 246 , 'u', -1 , -1 )/*qwertz*/\ + X(212, 0xBA, 0xBA, 0x1A, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautU , "ü" , 252 , 'u', -1 , -1 )/*qwertz*/\ + X(214, 0xBA, 0xBA, 0x27, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, RingU , "ů" , 367 , 'u', -1 , -1 )/*qwertz Czech*/\ + X(216, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, DeadCircumflex , "^" , 94 , 'u', -1 , -1 )/*qwertz*/\ + X(218, 0xDD, 0xDD, 0x0D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, DeadAcute , "´" , 180 , 'u', -1 , -1 )/*qwertz*/\ + X(220, 0xC0, 0xC0, 0x29, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, DeadGrave , "`" , 96 , 'u', -1 , -1 )/*bepo */\ + X(222, 0xDD, 0xDD, 0x1A, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, DeadUmlaut , "¨" , 168 , 'u', -1 , -1 )/*azerty*/\ + X(224, 0x4E, 0x4E, 0x31, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, DeadTilde , "~" , 771 , 'u', -1 , -1 )/*bepo */\ + X(226, 0xDC, 0xDC, 0x29, 0x0040E, 0, 0x0000'FFFFF'00'FF, 0, DeadCaron , "ˇ" , 780 , 'u', -1 , -1 )/*qwertz Hungarian*/\ + X(228, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, DeadBreve , "˘" , 774 , 'u', -1 , -1 )/*bepo French*/\ + X(230, 0xDE, 0xDE, 0x28, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, DeadOgonek , "˛" , 731 , 'u', -1 , -1 )/*bepo French*/\ + X(232, 0x70, 0x70, 0x3B, 0x00409, 0, 0x0000'00000'00'FF, 1, F1 , "F1" , 11 , '~', -1 , -1 )\ + X(234, 0x71, 0x71, 0x3C, 0x00409, 0, 0x0000'00000'00'FF, 1, F2 , "F2" , 12 , '~', -1 , -1 )\ + X(236, 0x72, 0x72, 0x3D, 0x00409, 0, 0x0000'00000'00'FF, 1, F3 , "F3" , 13 , '~', -1 , -1 )\ + X(238, 0x73, 0x73, 0x3E, 0x00409, 0, 0x0000'00000'00'FF, 1, F4 , "F4" , 14 , '~', -1 , -1 )\ + X(240, 0x74, 0x74, 0x3F, 0x00409, 0, 0x0000'00000'00'FF, 1, F5 , "F5" , 15 , '~', -1 , -1 )\ + X(242, 0x75, 0x75, 0x40, 0x00409, 0, 0x0000'00000'00'FF, 1, F6 , "F6" , 17 , '~', -1 , -1 )\ + X(244, 0x76, 0x76, 0x41, 0x00409, 0, 0x0000'00000'00'FF, 1, F7 , "F7" , 18 , '~', -1 , -1 )\ + X(246, 0x77, 0x77, 0x42, 0x00409, 0, 0x0000'00000'00'FF, 1, F8 , "F8" , 19 , '~', -1 , -1 )\ + X(248, 0x78, 0x78, 0x43, 0x00409, 0, 0x0000'00000'00'FF, 1, F9 , "F9" , 20 , '~', -1 , -1 )\ + X(250, 0x79, 0x79, 0x44, 0x00409, 0, 0x0000'00000'00'FF, 1, F10 , "F10" , 21 , '~', -1 , -1 )\ + X(252, 0x7A, 0x7A, 0x57, 0x00409, 0, 0x0000'00000'00'FF, 1, F11 , "F11" , 23 , '~', -1 , -1 )\ + X(254, 0x7B, 0x7B, 0x5B, 0x00409, 0, 0x0000'00000'00'FF, 1, F12 , "F12" , 24 , '~', -1 , -1 )\ + X(256, 0x7C, 0x7C, 0, 0x00409, 0, 0x0000'00000'00'FF, 1, F13 , "F13" , 57376, 'u', -1 , -1 )\ + X(258, 0x7D, 0x7D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F14 , "F14" , 57377, 'u', -1 , -1 )\ + X(260, 0x7E, 0x7E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F15 , "F15" , 57378, 'u', -1 , -1 )\ + X(262, 0x7F, 0x7F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F16 , "F16" , 57379, 'u', -1 , -1 )\ + X(264, 0x80, 0x80, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F17 , "F17" , 57380, 'u', -1 , -1 )\ + X(266, 0x81, 0x81, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F18 , "F18" , 57381, 'u', -1 , -1 )\ + X(268, 0x82, 0x82, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F19 , "F19" , 57382, 'u', -1 , -1 )\ + X(270, 0x83, 0x83, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F20 , "F20" , 57383, 'u', -1 , -1 )\ + X(272, 0x84, 0x84, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F21 , "F21" , 57384, 'u', -1 , -1 )\ + X(274, 0x85, 0x85, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F22 , "F22" , 57385, 'u', -1 , -1 )\ + X(276, 0x86, 0x86, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F23 , "F23" , 57386, 'u', -1 , -1 )\ + X(278, 0x87, 0x87, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F24 , "F24" , 57387, 'u', -1 , -1 )\ + X(280, 0x7D, 0x7D, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F25 , "F25" , 57388, 'u', -1 , -1 )\ + X(282, 0x7E, 0x7E, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F26 , "F26" , 57389, 'u', -1 , -1 )\ + X(284, 0x7F, 0x7F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F27 , "F27" , 57390, 'u', -1 , -1 )\ + X(286, 0x80, 0x80, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F28 , "F28" , 57391, 'u', -1 , -1 )\ + X(288, 0x81, 0x81, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F29 , "F29" , 57392, 'u', -1 , -1 )\ + X(290, 0x82, 0x82, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F30 , "F30" , 57393, 'u', -1 , -1 )\ + X(292, 0x83, 0x83, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F31 , "F31" , 57394, 'u', -1 , -1 )\ + X(294, 0x84, 0x84, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F32 , "F32" , 57395, 'u', -1 , -1 )\ + X(296, 0x85, 0x85, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F33 , "F33" , 57396, 'u', -1 , -1 )\ + X(298, 0x86, 0x86, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F34 , "F34" , 57397, 'u', -1 , -1 )\ + X(300, 0x87, 0x87, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F35 , "F35" , 57398, 'u', -1 , -1 )\ + X(302, 0x41, 0x41, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyA , "A" , 97 , 'u', 'a' , '\x01')\ + X(304, 0x42, 0x42, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyB , "B" , 98 , 'u', 'b' , '\x02')\ + X(306, 0x43, 0x43, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyC , "C" , 99 , 'u', 'c' , '\x03')\ + X(308, 0x44, 0x44, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyD , "D" , 100 , 'u', 'd' , '\x04')\ + X(310, 0x45, 0x45, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyE , "E" , 101 , 'u', 'e' , '\x05')\ + X(312, 0x46, 0x46, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyF , "F" , 102 , 'u', 'f' , '\x06')\ + X(314, 0x47, 0x47, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyG , "G" , 103 , 'u', 'g' , '\x07')\ + X(316, 0x48, 0x48, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyH , "H" , 104 , 'u', 'h' , '\x08')\ + X(318, 0x49, 0x49, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyI , "I" , 105 , 'u', 'i' , '\x09')\ + X(320, 0x4A, 0x4A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyJ , "J" , 106 , 'u', 'j' , '\x0a')\ + X(322, 0x4B, 0x4B, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyK , "K" , 107 , 'u', 'k' , '\x0b')\ + X(324, 0x4C, 0x4C, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyL , "L" , 108 , 'u', 'l' , '\x0c')\ + X(326, 0x4D, 0x4D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyM , "M" , 109 , 'u', 'm' , '\x0d')\ + X(328, 0x4E, 0x4E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyN , "N" , 110 , 'u', 'n' , '\x0e')\ + X(330, 0x4F, 0x4F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyO , "O" , 111 , 'u', 'o' , '\x0f')\ + X(332, 0x50, 0x50, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyP , "P" , 112 , 'u', 'p' , '\x10')\ + X(334, 0x51, 0x51, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyQ , "Q" , 113 , 'u', 'q' , '\x11')\ + X(336, 0x52, 0x52, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyR , "R" , 114 , 'u', 'r' , '\x12')\ + X(338, 0x53, 0x53, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyS , "S" , 115 , 'u', 's' , '\x13')\ + X(340, 0x54, 0x54, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyT , "T" , 116 , 'u', 't' , '\x14')\ + X(342, 0x55, 0x55, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyU , "U" , 117 , 'u', 'u' , '\x15')\ + X(344, 0x56, 0x56, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyV , "V" , 118 , 'u', 'v' , '\x16')\ + X(346, 0x57, 0x57, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyW , "W" , 119 , 'u', 'w' , '\x17')\ + X(348, 0x58, 0x58, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyX , "X" , 120 , 'u', 'x' , '\x18')\ + X(350, 0x59, 0x59, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyY , "Y" , 121 , 'u', 'y' , '\x19')\ + X(352, 0x5A, 0x5A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyZ , "Z" , 122 , 'u', 'z' , '\x1a')\ + X(354, 0x5F, 0x5F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Sleep , "Sleep" , 0 , 'u', -1 , -1 )\ + X(356, 0xB7, 0xB7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Calculator , "Calculator" , 0 , 'u', -1 , -1 )\ + X(368, 0x48, 0x48, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Mail , "Mail" , 0 , 'u', -1 , -1 )\ + X(360, 0xAD, 0xAD, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440, 'u', -1 , -1 )\ + X(362, 0xAE, 0xAE, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438, 'u', -1 , -1 )\ + X(364, 0xAF, 0xAF, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439, 'u', -1 , -1 )\ + X(366, 0xB0, 0xB0, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaNext , "MediaNext" , 57435, 'u', -1 , -1 )\ + X(368, 0xB1, 0xB1, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPrev , "MediaPrev" , 57436, 'u', -1 , -1 )\ + X(370, 0xB2, 0xB2, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaStop , "MediaStop" , 57432, 'u', -1 , -1 )\ + X(372, 0xB2, 0xB2, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPause , "MediaPause" , 57429, 'u', -1 , -1 )\ + X(374, 0xB3, 0xB3, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430, 'u', -1 , -1 )\ + X(376, 0xB3, 0xB3, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPlay , "MediaPlay" , 57428, 'u', -1 , -1 )\ + X(378, 0xB5, 0xB5, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaSelect , "MediaSelect" , 0 , 'u', -1 , -1 )\ + X(380, 0xB8, 0xB8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaReverse , "MediaReverse" , 57431, 'u', -1 , -1 )\ + X(382, 0xB8, 0xB8, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRecord , "MediaRecord" , 57437, 'u', -1 , -1 )\ + X(384, 0xB9, 0xB9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaFastForward , "MediaFastForward", 57433, 'u', -1 , -1 )\ + X(386, 0xB9, 0xB9, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRewind , "MediaRewind" , 57434, 'u', -1 , -1 )\ + X(388, 0xA6, 0xA6, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserBack , "BrowserBack" , 0 , 'u', -1 , -1 )\ + X(390, 0xA7, 0xA7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserForward , "BrowserForward" , 0 , 'u', -1 , -1 )\ + X(392, 0xA8, 0xA8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 , 'u', -1 , -1 )\ + X(394, 0xA9, 0xA9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserStop , "BrowserStop" , 0 , 'u', -1 , -1 )\ + X(396, 0xAA, 0xAA, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 , 'u', -1 , -1 )\ + X(398, 0xAB, 0xAB, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserFavorites , "BrowserFavorites", 0 , 'u', -1 , -1 )\ + X(400, 0xAC, 0xAC, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserHome , "BrowserHome" , 0 , 'u', -1 , -1 )\ + X(402, 0xFF, 0xFF, 0xFF, 0x00000, ExtendedKey, 0x0100'FFFFF'FF'FF, 0, lastKey , "lastKey" , 0 , 0 , -1 , -1 ) // Max 12 bits for KeyId. static constexpr auto idbits = 12; @@ -1165,8 +1179,8 @@ namespace netxs::input RAlt = 1 << 3, // Right ⎇ Alt, Right ⌥ Option, ⇮ AltGr LShift = 1 << 4, // Left ⇧ Shift RShift = 1 << 5, // Right ⇧ Shift - LWin = 1 << 6, // Left ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super - RWin = 1 << 7, // Right ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super + LSuper = 1 << 6, // Left ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super + RSuper = 1 << 7, // Right ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super LHyper = 1 << 8, // Left Hyper RHyper = 1 << 9, // Right Hyper // = 1 << 10, @@ -1180,9 +1194,9 @@ namespace netxs::input anyAlt = LAlt | RAlt, anyShift = LShift | RShift, anyCtrlAlt = anyAlt | anyCtrl, - anyWin = LWin | RWin, + anySuper = LSuper | RSuper, anyHyper = LHyper | RHyper, - anyMod = anyAlt | anyCtrl | anyShift | anyWin | anyHyper, + anyMod = anyAlt | anyCtrl | anyShift | anySuper | anyHyper, }; struct kkp { diff --git a/src/netxs/desktopio/intmath.hpp b/src/netxs/desktopio/intmath.hpp index 55d3329a6d..3fe72274b5 100644 --- a/src/netxs/desktopio/intmath.hpp +++ b/src/netxs/desktopio/intmath.hpp @@ -44,21 +44,28 @@ #include #include -#include -#include FT_FREETYPE_H -#include FT_TRUETYPE_TABLES_H -#include FT_MULTIPLE_MASTERS_H -#include FT_SFNT_NAMES_H -#include FT_COLOR_H -#include FT_OTSVG_H - -#include -#include - -#define STB_IMAGE_IMPLEMENTATION -#define STB_IMAGE_WRITE_IMPLEMENTATION -#include -#include +#if not defined(VTM_NO_DEPENDENCIES) + #include + #include FT_FREETYPE_H + #include FT_TRUETYPE_TABLES_H + #include FT_MULTIPLE_MASTERS_H + #include FT_SFNT_NAMES_H + #include FT_COLOR_H + #include FT_OTSVG_H + + #include + #include + + #define STB_IMAGE_IMPLEMENTATION + #define STB_IMAGE_WRITE_IMPLEMENTATION + #include + #include +#else + namespace lunasvg + { + struct Document {}; + } +#endif #ifndef faux #define faux (false) diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index fe074fc7d9..461b1eb71f 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -992,13 +992,13 @@ namespace netxs::os } else if (scancode == 0x5b && extflag) { - if (pressed) modstate |= input::hids::LWin; - else modstate &=~input::hids::LWin; + if (pressed) modstate |= input::hids::LSuper; + else modstate &=~input::hids::LSuper; } else if (scancode == 0x5c && extflag) { - if (pressed) modstate |= input::hids::RWin; - else modstate &=~input::hids::RWin; + if (pressed) modstate |= input::hids::RSuper; + else modstate &=~input::hids::RSuper; } else if (scancode == 0x5b && !extflag) { @@ -1016,8 +1016,8 @@ namespace netxs::os } auto lshift = modstate & input::hids::LShift; auto rshift = modstate & input::hids::RShift; - auto lwin = modstate & input::hids::LWin; - auto rwin = modstate & input::hids::RWin; + auto lsuper = modstate & input::hids::LSuper; + auto rsuper = modstate & input::hids::RSuper; auto lhyper = modstate & input::hids::LHyper; auto rhyper = modstate & input::hids::RHyper; bool lalt = ms_ctrls & LEFT_ALT_PRESSED; @@ -1034,8 +1034,8 @@ namespace netxs::os if (ralt ) state |= input::hids::RAlt; if (lctrl ) state |= input::hids::LCtrl; if (rctrl ) state |= input::hids::RCtrl; - if (lwin ) state |= input::hids::LWin; - if (rwin ) state |= input::hids::RWin; + if (lsuper) state |= input::hids::LSuper; + if (rsuper) state |= input::hids::RSuper; if (lhyper) state |= input::hids::LHyper; if (rhyper) state |= input::hids::RHyper; if (nums ) state |= input::hids::NumLock; @@ -1060,8 +1060,8 @@ namespace netxs::os stat.repeats = scancode == 0x002a // input::hids::LShift || scancode == 0x0036 // input::hids::RShift (Windows command prompt) || scancode == 0x0136 // input::hids::RShift (Windows terminal) - || scancode == 0x015b // input::hids::LWin - || scancode == 0x015c // input::hids::RWin + || scancode == 0x015b // input::hids::LSuper + || scancode == 0x015c // input::hids::RSuper || scancode == 0x005b // input::hids::LHyper || scancode == 0x005c // input::hids::RHyper || scancode == 0x001d // input::hids::LCtrl @@ -5834,14 +5834,14 @@ namespace netxs::os { "\x5b" , { "[", key::OpenBracket }}, { "\x5c" , { "\\", key::BackSlash }}, - { "\x5d" , { "]", key::ClosedBracket }}, + { "\x5d" , { "]", key::CloseBracket }}, { "\x5e" , { "^", key::Key6 | (hids::LShift << key::idbits) }}, { "\x5f" , { "_", key::KeyMinus | (hids::LShift << key::idbits) }}, { "\x60" , { "`", key::BackQuote }}, { "\x7b" , { "{", key::OpenBracket | (hids::LShift << key::idbits) }}, { "\x7c" , { "|", key::BackSlash | (hids::LShift << key::idbits) }}, - { "\x7d" , { "}", key::ClosedBracket | (hids::LShift << key::idbits) }}, + { "\x7d" , { "}", key::CloseBracket | (hids::LShift << key::idbits) }}, { "\x7e" , { "~", key::BackQuote | (hids::LShift << key::idbits) }}, { "\033[5~" , { "", key::KeyPageUp }}, @@ -6037,7 +6037,7 @@ namespace netxs::os if (mods & hids::LCtrl) k.ctlstat |= hids::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); if (mods & hids::LAlt) k.ctlstat |= hids::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); if (mods & hids::LShift) k.ctlstat |= hids::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (mods & hids::LWin) k.ctlstat |= hids::LWin, k.keycode = input::key::LeftWin, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (mods & hids::LSuper) k.ctlstat |= hids::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); std::swap(k.cluster, cluster); std::swap(k.keycode, keycode); std::swap(k.virtcod, virtcod); @@ -6054,7 +6054,7 @@ namespace netxs::os auto keycode = std::exchange(k.keycode, 0); auto virtcod = std::exchange(k.virtcod, 0); auto scancod = std::exchange(k.scancod, 0); - if (mods & hids::LWin ) k.ctlstat &= ~hids::LWin, k.keycode = input::key::LeftWin, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (mods & hids::LSuper) k.ctlstat &= ~hids::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); if (mods & hids::LShift) k.ctlstat &= ~hids::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); if (mods & hids::LAlt ) k.ctlstat &= ~hids::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); if (mods & hids::LCtrl ) k.ctlstat &= ~hids::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); @@ -6140,7 +6140,7 @@ namespace netxs::os if (ctlstat & hids::kkp::shift ) k.ctlstat |= hids::LShift; if (ctlstat & hids::kkp::alt ) k.ctlstat |= hids::LAlt; if (ctlstat & hids::kkp::ctrl ) k.ctlstat |= hids::LCtrl; - if (ctlstat & hids::kkp::super ) k.ctlstat |= hids::LWin; + if (ctlstat & hids::kkp::super ) k.ctlstat |= hids::LSuper; if (ctlstat & hids::kkp::hyper ) k.ctlstat |= hids::LHyper; if (ctlstat & hids::kkp::meta ) k.ctlstat |= hids::LAlt; if (ctlstat & hids::kkp::caps_lock) k.ctlstat |= hids::CapsLock; diff --git a/src/netxs/desktopio/terminal.hpp b/src/netxs/desktopio/terminal.hpp index c64e497c8b..ec89d07b4d 100644 --- a/src/netxs/desktopio/terminal.hpp +++ b/src/netxs/desktopio/terminal.hpp @@ -9758,7 +9758,11 @@ namespace netxs::ui selection_extend(gear); gear.dismiss(); } - else selection_cancel(); + else + { + target->selection_create(gear.click, faux); // Update lookup's beginning position. + selection_cancel(); + } } void selection_dblclk(hids& gear) { From d8d240c5b53beadc58cdb43d0b0f6ac95d536fb3 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 11 Jun 2026 20:19:38 +0500 Subject: [PATCH 14/71] Filter IME/pasted clusters in chords (sc=0 vk=0) --- src/netxs/desktopio/input.hpp | 6 +++--- src/netxs/desktopio/terminal.hpp | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 8c7efd83cf..4596ed4b2a 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -2152,8 +2152,8 @@ namespace netxs::input { if (keyid <= input::key::config) vk_valid = faux; if (val.scode == 0) sc_valid = faux; - push_keyid(true, k.vkchord, keyid); - push_scode(true, k.scchord, val.scode); + if (vk_valid) push_keyid(true, k.vkchord, keyid); + if (sc_valid) push_scode(true, k.scchord, val.scode); } //else if (is_released) log("\tkeyid=%% released", input::key::map::data(keyid).name); return is_released; @@ -2181,7 +2181,7 @@ namespace netxs::input if (!vk_valid) k.vkchord.clear(); if (!sc_valid) k.scchord.clear(); } - if (k.keystat == input::key::pressed) + if (k.keystat == input::key::pressed && (vk_valid || sc_valid)) // Filter pasted and IME clusters (sc=0 vk=0). { auto& key = pushed[k.keycode]; key.scode = k.scancod | (k.extflag ? 0x100 : 0); // Store the scan code of a pressed key. diff --git a/src/netxs/desktopio/terminal.hpp b/src/netxs/desktopio/terminal.hpp index ec89d07b4d..beab504881 100644 --- a/src/netxs/desktopio/terminal.hpp +++ b/src/netxs/desktopio/terminal.hpp @@ -9648,8 +9648,13 @@ namespace netxs::ui auto _paste(auto& data) { //todo pasting must be ready to be interruped by any pressed key (to interrupt a huge paste). - follow[axis::X] = true; - follow[axis::Y] = true; + if (defcfg.resetonkey) + { + base::riseup(tier::release, e2::form::animate::reset, 0); // Reset scroll animation. + unsync = true; + follow[axis::X] = true; + follow[axis::Y] = true; + } ipccon.paste(data, bpmode, kbmode); } auto paste(hids& gear) From 5fdbf853af49c6f69aa56e84031074919fe457af Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 11 Jun 2026 20:20:22 +0500 Subject: [PATCH 15/71] Filter IME/pasted clusters in chords (sc=0 vk=0) --- src/netxs/desktopio/input.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 4596ed4b2a..5f631816e4 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -2181,7 +2181,7 @@ namespace netxs::input if (!vk_valid) k.vkchord.clear(); if (!sc_valid) k.scchord.clear(); } - if (k.keystat == input::key::pressed && (vk_valid || sc_valid)) // Filter pasted and IME clusters (sc=0 vk=0). + if (k.keystat == input::key::pressed && (vk_valid || sc_valid)) // Filter IME/pasted clusters in chords (sc=0 vk=0). { auto& key = pushed[k.keycode]; key.scode = k.scancod | (k.extflag ? 0x100 : 0); // Store the scan code of a pressed key. From f371c406f4df2ba5d913381b8236bad4758484ed Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 11 Jun 2026 21:06:32 +0500 Subject: [PATCH 16/71] Fix invalid key chord state (stuck keys when using IME) --- src/netxs/desktopio/input.hpp | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 5f631816e4..547ab1825a 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -2066,7 +2066,7 @@ namespace netxs::input { struct chord_item_t { - si32 index; + si32 vcode; si32 scode; time stamp; }; @@ -2141,23 +2141,39 @@ namespace netxs::input auto sc_valid = k.scancod > 0; if (!keyout || k.keystat != input::key::released) { + auto broken_state = faux; keyout = k.keystat == input::key::released; //log(" erasing %%", k.keystat == input::key::released ? "key::released" : k.keystat == input::key::pressed ? "key::pressed" : "key::repeated"); std::erase_if(pushed, [&](auto& rec) { auto& [keyid, val] = rec; //log("\tcheck keyid=%%", input::key::map::data(keyid).name); - auto is_released = test_key_released(val.index); // Check if it is still pressed. - if (!is_released && keyid != k.keycode/*exclude repeated key*/) + auto is_released = test_key_released(val.vcode); // Check if it is still pressed. + auto same = k.keycode == keyid + && k.scancod == val.scode + && k.virtcod == val.vcode; + if (!is_released) { - if (keyid <= input::key::config) vk_valid = faux; - if (val.scode == 0) sc_valid = faux; - if (vk_valid) push_keyid(true, k.vkchord, keyid); - if (sc_valid) push_scode(true, k.scchord, val.scode); + if (same && k.keystat == input::key::pressed) // The same key was pressed twice without releasing. + { + broken_state = true; + } + else if (!same) // Exclude repeated key. + { + if (keyid <= input::key::config) vk_valid = faux; + if (val.scode == 0) sc_valid = faux; + if (vk_valid) push_keyid(true, k.vkchord, keyid); + if (sc_valid) push_scode(true, k.scchord, val.scode); + } } //else if (is_released) log("\tkeyid=%% released", input::key::map::data(keyid).name); return is_released; }); + if (broken_state) + { + reset(k); + return; + } auto valid_codepoint = [](view utf8) { auto codepoint = utf::to_code(utf8); @@ -2185,7 +2201,7 @@ namespace netxs::input { auto& key = pushed[k.keycode]; key.scode = k.scancod | (k.extflag ? 0x100 : 0); // Store the scan code of a pressed key. - key.index = k.virtcod; // Store the virtual code to check later that it is still pressed. + key.vcode = k.virtcod; // Store the virtual code to check later that it is still pressed. key.stamp = datetime::now(); } } From 607d1d6e92b269ee13958fc826cb2318106c0c4f Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sat, 13 Jun 2026 20:55:25 +0500 Subject: [PATCH 17/71] #943 WIP: KKP support (media keys) --- src/netxs/desktopio/gui.hpp | 80 ++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index a8591cd210..1f183256ad 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3570,6 +3570,7 @@ namespace netxs::gui virtual bool keybd_test_toggled(si32 virtcod) = 0; virtual bool keybd_read_pressed(si32 virtcod) = 0; virtual bool keybd_test_pressed(si32 virtcod) = 0; + virtual si32 keybd_read_media(si16 cmd, ui16 uDevice, ui16 dwKeys) = 0; virtual void mouse_capture(si32 captured_by) = 0; virtual void mouse_release(si32 released_by) = 0; @@ -5674,7 +5675,7 @@ namespace netxs::gui while (::PeekMessageW(&m, {}, msgtype + 1/*Peek WM_DEADCHAR*/, msgtype + 1, PM_REMOVE)) toWIDE.push_back((wchr)m.wParam); if (toWIDE.size()) keytype = 2; } - //log("\tvkey=", utf::to_hex(virtcod), " pressed=", pressed ? "1" : "0", " scancod=", scancod); + //log("\tvkey=", utf::to_hex(virtcod), " pressed=", keystat, " scancod=", scancod); //log("\t::TranslateMessage()=", rc, " toWIDE.size=", toWIDE.size(), " toWIDE=", ansi::hi(utf::debase(utf::to_utf(toWIDE))), " key_type=", keytype); if (!mfocus.focused()) // ::PeekMessageW() could call wind_proc() inside for any non queued msgs like wind_proc(WM_KILLFOCUS). { @@ -5786,6 +5787,75 @@ namespace netxs::gui } log("%%Keyboard layout changed to ", prompt::gui, utf::to_hex_0x(xlayout)); } + si32 keybd_read_media(si16 cmd, ui16 uDevice, ui16 dwKeys) + { + if constexpr (debugmode) log("%%Media key pressed: cmd=%% uDevice=%%, dwKeys=%%", prompt::gui, utf::to_hex(cmd), utf::to_hex(uDevice), utf::to_hex(dwKeys)); + //todo use lut + switch (uDevice) + { + case FAPPCOMMAND_KEY: // 0 User pressed a key. + case FAPPCOMMAND_MOUSE: // 0x8000 User clicked a mouse button. + case FAPPCOMMAND_OEM: // 0x1000 An unidentified hardware source generated the event. It could be a mouse or a keyboard event. + break; + } + switch (cmd) + { + case APPCOMMAND_BASS_BOOST: // 20 Toggle the bass boost on and off. + case APPCOMMAND_BASS_DOWN: // 19 Decrease the bass. + case APPCOMMAND_BASS_UP: // 21 Increase the bass. + case APPCOMMAND_BROWSER_BACKWARD: // 1 Navigate backward. + case APPCOMMAND_BROWSER_FAVORITES: // 6 Open favorites. + case APPCOMMAND_BROWSER_FORWARD: // 2 Navigate forward. + case APPCOMMAND_BROWSER_HOME: // 7 Navigate home. + case APPCOMMAND_BROWSER_REFRESH: // 3 Refresh page. + case APPCOMMAND_BROWSER_SEARCH: // 5 Open search. + case APPCOMMAND_BROWSER_STOP: // 4 Stop download. + case APPCOMMAND_CLOSE: // 31 Close the window (not the application). + case APPCOMMAND_COPY: // 36 Copy the selection. + case APPCOMMAND_CORRECTION_LIST: // 45 Brings up the correction list when a word is incorrectly identified during speech input. + case APPCOMMAND_CUT: // 37 Cut the selection. + case APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE: // 43 Toggles between two modes of speech input: dictation and command/control (giving commands to an application or accessing menus). + case APPCOMMAND_FIND: // 28 Open the Find dialog. + case APPCOMMAND_FORWARD_MAIL: // 40 Forward a mail message. + case APPCOMMAND_HELP: // 27 Open the Help dialog. + case APPCOMMAND_LAUNCH_APP1: // 17 Start App1. + case APPCOMMAND_LAUNCH_APP2: // 18 Start App2. + case APPCOMMAND_LAUNCH_MAIL: // 15 Open mail. + case APPCOMMAND_LAUNCH_MEDIA_SELECT: // 16 Go to Media Select mode. + case APPCOMMAND_MEDIA_CHANNEL_DOWN: // 52 Decrement the channel value, for example, for a TV or radio tuner. + case APPCOMMAND_MEDIA_CHANNEL_UP: // 51 Increment the channel value, for example, for a TV or radio tuner. + case APPCOMMAND_MEDIA_FAST_FORWARD: // 49 Increase the speed of stream playback. This can be implemented in many ways, for example, using a fixed speed or toggling through a series of increasing speeds. + case APPCOMMAND_MEDIA_NEXTTRACK: // 11 Go to next track. + case APPCOMMAND_MEDIA_PAUSE: // 47 Pause. If already paused, take no further action. This is a direct PAUSE command that has no state. If there are discrete Play and Pause buttons, applications should take action on this command as well as APPCOMMAND_MEDIA_PLAY_PAUSE. + case APPCOMMAND_MEDIA_PLAY: // 46 Begin playing at the current position. If already paused, it will resume. This is a direct PLAY command that has no state. If there are discrete Play and Pause buttons, applications should take action on this command as well as APPCOMMAND_MEDIA_PLAY_PAUSE. + case APPCOMMAND_MEDIA_PLAY_PAUSE: // 14 Play or pause playback. If there are discrete Play and Pause buttons, applications should take action on this command as well as APPCOMMAND_MEDIA_PLAY and APPCOMMAND_MEDIA_PAUSE. + case APPCOMMAND_MEDIA_PREVIOUSTRACK: // 12 Go to previous track. + case APPCOMMAND_MEDIA_RECORD: // 48 Begin recording the current stream. + case APPCOMMAND_MEDIA_REWIND: // 50 Go backward in a stream at a higher rate of speed. This can be implemented in many ways, for example, using a fixed speed or toggling through a series of increasing speeds. + case APPCOMMAND_MEDIA_STOP: // 13 Stop playback. + case APPCOMMAND_MIC_ON_OFF_TOGGLE: // 44 Toggle the microphone. + case APPCOMMAND_MICROPHONE_VOLUME_DOWN: // 25 Decrease microphone volume. + case APPCOMMAND_MICROPHONE_VOLUME_MUTE: // 24 Mute the microphone. + case APPCOMMAND_MICROPHONE_VOLUME_UP: // 26 Increase microphone volume. + case APPCOMMAND_NEW: // 29 Create a new window. + case APPCOMMAND_OPEN: // 30 Open a window. + case APPCOMMAND_PASTE: // 38 Paste + case APPCOMMAND_PRINT: // 33 Print current document. + case APPCOMMAND_REDO: // 35 Redo last action. + case APPCOMMAND_REPLY_TO_MAIL: // 39 Reply to a mail message. + case APPCOMMAND_SAVE: // 32 Save current document. + case APPCOMMAND_SEND_MAIL: // 41 Send a mail message. + case APPCOMMAND_SPELL_CHECK: // 42 Initiate a spell check. + case APPCOMMAND_TREBLE_DOWN: // 22 Decrease the treble. + case APPCOMMAND_TREBLE_UP: // 23 Increase the treble. + case APPCOMMAND_UNDO: // 34 Undo last action. + case APPCOMMAND_VOLUME_DOWN: // 9 Lower the volume. + case APPCOMMAND_VOLUME_MUTE: // 8 Mute the volume. + case APPCOMMAND_VOLUME_UP: // 10 + break; + } + return FALSE; // The event is not processed. + } void window_make_focused() { restore_if_minimized(); ::SetFocus((HWND)master.hWnd); } // Calls WM_KILLFOCOS(prev) + WM_ACTIVATEAPP(next) + WM_SETFOCUS(next). void window_make_exposed() { ::SetWindowPos((HWND)master.hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOACTIVATE); } void window_make_topmost(bool s) { ontop_state = s; ::SetWindowPos((HWND)master.hWnd, s ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } @@ -6001,6 +6071,13 @@ namespace netxs::gui case WM_USER: stat = w->run_command(wParam, lParam); break; // Receive command. case WM_CLIPBOARDUPDATE: w->book_clipboard(); break; // Schedule clipboard update. case WM_INPUTLANGCHANGE: w->keybd_sync_layout(); break; + case WM_APPCOMMAND: // It doesn't work via RDP. + { + auto cmd = GET_APPCOMMAND_LPARAM(lParam); + auto uDevice = GET_DEVICE_LPARAM(lParam); + auto dwKeys = GET_KEYSTATE_LPARAM(lParam); + stat = w->keybd_read_media(cmd, uDevice, dwKeys); break; // Media key pressed. + } case WM_SETTINGCHANGE: w->sync_os_settings(); break; case WM_WINDOWPOSCHANGED: if (moved(lParam)) w->check_window(coord(lParam)); break; // Check moving only. Windows moves our layers the way they wants without our control. case WM_DISPLAYCHANGE: @@ -6103,6 +6180,7 @@ namespace netxs::gui bool keybd_read_pressed(si32 /*virtcod*/) { return true; /*!!(::GetAsyncKeyState(virtcod) & 0x8000);*/ } bool keybd_read_toggled(si32 /*virtcod*/) { return true; /*!!(::GetAsyncKeyState(virtcod) & 0x0001);*/ } bool keybd_read_input() { return true; } + si32 keybd_read_media(si16 /*cmd*/, ui16 /*uDevice*/, ui16 /*dwKeys*/) { return 0; } void keybd_wipe_vkstat() {} void keybd_read_vkstat() {} void keybd_send_block(view /*block*/) {} From 76fe4433b78807e8b39b523f2c68518335b7a815 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sat, 13 Jun 2026 21:16:06 +0500 Subject: [PATCH 18/71] #944: Add LunaSVG as a git submodule --- .gitmodules | 3 +++ CMakeLists.txt | 16 +++++++++++++++- deps/lunasvg | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .gitmodules create mode 160000 deps/lunasvg diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..b275bade43 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "deps/lunasvg"] + path = deps/lunasvg + url = https://github.com/sammycage/lunasvg.git diff --git a/CMakeLists.txt b/CMakeLists.txt index a74fa44fa3..e51463a6c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,12 +24,26 @@ add_executable(vtm "src/vtm.cpp" $ENV{WIN32_RESOURCES}) find_package(Freetype REQUIRED) find_package(harfbuzz REQUIRED) find_package(Lua 5.4 REQUIRED) -find_package(lunasvg REQUIRED) find_path(STB_INCLUDE_DIR "stb_image.h") +find_package(lunasvg QUIET) +if(lunasvg_FOUND) + set(LUNASVG_TARGET lunasvg::lunasvg) +else() + message(STATUS "LunaSVG not found via find_package. Building from submodule...") + set(LUNASVG_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) + set(LUNASVG_BUILD_TOOLS OFF CACHE BOOL "" FORCE) + add_subdirectory(deps/lunasvg) + add_library(lunasvg::lunasvg ALIAS lunasvg) + set(LUNASVG_TARGET lunasvg::lunasvg) +endif() add_library(Lua::Lua INTERFACE IMPORTED) set_target_properties(Lua::Lua PROPERTIES INTERFACE_LINK_LIBRARIES "${LUA_LIBRARIES}") +if(NOT lunasvg_FOUND) + target_include_directories(vtm PRIVATE deps/lunasvg/include) +endif() + target_include_directories(vtm PRIVATE ${FREETYPE_INCLUDE_DIRS} ${HARFBUZZ_INCLUDE_DIRS} ${LUA_INCLUDE_DIR} diff --git a/deps/lunasvg b/deps/lunasvg new file mode 160000 index 0000000000..2872affa10 --- /dev/null +++ b/deps/lunasvg @@ -0,0 +1 @@ +Subproject commit 2872affa1027cad92a05408a7e6f2547efa7f364 From 89622434cadd4f135ed83eacd78c8b92f69013b9 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sun, 14 Jun 2026 01:30:56 +0500 Subject: [PATCH 19/71] Minor edits --- src/netxs/desktopio/gui.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 1f183256ad..88181139c7 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -6071,12 +6071,12 @@ namespace netxs::gui case WM_USER: stat = w->run_command(wParam, lParam); break; // Receive command. case WM_CLIPBOARDUPDATE: w->book_clipboard(); break; // Schedule clipboard update. case WM_INPUTLANGCHANGE: w->keybd_sync_layout(); break; - case WM_APPCOMMAND: // It doesn't work via RDP. + case WM_APPCOMMAND: { auto cmd = GET_APPCOMMAND_LPARAM(lParam); auto uDevice = GET_DEVICE_LPARAM(lParam); auto dwKeys = GET_KEYSTATE_LPARAM(lParam); - stat = w->keybd_read_media(cmd, uDevice, dwKeys); break; // Media key pressed. + stat = w->keybd_read_media(cmd, uDevice, dwKeys) break; // Media key pressed. } case WM_SETTINGCHANGE: w->sync_os_settings(); break; case WM_WINDOWPOSCHANGED: if (moved(lParam)) w->check_window(coord(lParam)); break; // Check moving only. Windows moves our layers the way they wants without our control. From 115df6f6b2a3a8f3f5ab1c44d4d8968d21979dcd Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sun, 14 Jun 2026 02:13:34 +0500 Subject: [PATCH 20/71] #944: Remove lunasvg submodule in favor of FetchContent --- .gitmodules | 3 -- CMakeLists.txt | 8 ++--- deps/lunasvg | 1 - src/netxs/desktopio/gui.hpp | 72 ++++++++++++++++++------------------- 4 files changed, 40 insertions(+), 44 deletions(-) delete mode 100644 .gitmodules delete mode 160000 deps/lunasvg diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index b275bade43..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "deps/lunasvg"] - path = deps/lunasvg - url = https://github.com/sammycage/lunasvg.git diff --git a/CMakeLists.txt b/CMakeLists.txt index e51463a6c1..7297ea2748 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,12 +29,12 @@ find_package(lunasvg QUIET) if(lunasvg_FOUND) set(LUNASVG_TARGET lunasvg::lunasvg) else() - message(STATUS "LunaSVG not found via find_package. Building from submodule...") + message(STATUS "LunaSVG not found. Downloading via FetchContent...") set(LUNASVG_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) set(LUNASVG_BUILD_TOOLS OFF CACHE BOOL "" FORCE) - add_subdirectory(deps/lunasvg) - add_library(lunasvg::lunasvg ALIAS lunasvg) - set(LUNASVG_TARGET lunasvg::lunasvg) + FetchContent_Declare(lunasvg + GIT_REPOSITORY https://github.com/sammycage/lunasvg.git + GIT_TAG v3.5.0) endif() add_library(Lua::Lua INTERFACE IMPORTED) diff --git a/deps/lunasvg b/deps/lunasvg deleted file mode 160000 index 2872affa10..0000000000 --- a/deps/lunasvg +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2872affa1027cad92a05408a7e6f2547efa7f364 diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 88181139c7..ef00fc9cd0 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -5800,58 +5800,58 @@ namespace netxs::gui } switch (cmd) { - case APPCOMMAND_BASS_BOOST: // 20 Toggle the bass boost on and off. - case APPCOMMAND_BASS_DOWN: // 19 Decrease the bass. - case APPCOMMAND_BASS_UP: // 21 Increase the bass. case APPCOMMAND_BROWSER_BACKWARD: // 1 Navigate backward. - case APPCOMMAND_BROWSER_FAVORITES: // 6 Open favorites. case APPCOMMAND_BROWSER_FORWARD: // 2 Navigate forward. - case APPCOMMAND_BROWSER_HOME: // 7 Navigate home. case APPCOMMAND_BROWSER_REFRESH: // 3 Refresh page. - case APPCOMMAND_BROWSER_SEARCH: // 5 Open search. case APPCOMMAND_BROWSER_STOP: // 4 Stop download. - case APPCOMMAND_CLOSE: // 31 Close the window (not the application). - case APPCOMMAND_COPY: // 36 Copy the selection. - case APPCOMMAND_CORRECTION_LIST: // 45 Brings up the correction list when a word is incorrectly identified during speech input. - case APPCOMMAND_CUT: // 37 Cut the selection. - case APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE: // 43 Toggles between two modes of speech input: dictation and command/control (giving commands to an application or accessing menus). - case APPCOMMAND_FIND: // 28 Open the Find dialog. - case APPCOMMAND_FORWARD_MAIL: // 40 Forward a mail message. - case APPCOMMAND_HELP: // 27 Open the Help dialog. - case APPCOMMAND_LAUNCH_APP1: // 17 Start App1. - case APPCOMMAND_LAUNCH_APP2: // 18 Start App2. - case APPCOMMAND_LAUNCH_MAIL: // 15 Open mail. - case APPCOMMAND_LAUNCH_MEDIA_SELECT: // 16 Go to Media Select mode. - case APPCOMMAND_MEDIA_CHANNEL_DOWN: // 52 Decrement the channel value, for example, for a TV or radio tuner. - case APPCOMMAND_MEDIA_CHANNEL_UP: // 51 Increment the channel value, for example, for a TV or radio tuner. - case APPCOMMAND_MEDIA_FAST_FORWARD: // 49 Increase the speed of stream playback. This can be implemented in many ways, for example, using a fixed speed or toggling through a series of increasing speeds. + case APPCOMMAND_BROWSER_SEARCH: // 5 Open search. + case APPCOMMAND_BROWSER_FAVORITES: // 6 Open favorites. + case APPCOMMAND_BROWSER_HOME: // 7 Navigate home. + case APPCOMMAND_VOLUME_MUTE: // 8 Mute the volume. + case APPCOMMAND_VOLUME_DOWN: // 9 Lower the volume. + case APPCOMMAND_VOLUME_UP: // 10 Raise the volume. case APPCOMMAND_MEDIA_NEXTTRACK: // 11 Go to next track. - case APPCOMMAND_MEDIA_PAUSE: // 47 Pause. If already paused, take no further action. This is a direct PAUSE command that has no state. If there are discrete Play and Pause buttons, applications should take action on this command as well as APPCOMMAND_MEDIA_PLAY_PAUSE. - case APPCOMMAND_MEDIA_PLAY: // 46 Begin playing at the current position. If already paused, it will resume. This is a direct PLAY command that has no state. If there are discrete Play and Pause buttons, applications should take action on this command as well as APPCOMMAND_MEDIA_PLAY_PAUSE. - case APPCOMMAND_MEDIA_PLAY_PAUSE: // 14 Play or pause playback. If there are discrete Play and Pause buttons, applications should take action on this command as well as APPCOMMAND_MEDIA_PLAY and APPCOMMAND_MEDIA_PAUSE. case APPCOMMAND_MEDIA_PREVIOUSTRACK: // 12 Go to previous track. - case APPCOMMAND_MEDIA_RECORD: // 48 Begin recording the current stream. - case APPCOMMAND_MEDIA_REWIND: // 50 Go backward in a stream at a higher rate of speed. This can be implemented in many ways, for example, using a fixed speed or toggling through a series of increasing speeds. case APPCOMMAND_MEDIA_STOP: // 13 Stop playback. - case APPCOMMAND_MIC_ON_OFF_TOGGLE: // 44 Toggle the microphone. - case APPCOMMAND_MICROPHONE_VOLUME_DOWN: // 25 Decrease microphone volume. + case APPCOMMAND_MEDIA_PLAY_PAUSE: // 14 Play or pause playback. If there are discrete Play and Pause buttons, applications should take action on this command as well as APPCOMMAND_MEDIA_PLAY and APPCOMMAND_MEDIA_PAUSE. + case APPCOMMAND_LAUNCH_MAIL: // 15 Open mail. + case APPCOMMAND_LAUNCH_MEDIA_SELECT: // 16 Go to Media Select mode. + case APPCOMMAND_LAUNCH_APP1: // 17 Start App1. + case APPCOMMAND_LAUNCH_APP2: // 18 Start App2. + case APPCOMMAND_BASS_DOWN: // 19 Decrease the bass. + case APPCOMMAND_BASS_BOOST: // 20 Toggle the bass boost on and off. + case APPCOMMAND_BASS_UP: // 21 Increase the bass. + case APPCOMMAND_TREBLE_DOWN: // 22 Decrease the treble. + case APPCOMMAND_TREBLE_UP: // 23 Increase the treble. case APPCOMMAND_MICROPHONE_VOLUME_MUTE: // 24 Mute the microphone. + case APPCOMMAND_MICROPHONE_VOLUME_DOWN: // 25 Decrease microphone volume. case APPCOMMAND_MICROPHONE_VOLUME_UP: // 26 Increase microphone volume. + case APPCOMMAND_HELP: // 27 Open the Help dialog. + case APPCOMMAND_FIND: // 28 Open the Find dialog. case APPCOMMAND_NEW: // 29 Create a new window. case APPCOMMAND_OPEN: // 30 Open a window. - case APPCOMMAND_PASTE: // 38 Paste + case APPCOMMAND_CLOSE: // 31 Close the window (not the application). + case APPCOMMAND_SAVE: // 32 Save current document. case APPCOMMAND_PRINT: // 33 Print current document. + case APPCOMMAND_UNDO: // 34 Undo last action. case APPCOMMAND_REDO: // 35 Redo last action. + case APPCOMMAND_COPY: // 36 Copy the selection. + case APPCOMMAND_CUT: // 37 Cut the selection. + case APPCOMMAND_PASTE: // 38 Paste case APPCOMMAND_REPLY_TO_MAIL: // 39 Reply to a mail message. - case APPCOMMAND_SAVE: // 32 Save current document. + case APPCOMMAND_FORWARD_MAIL: // 40 Forward a mail message. case APPCOMMAND_SEND_MAIL: // 41 Send a mail message. case APPCOMMAND_SPELL_CHECK: // 42 Initiate a spell check. - case APPCOMMAND_TREBLE_DOWN: // 22 Decrease the treble. - case APPCOMMAND_TREBLE_UP: // 23 Increase the treble. - case APPCOMMAND_UNDO: // 34 Undo last action. - case APPCOMMAND_VOLUME_DOWN: // 9 Lower the volume. - case APPCOMMAND_VOLUME_MUTE: // 8 Mute the volume. - case APPCOMMAND_VOLUME_UP: // 10 + case APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE: // 43 Toggles between two modes of speech input: dictation and command/control (giving commands to an application or accessing menus). + case APPCOMMAND_MIC_ON_OFF_TOGGLE: // 44 Toggle the microphone. + case APPCOMMAND_CORRECTION_LIST: // 45 Brings up the correction list when a word is incorrectly identified during speech input. + case APPCOMMAND_MEDIA_PLAY: // 46 Begin playing at the current position. If already paused, it will resume. This is a direct PLAY command that has no state. If there are discrete Play and Pause buttons, applications should take action on this command as well as APPCOMMAND_MEDIA_PLAY_PAUSE. + case APPCOMMAND_MEDIA_PAUSE: // 47 Pause. If already paused, take no further action. This is a direct PAUSE command that has no state. If there are discrete Play and Pause buttons, applications should take action on this command as well as APPCOMMAND_MEDIA_PLAY_PAUSE. + case APPCOMMAND_MEDIA_RECORD: // 48 Begin recording the current stream. + case APPCOMMAND_MEDIA_FAST_FORWARD: // 49 Increase the speed of stream playback. This can be implemented in many ways, for example, using a fixed speed or toggling through a series of increasing speeds. + case APPCOMMAND_MEDIA_REWIND: // 50 Go backward in a stream at a higher rate of speed. This can be implemented in many ways, for example, using a fixed speed or toggling through a series of increasing speeds. + case APPCOMMAND_MEDIA_CHANNEL_UP: // 51 Increment the channel value, for example, for a TV or radio tuner. + case APPCOMMAND_MEDIA_CHANNEL_DOWN: // 52 Decrement the channel value, for example, for a TV or radio tuner. break; } return FALSE; // The event is not processed. From 00b918440876277eac30b969a39bce4760fb7772 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sun, 14 Jun 2026 02:32:43 +0500 Subject: [PATCH 21/71] #944: Update build.md --- doc/build.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/build.md b/doc/build.md index 94a2725cad..55d94b1406 100644 --- a/doc/build.md +++ b/doc/build.md @@ -11,12 +11,14 @@ Build-time dependencies - `FreeType` - `HarfBuzz` - `Lua` (minimum version v5.4) + - `LunaSVG` (Will be built automatically from source via CMake if not found in the system) + - `stb` Examples of installing dependencies: OS | Dependency installation command | Notes --------|---------------------------------|------ -Linux | `sudo apt install libfreetype-dev libharfbuzz-dev liblua5.4-dev git cmake` +Linux | `sudo apt install libfreetype-dev libharfbuzz-dev liblua5.4-dev libstb-dev git cmake` | `LunaSVG` is built automatically during CMake configuration. FreeBSD | `pkg install freetype2 harfbuzz lua54 cmake` | Best results with GCC compiler and 6GB of RAM. MacOS | `brew install freetype harfbuzz lua cmake` @@ -51,5 +53,7 @@ Build-time dependencies - `FreeType` - `HarfBuzz` - `Lua` + - `LunaSVG` + - `stb` To manually compile vtm, launch Visual Studio and clone the repository https://github.com/directvt/vtm.git, after cloning is complete, double-click on the Folder View in Solution Explorer, wait for the dependencies to initialize (may take several minutes), select the required configuration on the top menu toolbar, and click the `Build All` menu button. \ No newline at end of file From ee19f0062bb008b636b5f0240f873bdb5706258b Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sun, 14 Jun 2026 22:25:05 +0500 Subject: [PATCH 22/71] #944: Make stb fetched automatically via cmake if not found --- CMakeLists.txt | 38 ++++++++++++++++++++++++++----------- doc/build.md | 4 ++-- src/netxs/desktopio/gui.hpp | 2 +- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7297ea2748..01be967ccc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,10 +24,11 @@ add_executable(vtm "src/vtm.cpp" $ENV{WIN32_RESOURCES}) find_package(Freetype REQUIRED) find_package(harfbuzz REQUIRED) find_package(Lua 5.4 REQUIRED) -find_path(STB_INCLUDE_DIR "stb_image.h") find_package(lunasvg QUIET) +find_package(Stb QUIET) + if(lunasvg_FOUND) - set(LUNASVG_TARGET lunasvg::lunasvg) + message(STATUS "LunaSVG found via find_package.") else() message(STATUS "LunaSVG not found. Downloading via FetchContent...") set(LUNASVG_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) @@ -35,23 +36,38 @@ else() FetchContent_Declare(lunasvg GIT_REPOSITORY https://github.com/sammycage/lunasvg.git GIT_TAG v3.5.0) + FetchContent_MakeAvailable(lunasvg) + add_library(lunasvg::lunasvg ALIAS lunasvg) +endif() + +if(Stb_FOUND) + message(STATUS "stb found via find_package.") + if(NOT TARGET stb::stb) + add_library(stb_interface INTERFACE) + target_include_directories(stb_interface INTERFACE ${Stb_INCLUDE_DIR}) + add_library(stb::stb ALIAS stb_interface) + endif() +else() + message(STATUS "stb not found. Downloading via FetchContent...") + FetchContent_Declare(stb + GIT_REPOSITORY https://github.com/nothings/stb + GIT_TAG master) + FetchContent_MakeAvailable(stb) + add_library(stb_interface INTERFACE) + target_include_directories(stb_interface INTERFACE ${stb_SOURCE_DIR}) + add_library(stb::stb ALIAS stb_interface) endif() add_library(Lua::Lua INTERFACE IMPORTED) set_target_properties(Lua::Lua PROPERTIES INTERFACE_LINK_LIBRARIES "${LUA_LIBRARIES}") -if(NOT lunasvg_FOUND) - target_include_directories(vtm PRIVATE deps/lunasvg/include) -endif() - target_include_directories(vtm PRIVATE ${FREETYPE_INCLUDE_DIRS} ${HARFBUZZ_INCLUDE_DIRS} - ${LUA_INCLUDE_DIR} - ${STB_INCLUDE_DIR}) + ${LUA_INCLUDE_DIR}) -target_link_libraries(vtm PRIVATE Lua::Lua Freetype::Freetype harfbuzz::harfbuzz lunasvg::lunasvg) -# target_link_libraries(term PRIVATE Lua::Lua Freetype::Freetype harfbuzz::harfbuzz lunasvg::lunasvg) -# target_link_libraries(calc PRIVATE Lua::Lua Freetype::Freetype harfbuzz::harfbuzz lunasvg::lunasvg) +target_link_libraries(vtm PRIVATE Lua::Lua Freetype::Freetype harfbuzz::harfbuzz lunasvg::lunasvg stb::stb) +# target_link_libraries(term PRIVATE Lua::Lua Freetype::Freetype harfbuzz::harfbuzz lunasvg::lunasvg stb::stb) +# target_link_libraries(calc PRIVATE Lua::Lua Freetype::Freetype harfbuzz::harfbuzz lunasvg::lunasvg stb::stb) if(NOT WIN32) install(TARGETS vtm DESTINATION bin) diff --git a/doc/build.md b/doc/build.md index 55d94b1406..389b9d1443 100644 --- a/doc/build.md +++ b/doc/build.md @@ -12,13 +12,13 @@ Build-time dependencies - `HarfBuzz` - `Lua` (minimum version v5.4) - `LunaSVG` (Will be built automatically from source via CMake if not found in the system) - - `stb` + - `stb` (Will be fetched automatically via CMake if not found) Examples of installing dependencies: OS | Dependency installation command | Notes --------|---------------------------------|------ -Linux | `sudo apt install libfreetype-dev libharfbuzz-dev liblua5.4-dev libstb-dev git cmake` | `LunaSVG` is built automatically during CMake configuration. +Linux | `sudo apt install libfreetype-dev libharfbuzz-dev liblua5.4-dev git cmake` | `stb` and `LunaSVG` are managed automatically during CMake configuration. FreeBSD | `pkg install freetype2 harfbuzz lua54 cmake` | Best results with GCC compiler and 6GB of RAM. MacOS | `brew install freetype harfbuzz lua cmake` diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index ef00fc9cd0..0581ff6e18 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -6076,7 +6076,7 @@ namespace netxs::gui auto cmd = GET_APPCOMMAND_LPARAM(lParam); auto uDevice = GET_DEVICE_LPARAM(lParam); auto dwKeys = GET_KEYSTATE_LPARAM(lParam); - stat = w->keybd_read_media(cmd, uDevice, dwKeys) break; // Media key pressed. + stat = w->keybd_read_media(cmd, uDevice, dwKeys); break; // Media key pressed. } case WM_SETTINGCHANGE: w->sync_os_settings(); break; case WM_WINDOWPOSCHANGED: if (moved(lParam)) w->check_window(coord(lParam)); break; // Check moving only. Windows moves our layers the way they wants without our control. From d850e99e4dde2e1b7efd1a1f9310c0aaf08803aa Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Tue, 16 Jun 2026 21:05:40 +0500 Subject: [PATCH 23/71] #943 WIP: Implement deadkey preview --- src/netxs/desktopio/gui.hpp | 27 ++++++++++++++++++--------- src/netxs/desktopio/input.hpp | 1 + src/netxs/desktopio/terminal.hpp | 10 +++++++++- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 0581ff6e18..229c29a032 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -4563,7 +4563,13 @@ namespace netxs::gui } }); } - void keybd_send_state(si32 virtcod = {}, si32 keystat = {}, si32 scancod = {}, bool extflag = {}, view cluster = {}, bool synth = faux) + void keybd_send_state(si32 virtcod = {}, + si32 keystat = {}, + si32 scancod = {}, + bool extflag = {}, + view cluster = {}, + bool synth = faux, + byte payload = input::keybd::type::keypress) { auto state = 0; auto cs = 0; @@ -4693,7 +4699,7 @@ namespace netxs::gui stream.mouse(stream.m); // Fire mouse event to update kb modifiers. } } - gear.payload = input::keybd::type::keypress; + gear.payload = payload; gear.extflag = extflag; gear.virtcod = virtcod; gear.scancod = scancod; @@ -5456,7 +5462,6 @@ namespace netxs::gui tsfl tslink; // window: TSF link. MSG winmsg; // window: Last OS window message. - text toUTF8; // window: UTF-8 conversion buffer. wide toWIDE; // window: UTF-16 conversion buffer. window(auto&& ...Args) @@ -5692,34 +5697,38 @@ namespace netxs::gui } ::GetKeyboardState(vkstat.data()); // Sync with thread kb state. auto is_deadkey_released = last_deadkey_vkey && (keystat == input::key::released) && (virtcod == last_deadkey_vkey); - if (is_deadkey_released) // Do not notify dead keys. + auto toUTF8 = utf::to_utf(toWIDE); + toWIDE.clear(); + if (is_deadkey_released) { - last_deadkey_vkey = {}; //if constexpr (debugmode) log("deadkey released"); + keybd_send_state(virtcod, keystat, scancod, extflag, toUTF8, faux, input::keybd::type::deadkey); + last_deadkey_vkey = {}; } else if (keytype != 2) { - toUTF8.clear(); if (keytype == 1) { - utf::to_utf(toWIDE, toUTF8); if (keystat == input::key::released) // Only Alt+Numpad fires on release. { keybd_send_state(virtcod, keystat, scancod, extflag); // Release Alt. Send empty string. keybd_send_input(toUTF8, input::keybd::type::imeinput); // Send Alt+Numpads result. - toWIDE.clear(); //print_vkstat("Alt+Numpad"); return true; } } + else + { + toUTF8.clear(); + } keybd_send_state(virtcod, keystat, scancod, extflag, toUTF8); } else { last_deadkey_vkey = virtcod; //if constexpr (debugmode) log("deadkey pressed"); + keybd_send_state(virtcod, keystat, scancod, extflag, toUTF8, faux, input::keybd::type::deadkey); } - toWIDE.clear(); //print_vkstat("keybd_read_input"); return true; } diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 547ab1825a..8512c72f62 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -930,6 +930,7 @@ namespace netxs::input static constexpr byte imeinput = 2; static constexpr byte imeanons = 3; static constexpr byte kblayout = 4; + static constexpr byte deadkey = 5; }; si32 nullkey = key::Key2; diff --git a/src/netxs/desktopio/terminal.hpp b/src/netxs/desktopio/terminal.hpp index beab504881..224acd2e75 100644 --- a/src/netxs/desktopio/terminal.hpp +++ b/src/netxs/desktopio/terminal.hpp @@ -8211,6 +8211,7 @@ namespace netxs::ui std::array image_ref_count{}; // term: Each slot contains a count of the number of cells containing an id corresponding to the slot index. ui16 image_sixel_count{}; // term: Registered sixel image count; std::vector image_removed_indexes; // term: Image indexes to be deleted. + text deadkey_preview; // term: Deadkey preview. sixel_t sixels; // term: Sixel mode state. vtty ipccon; // term: IPC connector. Should be destroyed first. @@ -10223,6 +10224,9 @@ namespace netxs::ui if (!forced_event && gear.touched && !rawkbd) return; switch (gear.payload) { + case keybd::type::deadkey: + deadkey_preview = gear.keystat == input::key::pressed ? gear.cluster : ""; + if (io_log) log("%%Deadkey preview: ", prompt::key, ansi::hi(deadkey_preview.size() ? deadkey_preview : " ")); case keybd::type::keypress: if (defcfg.resetonkey && gear.doinput()) { @@ -10231,7 +10235,7 @@ namespace netxs::ui follow[axis::X] = true; follow[axis::Y] = true; } - ipccon.keybd(gear, decckm, kbmode); + if (gear.payload == keybd::type::keypress) ipccon.keybd(gear, decckm, kbmode); if (forced_event || !gear.touched || gear.keystat != input::key::released || rawkbd) gear.set_handled(faux); break; case keybd::type::imeinput: @@ -11006,6 +11010,10 @@ namespace netxs::ui caret.coor(original_cursor); if (defclr.bga() != 0xFF) parent_canvas.fill(rect{ caret.coor(), dot_11 }, [&](cell& c){ c.fgc(console.brush.fgc()); }); // Prefill the cursor cell placeholder in the case of transparent background. console.output(parent_canvas); + if (deadkey_preview.size()) + { + parent_canvas.fill(rect{ caret.coor(), dot_11 }, [&](cell& c){ c.txt(deadkey_preview); }); + } } if (invbit) // DECSCNM. { From fa169aa9839be77b987235ccfc12ae0ee70caec0 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Wed, 17 Jun 2026 18:37:17 +0500 Subject: [PATCH 24/71] #943 WIP: Implement kb layout tracking --- src/netxs/desktopio/gui.hpp | 59 ++++++++++++++-- src/netxs/desktopio/input.hpp | 125 ++++++++++++++++++++++++++++++++++ src/netxs/desktopio/utf.hpp | 11 +++ 3 files changed, 188 insertions(+), 7 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 229c29a032..e19d61224f 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -5463,11 +5463,15 @@ namespace netxs::gui tsfl tslink; // window: TSF link. MSG winmsg; // window: Last OS window message. wide toWIDE; // window: UTF-16 conversion buffer. + ui32 klid_fallback; // window: User's latin-based keyboard layout. + bool klid_suppress_tracking; // window: Suppress keyboard layout tracking. window(auto&& ...Args) : winbase{ Args... }, tslink{ *this }, - winmsg{} + winmsg{}, + klid_fallback{}, + klid_suppress_tracking{} { auto proc = (LONG(_stdcall*)(si32))::GetProcAddress(::GetModuleHandleA("user32.dll"), "SetProcessDpiAwarenessInternal"); if (proc) proc(2/*PROCESS_PER_MONITOR_DPI_AWARE*/); @@ -5783,18 +5787,59 @@ namespace netxs::gui ::SetKeyboardState(vkstat.data()); // Sync thread kb state. //print_vkstat("deactivate"); } + auto keybd_find_layout() // Find any installed latin-based keyboard layout. + { + klid_suppress_tracking = true; + auto latin_klid = 0; + auto layout_count = ::GetKeyboardLayoutList(0, nullptr); + auto layouts = std::vector(layout_count); + ::GetKeyboardLayoutList(layout_count, layouts.data()); + auto old_hkl = ::GetKeyboardLayout(0); // Save current layout. + for (auto hkl : layouts) // Iterate over existing layouts. + { + ::ActivateKeyboardLayout(hkl, 0); + auto klid_wide = wide(KL_NAMELENGTH - 1/*exclude trailing null*/, '\0'); + if (::GetKeyboardLayoutNameW(klid_wide.data())) + { + auto klid = utf::to_int_from_hex_str(klid_wide); + if (input::key::is_layout_supported(klid)) + { + if constexpr (debugmode) log("Latin-based keyboard layout found: ", utf::adjust(utf::to_hex(klid), 8, "0", true)); + latin_klid = klid; + break; + } + } + } + ::ActivateKeyboardLayout(old_hkl, 0); // Restore user's layout. + if constexpr (debugmode) + if (!latin_klid) + { + log("Latin-based keyboard layout not found"); + } + klid_suppress_tracking = faux; + return latin_klid; + } void keybd_sync_layout() { + if (klid_suppress_tracking) return; keybd_sync_state(); - auto klid_buf = wide(KL_NAMELENGTH, '\0'); + auto klid_buf = wide(KL_NAMELENGTH - 1/*exclude trailing null*/, '\0'); ::GetKeyboardLayoutNameW(klid_buf.data()); - xlayout = 0; - for(auto i = 0; i < 8; ++i) + auto klid = utf::to_int_from_hex_str(klid_buf); + log("%%Keyboard layout changed to ", prompt::gui, utf::adjust(utf::to_hex(klid), 8, "0", true)); + if (!klid_fallback) { - xlayout = (xlayout << 4) | (klid_buf[i] >= 'a' ? klid_buf[i] - 'a' + 10 : - klid_buf[i] >= 'A' ? klid_buf[i] - 'A' + 10 : klid_buf[i] - '0'); + if (input::key::is_layout_supported(klid)) + { + klid_fallback = klid; + } + else + { + if constexpr (debugmode) log("Layout %% is unsupported or not latin-based. Looking for klid fallback.", utf::adjust(utf::to_hex(klid), 8, "0", true)); + klid_fallback = keybd_find_layout(); // Looking for klid fallback. + } } - log("%%Keyboard layout changed to ", prompt::gui, utf::to_hex_0x(xlayout)); + xlayout = klid; } si32 keybd_read_media(si16 cmd, ui16 uDevice, ui16 dwKeys) { diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 8512c72f62..a017b2b6fa 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -130,6 +130,131 @@ namespace netxs::input return layout::qwerty; } + static constexpr auto latin_klids = std::to_array( + { + 0x00000409, // US + 0x00000412, // Korean + 0x00000468, // Hausa + 0x00000411, // Japanese + 0x00000432, // Setswana + 0x00050408, // Greek Latin + 0x00000415, // Polish (Programmers) + 0x00000404, // Chinese (Traditional) - US + 0x00004009, // English (India) + 0x00020418, // Romanian (Programmers) + 0x00020409, // United States-International + 0x00020405, // Czech Programmers + 0x00000c04, // Chinese (Traditional, Hong Kong S.A.R.) - US + 0x00000804, // Chinese (Simplified) - US + 0x00020426, // Latvian (Standard) + 0x00000481, // Maori + 0x00001404, // Chinese (Traditional, Macao S.A.R.) - US + 0x00010402, // Bulgarian (Latin) + 0x00000470, // Igbo + 0x0000046c, // Sesotho sa Leboa + 0x0000046a, // Yoruba + 0x00001004, // Chinese (Simplified, Singapore) - US + 0x00010426, // Latvian (QWERTY) + 0x00000475, // Hawaiian + 0x00050409, // US English Table for IBM Arabic 238_L + 0x0001045d, // Inuktitut - Naqittaut + 0x0000085d, // Inuktitut - Latin + 0x00001809, // Irish + 0x00011809, // Scottish Gaelic + 0x00000452, // United Kingdom Extended + 0x00000809, // United Kingdom + 0x0000043a, // Maltese 47-Key + 0x0001043a, // Maltese 48-Key + 0x00001009, // Canadian French + 0x00011009, // Canadian Multilingual Standard + 0x00000c0c, // Canadian French (Legacy) + 0x00040408, // Greek (319) Latin + 0x00000416, // Portuguese (Brazil ABNT) + 0x00010418, // Romanian (Standard) + 0x00010416, // Portuguese (Brazil ABNT2) + 0x0001040a, // Spanish Variation + 0x00000816, // Portuguese + 0x0000041c, // Albanian + 0x00000410, // Italian + 0x00010410, // Italian (142) + 0x0000041d, // Swedish + 0x0000083b, // Swedish with Sami + 0x00000413, // Dutch + 0x00000414, // Norwegian + 0x00000474, // Guarani + 0x00000406, // Danish + 0x0000046f, // Greenlandic + 0x0000043b, // Norwegian with Sami + 0x0000080a, // Latin American + 0x0001083b, // Finnish with Sami + 0x0000040a, // Spanish + 0x0000040b, // Finnish + 0x00030408, // Greek (220) Latin + 0x00000438, // Faeroese + 0x00000425, // Estonian + 0x0000040f, // Icelandic + 0x00010427, // Lithuanian + 0x0001040e, // Hungarian 101-key + 0x0000100c, // Swiss French + 0x00000424, // Slovenian + 0x0001042e, // Sorbian Extended + 0x00000407, // German + 0x0000081a, // Serbian (Latin) + 0x00010407, // German (IBM) + 0x00010415, // Polish (214) + 0x0000042e, // Sorbian Standard (Legacy) + 0x0002042e, // Sorbian Standard + 0x00000807, // Swiss German + 0x0000041a, // Standard + 0x0000046e, // Luxembourgish + 0x00000418, // Romanian (Legacy) + 0x0000040e, // Hungarian + 0x0000041f, // Turkish Q + 0x0000042a, // Vietnamese + 0x0001041b, // Slovak (QWERTY) + 0x00010405, // Czech (QWERTY) + 0x00000405, // Czech + 0x0000041b, // Slovak + 0x0000040c, // French + 0x0000085f, // Central Atlas Tamazight + 0x00000488, // Wolof + 0x0001080c, // Belgian (Comma) + 0x0000080c, // Belgian French + 0x00000813, // Belgian (Period) + 0x00010409, // United States-Dvorak + 0x00020427, // Lithuanian Standard + 0x0001041f, // Turkish F + 0x00040409, // United States-Dvorak for right hand + 0x00030409, // United States-Dvorak for left hand + }); + // modul=161(0x000000a1) | prime=221868(0x000362ac) | shift=374331(0x0005b63b) | MIN=2 | MAX=159 | DELTA=157 + static constexpr auto klid_prime = 221868u; + static constexpr auto klid_shift = 374331u; + static constexpr auto klid_modul = 161u; + static constexpr auto klid_hash(si32 klid) + { + auto uniq = (((ui32)klid ^ (ui32)klid_prime) * (ui32)klid_shift) % (ui32)klid_modul; + return uniq; + } + static constexpr auto supported_klids = [] // This won't compile if there are collisions. + { + auto klids = std::array{}; + for (auto klid : input::key::latin_klids) // Check hash collisions. + { + auto uniq = input::key::klid_hash(klid); + if (klids[uniq] != 0) + { + log("Hash collision detected. Try to update prime/shift/modul."); + } + klids[uniq] = klid; + } + return klids; + }(); + static constexpr auto is_layout_supported(si32 klid) + { + return input::key::supported_klids[input::key::klid_hash(klid)] == klid; + } + // Notes: // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. diff --git a/src/netxs/desktopio/utf.hpp b/src/netxs/desktopio/utf.hpp index b2a3ed45df..0e2d1084ae 100644 --- a/src/netxs/desktopio/utf.hpp +++ b/src/netxs/desktopio/utf.hpp @@ -1187,6 +1187,17 @@ namespace netxs::utf template using unordered_map = std::unordered_map; + template + auto to_int_from_hex_str(auto&& text_or_wide) + { + auto num = A{}; + for(auto c : text_or_wide) + { + auto val = (c & 0x0F) + 9 * (c >> 6 & 0x01); + num = (num << 4) | val; + } + return num; + } template>> std::optional to_int(View& utf8) { From 30ea3f0484ceb283956db25d10697b7f96c1cee7 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 02:08:34 +0500 Subject: [PATCH 25/71] #943 WIP: Update physical key list --- src/netxs/desktopio/gui.hpp | 10 +- src/netxs/desktopio/input.hpp | 655 ++++++++++++++++++++-------------- 2 files changed, 393 insertions(+), 272 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index e19d61224f..b255b2dbae 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3515,6 +3515,7 @@ namespace netxs::gui bool wait_ralt; // winbase: Wait RightAlt right after the fake LeftCtrl. si32 last_deadkey_vkey = {}; // winbase: Virtual code for deadkey tracking. si32 xlayout; // winbase: Current keyboard layout (KLID). + si32 klid_fallback; // winbase: User's latin-based keyboard layout. winbase(auth& indexer, cfg_t& config, twod grip_cell) : base{ indexer }, @@ -3548,7 +3549,8 @@ namespace netxs::gui stream{ *this, *os::dtvt::client }, fake_ctrl{ faux }, wait_ralt{ faux }, - xlayout{ input::key::klid::k00000409 } + xlayout{}, + klid_fallback{} { } virtual bool layer_create(layer& s, winbase* host_ptr = nullptr, twod win_coord = {}, twod grid_size = {}, dent border_dent = {}, twod cell_size = {}) = 0; @@ -4703,13 +4705,13 @@ namespace netxs::gui gear.extflag = extflag; gear.virtcod = virtcod; gear.scancod = scancod; - auto keycode = input::key::xlat(virtcod, scancod, cs, xlayout); + keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); + auto keycode = input::key::xlat(scancod, extflag, keymod, xlayout, klid_fallback); if ((gear.keystat == input::key::released || keycode != gear.keycode) && keystat == input::key::repeated) keystat = input::key::pressed; // LeftMod+RightMod press is treated by the OS as a repeated LeftMod. gear.keystat = keystat; gear.keycode = keycode; gear.xlayout = xlayout; gear.cluster = cluster; - keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); if constexpr (debugmode) log("shifted='%%' unshift='%%'", gear.shifted, gear.unshift); auto repeat_ctrl = keystat == input::key::repeated && (virtcod == vkey::shift || virtcod == vkey::control || virtcod == vkey::alt || virtcod == vkey::capslock || virtcod == vkey::numlock || virtcod == vkey::scrllock @@ -5463,14 +5465,12 @@ namespace netxs::gui tsfl tslink; // window: TSF link. MSG winmsg; // window: Last OS window message. wide toWIDE; // window: UTF-16 conversion buffer. - ui32 klid_fallback; // window: User's latin-based keyboard layout. bool klid_suppress_tracking; // window: Suppress keyboard layout tracking. window(auto&& ...Args) : winbase{ Args... }, tslink{ *this }, winmsg{}, - klid_fallback{}, klid_suppress_tracking{} { auto proc = (LONG(_stdcall*)(si32))::GetProcAddress(::GetModuleHandleA("user32.dll"), "SetProcessDpiAwarenessInternal"); diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index a017b2b6fa..31f3a860f4 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -238,269 +238,366 @@ namespace netxs::input } static constexpr auto supported_klids = [] // This won't compile if there are collisions. { - auto klids = std::array{}; + struct layout + { + si32 klid; + si32 index; + }; + auto index = 0; + auto klids = std::array{}; for (auto klid : input::key::latin_klids) // Check hash collisions. { auto uniq = input::key::klid_hash(klid); - if (klids[uniq] != 0) + if (klids[uniq].klid != 0) { log("Hash collision detected. Try to update prime/shift/modul."); } - klids[uniq] = klid; + klids[uniq] = { (si32)klid, index++ }; } return klids; }(); static constexpr auto is_layout_supported(si32 klid) { - return input::key::supported_klids[input::key::klid_hash(klid)] == klid; + return input::key::supported_klids[input::key::klid_hash(klid)].klid == klid; + } + // 15 9 8 7 0 + // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + // | L L L L L L L | E | S S S S S S S S | + // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ + // \_________________________/ | \_____________________________/ + // 7 bit Layout Index | 8 bit Base Scancode + // (0 - 93) | (0 - 255) + // Extended Bit (0 or 1) + auto key_hash(si32 scan, si32 klid) + { + auto hash = (ui16)((scan & 0xFF) | ((!!(scan & ExtendedKey)) << 8) | (input::key::supported_klids[input::key::klid_hash(klid)].index << 9)); + return hash; } // Notes: // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. #define key_list \ + /* ID Input Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */\ + X(0 , 1, undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(1 , 0, config , "config" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(2 , 0, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001da2281da2081da2261da2121da20c1da21e1da21c1da2061da2241da2041da20a1da2101da2161da2201da2181da20e1da22a1da21a1da2221da2141da27a1da22c1da22e1da2021da2301da2321da2341da23a1da23c1da2381da2361da29c1da2401da23e1da24c1da2421da24e1da24a1da2461da2541da2441da25c1da25a1da2681da2621da2661da2481da2721da26c1da2501da29e1da2761da2a01da2521da2581da2561da26e1da2601da26a1da2701da2741da25e1da2641da2a21da2781da28c1da28e1da2821da2a41da2861da28a1da2981da29a1da2901da27e1da2941da2881da2841da27c1da2921da2801da2961da2aa1da2a81da2a61da2ae1da2b01da2ac1da2b41da2b21da2b61da2b81da2ba1da2")\ + X( 3 , 0, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "001da3281da3081da3261da3121da30c1da31e1da31c1da3061da3241da3041da30a1da3101da3161da3201da3181da30e1da32a1da31a1da3221da3141da37a1da32c1da32e1da3021d19301da3321da3341da33a1da33c1da3381da3361da39c1da3401da33e1da34c1da3421da34e1da34a1da3461da3541da3441ddf5c1da35a1da3681da3621da3661da3481da3721da36c1da3501da39e1da3761da3a01da3521da3581da3561da36e1da3601da36a1da3701da3741da35e1da3641da3a21da3781da38c1da38e1da3821da3a41da3861da38a1da3981da39a1da3901da37e1da3941da3881da3841da37c1da3921da3801da3961da3aa1da3a81da3a61da3ae1da3b01da3ac1da3b41da3b21da3b61da3b81da3ba1da3")\ + X(4 , 0, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038a42838a40838a42638a41238a40c38a41e38a41c38a40638a42438a40438a40a38a41038a41638a42038a41838a40e38a42a38a41a38a42238a41438a47a38a42c38a42e38a40238a43038a43238a43438a43a38a43c38a43838a43638a49c38a44038a43e38a44c38a44238a44e38a44a38a44638a45438a44438a45c38a45a38a46838a46238a46638a44838a47238a46c38a45038a49e38a47638a4a038a45238a45838a45638a46e38a46038a46a38a47038a47438a45e38a46438a4a238a47838a48c38a48e38a48238a4a438a48638a48a38a49838a49a38a49038a47e38a49438a48838a48438a47c38a49238a48038a49638a4aa38a4a838a4a638a4ae38a4b038a4ac38a4b438a4b238a4b638a4b838a4ba38a4")\ + X( 5 , 0, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0038a52838a50838a52638a51238a50c38a51e38a51c38a50638a52438a50438a50a38a51038a51638a52038a51838a50e38a52a38a51a38a52238a51438a57a38a52c38a52e38a50238153038a53238a53438a53a38a53c38a53838a53638a59c38a54038a53e38a54c38a54238a54e38a54a38a54638a55438a54438a55c38a55a38a56838a56238a56638a54838a57238a56c38a55038a59e38a57638a5a038a55238a55838a55638a56e38a56038a56a38a57038a57438a55e38a56438a5a238a57838a58c38a58e38a58238a5a438a58638a58a38a59838a59a38a59038a57e38a59438a58838a58438a57c38a59238a58038a59638a5aa38a5a838a5a638a5ae38a5b038a5ac38a5b438a5b238a5b638a5b838a5ba38a5")\ + X(6 , 0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002aa0282aa0082aa0262aa0122aa00c2aa01e2aa01c2aa0062aa0242aa0042aa00a2aa0102aa0162aa0202aa0182aa00e2aa02a2aa01a2aa0222aa0142aa07a2aa02c2aa02e2aa0022aa0302aa0322aa0342aa03a2aa03c2aa0382aa0362aa09c2aa0402aa03e2aa04c2aa0422aa04e2aa04a2aa0462aa0542aa0442aa05c2aa05a2aa0682aa0622aa0662aa0482aa0722aa06c2aa0502aa09e2aa0762aa0a02aa0522aa0582aa0562aa06e2aa0602aa06a2aa0702aa0742aa05e2aa0642aa0a22aa0782aa08c2aa08e2aa0822aa0a42aa0862aa08a2aa0982aa09a2aa0902aa07e2aa0942aa0882aa0842aa07c2aa0922aa0802aa0962aa0aa2aa0a82aa0a62aa0ae2aa0b02aa0ac2aa0b42aa0b22aa0b62aa0b82aa0ba2aa0")\ + X( 7 , 0, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036a12836a10836a12636a11236a10c36a11e36a11c36a10636a12436a10436a10a36a11036a11636a12036a11836a10e36a12a36a11a36a12236a11436a17a36a12c36a12e36a10236a13036a13236a13436a13a36a13c36a13836a13636a19c36a14036a13e36a14c36a14236a14e36a14a36a14636a15436a14436a15c36a15a36a16836a16236a16636a14836a17236a16c36a15036a19e36a17636a1a036a15236a15836a15636a16e36a16036a16a36a17036a17436a15e36a16436a1a236a17836a18c36a18e36a18236a1a436a18636a18a36a19836a19a36a19036a17e36a19436a18836a18436a17c36a19236a18036a19636a1aa36a1a836a1a636a1ae36a1b036a1ac36a1b436a1b236a1b636a1b836a1ba36a1")\ + X(8 , 0, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "005b5b285b5b085b5b265b5b125b5b0c5b5b1e5b5b1c5b5b065b5b245b5b045b5b0a5b5b105b5b165b5b205b5b185b5b0e5b5b2a5b5b1a5b5b225b5b145b5b7a5b5b2c5b5b2e5b5b025b5b305b5b325b5b345b5b3a5b5b3c5b5b385b5b365b5b9c5b5b405b5b3e5b5b4c5b5b425b5b4e5b5b4a5b5b465b5b545b5b445b5b5c5b5b5a5b5b685b5b625b5b665b5b725b5b6c5b5b505b5b9e5b5b765b5ba05b5b525b5b585b5b565b5b6e5b5b605b5b6a5b5b705b5b745b5b5e5b5b645b5ba25b5b785b5b8c5b5b8e5b5b825b5ba45b5b865b5b8a5b5b985b5b9a5b5b905b5b7e5b5b945b5b885b5b845b5baa5b5ba85b5ba65b5bae5b5bb05b5bac5b5bb45b5bb25b5bb65b5bb85b5bba5b5b")\ + X( 9 , 0, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "005c5c285c5c085c5c265c5c125c5c0c5c5c1e5c5c1c5c5c065c5c245c5c045c5c0a5c5c105c5c165c5c205c5c185c5c0e5c5c2a5c5c1a5c5c225c5c145c5c7a5c5c2c5c5c2e5c5c025c5c305c5c325c5c345c5c3a5c5c3c5c5c385c5c365c5c9c5c5c405c5c3e5c5c4c5c5c425c5c4e5c5c4a5c5c465c5c545c5c445c5c5c5c5c5a5c5c685c5c625c5c665c5c485c5c725c5c6c5c5c505c5c9e5c5c765c5ca05c5c525c5c585c5c565c5c6e5c5c605c5c6a5c5c705c5c745c5c5e5c5c645c5ca25c5c785c5c8c5c5c8e5c5c825c5ca45c5c865c5c8a5c5c985c5c9a5c5c905c5c7e5c5c945c5c885c5c845c5c7c5c5c925c5c805c5c965c5caa5c5ca85c5ca65c5cae5c5cb05c5cac5c5cb45c5cb25c5cb65c5cb85c5cba5c5c")\ + X(10 , 0, LeftHyper , "Hyper" , "" , 0 , 57445, 'u', -1 , -1 , "")\ + X( 11 , 0, RightHyper , "Hyper" , "" , 0 , 57451, 'u', -1 , -1 , "")\ + X(12 , 0, AltGR , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ + X(14 , 0, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0045902845900845902645901245900c45901e45901c45900645902445900445900a45901045901645902045901845900e45902a45901a45902245901445907a45902c45902e45900245903045903245903445903a45903c45903845903645909c45904045903e45904c45904245904e45904a45904645905445904445905c45905a45906845906245906645904845907245906c45905045909e4590764590a045905245905845905645906e45906045906a45907045907445905e4590644590a245907845908c45908e4590824590a445908645908a45909845909a45909045907e45909445908845908445907c4590924590804590964590aa4590a84590a64590ae4590b04590ac4590b44590b24590b64590b84590ba4590")\ + X(16 , 0, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14283a14083a14263a14123a140c3a141e3a141c3a14063a14243a14043a140a3a14103a14163a14203a14183a140e3a142a3a141a3a14223a14143a147a3a142c3a142e3a14023a14303a14323a14343a143a3a143c3a14383a14363a149c3a14403a143e3a144c3a14423a144e3a144a3a14463a14543a14443a145c3a145a3a14683a14623a14663a14483a14723a146c3a14503a149e3a14763a14a03a14523a14583a14563a146e3a14603a146a3a14703a14743a145e3a14643a14a23a14783a148c3a148e3a14823a14a43a14863a148a3a14983a149a3a14903a147e3a14943a14883a14843a147c3a14923a14803a14963a14aa3a14a83a14a63a14ae3a14b03a14ac3a14b43a14b23a14b63a14b83a14ba3a14")\ + X(18 , 0, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046912846910846912646911246910c46911e46911c46910646912446910446910a46911046911646912046911846910e46912a46911a46912246911446917a46912c46912e46910246913046913246913446913a46913c46913846913646919c46914046913e46914c46914246914e46914a46914646915446914446915c46915a46916846916246916646914846917246916c46915046919e4691764691a046915246915846915646916e46916046916a46917046917446915e4691644691a246917846918c46918e4691824691a446918646918a46919846919a46919046917e46919446918846918446917c4691924691804691964691aa4691a84691a64691ae4691b04691ac4691b44691b24691b64691b84691ba4691")\ + X(20 , 0, Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0670f2")\ + X(22 , 0, Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "06791c")\ + X(24 , 0, Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "067b1d")\ + X(26 , 0, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "02f119")\ + X(28 , 0, Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "02f215")\ + X(30 , 0, IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "")\ + X(32 , 0, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "005d5d285d5d085d5d265d5d125d5d0c5d5d1e5d5d1c5d5d065d5d245d5d045d5d0a5d5d105d5d165d5d205d5d185d5d0e5d5d2a5d5d1a5d5d225d5d145d5d7a5d5d2c5d5d2e5d5d025d5d305d5d325d5d345d5d3a5d5d3c5d5d385d5d365d5d9c5d5d405d5d3e5d5d4c5d5d425d5d4e5d5d4a5d5d465d5d545d5d445d5d5c5d5d5a5d5d685d5d625d5d665d5d725d5d6c5d5d505d5d9e5d5d765d5da05d5d525d5d585d5d565d5d6e5d5d605d5d6a5d5d705d5d745d5d5e5d5d645d5da25d5d785d5d8c5d5d8e5d5d825d5da45d5d865d5d8a5d5d985d5d9a5d5d905d5d7e5d5d945d5d885d5d845d5daa5d5da85d5da65d5dae5d5db05d5dac5d5db45d5db25d5db65d5db85d5dba5d5d")\ + X(34 , 0, Select , "Select" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(36 , 0, Fn , "Fn" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(38 , 0, F1 , "F1" , "" , 0 , 11 , '~', -1 , -1 , "003b70283b70083b70263b70123b700c3b701e3b701c3b70063b70243b70043b700a3b70103b70163b70203b70183b700e3b702a3b701a3b70223b70143b707a3b702c3b702e3b70023b70303b70323b70343b703a3b703c3b70383b70363b709c3b70403b703e3b704c3b70423b704e3b704a3b70463b70543b70443b705c3b705a3b70683b70623b70663b70483b70723b706c3b70503b709e3b70763b70a03b70523b70583b70563b706e3b70603b706a3b70703b70743b705e3b70643b70a23b70783b708c3b708e3b70823b70a43b70863b708a3b70983b709a3b70903b707e3b70943b70883b70843b707c3b70923b70803b70963b70aa3b70a83b70a63b70ae3b70b03b70ac3b70b43b70b23b70b63b70b83b70ba3b70")\ + X(40 , 0, F2 , "F2" , "" , 0 , 12 , '~', -1 , -1 , "003c71283c71083c71263c71123c710c3c711e3c711c3c71063c71243c71043c710a3c71103c71163c71203c71183c710e3c712a3c711a3c71223c71143c717a3c712c3c712e3c71023c71303c71323c71343c713a3c713c3c71383c71363c719c3c71403c713e3c714c3c71423c714e3c714a3c71463c71543c71443c715c3c715a3c71683c71623c71663c71483c71723c716c3c71503c719e3c71763c71a03c71523c71583c71563c716e3c71603c716a3c71703c71743c715e3c71643c71a23c71783c718c3c718e3c71823c71a43c71863c718a3c71983c719a3c71903c717e3c71943c71883c71843c717c3c71923c71803c71963c71aa3c71a83c71a63c71ae3c71b03c71ac3c71b43c71b23c71b63c71b83c71ba3c71")\ + X(42 , 0, F3 , "F3" , "" , 0 , 13 , '~', -1 , -1 , "003d72283d72083d72263d72123d720c3d721e3d721c3d72063d72243d72043d720a3d72103d72163d72203d72183d720e3d722a3d721a3d72223d72143d727a3d722c3d722e3d72023d72303d72323d72343d723a3d723c3d72383d72363d729c3d72403d723e3d724c3d72423d724e3d724a3d72463d72543d72443d725c3d725a3d72683d72623d72663d72483d72723d726c3d72503d729e3d72763d72a03d72523d72583d72563d726e3d72603d726a3d72703d72743d725e3d72643d72a23d72783d728c3d728e3d72823d72a43d72863d728a3d72983d729a3d72903d727e3d72943d72883d72843d727c3d72923d72803d72963d72aa3d72a83d72a63d72ae3d72b03d72ac3d72b43d72b23d72b63d72b83d72ba3d72")\ + X(44 , 0, F4 , "F4" , "" , 0 , 14 , '~', -1 , -1 , "003e73283e73083e73263e73123e730c3e731e3e731c3e73063e73243e73043e730a3e73103e73163e73203e73183e730e3e732a3e731a3e73223e73143e737a3e732c3e732e3e73023e73303e73323e73343e733a3e733c3e73383e73363e739c3e73403e733e3e734c3e73423e734e3e734a3e73463e73543e73443e735c3e735a3e73683e73623e73663e73483e73723e736c3e73503e739e3e73763e73a03e73523e73583e73563e736e3e73603e736a3e73703e73743e735e3e73643e73a23e73783e738c3e738e3e73823e73a43e73863e738a3e73983e739a3e73903e737e3e73943e73883e73843e737c3e73923e73803e73963e73aa3e73a83e73a63e73ae3e73b03e73ac3e73b43e73b23e73b63e73b83e73ba3e73")\ + X(46 , 0, F5 , "F5" , "" , 0 , 15 , '~', -1 , -1 , "003f74283f74083f74263f74123f740c3f741e3f741c3f74063f74243f74043f740a3f74103f74163f74203f74183f740e3f742a3f741a3f74223f74143f747a3f742c3f742e3f74023f74303f74323f74343f743a3f743c3f74383f74363f749c3f74403f743e3f744c3f74423f744e3f744a3f74463f74543f74443f745c3f745a3f74683f74623f74663f74483f74723f746c3f74503f749e3f74763f74a03f74523f74583f74563f746e3f74603f746a3f74703f74743f745e3f74643f74a23f74783f748c3f748e3f74823f74a43f74863f748a3f74983f749a3f74903f747e3f74943f74883f74843f747c3f74923f74803f74963f74aa3f74a83f74a63f74ae3f74b03f74ac3f74b43f74b23f74b63f74b83f74ba3f74")\ + X(48 , 0, F6 , "F6" , "" , 0 , 17 , '~', -1 , -1 , "0040752840750840752640751240750c40751e40751c40750640752440750440750a40751040751640752040751840750e40752a40751a40752240751440757a40752c40752e40750240753040753240753440753a40753c40753840753640759c40754040753e40754c40754240754e40754a40754640755440754440755c40755a40756840756240756640754840757240756c40755040759e4075764075a040755240755840755640756e40756040756a40757040757440755e4075644075a240757840758c40758e4075824075a440758640758a40759840759a40759040757e40759440758840758440757c4075924075804075964075aa4075a84075a64075ae4075b04075ac4075b44075b24075b64075b84075ba4075")\ + X(50 , 0, F7 , "F7" , "" , 0 , 18 , '~', -1 , -1 , "0041762841760841762641761241760c41761e41761c41760641762441760441760a41761041761641762041761841760e41762a41761a41762241761441767a41762c41762e41760241763041763241763441763a41763c41763841763641769c41764041763e41764c41764241764e41764a41764641765441764441765c41765a41766841766241766641764841767241766c41765041769e4176764176a041765241765841765641766e41766041766a41767041767441765e4176644176a241767841768c41768e4176824176a441768641768a41769841769a41769041767e41769441768841768441767c4176924176804176964176aa4176a84176a64176ae4176b04176ac4176b44176b24176b64176b84176ba4176")\ + X(52 , 0, F8 , "F8" , "" , 0 , 19 , '~', -1 , -1 , "0042772842770842772642771242770c42771e42771c42770642772442770442770a42771042771642772042771842770e42772a42771a42772242771442777a42772c42772e42770242773042773242773442773a42773c42773842773642779c42774042773e42774c42774242774e42774a42774642775442774442775c42775a42776842776242776642774842777242776c42775042779e4277764277a042775242775842775642776e42776042776a42777042777442775e4277644277a242777842778c42778e4277824277a442778642778a42779842779a42779042777e42779442778842778442777c4277924277804277964277aa4277a84277a64277ae4277b04277ac4277b44277b24277b64277b84277ba4277")\ + X(54 , 0, F9 , "F9" , "" , 0 , 20 , '~', -1 , -1 , "0043782843780843782643781243780c43781e43781c43780643782443780443780a43781043781643782043781843780e43782a43781a43782243781443787a43782c43782e43780243783043783243783443783a43783c43783843783643789c43784043783e43784c43784243784e43784a43784643785443784443785c43785a43786843786243786643784843787243786c43785043789e4378764378a043785243785843785643786e43786043786a43787043787443785e4378644378a243787843788c43788e4378824378a443788643788a43789843789a43789043787e43789443788843788443787c4378924378804378964378aa4378a84378a64378ae4378b04378ac4378b44378b24378b64378b84378ba4378")\ + X(56 , 0, F10 , "F10" , "" , 0 , 21 , '~', -1 , -1 , "0044792844790844792644791244790c44791e44791c44790644792444790444790a44791044791644792044791844790e44792a44791a44792244791444797a44792c44792e44790244793044793244793444793a44793c44793844793644799c44794044793e44794c44794244794e44794a44794644795444794444795c44795a44796844796244796644794844797244796c44795044799e4479764479a044795244795844795644796e44796044796a44797044797444795e4479644479a244797844798c44798e4479824479a444798644798a44799844799a44799044797e44799444798844798444797c4479924479804479964479aa4479a84479a64479ae4479b04479ac4479b44479b24479b64479b84479ba4479")\ + X(58 , 0, F11 , "F11" , "" , 0 , 23 , '~', -1 , -1 , "00577a28577a08577a26577a12577a0c577a1e577a1c577a06577a24577a04577a0a577a10577a16577a20577a18577a0e577a2a577a1a577a22577a14577a7a577a2c577a2e577a02577a30577a32577a34577a3a577a3c577a38577a36577a9c577a40577a3e577a4c577a42577a4e577a4a577a46577a54577a44577a5c577a5a577a68577a62577a66577a48577a72577a6c577a50577a9e577a76577aa0577a52577a58577a56577a6e577a60577a6a577a70577a74577a5e577a64577aa2577a78577a8c577a8e577a82577aa4577a86577a8a577a98577a9a577a90577a7e577a94577a88577a84577a7c577a92577a80577a96577aaa577aa8577aa6577aae577ab0577aac577ab4577ab2577ab6577ab8577aba577a")\ + X(60 , 0, F12 , "F12" , "" , 0 , 24 , '~', -1 , -1 , "00587b28587b08587b26587b12587b0c587b1e587b1c587b06587b24587b04587b0a587b10587b16587b20587b18587b0e587b2a587b1a587b22587b14587b7a587b2c587b2e587b02587b30587b32587b34587b3a587b3c587b38587b36587b9c587b40587b3e587b4c587b42587b4e587b4a587b46587b54587b44587b5c587b5a587b68587b62587b66587b48587b72587b6c587b50587b9e587b76587ba0587b52587b58587b56587b6e587b60587b6a587b70587b74587b5e587b64587ba2587b78587b8c587b8e587b82587ba4587b86587b8a587b98587b9a587b90587b7e587b94587b88587b84587b7c587b92587b80587b96587baa587ba8587ba6587bae587bb0587bac587bb4587bb2587bb6587bb8587bba587b")\ + X(62 , 0, F13 , "F13" , "" , 0 , 57376, 'u', -1 , -1 , "00647c28647c08647c26647c12647c0c647c1e647c1c647c06647c24647c04647c0a647c10647c16647c20647c18647c0e647c2a647c1a647c22647c14647c7a647c2c647c2e647c02647c30647c32647c34647c3a647c3c647c38647c36647c9c647c40647c3e647c4c647c42647c4e647c4a647c46647c54647c44647c5c647c5a647c68647c62647c66647c48647c72647c6c647c50647c9e647c76647ca0647c52647c58647c56647c6e647c60647c6a647c70647c74647c5e647c64647ca2647c78647c8c647c8e647c82647ca4647c86647c8a647c98647c9a647c90647c7e647c94647c88647c84647c7c647c92647c80647c96647caa647ca8647ca6647cae647cb0647cac647cb4647cb2647cb6647cb8647cba647c")\ + X(64 , 0, F14 , "F14" , "" , 0 , 57377, 'u', -1 , -1 , "00657d28657d08657d26657d12657d0c657d1e657d1c657d06657d24657d04657d0a657d10657d16657d20657d18657d0e657d2a657d1a657d22657d14657d7a657d2c657d2e657d02657d30657d32657d34657d3a657d3c657d38657d36657d9c657d40657d3e657d4c657d42657d4e657d4a657d46657d54657d44657d5c657d5a657d68657d62657d66657d48657d72657d6c657d50657d9e657d76657da0657d52657d58657d56657d6e657d60657d6a657d70657d74657d5e657d64657da2657d78657d8c657d8e657d82657da4657d86657d8a657d98657d9a657d90657d7e657d94657d88657d84657d7c657d92657d80657d96657daa657da8657da6657dae657db0657dac657db4657db2657db6657db8657dba657d")\ + X(66 , 0, F15 , "F15" , "" , 0 , 57378, 'u', -1 , -1 , "00667e28667e08667e26667e12667e0c667e1e667e1c667e06667e24667e04667e0a667e10667e16667e20667e18667e0e667e2a667e1a667e22667e14667e7a667e2c667e2e667e02667e30667e32667e34667e3a667e3c667e38667e36667e9c667e40667e3e667e4c667e42667e4e667e4a667e46667e54667e44667e5c667e5a667e68667e62667e66667e48667e72667e6c667e50667e9e667e76667ea0667e52667e58667e56667e6e667e60667e6a667e70667e74667e5e667e64667ea2667e78667e8c667e8e667e82667ea4667e86667e8a667e98667e9a667e90667e7e667e94667e88667e84667e7c667e92667e80667e96667eaa667ea8667ea6667eae667eb0667eac667eb4667eb2667eb6667eb8667eba667e")\ + X(68 , 0, F16 , "F16" , "" , 0 , 57379, 'u', -1 , -1 , "00677f28677f08677f26677f12677f0c677f1e677f1c677f06677f24677f04677f0a677f10677f16677f20677f18677f0e677f2a677f1a677f22677f14677f7a677f2c677f2e677f02677f30677f32677f34677f3a677f3c677f38677f36677f9c677f40677f3e677f4c677f42677f4e677f4a677f46677f54677f44677f5c677f5a677f68677f62677f66677f48677f72677f6c677f50677f9e677f76677fa0677f52677f58677f56677f6e677f60677f6a677f70677f74677f5e677f64677fa2677f78677f8c677f8e677f82677fa4677f86677f8a677f98677f9a677f90677f7e677f94677f88677f84677f7c677f92677f80677f96677faa677fa8677fa6677fae677fb0677fac677fb4677fb2677fb6677fb8677fba677f")\ + X(70 , 0, F17 , "F17" , "" , 0 , 57380, 'u', -1 , -1 , "0068802868800868802668801268800c68801e68801c68800668802468800468800a68801068801668802068801868800e68802a68801a68802268801468807a68802c68802e68800268803068803268803468803a68803c68803868803668809c68804068803e68804c68804268804e68804a68804668805468804468805c68805a68806868806268806668804868807268806c68805068809e6880766880a068805268805868805668806e68806068806a68807068807468805e6880646880a268807868808c68808e6880826880a468808668808a68809868809a68809068807e68809468808868808468807c6880926880806880966880aa6880a86880a66880ae6880b06880ac6880b46880b26880b66880b86880ba6880")\ + X(72 , 0, F18 , "F18" , "" , 0 , 57381, 'u', -1 , -1 , "0069812869810869812669811269810c69811e69811c69810669812469810469810a69811069811669812069811869810e69812a69811a69812269811469817a69812c69812e69810269813069813269813469813a69813c69813869813669819c69814069813e69814c69814269814e69814a69814669815469814469815c69815a69816869816269816669814869817269816c69815069819e6981766981a069815269815869815669816e69816069816a69817069817469815e6981646981a269817869818c69818e6981826981a469818669818a69819869819a69819069817e69819469818869818469817c6981926981806981966981aa6981a86981a66981ae6981b06981ac6981b46981b26981b66981b86981ba6981")\ + X(74 , 0, F19 , "F19" , "" , 0 , 57382, 'u', -1 , -1 , "006a82286a82086a82266a82126a820c6a821e6a821c6a82066a82246a82046a820a6a82106a82166a82206a82186a820e6a822a6a821a6a82226a82146a827a6a822c6a822e6a82026a82306a82326a82346a823a6a823c6a82386a82366a829c6a82406a823e6a824c6a82426a824e6a824a6a82466a82546a82446a825c6a825a6a82686a82626a82666a82486a82726a826c6a82506a829e6a82766a82a06a82526a82586a82566a826e6a82606a826a6a82706a82746a825e6a82646a82a26a82786a828c6a828e6a82826a82a46a82866a828a6a82986a829a6a82906a827e6a82946a82886a82846a827c6a82926a82806a82966a82aa6a82a86a82a66a82ae6a82b06a82ac6a82b46a82b26a82b66a82b86a82ba6a82")\ + X(76 , 0, F20 , "F20" , "" , 0 , 57383, 'u', -1 , -1 , "006b83286b83086b83266b83126b830c6b831e6b831c6b83066b83246b83046b830a6b83106b83166b83206b83186b830e6b832a6b831a6b83226b83146b837a6b832c6b832e6b83026b83306b83326b83346b833a6b833c6b83386b83366b839c6b83406b833e6b834c6b83426b834e6b834a6b83466b83546b83446b835c6b835a6b83686b83626b83666b83486b83726b836c6b83506b839e6b83766b83a06b83526b83586b83566b836e6b83606b836a6b83706b83746b835e6b83646b83a26b83786b838c6b838e6b83826b83a46b83866b838a6b83986b839a6b83906b837e6b83946b83886b83846b837c6b83926b83806b83966b83aa6b83a86b83a66b83ae6b83b06b83ac6b83b46b83b26b83b66b83b86b83ba6b83")\ + X(78 , 0, F21 , "F21" , "" , 0 , 57384, 'u', -1 , -1 , "006c84286c84086c84266c84126c840c6c841e6c841c6c84066c84246c84046c840a6c84106c84166c84206c84186c840e6c842a6c841a6c84226c84146c847a6c842c6c842e6c84026c84306c84326c84346c843a6c843c6c84386c84366c849c6c84406c843e6c844c6c84426c844e6c844a6c84466c84546c84446c845c6c845a6c84686c84626c84666c84486c84726c846c6c84506c849e6c84766c84a06c84526c84586c84566c846e6c84606c846a6c84706c84746c845e6c84646c84a26c84786c848c6c848e6c84826c84a46c84866c848a6c84986c849a6c84906c847e6c84946c84886c84846c847c6c84926c84806c84966c84aa6c84a86c84a66c84ae6c84b06c84ac6c84b46c84b26c84b66c84b86c84ba6c84")\ + X(80 , 0, F22 , "F22" , "" , 0 , 57385, 'u', -1 , -1 , "006d85286d85086d85266d85126d850c6d851e6d851c6d85066d85246d85046d850a6d85106d85166d85206d85186d850e6d852a6d851a6d85226d85146d857a6d852c6d852e6d85026d85306d85326d85346d853a6d853c6d85386d85366d859c6d85406d853e6d854c6d85426d854e6d854a6d85466d85546d85446d855c6d855a6d85686d85626d85666d85486d85726d856c6d85506d859e6d85766d85a06d85526d85586d85566d856e6d85606d856a6d85706d85746d855e6d85646d85a26d85786d858c6d858e6d85826d85a46d85866d858a6d85986d859a6d85906d857e6d85946d85886d85846d857c6d85926d85806d85966d85aa6d85a86d85a66d85ae6d85b06d85ac6d85b46d85b26d85b66d85b86d85ba6d85")\ + X(82 , 0, F23 , "F23" , "" , 0 , 57386, 'u', -1 , -1 , "006e86286e86086e86266e86126e860c6e861e6e861c6e86066e86246e86046e860a6e86106e86166e86206e86186e860e6e862a6e861a6e86226e86146e867a6e862c6e862e6e86026e86306e86326e86346e863a6e863c6e86386e86366e869c6e86406e863e6e864c6e86426e864e6e864a6e86466e86546e86446e865c6e865a6e86686e86626e86666e86486e86726e866c6e86506e869e6e86766e86a06e86526e86586e86566e866e6e86606e866a6e86706e86746e865e6e86646e86a26e86786e868c6e868e6e86826e86a46e86866e868a6e86986e869a6e86906e867e6e86946e86886e86846e867c6e86926e86806e86966e86aa6e86a86e86a66e86ae6e86b06e86ac6e86b46e86b26e86b66e86b86e86ba6e86")\ + X(84 , 0, F24 , "F24" , "" , 0 , 57387, 'u', -1 , -1 , "006f87286f87086f87266f87126f870c6f871e6f871c6f87066f87246f87046f870a6f87106f87166f87206f87186f870e6f872a6f871a6f87226f87146f877a6f872c6f872e6f87026f87306f87326f87346f873a6f873c6f87386f87366f879c6f87406f873e6f874c6f87426f874e6f874a6f87466f87546f87446f875c6f875a6f87686f87626f87666f87486f87726f876c6f87506f879e6f87766f87a06f87526f87586f87566f876e6f87606f876a6f87706f87746f875e6f87646f87a26f87786f878c6f878e6f87826f87a46f87866f878a6f87986f879a6f87906f877e6f87946f87886f87846f877c6f87926f87806f87966f87aa6f87a86f87a66f87ae6f87b06f87ac6f87b46f87b26f87b66f87b86f87ba6f87")\ + X(86 , 0, F25 , "F25" , "" , 0 , 57388, 'u', -1 , -1 , "")\ + X(88 , 0, F26 , "F26" , "" , 0 , 57389, 'u', -1 , -1 , "")\ + X(90 , 0, F27 , "F27" , "" , 0 , 57390, 'u', -1 , -1 , "")\ + X(92 , 0, F28 , "F28" , "" , 0 , 57391, 'u', -1 , -1 , "")\ + X(94 , 0, F29 , "F29" , "" , 0 , 57392, 'u', -1 , -1 , "")\ + X(96 , 0, F30 , "F30" , "" , 0 , 57393, 'u', -1 , -1 , "")\ + X(98 , 0, F31 , "F31" , "" , 0 , 57394, 'u', -1 , -1 , "")\ + X(100 , 0, F32 , "F32" , "" , 0 , 57395, 'u', -1 , -1 , "")\ + X(102 , 0, F33 , "F33" , "" , 0 , 57396, 'u', -1 , -1 , "")\ + X(104 , 0, F34 , "F34" , "" , 0 , 57397, 'u', -1 , -1 , "")\ + X(106 , 0, F35 , "F35" , "" , 0 , 57398, 'u', -1 , -1 , "")\ + X(108 , 0, PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "00372c28372c08372c26372c12372c0c372c1e372c1c372c06372c24372c04372c0a372c10372c16372c20372c18372c0e372c2a372c1a372c22372c14372c7a372c2c372c2e372c02372c30372c32372c34372c3a372c3c372c38372c36372c9c372c40372c3e372c4c372c42372c4e372c4a372c46372c54372c44372c5c372c5a372c68372c62372c66372c48372c72372c6c372c50372c9e372c76372ca0372c52372c58372c56372c6e372c60372c6a372c70372c74372c5e372c64372ca2372c78372c8c372c8e372c82372ca4372c86372c8a372c98372c9a372c90372c7e372c94372c88372c84372c7c372c92372c80372c96372caa372ca8372ca6372cae372cb0372cac372cb4372cb2372cb6372cb8372cba372c")\ + X(110 , 0, Pause , "Pause" , "" , 0 , 57362, 'u', '\x1a', '\x03', "0045902845900845902645901245900c45901e45901c45900645902445900445900a45901045901645902045901845900e45902a45901a45902245901445907a45902c45902e45900245903045903245903445903a45903c45903845903645909c45904045903e45904c45904245904e45904a45904645905445904445905c45905a45906845906245906645904845907245906c45905045909e4590764590a045905245905845905645906e45906045906a45907045907445905e4590644590a245907845908c45908e4590824590a445908645908a45909845909a45909045907e45909445908845908445907c4590924590804590964590aa4590a84590a64590ae4590b04590ac4590b44590b24590b64590b84590ba4590")\ + X(112 , 1, Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0046032846030846032646031246030c46031e46031c46030646032446030446030a46031046031646032046031846030e46032a46031a46032246031446037a46032c46032e46030246033046033246033446033a46033c46033846033646039c46034046033e46034c46034246034e46034a46034646035446034446035c46035a46036846036246036646034846037246036c46035046039e4603764603a046035246035846035646036e46036046036a46037046037446035e4603644603a246037846038c46038e4603824603a446038646038a46039846039a46039046037e46039446038846038446037c4603924603804603964603aa4603a84603a64603ae4603b04603ac4603b44603b24603b64603b84603ba4603")\ + X(114 , 1, SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c28542c08542c26542c12542c0c542c1e542c1c542c06542c24542c04542c0a542c10542c16542c20542c18542c0e542c2a542c1a542c22542c7a542c2c542c2e542c02542c30542c32542c34542c3a542c40542c3e542c4c542c4e542c4a542c54542c5c542c5a542c68542c62542c66542c48542c72542c6c542c9e542c76542ca0542ca2542c8c542c8e542c82542ca4542c86542c8a542c98542c9a542c7c542c92542c80542c96542caa542ca8542cb4542cb6542cb8542cba542c")\ + X(116 , 1, Esc , "Esc" , "\x1B", 0x1b , 27 , 'u', '\x1b', '\x1b', "00011b28011b08011b26011b12011b0c011b1e011b1c011b06011b24011b04011b0a011b10011b16011b20011b18011b0e011b2a011b1a011b22011b14011b7a011b2c011b2e011b02011b30011b32011b34011b3a011b3c011b38011b36011b9c011b40011b3e011b4c011b42011b4e011b4a011b46011b54011b44011b5c011b5a011b68011b62011b66011b48011b72011b6c011b50011b9e011b76011ba0011b52011b58011b56011b6e011b60011b6a011b70011b74011b5e011b64011ba2011b78011b8c011b8e011b82011ba4011b86011b8a011b98011b9a011b90011b7e011b94011b88011b84011b7c011b92011b80011b96011baa011ba8011ba6011bae011bb0011bac011bb4011bb2011bb6011bb8011bba011b")\ + X(118 , 1, Tab , "Tab" , "\x09", 0x09 , 9 , 'u', '\x09', '\x09', "000f09280f09080f09260f09120f090c0f091e0f091c0f09060f09240f09040f090a0f09100f09160f09200f09180f090e0f092a0f091a0f09220f09140f097a0f092c0f092e0f09020f09300f09320f09340f093a0f093c0f09380f09360f099c0f09400f093e0f094c0f09420f094e0f094a0f09460f09540f09440f095c0f095a0f09680f09620f09660f09480f09720f096c0f09500f099e0f09760f09a00f09520f09580f09560f096e0f09600f096a0f09700f09740f095e0f09640f09a20f09780f098c0f098e0f09820f09a40f09860f098a0f09980f099a0f09900f097e0f09940f09880f09840f097c0f09920f09800f09960f09aa0f09a80f09a60f09ae0f09b00f09ac0f09b40f09b20f09b60f09b80f09ba0f09")\ + X(120 , 1, Backspace , "Backspace" , "\x08", 0x08 , 127 , 'u', '\x7f', '\x08', "000e08280e08080e08260e08120e080c0e081e0e081c0e08060e08240e08040e080a0e08100e08160e08200e08180e080e0e082a0e081a0e08220e08140e087a0e082c0e082e0e08020e08300e08320e08340e083a0e083c0e08380e08360e089c0e08400e083e0e084c0e08420e084e0e084a0e08460e08540e08440e085c0e085a0e08680e08620e08660e08480e08720e086c0e08500e089e0e08760e08a00e08520e08580e08560e086e0e08600e086a0e08700e08740e085e0e08640e08a20e08780e088c0e088e0e08820e08a40e08860e088a0e08980e089a0e08900e087e0e08940e08880e08840e087c0e08920e08800e08960e08aa0e08a80e08a60e08ae0e08b00e08ac0e08b40e08b20e08b60e08b80e08ba0e08")\ + X(122 , 1, Space , "Space" , "\x20", 0x20 , 32 , 'u', '\x20', '\0' , "0039202839200839202639201239200c39201e39201c39200639202439200439200a39201039201639202039201839200e39202a39201a39202239201439207a39202c39202e39200239203039203239203439203a39203c39203839203639209c39204039203e39204c39204239204e39204a39204639205439204439205c39205a39206839206239206639204839207239206c39205039209e3920763920a039205239205839205639206e39206039206a39207039207439205e3920643920a239207839208c39208e3920823920a439208639208a39209839209a39209039207e39209439208839208439207c3920923920803920963920aa3920a83920a63920ae3920b03920ac3920b43920b23920b63920b83920ba3920")\ + X(124 , 1, KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d281c0d081c0d261c0d121c0d0c1c0d1e1c0d1c1c0d061c0d241c0d041c0d0a1c0d101c0d161c0d201c0d181c0d0e1c0d2a1c0d1a1c0d221c0d141c0d7a1c0d2c1c0d2e1c0d021c0d301c0d321c0d341c0d3a1c0d3c1c0d381c0d361c0d9c1c0d401c0d3e1c0d4c1c0d421c0d4e1c0d4a1c0d461c0d541c0d441c0d5c1c0d5a1c0d681c0d621c0d661c0d481c0d721c0d6c1c0d501c0d9e1c0d761c0da01c0d521c0d581c0d561c0d6e1c0d601c0d6a1c0d701c0d741c0d5e1c0d641c0da21c0d781c0d8c1c0d8e1c0d821c0da41c0d861c0d8a1c0d981c0d9a1c0d901c0d7e1c0d941c0d881c0d841c0d7c1c0d921c0d801c0d961c0daa1c0da81c0da61c0dae1c0db01c0dac1c0db41c0db21c0db61c0db81c0dba1c0d")\ + X( 125, 1, NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "001c0d281c0d081c0d261c0d121c0d0c1c0d1e1c0d1c1c0d061c0d241c0d041c0d0a1c0d101c0d161c0d201c0d181c0d0e1c0d2a1c0d1a1c0d221c0d141c0d7a1c0d2c1c0d2e1c0d021c0d301c0d321c0d341c0d3a1c0d3c1c0d381c0d361c0d9c1c0d401c0d3e1c0d4c1c0d421c0d4e1c0d4a1c0d461c0d541c0d441c0d5c1c0d5a1c0d681c0d621c0d661c0d481c0d721c0d6c1c0d501c0d9e1c0d761c0da01c0d521c0d581c0d561c0d6e1c0d601c0d6a1c0d701c0d741c0d5e1c0d641c0da21c0d781c0d8c1c0d8e1c0d821c0da41c0d861c0d8a1c0d981c0d9a1c0d901c0d7e1c0d941c0d881c0d841c0d7c1c0d921c0d801c0d961c0daa1c0da81c0da61c0dae1c0db01c0dac1c0db41c0db21c0db61c0db81c0dba1c0d")\ + X(126 , 1, KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "00522d28522d08522d26522d12522d0c522d1e522d1c522d06522d24522d04522d0a522d10522d16522d20522d18522d0e522d2a522d1a522d22522d14522d7a522d2c522d2e522d02522d30522d32522d34522d3a522d3c522d38522d36522d9c522d40522d3e522d4c522d42522d4e522d4a522d46522d54522d44522d5c522d5a522d68522d62522d66522d48522d72522d6c522d50522d9e522d76522da0522d52522d58522d56522d6e522d60522d6a522d70522d74522d5e522d64522da2522d78522d8c522d8e522d82522da4522d86522d8a522d98522d9a522d90522d7e522d94522d88522d84522d7c522d92522d80522d96522daa522da8522da6522dae522db0522dac522db4522db2522db6522db8522dba522d")\ + X( 127, 1, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00522d28522d08522d26522d12522d0c522d1e522d1c522d06522d24522d04522d0a522d10522d16522d20522d18522d0e522d2a522d1a522d22522d14522d7a522d2c522d2e522d02522d30522d32522d34522d3a522d3c522d38522d36522d9c522d40522d3e522d4c522d42522d4e522d4a522d46522d54522d44522d5c522d5a522d68522d62522d66522d48522d72522d6c522d50522d9e522d76522da0522d52522d58522d56522d6e522d60522d6a522d70522d74522d5e522d64522da2522d78522d8c522d8e522d82522da4522d86522d8a522d98522d9a522d90522d7e522d94522d88522d84522d7c522d92522d80522d96522daa522da8522da6522dae522db0522dac522db4522db2522db6522db8522dba522d")\ + X(128 , 1, KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "00532e28532e08532e26532e12532e0c532e1e532e1c532e06532e24532e04532e0a532e10532e16532e20532e18532e0e532e2a532e1a532e22532e14532e7a532e2c532e2e532e02532e30532e32532e34532e3a532e3c532e38532e36532e9c532e40532e3e532e4c532e42532e4e532e4a532e46532e54532e44532e5c532e5a532e68532e62532e66532e48532e72532e6c532e50532e9e532e76532ea0532e52532e58532e56532e6e532e60532e6a532e70532e74532e5e532e64532ea2532e78532e8c532e8e532e82532ea4532e86532e8a532e98532e9a532e90532e7e532e94532e88532e84532e7c532e92532e80532e96532eaa532ea8532ea6532eae532eb0532eac532eb4532eb2532eb6532eb8532eba532e")\ + X( 129, 1, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00532e28532e08532e26532e12532e0c532e1e532e1c532e06532e24532e04532e0a532e10532e16532e20532e18532e0e532e2a532e1a532e22532e14532e7a532e2c532e2e532e02532e30532e32532e34532e3a532e3c532e38532e36532e9c532e40532e3e532e4c532e42532e4e532e4a532e46532e54532e44532e5c532e5a532e68532e62532e66532e48532e72532e6c532e50532e9e532e76532ea0532e52532e58532e56532e6e532e60532e6a532e70532e74532e5e532e64532ea2532e78532e8c532e8e532e82532ea4532e86532e8a532e98532e9a532e90532e7e532e94532e88532e84532e7c532e92532e80532e96532eaa532ea8532ea6532eae532eb0532eac532eb4532eb2532eb6532eb8532eba532e")\ + X(130 , 1, KeyClear , "Clear" , "" , 0 , 1 , 'E', -1 , -1 , "")\ + X( 131, 1, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "004c0c284c0c084c0c264c0c124c0c0c4c0c1e4c0c1c4c0c064c0c244c0c044c0c0a4c0c104c0c164c0c204c0c184c0c0e4c0c2a4c0c1a4c0c224c0c144c0c7a4c0c2c4c0c2e4c0c024c0c304c0c324c0c344c0c3a4c0c3c4c0c384c0c364c0c9c4c0c404c0c3e4c0c4c4c0c424c0c4e4c0c4a4c0c464c0c544c0c444c0c5c4c0c5a4c0c684c0c624c0c664c0c484c0c724c0c6c4c0c504c0c9e4c0c764c0ca04c0c524c0c584c0c564c0c6e4c0c604c0c6a4c0c704c0c744c0c5e4c0c644c0ca24c0c784c0c8c4c0c8e4c0c824c0ca44c0c864c0c8a4c0c984c0c9a4c0c904c0c7e4c0c944c0c884c0c844c0c7c4c0c924c0c804c0c964c0caa4c0ca84c0ca64c0cae4c0cb04c0cac4c0cb44c0cb24c0cb64c0cb84c0cba4c0c")\ + X(132 , 1, KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0049212849210849212649211249210c49211e49211c49210649212449210449210a49211049211649212049211849210e49212a49211a49212249211449217a49212c49212e49210249213049213249213449213a49213c49213849213649219c49214049213e49214c49214249214e49214a49214649215449214449215c49215a49216849216249216649214849217249216c49215049219e4921764921a049215249215849215649216e49216049216a49217049217449215e4921644921a249217849218c49218e4921824921a449218649218a49219849219a49219049217e49219449218849218449217c4921924921804921964921aa4921a84921a64921ae4921b04921ac4921b44921b24921b64921b84921ba4921")\ + X( 133, 1, NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0049212849210849212649211249210c49211e49211c49210649212449210449210a49211049211649212049211849210e49212a49211a49212249211449217a49212c49212e49210249213049213249213449213a49213c49213849213649219c49214049213e49214c49214249214e49214a49214649215449214449215c49215a49216849216249216649214849217249216c49215049219e4921764921a049215249215849215649216e49216049216a49217049217449215e4921644921a249217849218c49218e4921824921a449218649218a49219849219a49219049217e49219449218849218449217c4921924921804921964921aa4921a84921a64921ae4921b04921ac4921b44921b24921b64921b84921ba4921")\ + X(134 , 1, KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0051222851220851222651221251220c51221e51221c51220651222451220451220a51221051221651222051221851220e51222a51221a51222251221451227a51222c51222e51220251223051223251223451223a51223c51223851223651229c51224051223e51224c51224251224e51224a51224651225451224451225c51225a51226851226251226651224851227251226c51225051229e5122765122a051225251225851225651226e51226051226a51227051227451225e5122645122a251227851228c51228e5122825122a451228651228a51229851229a51229051227e51229451228851228451227c5122925122805122965122aa5122a85122a65122ae5122b05122ac5122b45122b25122b65122b85122ba5122")\ + X( 135, 1, NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0051222851220851222651221251220c51221e51221c51220651222451220451220a51221051221651222051221851220e51222a51221a51222251221451227a51222c51222e51220251223051223251223451223a51223c51223851223651229c51224051223e51224c51224251224e51224a51224651225451224451225c51225a51226851226251226651224851227251226c51225051229e5122765122a051225251225851225651226e51226051226a51227051227451225e5122645122a251227851228c51228e5122825122a451228651228a51229851229a51229051227e51229451228851228451227c5122925122805122965122aa5122a85122a65122ae5122b05122ac5122b45122b25122b65122b85122ba5122")\ + X(136 , 1, KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0047242847240847242647241247240c47241e47241c47240647242447240447240a47241047241647242047241847240e47242a47241a47242247241447247a47242c47242e47240247243047243247243447243a47243c47243847243647249c47244047243e47244c47244247244e47244a47244647245447244447245c47245a47246847246247246647244847247247246c47245047249e4724764724a047245247245847245647246e47246047246a47247047247447245e4724644724a247247847248c47248e4724824724a447248647248a47249847249a47249047247e47249447248847248447247c4724924724804724964724aa4724a84724a64724ae4724b04724ac4724b44724b24724b64724b84724ba4724")\ + X( 137, 1, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0047242847240847242647241247240c47241e47241c47240647242447240447240a47241047241647242047241847240e47242a47241a47242247241447247a47242c47242e47240247243047243247243447243a47243c47243847243647249c47244047243e47244c47244247244e47244a47244647245447244447245c47245a47246847246247246647244847247247246c47245047249e4724764724a047245247245847245647246e47246047246a47247047247447245e4724644724a247247847248c47248e4724824724a447248647248a47249847249a47249047247e47249447248847248447247c4724924724804724964724aa4724a84724a64724ae4724b04724ac4724b44724b24724b64724b84724ba4724")\ + X(138 , 1, KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "004f23284f23084f23264f23124f230c4f231e4f231c4f23064f23244f23044f230a4f23104f23164f23204f23184f230e4f232a4f231a4f23224f23144f237a4f232c4f232e4f23024f23304f23324f23344f233a4f233c4f23384f23364f239c4f23404f233e4f234c4f23424f234e4f234a4f23464f23544f23444f235c4f235a4f23684f23624f23664f23484f23724f236c4f23504f239e4f23764f23a04f23524f23584f23564f236e4f23604f236a4f23704f23744f235e4f23644f23a24f23784f238c4f238e4f23824f23a44f23864f238a4f23984f239a4f23904f237e4f23944f23884f23844f237c4f23924f23804f23964f23aa4f23a84f23a64f23ae4f23b04f23ac4f23b44f23b24f23b64f23b84f23ba4f23")\ + X( 139, 1, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "004f23284f23084f23264f23124f230c4f231e4f231c4f23064f23244f23044f230a4f23104f23164f23204f23184f230e4f232a4f231a4f23224f23144f237a4f232c4f232e4f23024f23304f23324f23344f233a4f233c4f23384f23364f239c4f23404f233e4f234c4f23424f234e4f234a4f23464f23544f23444f235c4f235a4f23684f23624f23664f23484f23724f236c4f23504f239e4f23764f23a04f23524f23584f23564f236e4f23604f236a4f23704f23744f235e4f23644f23a24f23784f238c4f238e4f23824f23a44f23864f238a4f23984f239a4f23904f237e4f23944f23884f23844f237c4f23924f23804f23964f23aa4f23a84f23a64f23ae4f23b04f23ac4f23b44f23b24f23b64f23b84f23ba4f23")\ + X(140 , 1, KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "004b25284b25084b25264b25124b250c4b251e4b251c4b25064b25244b25044b250a4b25104b25164b25204b25184b250e4b252a4b251a4b25224b25144b257a4b252c4b252e4b25024b25304b25324b25344b253a4b253c4b25384b25364b259c4b25404b253e4b254c4b25424b254e4b254a4b25464b25544b25444b255c4b255a4b25684b25624b25664b25484b25724b256c4b25504b259e4b25764b25a04b25524b25584b25564b256e4b25604b256a4b25704b25744b255e4b25644b25a24b25784b258c4b258e4b25824b25a44b25864b258a4b25984b259a4b25904b257e4b25944b25884b25844b257c4b25924b25804b25964b25aa4b25a84b25a64b25ae4b25b04b25ac4b25b44b25b24b25b64b25b84b25ba4b25")\ + X( 141, 1, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "004b25284b25084b25264b25124b250c4b251e4b251c4b25064b25244b25044b250a4b25104b25164b25204b25184b250e4b252a4b251a4b25224b25144b257a4b252c4b252e4b25024b25304b25324b25344b253a4b253c4b25384b25364b259c4b25404b253e4b254c4b25424b254e4b254a4b25464b25544b25444b255c4b255a4b25684b25624b25664b25484b25724b256c4b25504b259e4b25764b25a04b25524b25584b25564b256e4b25604b256a4b25704b25744b255e4b25644b25a24b25784b258c4b258e4b25824b25a44b25864b258a4b25984b259a4b25904b257e4b25944b25884b25844b257c4b25924b25804b25964b25aa4b25a84b25a64b25ae4b25b04b25ac4b25b44b25b24b25b64b25b84b25ba4b25")\ + X(142 , 1, KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "004d27284d27084d27264d27124d270c4d271e4d271c4d27064d27244d27044d270a4d27104d27164d27204d27184d270e4d272a4d271a4d27224d27144d277a4d272c4d272e4d27024d27304d27324d27344d273a4d273c4d27384d27364d279c4d27404d273e4d274c4d27424d274e4d274a4d27464d27544d27444d275c4d275a4d27684d27624d27664d27484d27724d276c4d27504d279e4d27764d27a04d27524d27584d27564d276e4d27604d276a4d27704d27744d275e4d27644d27a24d27784d278c4d278e4d27824d27a44d27864d278a4d27984d279a4d27904d277e4d27944d27884d27844d277c4d27924d27804d27964d27aa4d27a84d27a64d27ae4d27b04d27ac4d27b44d27b24d27b64d27b84d27ba4d27")\ + X( 143, 1, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "004d27284d27084d27264d27124d270c4d271e4d271c4d27064d27244d27044d270a4d27104d27164d27204d27184d270e4d272a4d271a4d27224d27144d277a4d272c4d272e4d27024d27304d27324d27344d273a4d273c4d27384d27364d279c4d27404d273e4d274c4d27424d274e4d274a4d27464d27544d27444d275c4d275a4d27684d27624d27664d27484d27724d276c4d27504d279e4d27764d27a04d27524d27584d27564d276e4d27604d276a4d27704d27744d275e4d27644d27a24d27784d278c4d278e4d27824d27a44d27864d278a4d27984d279a4d27904d277e4d27944d27884d27844d277c4d27924d27804d27964d27aa4d27a84d27a64d27ae4d27b04d27ac4d27b44d27b24d27b64d27b84d27ba4d27")\ + X(144 , 1, KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0048262848260848262648261248260c48261e48261c48260648262448260448260a48261048261648262048261848260e48262a48261a48262248261448267a48262c48262e48260248263048263248263448263a48263c48263848263648269c48264048263e48264c48264248264e48264a48264648265448264448265c48265a48266848266248266648264848267248266c48265048269e4826764826a048265248265848265648266e48266048266a48267048267448265e4826644826a248267848268c48268e4826824826a448268648268a48269848269a48269048267e48269448268848268448267c4826924826804826964826aa4826a84826a64826ae4826b04826ac4826b44826b24826b64826b84826ba4826")\ + X( 145, 1, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0048262848260848262648261248260c48261e48261c48260648262448260448260a48261048261648262048261848260e48262a48261a48262248261448267a48262c48262e48260248263048263248263448263a48263c48263848263648269c48264048263e48264c48264248264e48264a48264648265448264448265c48265a48266848266248266648264848267248266c48265048269e4826764826a048265248265848265648266e48266048266a48267048267448265e4826644826a248267848268c48268e4826824826a448268648268a48269848269a48269048267e48269448268848268448267c4826924826804826964826aa4826a84826a64826ae4826b04826ac4826b44826b24826b64826b84826ba4826")\ + X(146 , 1, KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0050282850280850282650281250280c50281e50281c50280650282450280450280a50281050281650282050281850280e50282a50281a50282250281450287a50282c50282e50280250283050283250283450283a50283c50283850283650289c50284050283e50284c50284250284e50284a50284650285450284450285c50285a50286850286250286650284850287250286c50285050289e5028765028a050285250285850285650286e50286050286a50287050287450285e5028645028a250287850288c50288e5028825028a450288650288a50289850289a50289050287e50289450288850288450287c5028925028805028965028aa5028a85028a65028ae5028b05028ac5028b45028b25028b65028b85028ba5028")\ + X( 147, 1, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0050282850280850282650281250280c50281e50281c50280650282450280450280a50281050281650282050281850280e50282a50281a50282250281450287a50282c50282e50280250283050283250283450283a50283c50283850283650289c50284050283e50284c50284250284e50284a50284650285450284450285c50285a50286850286250286650284850287250286c50285050289e5028765028a050285250285850285650286e50286050286a50287050287450285e5028645028a250287850288c50288e5028825028a450288650288a50289850289a50289050287e50289450288850288450287c5028925028805028965028aa5028a85028a65028ae5028b05028ac5028b45028b25028b65028b85028ba5028")\ + X(148 , 1, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30280b30080b30260b30120b300c0b301e0b301c0b30060b30240b30040b300a0b30100b30160b30200b30180b300e0b302a0b301a0b30220b30140b307a0b302c0b302e0b30020b30300b30320b30340b303a0b303c0b30380b30360b309c0b30400b303e0b304c0b30420b304e0b304a0b30460b30540b30440b305c0b305a0b30680b30620b30660b30480b30720b306c0b30500b309e0b30760b30a00b30520b30580b30560b306e0b30600b306a0b30700b30740b305e0b30640b30a20b30780b308c0b308e0b30820b30a40b30860b308a0b30982930980bc09a0b30900b307e0b30940b30880b30840b307c0bc0920b30800b30960b30aa0b30a80b30a60b30ae0b30b00b30ac0b30b40b30b20b30b60b30b82d30ba3430")\ + X( 149, 1, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052602852600852602652601252600c52601e52601c52600652602452600452600a52601052601652602052601852600e52602a52601a52602252601452607a52602c52602e52600252603052603252603452603a52603c52603852603652609c52604052603e52604c52604252604e52604a52604652605452604452605c52605a52606852606252606652604852607252606c52605052609e5260765260a052605252605852605652606e52606052606a52607052607452605e5260645260a252607852608c52608e5260825260a452608652608a52609852609a52609052607e52609452608852608452607c5260925260805260965260aa5260a85260a65260ae5260b05260ac5260b45260b25260b65260b85260ba5260")\ + X(150 , 1, Key1 , "1" , "1" , 0x31 , 49 , 'u', '1' , '1' , "0002312802310802312602311202310c02311e02311c02310602312402310402310a02311002311602312002311802310e02312a02311a02312202311402317a02312c02312e02310202313002313202313402313a02313c02313802313602319c02314002313e02314c02314202314e02314a02314602315402314402315c02315a02316802316202316602314802317202316c02315002319e0231760231a002315202315802315602316e02316002316a02317002317402315e0231640231a202317802318c02318e0231820231a402318602318a02319802319a02319002317e02319402318802318402317c0231920231800231960231aa0231a80231a60231ae0231b00231ac0231b40231b20231b60231b80231ba0d31")\ + X( 151, 1, Numpad1 , "1" , "1" , 0x31 , 57400, 'u', '1' , '1' , "004f61284f61084f61264f61124f610c4f611e4f611c4f61064f61244f61044f610a4f61104f61164f61204f61184f610e4f612a4f611a4f61224f61144f617a4f612c4f612e4f61024f61304f61324f61344f613a4f613c4f61384f61364f619c4f61404f613e4f614c4f61424f614e4f614a4f61464f61544f61444f615c4f615a4f61684f61624f61664f61484f61724f616c4f61504f619e4f61764f61a04f61524f61584f61564f616e4f61604f616a4f61704f61744f615e4f61644f61a24f61784f618c4f618e4f61824f61a44f61864f618a4f61984f619a4f61904f617e4f61944f61884f61844f617c4f61924f61804f61964f61aa4f61a84f61a64f61ae4f61b04f61ac4f61b44f61b24f61b64f61b84f61ba4f61")\ + X(152 , 1, Key2 , "2" , "2" , 0x32 , 50 , 'u', '2' , '\0' , "0003322803320803322603321203320c03321e03321c03320603322403320403320a03321003321603322003321803320e03322a03321a03322203321403327a03322c03322e03320203323003323203323403323a03323c03323803323603329c03324003323e03324c03324203324e03324a03324603325403324403325c03325a03326803326203326603324803327203326c03325003329e0332760332a003325203325803325603326e03326003326a03327003327403325e0332640332a203327803328c03328e0332820332a403328603328a03329803329a03329003327e03329403328803328403327c0332920332800332960332aa0332a80332a60332ae0332b00332ac0332b40332b20332b60332b80332ba0c32")\ + X( 153, 1, Numpad2 , "2" , "2" , 0x32 , 57401, 'u', '2' , '\0' , "0050622850620850622650621250620c50621e50621c50620650622450620450620a50621050621650622050621850620e50622a50621a50622250621450627a50622c50622e50620250623050623250623450623a50623c50623850623650629c50624050623e50624c50624250624e50624a50624650625450624450625c50625a50626850626250626650624850627250626c50625050629e5062765062a050625250625850625650626e50626050626a50627050627450625e5062645062a250627850628c50628e5062825062a450628650628a50629850629a50629050627e50629450628850628450627c5062925062805062965062aa5062a85062a65062ae5062b05062ac5062b45062b25062b65062b85062ba5062")\ + X(154 , 1, Key3 , "3" , "3" , 0x33 , 51 , 'u', '3' , '\x1b', "0004332804330804332604331204330c04331e04331c04330604332404330404330a04331004331604332004331804330e04332a04331a04332204331404337a04332c04332e04330204333004333204333404333a04333c04333804333604339c04334004333e04334c04334204334e04334a04334604335404334404335c04335a04336804336204336604334804337204336c04335004339e0433760433a004335204335804335604336e04336004336a04337004337404335e0433640433a204337804338c04338e0433820433a404338604338a04339804339a04339004337e04339404338804338404337c0433920433800433960433aa0433a80433a60433ae0433b00433ac0433b40433b20433b60433b80433ba0b33")\ + X( 155, 1, Numpad3 , "3" , "3" , 0x33 , 57402, 'u', '3' , '\x1b', "0051632851630851632651631251630c51631e51631c51630651632451630451630a51631051631651632051631851630e51632a51631a51632251631451637a51632c51632e51630251633051633251633451633a51633c51633851633651639c51634051633e51634c51634251634e51634a51634651635451634451635c51635a51636851636251636651634851637251636c51635051639e5163765163a051635251635851635651636e51636051636a51637051637451635e5163645163a251637851638c51638e5163825163a451638651638a51639851639a51639051637e51639451638851638451637c5163925163805163965163aa5163a85163a65163ae5163b05163ac5163b45163b25163b65163b85163ba5163")\ + X(156 , 1, Key4 , "4" , "4" , 0x34 , 52 , 'u', '4' , '\x1c', "0005342805340805342605341205340c05341e05341c05340605342405340405340a05341005341605342005341805340e05342a05341a05342205341405347a05342c05342e05340205343005343205343405343a05343c05343805343605349c05344005343e05344c05344205344e05344a05344605345405344405345c05345a05346805346205346605344805347205346c05345005349e0534760534a005345205345805345605346e05346005346a05347005347405345e0534640534a205347805348c05348e0534820534a405348605348a05349805349a05349005347e05349405348805348405347c0534920534800534960534aa0534a80534a60534ae0534b00534ac0534b40534b20534b60534b80534ba0a34")\ + X( 157, 1, Numpad4 , "4" , "4" , 0x34 , 57403, 'u', '4' , '\x1c', "004b64284b64084b64264b64124b640c4b641e4b641c4b64064b64244b64044b640a4b64104b64164b64204b64184b640e4b642a4b641a4b64224b64144b647a4b642c4b642e4b64024b64304b64324b64344b643a4b643c4b64384b64364b649c4b64404b643e4b644c4b64424b644e4b644a4b64464b64544b64444b645c4b645a4b64684b64624b64664b64484b64724b646c4b64504b649e4b64764b64a04b64524b64584b64564b646e4b64604b646a4b64704b64744b645e4b64644b64a24b64784b648c4b648e4b64824b64a44b64864b648a4b64984b649a4b64904b647e4b64944b64884b64844b647c4b64924b64804b64964b64aa4b64a84b64a64b64ae4b64b04b64ac4b64b44b64b24b64b64b64b84b64ba4b64")\ + X(158 , 1, Key5 , "5" , "5" , 0x35 , 53 , 'u', '5' , '\x1d', "0006352806350806352606351206350c06351e06351c06350606352406350406350a06351006351606352006351806350e06352a06351a06352206351406357a06352c06352e06350206353006353206353406353a06353c06353806353606359c06354006353e06354c06354206354e06354a06354606355406354406355c06355a06356806356206356606354806357206356c06355006359e0635760635a006355206355806355606356e06356006356a06357006357406355e0635640635a206357806358c06358e0635820635a406358606358a06359806359a06359006357e06359406358806358406357c0635920635800635960635aa0635a80635a60635ae0635b00635ac0635b40635b20635b60635b81035ba1a35")\ + X( 159, 1, Numpad5 , "5" , "5" , 0x35 , 57404, 'u', '5' , '\x1d', "004c65284c65084c65264c65124c650c4c651e4c651c4c65064c65244c65044c650a4c65104c65164c65204c65184c650e4c652a4c651a4c65224c65144c657a4c652c4c652e4c65024c65304c65324c65344c653a4c653c4c65384c65364c659c4c65404c653e4c654c4c65424c654e4c654a4c65464c65544c65444c655c4c655a4c65684c65624c65664c65484c65724c656c4c65504c659e4c65764c65a04c65524c65584c65564c656e4c65604c656a4c65704c65744c655e4c65644c65a24c65784c658c4c658e4c65824c65a44c65864c658a4c65984c659a4c65904c657e4c65944c65884c65844c657c4c65924c65804c65964c65aa4c65a84c65a64c65ae4c65b04c65ac4c65b44c65b24c65b64c65b84c65ba4c65")\ + X(160 , 1, Key6 , "6" , "6" , 0x36 , 54 , 'u', '6' , '\x1e', "0007362807360807362607361207360c07361e07361c07360607362407360407360a07361007361607362007361807360e07362a07361a07362207361407367a07362c07362e07360207363007363207363407363a07363c07363807363607369c07364007363e07364c07364207364e07364a07364607365407364407365c07365a07366807366207366607364807367207366c07365007369e0736760736a007365207365807365607366e07366007366a07367007367407365e0736640736a207367807368c07368e0736820736a407368607368a07369807369a07369007367e07369407368807368407367c0736920736800736960736aa0736a80736a60736ae0736b00736ac0736b40736b20736b60736b81136ba1936")\ + X( 161, 1, Numpad6 , "6" , "6" , 0x36 , 57405, 'u', '6' , '\x1e', "004d66284d66084d66264d66124d660c4d661e4d661c4d66064d66244d66044d660a4d66104d66164d66204d66184d660e4d662a4d661a4d66224d66144d667a4d662c4d662e4d66024d66304d66324d66344d663a4d663c4d66384d66364d669c4d66404d663e4d664c4d66424d664e4d664a4d66464d66544d66444d665c4d665a4d66684d66624d66664d66484d66724d666c4d66504d669e4d66764d66a04d66524d66584d66564d666e4d66604d666a4d66704d66744d665e4d66644d66a24d66784d668c4d668e4d66824d66a44d66864d668a4d66984d669a4d66904d667e4d66944d66884d66844d667c4d66924d66804d66964d66aa4d66a84d66a64d66ae4d66b04d66ac4d66b44d66b24d66b64d66b84d66ba4d66")\ + X(162 , 1, Key7 , "7" , "7" , 0x37 , 55 , 'u', '7' , '\x1f', "0008372808370808372608371208370c08371e08371c08370608372408370408370a08371008371608372008371808370e08372a08371a08372208371408377a08372c08372e08370208373008373208373408373a08373c08373808373608379c08374008373e08374c08374208374e08374a08374608375408374408375c08375a08376808376208376608374808377208376c08375008379e0837760837a008375208375808375608376e08376008376a08377008377408375e0837640837a208377808378c08378e0837820837a408378608378a08379808379a08379008377e08379408378808378408377c0837920837800837960837aa0837a80837a60837ae0837b00837ac0837b40837b20837b60837b81e37ba2837")\ + X( 163, 1, Numpad7 , "7" , "7" , 0x37 , 57406, 'u', '7' , '\x1f', "0047672847670847672647671247670c47671e47671c47670647672447670447670a47671047671647672047671847670e47672a47671a47672247671447677a47672c47672e47670247673047673247673447673a47673c47673847673647679c47674047673e47674c47674247674e47674a47674647675447674447675c47675a47676847676247676647674847677247676c47675047679e4767764767a047675247675847675647676e47676047676a47677047677447675e4767644767a247677847678c47678e4767824767a447678647678a47679847679a47679047677e47679447678847678447677c4767924767804767964767aa4767a84767a64767ae4767b04767ac4767b44767b24767b64767b84767ba4767")\ + X(164 , 1, Key8 , "8" , "8" , 0x38 , 56 , 'u', '8' , '\x7f', "0009382809380809382609381209380c09381e09381c09380609382409380409380a09381009381609382009381809380e09382a09381a09382209381409387a09382c09382e09380209383009383209383409383a09383c09383809383609389c09384009383e09384c09384209384e09384a09384609385409384409385c09385a09386809386209386609384809387209386c09385009389e0938760938a009385209385809385609386e09386009386a09387009387409385e0938640938a209387809388c09388e0938820938a409388609388a09389809389a09389009387e09389409388809388409387c0938920938800938960938aa0938a80938a60938ae0938b00938ac0938b40938b20938b60938b81f38ba2738")\ + X( 165, 1, Numpad8 , "8" , "8" , 0x38 , 57407, 'u', '8' , '\x7f', "0048682848680848682648681248680c48681e48681c48680648682448680448680a48681048681648682048681848680e48682a48681a48682248681448687a48682c48682e48680248683048683248683448683a48683c48683848683648689c48684048683e48684c48684248684e48684a48684648685448684448685c48685a48686848686248686648684848687248686c48685048689e4868764868a048685248685848685648686e48686048686a48687048687448685e4868644868a248687848688c48688e4868824868a448688648688a48689848689a48689048687e48689448688848688448687c4868924868804868964868aa4868a84868a64868ae4868b04868ac4868b44868b24868b64868b84868ba4868")\ + X(166 , 1, Key9 , "9" , "9" , 0x39 , 57 , 'u', '9' , '9' , "000a39280a39080a39260a39120a390c0a391e0a391c0a39060a39240a39040a390a0a39100a39160a39200a39180a390e0a392a0a391a0a39220a39140a397a0a392c0a392e0a39020a39300a39320a39340a393a0a393c0a39380a39360a399c0a39400a393e0a394c0a39420a394e0a394a0a39460a39540a39440a395c0a395a0a39680a39620a39660a39480a39720a396c0a39500a399e0a39760a39a00a39520a39580a39560a396e0a39600a396a0a39700a39740a395e0a39640a39a20a39780a398c0a398e0a39820a39a40a39860a398a0a39980a399a0a39900a397e0a39940a39880a39840a397c0a39920a39800a39960a39aa0a39a80a39a60a39ae0a39b00a39ac0a39b40a39b20a39b60a39b82c39ba3539")\ + X( 167, 1, Numpad9 , "9" , "9" , 0x39 , 57408, 'u', '9' , '9' , "0049692849690849692649691249690c49691e49691c49690649692449690449690a49691049691649692049691849690e49692a49691a49692249691449697a49692c49692e49690249693049693249693449693a49693c49693849693649699c49694049693e49694c49694249694e49694a49694649695449694449695c49695a49696849696249696649694849697249696c49695049699e4969764969a049695249695849695649696e49696049696a49697049697449695e4969644969a249697849698c49698e4969824969a449698649698a49699849699a49699049697e49699449698849698449697c4969924969804969964969aa4969a84969a64969ae4969b04969ac4969b44969b24969b64969b84969ba4969")\ + X(168 , 1, KeyMultiply , "*" , "*" , 0x2A , 42 , 'u', '*' , '*' , "5e1bba9a0cdfaa2bdca82bdca62bdc")\ + X( 169, 1, NumpadMultiply , "*" , "*" , 0x2A , 57411, 'u', '*' , '*' , "00376a28376a08376a26376a12376a0c376a1e376a1c376a06376a24376a04376a0a376a10376a16376a20376a18376a0e376a2a376a1a376a22376a14376a7a376a2c376a2e376a02376a30376a32376a34376a3a376a3c376a38376a36376a9c376a40376a3e376a4c376a42376a4e376a4a376a46376a54376a44376a5c376a5a376a68376a62376a66376a48376a72376a6c376a50376a9e376a76376aa0376a52376a58376a56376a6e376a60376a6a376a70376a74376a5e376a64376aa2376a78376a8c376a8e376a82376aa4376a86376a8a376a98376a9a376a90376a7e376a94376a88376a84376a7c376a92376a80376a96376aaa376aa8376aa6376aae376ab0376aac376ab4376ab2376ab6376ab8376aba376a")\ + X(170 , 1, KeySlash , "/" , "/" , 0x2F , 47 , 'u', '/' , '\x1f', "0035bf2835bf0835bf2635bf1235bf0c35bf1e35bf1c35bf0635bf2435bf0435bf0a35bf1035bf1635bf2035bf1835bf0e35bf2a35bf1a35bf2235bf1435bf7a35bf2c35bf2e35bf0235bf3035bf3235bf3435bf3a35bf3c35bf3835bf3635bf9c35bf4035bf3e35bf4c35bf4e73c14a73c15435bf4429de5e0cdbb21abfb60cbbb80bbfba04bf")\ + X( 171, 1, NumpadDivide , "/" , "/" , 0x2F , 57410, 'u', '/' , '\x1f', "00356f28356f08356f26356f12356f0c356f1e356f1c356f06356f24356f04356f0a356f10356f16356f20356f18356f0e356f2a356f1a356f22356f14356f7a356f2c356f2e356f02356f30356f32356f34356f3a356f3c356f38356f36356f9c356f40356f3e356f4c356f42356f4e356f4a356f46356f54356f44356f5c356f5a356f68356f62356f66356f48356f72356f6c356f50356f9e356f76356fa0356f52356f58356f56356f6e356f60356f6a356f70356f74356f5e356f64356fa2356f78356f8c356f8e356f82356fa4356f86356f8a356f98356f9a356f90356f7e356f94356f88356f84356f7c356f92356f80356f96356faa356fa8356fa6356fae356fb0356fac356fb4356fb2356fb6356fb8356fba356f")\ + X(172 , 1, KeyPlus , "Plus" , "+" , 0x2B , 43 , 'u', '+' , '+' , "5c0cbb5a0cbb680cbb621bbb660cbb480dbb721abb6c0cbb760cbd521abb581bbb561bbb6e1bbb600cbb6a1bbb700cbb740cbb5e27bb640cbb782bbf8c1bbb8e1bbb821bbb860dbb8a0cbb881bbb841bbb920dbb800dbb960cbdb629c0")\ + X( 173, 1, NumpadPlus , "Plus" , "+" , 0x2B , 57413, 'u', '+' , '+' , "004e6b284e6b084e6b264e6b124e6b0c4e6b1e4e6b1c4e6b064e6b244e6b044e6b0a4e6b104e6b164e6b204e6b184e6b0e4e6b2a4e6b1a4e6b224e6b144e6b7a4e6b2c4e6b2e4e6b024e6b304e6b324e6b344e6b3a4e6b3c4e6b384e6b364e6b9c4e6b404e6b3e4e6b4c4e6b424e6b4e4e6b4a4e6b464e6b544e6b444e6b5c4e6b5a4e6b684e6b624e6b664e6b484e6b724e6b6c4e6b504e6b9e4e6b764e6ba04e6b524e6b584e6b564e6b6e4e6b604e6b6a4e6b704e6b744e6b5e4e6b644e6ba24e6b784e6b8c4e6b8e4e6b824e6ba44e6b864e6b8a4e6b984e6b9a4e6b904e6b7e4e6b944e6b884e6b844e6b7c4e6b924e6b804e6b964e6baa4e6ba84e6ba64e6bae4e6bb04e6bac4e6bb44e6bb24e6bb64e6bb84e6bba4e6b")\ + X(174 , 1, KeyMinus , "Minus" , "-" , 0x2D , 45 , 'u', '-' , '-' , "000cbd280cbd080cbd260cbd120cbd0c0cbd1e0cbd1c0cbd060cbd240cbd040cbd0a0cbd100cbd160cbd200cbd180cbd0e0cbd2a0cbd1a0cbd220cbd140cbd7a0cbd2c0cbd2e0cbd020cbd300cbd320cbd340cbd3a0cbd3c0cbd380cbd360cbd9c0cbd400cbd3e0cbd4c0cbd420cbd4e0cbd4a0cbd460cbd540cbd440cbd5c35bd5a35bd6835bd6235bd6635bd4835bd7235bd6c35bd500cbd9e35bf7635dda035bf5235bd5835bd5635bd6e35bd6035bd6a35bd7035bd7435bd5e35bd6435bda235bd780ddb8c35bd8e35bd8235bda435bd8635bd8a35bd9835bd9a0dbd9035bd7e35bd9435bd8835bd8435bd7c35bf9235bd8035bd9635bfae0dbdb00dbdac0dbdb228bdb60dbdb828bdba1ebd")\ + X( 175, 1, NumpadMinus , "Minus" , "-" , 0x2D , 57412, 'u', '-' , '-' , "004a6d284a6d084a6d264a6d124a6d0c4a6d1e4a6d1c4a6d064a6d244a6d044a6d0a4a6d104a6d164a6d204a6d184a6d0e4a6d2a4a6d1a4a6d224a6d144a6d7a4a6d2c4a6d2e4a6d024a6d304a6d324a6d344a6d3a4a6d3c4a6d384a6d364a6d9c4a6d404a6d3e4a6d4c4a6d424a6d4e4a6d4a4a6d464a6d544a6d444a6d5c4a6d5a4a6d684a6d624a6d664a6d484a6d724a6d6c4a6d504a6d9e4a6d764a6da04a6d524a6d584a6d564a6d6e4a6d604a6d6a4a6d704a6d744a6d5e4a6d644a6da24a6d784a6d8c4a6d8e4a6d824a6da44a6d864a6d8a4a6d984a6d9a4a6d904a6d7e4a6d944a6d884a6d844a6d7c4a6d924a6d804a6d964a6daa4a6da84a6da64a6dae4a6db04a6dac4a6db44a6db24a6db64a6db84a6dba4a6d")\ + X(176 , 1, KeyEqual , "=" , "=" , 0x3D , 61 , 'u', '=' , '=' , "000dbb280dbb080dbb260dbb120dbb0c0dbb1e0dbb1c0dbb060dbb240dbb040dbb0a0dbb100dbb160dbb200dbb180dbb0e0dbb2a0dbb1a0dbb220dbb140dbb2c0dbb2e0dbb020dbb300dbb320dbb340dbb3a0dbb3c0dbb380dbb360dbb400dbb3e0dbb4c0dbb420dbb4e0dbb4a0dbb460dbb540dbb440dbb5035df9e0cbda00cbda20cbba40cbfaa0dbba80dbba60dbbae35bbb035bbac35bbb21bbbb81bbbba1bbb")\ + X( 177, 1, NumpadEqual , "=" , "=" , 0x3D , 57415, 'u', '=' , '=' , "")\ + X(178 , 1, KeyDot , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be2834be0834be2634be1234be0c34be1e34be1c34be0634be2434be0434be0a34be1034be1634be2034be1834be0e34be2a34be1a34be2234be1434be7a34be2c34be2e34be0234be3034be3234be3434be3a34be3c34be3834be3634be9c34be4034be3e34be4c34be4234be4e34be4a34be4634be5434be4434be5c34be5a34be6834be6234be6634be4834be7234be6c34be5034be9e34be7634bea034be5234be5834be5634be6e34be6034be6a34be7034be7434be5e34be6434bea234be7834be8c34be8e34be8234bea434be8634be8a34be9834be9a35be9034be7e34be9434be8834be8434be7c34be9234be8034be9634beb212beb634beb813beba18be")\ + X( 179, 1, NumpadDecimal , "." , "." , 0x2E , 57409, 'u', '.' , '.' , "00536e28536e08536e26536e12536e0c536e1e536e1c536e06536e24536e04536e0a536e10536e16536e20536e18536e0e536e2a536e1a536e22536e14536e7a536e2c536e2e536e02536e30536e32536e34536e3a536e3c536e38536e36536e9c536e40536e3e536e4c536e42536e4e536e4a536e46536e54536e44536e5c536e5a536e68536e62536e66536e48536e72536e6c536e50536e9e536e76536ea0536e52536e58536e56536e6e536e60536e6a536e70536e74536e5e536e64536ea2536e78536e8c536e8e536e82536ea4536e86536e8a536e98536e9a536e90536e7e536e94536e88536e84536e7c536e92536e80536e96536eaa536ea8536ea6536eae536eb0536eac536eb4536eb2536eb6536eb8536eba536e")\ + X(180 , 1, KeyComma , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "0033bc2833bc0833bc2633bc1233bc0c33bc1e33bc1c33bc0633bc2433bc0433bc0a33bc1033bc1633bc2033bc1833bc0e33bc2a33bc1a33bc2233bc1433bc7a33bc2c33bc2e33bc0233bc3033bc3233bc3433bc3a33bc3c33bc3833bc3633bc9c33bc4033bc3e33bc4c33bc4233bc4e33bc4a33bc4633bc5433bc4433bc5c33bc5a33bc6833bc6233bc6633bc4833bc7233bc6c33bc5033bc9e33bc7633bca033bc5233bc5833bc5633bc6e33bc6033bc6a33bc7033bc7433bc5e33bc6433bca233bc7833bc8c33bc8e33bc8233bca433bc8633bc8a33bc9833bc9a2bbc9033bc7e33bc9433bc8833bc8433bc7c33bc9233bc8033bc9633bcaa32bca832bca632bcae32bcb032bcac32bcb211bcb635bcb82fbcba33bc")\ + X( 181, 1, NumpadPoint , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "007ec2287ec2087ec2267ec2127ec20c7ec21e7ec21c7ec2067ec2247ec2047ec20a7ec2107ec2167ec2207ec2187ec20e7ec22a7ec21a7ec2227ec2147ec27a7ec22c7ec22e7ec2027ec2307ec2327ec2347ec23a7ec23c7ec2387ec2367ec29c7ec2407ec23e7ec24c7ec2427ec24e7ec24a7ec2467ec2547ec2447ec25c7ec25a7ec2687ec2627ec2667ec2487ec2727ec26c7ec2507ec29e7ec2767ec2a07ec2527ec2587ec2567ec26e7ec2607ec26a7ec2707ec2747ec25e7ec2647ec2a27ec2787ec28c7ec28e7ec2827ec2a47ec2867ec28a7ec2987ec29a7ec2907ec27e7ec2947ec2887ec2847ec27c7ec2927ec2807ec2967ec2aa7ec2a87ec2a67ec2ae7ec2b07ec2ac7ec2b47ec2b27ec2b67ec2b87ec2ba7ec2")\ + X(182 , 1, Colon , ":" , ":" , 0x3A , 58 , 'u', ':' , ':' , "aa34bfa834bfa634bfae34bfb034bfac34bf")\ + X(184 , 1, Semicolon , ";" , ";" , 0x3B , 59 , 'u', ';' , ';' , "0027ba2827ba0827ba2627ba1227ba0c27ba1e27ba1c27ba0627ba2427ba0427ba0a27ba1027ba1627ba2027ba1827ba0e27ba2a27ba1a27ba2227ba1427ba7a27ba2c27ba2e27ba0227ba3027ba3227ba3427ba3a27ba3c27ba3827ba3627ba9c27ba4027ba3e27ba4227ba4e35bf4a35bf4627ba4427ba9e29c0a029c0a229c0a429c0aa33bea833bea633beae33beb033beac33beb22cbab81ababa10ba")\ + X(186 , 1, TurnedComma , "ʻ" , "ʻ" , 0x02BB, 699 , 'u', -1 , -1 , "2e28de")\ + X(188 , 1, OpenSquareBracket , "[" , "[" , 0x5B , 91 , 'u', '[' , '\x1b', "001adb281adb081adb261adb121adb0c1adb1e1adb1c1adb061adb241adb041adb0a1adb101adb161adb201adb181adb0e1adb2a1adb1a1adb221adb141adb7a1adb2c1adb2e1adb021adb301adb321adb341adb3a1adb3c1adb381adb361adb4e1bdd4a1bdd5428de481adbb20cdbb80cdbba02db")\ + X(190 , 1, CloseSquareBracket , "]" , "]" , 0x5D , 93 , 'u', ']' , '\x1d', "001bdd281bdd081bdd261bdd121bdd0c1bdd1e1bdd1c1bdd061bdd241bdd041bdd0a1bdd101bdd161bdd201bdd181bdd0e1bdd2a1bdd1a1bdd221bdd141bdd7a1bdd2c1bdd2e1bdd021bdd301bdd321bdd341bdd3a1bdd3c1bdd381bdd361bdd4e2bdc4a2bdc542bdc481bdd720ddb5e56e29629c0b20dddb80dddba03dd")\ + X(192 , 1, OpenCurlyBracket , "{" , "{" , 0x7B , 123 , 'u', '{' , 27 , "6228de6a28de")\ + X(194 , 1, CloseCurlyBracket , "}" , "}" , 0x7D , 125 , 'u', '}' , 29 , "622bbf721bdd6a2bbf")\ + X(196 , 1, CloseRoundBracket , ")" , ")" , 0x29 , 41 , 'u', ')' , ')' , "a01bdda21bddaa0cdba80cdba60cdbae0cdbb00cdbac0cdb")\ + X(198 , 1, LessThan , "<" , "<" , 0x3C , 60 , 'u', '<' , '<' , "3029c0422bdc5456e25c56e25a56e26856e26256e26656e24856e27256e26c56e25056e27656e25256e25856e25656e26e56e26056e26a56e27056e27456e25e2bdc6456e27856e28c56e28e56e28256e28656e28a56e29a56e29056e27e56e29456e28856e28456e29256e28056e29656e2aa56e2a856e2a656e2ae56e2b056e2ac56e2b456e2b656e2")\ + X(200 , 1, BackSlash , "\\" , "\\" , 0x5C , 92 , 'u', '\\' , '\x1c', "002bdc0056e22856e2282bdc0856e2082bdc262bdc2656e21256e2122bdc0c2bdc0c56e21e2bdc1e56e21c2bdc1c56e2062bdc0656e2242bdc2456e20456e2042bdc0a56e20a2bdc102bdc1056e2162bdc1656e22056e2202bdc182bdc1856e20e2bdc0e56e22a56e22a2bdc1a2bdc1a56e22256e2222bdc1456e2142bdc7a56e27a2bdc2c56e22e2bdc2e56e2022bdc0256e23056e2322bde3256dc342bde3456dc3a56dc3c56dc3856dc3656dc9c56e29c2bdc4c56e24e56e24a56e25429c0680ddb4829c07229c0a056e25229dc5829dc5629dc600ddba256e2b256e2b22bdcb82bdcb856e2ba2bdcba56e2")\ + X(202 , 1, Underscore , "_" , "_" , 0x5F , 95 , 'u', '_' , '\x1f', "0673e2")\ + X(204 , 1, VerticalBar , "|" , "|" , 0x7C , 124 , 'u', '|' , 28 , "6829dc6229dc6029dc6a29dc")\ + X(206 , 1, DivisionSign , "÷" , "÷" , 0xF7 , 247 , 'u', -1 , -1 , "501add")\ + X(208 , 1, OneHalf , "½" , "½" , 0xBD , 189 , 'u', -1 , -1 , "6629dc7429dc6429dc")\ + X(210 , 1, SuperscriptTwo , "²" , "²" , 0xB2 , 178 , 'u', -1 , -1 , "a829dea629deae29deb029deac29de")\ + X(212 , 1, DegreeSign , "°" , "°" , 0xB0 , 176 , 'u', -1 , -1 , "2c2bdc4629de5e0dbf7829dc")\ + X(214 , 1, NumeroSign , "º" , "º" , 0xBA , 186 , 'u', -1 , -1 , "5228de6e29dc")\ + X(216 , 1, Acute , "´" , "´" , 0xB4 , 180 , 'u', -1 , -1 , "4e1adb4a1adb5c0ddb5a0ddb621aba660ddb4827ba6c0ddb502bbf9e0dbb760dbba00dbb521bba6e28de6a1aba700ddb740ddb5e28c0640ddba20dbf7828de8c0ddd8e0ddd820ddda40ddf880ddd840ddd")\ + X(218 , 1, Caron , "ˇ" , "ˇ" , 0x02C7, 780 , 'u', -1 , -1 , "7629de")\ + X(220 , 1, Cedilla , "¸" , "¸" , 0xB8 , 184 , 'u', -1 , -1 , "421bdd9229c08029c0")\ + X(222 , 1, Circumflex , "^" , "^" , 0x5E , 94 , 'u', '^' , 30 , "421adb461adb441adb4828de8c29dc8e29dc8229dc900ddd7e0ddd940ddd8829dc8429dcaa1adda81adda61addae1addb01addac1add")\ + X(224 , 1, Ogonek , "˛" , "˛" , 0x02DB, 731 , 'u', -1 , -1 , "8a29c0")\ + X(226 , 1, Tilde , "~" , "~" , 0x7E , 771 , 'u', '~' , 30 , "4e28de4a28de522bbf")\ + X(228 , 1, Tonos , "΄" , "΄" , 0x0384, 900 , 'u', -1 , -1 , "7227ba")\ + X(230 , 1, Umlaut , "¨" , "¨" , 0xA8 , 168 , 'u', -1 , -1 , "5c1bba5a1bba681bba661bba7228de6c1bba500ddba02bdc601bba701bba5e1add641bbaa22bdc901bc07e1bc0941bc0")\ + X(232 , 1, BackQuote , "`" , "`" , 0x60 , 96 , 'u', '`' , '`' , "0029c02829c00829c02629c01229c00c29c01e29c01c29c00629c02429c00429c00a29c01029c01629c02029c01829c00e29c02a29c01a29c02229c01429c07a29c02c29c02e29c00229c0302bdc3229df3429df3a29df3c29df3829df3629df9c29c04228c0482bdc501bba6e1abab429dcb229c0b829c0ba29c0")\ + X(234 , 1, SingleQuote , "'" , "'" , 0x27 , 39 , 'u', '\'' , '\'' , "0028de2828de0828de2628de1228de0c28de1e28de1c28de0628de2428de0428de0a28de1028de1628de2028de1828de0e28de2a28de1a28de2228de1428de7a28de2c28de0228de3028de3228c03428c03a28c03c28c03828c03628c09c28de4028de3e28de4e29c04a29c05c2bbf5a2bbf682bbf620cdb662bbf480cbf720cbf6c2bbf5029dc762bdc520cdb580cdb560cdb6e0cdb602bbf6a0cdb702bbf742bbf642bbf781bba860cbf8a0dbf900cdb7e0cdb940cdb920cbf800cbf960dbbb210deb835deba2cde")\ + X(236 , 1, DoubleQuote , "\"" , "\"" , 0x22 , 34 , 'u', '"' , '"' , "9a29c0")\ + X(238 , 1, SingleLowQuote , "‚" , "‚" , 0x201A, 8218 , 'u', -1 , -1 , "8629c0")\ + X(240 , 1, DoubleLowQuote , "„" , "„" , 0x201E, 8222 , 'u', -1 , -1 , "4c29c0")\ + X(242 , 1, LeftGuillemet , "«" , "«" , 0xAB , 171 , 'u', -1 , -1 , "4256e2520ddd")\ + X(244 , 1, Hash , "#" , "#" , 0x23 , 35 , 'u', '#' , '#' , "3a2bde3c2bde382bde362bde402bdc4229de722bdc8e2bbf882bbf842bbf")\ + X(246 , 1, AtSign , "@" , "@" , 0x40 , 64 , 'u', '@' , '\0' , "541bdd5e29de")\ + X(248 , 1, Exclamation , "!" , "!" , 0x21 , 33 , 'u', '!' , '!' , "aa35dfa835dfa635df")\ + X(250 , 1, InvertedExclamation, "¡" , "¡" , 0xA1 , 161 , 'u', -1 , -1 , "6e0ddd")\ + X(252 , 1, QuestionMark , "?" , "?" , 0x3F , 63 , 'u', '?' , 127 , "b40cbb")\ + X(254 , 1, InvertedQuestion , "¿" , "¿" , 0xBF , 191 , 'u', -1 , -1 , "620ddd6a0ddd")\ + X(256 , 1, Paragraph , "§" , "§" , 0xA7 , 167 , 'u', -1 , -1 , "5c29dc5a29dc6c29dc9e28dea028de7029dca228dea428de9029bf7e29bf9429bf")\ + X(258 , 1, Ampersand , "&" , "&" , 0x26 , 38 , 'u', '&' , '&' , "9e56e2a456e2")\ + X(260 , 1, Dollar , "$" , "$" , 0x24 , 36 , 'u', '$' , '$' , "902bdf7e2bdf942bdfa81bbaa61bbaae1bbab01bbaac1bba")\ + X(262 , 1, Dong , "₫" , "₫" , 0x20AB, 8363 , 'u', -1 , -1 , "9c0dbb")\ + X(264 , 1, Yen , "¥" , "¥" , 0xA5 , 165 , 'u', -1 , -1 , "067ddc027ddc")\ + X(266 , 1, DotlessI , "ı" , "ı" , 0x0131, 305 , 'u', -1 , -1 , "9a1749b61349")\ + X(268 , 1, MicroSign , "µ" , "µ" , 0xB5 , 181 , 'u', -1 , -1 , "ae2bdcb02bdcac2bdc")\ + X(270 , 1, Eth , "ð" , "ð" , 0xF0 , 240 , 'u', -1 , -1 , "741bba781add")\ + X(272 , 1, Thorn , "þ" , "þ" , 0xFE , 254 , 'u', -1 , -1 , "7835bd")\ + X(274 , 1, Eszett , "ẞ" , "ß" , 0xDF , 223 , 'u', -1 , -1 , "8c0cdb8e0cdb820cdb880cdb840cdb")\ + X(276 , 1, KeyA , "A" , "a" , 0x61 , 97 , 'u', 'a' , '\x01', "001e41281e41081e41261e41121e410c1e411e1e411c1e41061e41241e41041e410a1e41101e41161e41201e41181e410e1e412a1e411a1e41221e41141e417a1e412c1e412e1e41021e41301e41321e41341e413a1e413c1e41381e41361e419c1e41401e413e1e414c1e41421e414e1e414a1e41461e41541e41441e415c1e415a1e41681e41621e41661e41481e41721e416c1e41501e419e1e41761e41a01e41521e41581e41561e416e1e41601e416a1e41701e41741e415e1e41641e41a21e41781e418c1e418e1e41821e41a41e41861e418a1e41981e419a1e41901e417e1e41941e41881e41841e417c1e41921e41801e41961e41aa1041a81041a61041ae1041b01041ac1041b41e41b21e41b62141b82141ba2541")\ + X(278 , 1, KeyB , "B" , "b" , 0x62 , 98 , 'u', 'b' , '\x02', "0030422830420830422630421230420c30421e30421c30420630422430420430420a30421030421630422030421830420e30422a30421a30422230421430427a30422c30422e30420230423030423230423430423a30423c30423830423630429c30424030423e30424c30424230424e30424a30424630425430424430425c30425a30426830426230426630424830427230426c30425030429e3042763042a030425230425830425630426e30426030426a30427030427430425e3042643042a230427830428c30428e3042823042a430428630428a30429830429a30429030427e30429430428830428430427c3042923042803042963042aa3042a83042a63042ae3042b03042ac3042b43042b23142b63342b81942ba1242")\ + X(280 , 1, KeyC , "C" , "c" , 0x63 , 99 , 'u', 'c' , '\x03', "002e43282e43082e43262e43122e430c2e431e2e431c2e43062e43242e43042e430a2e43102e43162e43202e43182e430e2e432a2e431a2e43222e43142e437a2e432c2e432e2e43022e43302e43322e43342e433a2e433c2e43382e43362e439c2e43402e433e2e434c2e43422e434e2e434a2e43462e43542e43442e435c2e435a2e43682e43622e43662e43482e43722e436c2e43502e439e2e43762e43a02e43522e43582e43562e436e2e43602e436a2e43702e43742e435e2e43642e43a22e43782e438c2e438e2e43822e43a42e43862e438a2e43982e439a2e43902e437e2e43942e43882e43842e437c2e43922e43802e43962e43aa2e43a82e43a62e43ae2e43b02e43ac2e43b42e43b21743b62f43b82643ba2043")\ + X(282 , 1, KeyD , "D" , "d" , 0x64 , 100 , 'u', 'd' , '\x04', "0020442820440820442620441220440c20441e20441c20440620442420440420440a20441020441620442020441820440e20442a20441a20442220441420447a20442c20442e20440220443020443220443420443a20443c20443820443620449c20444020443e20444c20444220444e20444a20444620445420444420445c20445a20446820446220446620444820447220446c20445020449e2044762044a020445220445820445620446e20446020446a20447020447420445e2044642044a220447820448c20448e2044822044a420448620448a20449820449a20449020447e20449420448820448420447c2044922044802044962044aa2044a82044a62044ae2044b02044ac2044b42044b22344b61544b82544ba2144")\ + X(284 , 1, KeyE , "E" , "e" , 0x65 , 101 , 'u', 'e' , '\x05', "0012452812450812452612451212450c12451e12451c12450612452412450412450a12451012451612452012451812450e12452a12451a12452212451412457a12452c12452e12450212453012453212453412453a12453c12453812453612459c12454012453e12454c12454212454e12454a12454612455412454412455c12455a12456812456212456612454812457212456c12455012459e1245761245a012455212455812455612456e12456012456a12457012457412455e1245641245a212457812458c12458e1245821245a412458612458a12459812459a12459012457e12459412458812458412457c1245921245801245961245aa1245a81245a61245ae1245b01245ac1245b41245b22045b62045b82245ba2445")\ + X(286 , 1, KeyF , "F" , "f" , 0x66 , 102 , 'u', 'f' , '\x06', "0021462821460821462621461221460c21461e21461c21460621462421460421460a21461021461621462021461821460e21462a21461a21462221461421467a21462c21462e21460221463021463221463421463a21463c21463821463621469c21464021463e21464c21464221464e21464a21464621465421464421465c21465a21466821466221466621464821467221466c21465021469e2146762146a021465221465821465621466e21466021466a21467021467421465e2146642146a221467821468c21468e2146822146a421468621468a21469821469a21469021467e21469421468821468421467c2146922146802146962146aa2146a82146a62146ae2146b02146ac2146b434beb21546b61046b80946ba0646")\ + X(288 , 1, KeyG , "G" , "g" , 0x67 , 103 , 'u', 'g' , '\x07', "0022472822470822472622471222470c22471e22471c22470622472422470422470a22471022471622472022471822470e22472a22471a22472222471422477a22472c22472e22470222473022473222473422473a22473c22473822473622479c22474022473e22474c22474222474e22474a22474622475422474422475c22475a22476822476222476622474822477222476c22475022479e2247762247a022475222475822475622476e22476022476a22477022477422475e2247642247a222477822478c22478e2247822247a422478622478a22479822479a22479022477e22479422478822478422477c2247922247802247962247aa2247a82247a62247ae2247b02247ac2247b42247b21647b61147b83447ba2e47")\ + X(290 , 1, KeyH , "H" , "h" , 0x68 , 104 , 'u', 'h' , '\x08', "0023482823480823482623481223480c23481e23481c23480623482423480423480a23481023481623482023481823480e23482a23481a23482223481423487a23482c23482e23480223483023483223483423483a23483c23483823483623489c23484023483e23484c23484223484e23484a23484623485423484423485c23485a23486823486223486623484823487223486c23485023489e2348762348a023485223485823485623486e23486023486a23487023487423485e2348642348a223487823488c23488e2348822348a423488623488a23489823489a23489023487e23489423488823488423487c2348922348802348962348aa2348a82348a62348ae2348b02348ac2348b42348b22448b61848b82348ba2348")\ + X(292 , 1, KeyI , "I" , "i" , 0x69 , 105 , 'u', 'i' , '\x09', "0017492817490817492617491217490c17491e17491c17490617492417490417490a17491017491617492017491817490e17492a17491a17492217491417497a17492c17492e17490217493017493217493417493a17493c17493817493617499c17494017493e17494c17494217494e17494a17494617495417494417495c17495a17496817496217496617494817497217496c17495017499e1749761749a017495217495817495617496e17496017496a17497017497417495e1749641749a217497817498c17498e1749821749a417498617498a17499817499a28de9017497e17499417498817498417497c1749921749801749961749aa1749a81749a61749ae1749b01749ac1749b41749b22249b61fdbb83049ba3249")\ + X(294 , 1, KeyJ , "J" , "j" , 0x6A , 106 , 'u', 'j' , '\x0a', "00244a28244a08244a26244a12244a0c244a1e244a1c244a06244a24244a04244a0a244a10244a16244a20244a18244a0e244a2a244a1a244a22244a14244a7a244a2c244a2e244a02244a30244a32244a34244a3a244a3c244a38244a36244a9c244a40244a3e244a4c244a42244a4e244a4a244a46244a54244a44244a5c244a5a244a68244a62244a66244a48244a72244a6c244a50244a9e244a76244aa0244a52244a58244a56244a6e244a60244a6a244a70244a74244a5e244a64244aa2244a78244a8c244a8e244a82244aa4244a86244a8a244a98244a9a244a90244a7e244a94244a88244a84244a7c244a92244a80244a96244aaa244aa8244aa6244aae244ab0244aac244ab4244ab22e4ab62c4ab8064aba094a")\ + X(296 , 1, KeyK , "K" , "k" , 0x6B , 107 , 'u', 'k' , '\x0b', "00254b28254b08254b26254b12254b0c254b1e254b1c254b06254b24254b04254b0a254b10254b16254b20254b18254b0e254b2a254b1a254b22254b14254b7a254b2c254b2e254b02254b30254b32254b34254b3a254b3c254b38254b36254b9c254b40254b3e254b4c254b42254b4e254b4a254b46254b54254b44254b5c254b5a254b68254b62254b66254b48254b72254b6c254b50254b9e254b76254ba0254b52254b58254b56254b6e254b60254b6a254b70254b74254b5e254b64254ba2254b78254b8c254b8e254b82254ba4254b86254b8a254b98254b9a254b90254b7e254b94254b88254b84254b7c254b92254b80254b96254baa254ba8254ba6254bae254bb0254bac254bb4254bb22f4bb6244bb8274bba1f4b")\ + X(298 , 1, KeyL , "L" , "l" , 0x6C , 108 , 'u', 'l' , '\x0c', "00264c28264c08264c26264c12264c0c264c1e264c1c264c06264c24264c04264c0a264c10264c16264c20264c18264c0e264c2a264c1a264c22264c14264c7a264c2c264c2e264c02264c30264c32264c34264c3a264c3c264c38264c36264c9c264c40264c3e264c4c264c42264c4e264c4a264c46264c54264c44264c5c264c5a264c68264c62264c66264c48264c72264c6c264c50264c9e264c76264ca0264c52264c58264c56264c6e264c60264c6a264c70264c74264c5e264c64264ca2264c78264c8c264c8e264c82264ca4264c86264c8a264c98264c9a264c90264c7e264c94264c88264c84264c7c264c92264c80264c96264caa264ca8264ca6264cae264cb0264cac264cb4264cb2194cb6264cb8074cba084c")\ + X(300 , 1, KeyM , "M" , "m" , 0x6D , 109 , 'u', 'm' , '\x0d', "00324d28324d08324d26324d12324d0c324d1e324d1c324d06324d24324d04324d0a324d10324d16324d20324d18324d0e324d2a324d1a324d22324d14324d7a324d2c324d2e324d02324d30324d32324d34324d3a324d3c324d38324d36324d9c324d40324d3e324d4c324d42324d4e324d4a324d46324d54324d44324d5c324d5a324d68324d62324d66324d48324d72324d6c324d50324d9e324d76324da0324d52324d58324d56324d6e324d60324d6a324d70324d74324d5e324d64324da2324d78324d8c324d8e324d82324da4324d86324d8a324d98324d9a324d90324d7e324d94324d88324d84324d7c324d92324d80324d96324daa274da8274da6274dae274db0274dac274db4324db2324db6254db8084dba074d")\ + X(302 , 1, KeyN , "N" , "n" , 0x6E , 110 , 'u', 'n' , '\x0e', "00314e28314e08314e26314e12314e0c314e1e314e1c314e06314e24314e04314e0a314e10314e16314e20314e18314e0e314e2a314e1a314e22314e14314e7a314e2c314e2e314e02314e30314e32314e34314e3a314e3c314e38314e36314e9c314e40314e3e314e4c314e42314e4e314e4a314e46314e54314e44314e5c314e5a314e68314e62314e66314e48314e72314e6c314e50314e9e314e76314ea0314e52314e58314e56314e6e314e60314e6a314e70314e74314e5e314e64314ea2314e78314e8c314e8e314e82314ea4314e86314e8a314e98314e9a314e90314e7e314e94314e88314e84314e7c314e92314e80314e96314eaa314ea8314ea6314eae314eb0314eac314eb4314eb2264eb6174eb8314eba314e")\ + X(304 , 1, KeyO , "O" , "o" , 0x6F , 111 , 'u', 'o' , '\x0f', "00184f28184f08184f26184f12184f0c184f1e184f1c184f06184f24184f04184f0a184f10184f16184f20184f18184f0e184f2a184f1a184f22184f14184f7a184f2c184f2e184f02184f30184f32184f34184f3a184f3c184f38184f36184f9c184f40184f3e184f4c184f42184f4e184f4a184f46184f54184f44184f5c184f5a184f68184f62184f66184f48184f72184f6c184f50184f9e184f76184fa0184f52184f58184f56184f6e184f60184f6a184f70184f74184f5e184f64184fa2184f78184f8c184f8e184f82184fa4184f86184f8a184f98184f9a184f90184f7e184f94184f88184f84184f7c184f92184f80184f96184faa184fa8184fa6184fae184fb0184fac184fb4184fb21f4fb6144fb8144fba174f")\ + X(306 , 1, KeyP , "P" , "p" , 0x70 , 112 , 'u', 'p' , '\x10', "0019502819500819502619501219500c19501e19501c19500619502419500419500a19501019501619502019501819500e19502a19501a19502219501419507a19502c19502e19500219503019503219503419503a19503c19503819503619509c19504019503e19504c19504219504e19504a19504619505419504419505c19505a19506819506219506619504819507219506c19505019509e1950761950a019505219505819505619506e19506019506a19507019507419505e1950641950a219507819508c19508e1950821950a419508619508a19509819509a19509019507e19509419508819508419507c1950921950801950961950aa1950a81950a61950ae1950b01950ac1950b41950b21350b61950b80a50ba0550")\ + X(308 , 1, KeyQ , "Q" , "q" , 0x71 , 113 , 'u', 'q' , '\x11', "0010512810510810512610511210510c10511e10511c10510610512410510410510a10511010511610512010511810510e10512a10511a10512210511410517a10512c10512e10510210513010513210513410513a10513c10513810513610519c10514010513e10514c10514210514e10514a10514610515410514410515c10515a10516810516210516610514810517210516c10515010519e1051761051a010515210515810515610516e10516010516a10517010517410515e1051641051a210517810518c10518e1051821051a410518610518a10519810519a10519010517e10519410518810518410517c1051921051801051961051aa1e51a81e51a61e51ae1e51b01e51ac1e51b42bbfb22d51b61a51b81251ba1151")\ + X(310 , 1, KeyR , "R" , "r" , 0x72 , 114 , 'u', 'r' , '\x12', "0013522813520813522613521213520c13521e13521c13520613522413520413520a13521013521613522013521813520e13522a13521a13522213521413527a13522c13522e13520213523013523213523413523a13523c13523813523613529c13524013523e13524c13524213524e13524a13524613525413524413525c13525a13526813526213526613524813527213526c13525013529e1352761352a013525213525813525613526e13526013526a13527013527413525e1352641352a213527813528c13528e1352821352a413528613528a13529813529a13529013527e13529413528813528413527c1352921352801352961352aa1352a81352a61352ae1352b01352ac1352b41352b21852b61652b81552ba1552")\ + X(312 , 1, KeyS , "S" , "s" , 0x73 , 115 , 'u', 's' , '\x13', "001f53281f53081f53261f53121f530c1f531e1f531c1f53061f53241f53041f530a1f53101f53161f53201f53181f530e1f532a1f531a1f53221f53141f537a1f532c1f532e1f53021f53301f53321f53341f533a1f533c1f53381f53361f539c1f53401f533e1f534c1f53421f534e1f534a1f53461f53541f53441f535c1f535a1f53681f53621f53661f53481f53721f536c1f53501f539e1f53761f53a01f53521f53581f53561f536e1f53601f536a1f53701f53741f535e1f53641f53a21f53781f538c1f538e1f53821f53a41f53861f538a1f53981f539a1f53901f537e1f53941f53881f53841f537c1f53921f53801f53961f53aa1f53a81f53a61f53ae1f53b01f53ac1f53b41f53b22753b63253b81653ba1653")\ + X(314 , 1, KeyT , "T" , "t" , 0x74 , 116 , 'u', 't' , '\x14', "0014542814540814542614541214540c14541e14541c14540614542414540414540a14541014541614542014541814540e14542a14541a14542214541414547a14542c14542e14540214543014543214543414543a14543c14543814543614549c14544014543e14544c14544214544e14544a14544614545414544414545c14545a14546814546214546614544814547214546c14545014549e1454761454a014545214545814545614546e14546014546a14547014547414545e1454641454a214547814548c14548e1454821454a414548614548a14549814549a14549014547e14549414548814548414547c1454921454801454961454aa1454a81454a61454ae1454b01454ac1454b41454b22554b62354b82454ba2254")\ + X(316 , 1, KeyU , "U" , "u" , 0x75 , 117 , 'u', 'u' , '\x15', "0016552816550816552616551216550c16551e16551c16550616552416550416550a16551016551616552016551816550e16552a16551a16552216551416557a16552c16552e16550216553016553216553416553a16553c16553816553616559c16554016553e16554c16554216554e16554a16554616555416554416555c16555a16556816556216556616554816557216556c16555016559e1655761655a016555216555816555616556e16556016556a16557016557416555e1655641655a216557816558c16558e1655821655a416558616558a16559816559a16559016557e16559416558816558416557c1655921655801655961655aa1655a81655a61655ae1655b01655ac1655b41655b22155b61e55b81755ba1455")\ + X(318 , 1, KeyV , "V" , "v" , 0x76 , 118 , 'u', 'v' , '\x16', "002f56282f56082f56262f56122f560c2f561e2f561c2f56062f56242f56042f560a2f56102f56162f56202f56182f560e2f562a2f561a2f56222f56142f567a2f562c2f562e2f56022f56302f56322f56342f563a2f563c2f56382f56362f569c2f56402f563e2f564c2f56422f564e2f564a2f56462f56542f56442f565c2f565a2f56682f56622f56662f56482f56722f566c2f56502f569e2f56762f56a02f56522f56582f56562f566e2f56602f566a2f56702f56742f565e2f56642f56a22f56782f568c2f568e2f56822f56a42f56862f568a2f56982f569a2f56902f567e2f56942f56882f56842f567c2f56922f56802f56962f56aa2f56a82f56a62f56ae2f56b02f56ac2f56b42f56b23456b62e56b83356ba2f56")\ + X(320 , 1, KeyW , "W" , "w" , 0x77 , 119 , 'u', 'w' , '\x17', "0011572811570811572611571211570c11571e11571c11570611572411570411570a11571011571611572011571811570e11572a11571a11572211571411577a11572c11572e11570211573011573211573411573a11573c11573811573611579c11574011573e11574c11574211574e11574a11574611575411574411575c11575a11576811576211576611574811577211576c11575011579e1157761157a011575211575811575611576e11576011576a11577011577411575e1157641157a211577811578c11578e1157821157a411578611578a11579811579a11579011577e11579411578811578411577c1157921157801157961157aa2c57a82c57a62c57ae2c57b02c57ac2c57b41bbab23357b61b57b83257ba3057")\ + X(322 , 1, KeyX , "X" , "x" , 0x78 , 120 , 'u', 'x' , '\x18', "002d58282d58082d58262d58122d580c2d581e2d581c2d58062d58242d58042d580a2d58102d58162d58202d58182d580e2d582a2d581a2d58222d58142d587a2d582c2d582e2d58022d58302d58322d58342d583a2d583c2d58382d58362d589c2d58402d583e2d584c2d58422d584e2d584a2d58462d58542d58442d585c2d585a2d58682d58622d58662d58482d58722d586c2d58502d589e2d58762d58a02d58522d58582d58562d586e2d58602d586a2d58702d58742d585e2d58642d58a22d58782d588c2d588e2d58822d58a42d58862d588a2d58982d589a2d58902d587e2d58942d58882d58842d587c2d58922d58802d58962d58aa2d58a82d58a62d58ae2d58b02d58ac2d58b40ddbb23058b62b58b82e58ba2d58")\ + X(324 , 1, KeyY , "Y" , "y" , 0x79 , 121 , 'u', 'y' , '\x19', "0015592815590815592615591215590c15591e15591c15590615592415590415590a15591015591615592015591815590e15592a15591a15592215591415597a15592c15592e15590215593015593215593415593a15593c15593815593615599c15594015593e15594c15594215594e15594a1559461559542c594415595c15595a15596815596215596615594815597215596c15595015599e1559761559a015595215595815595615596e15596015596a15597015597415595e1559641559a22c597815598c2c598e2c59822c59a42c59862c598a2c59982c599a1559902c597e2c59942c59882c59842c597c1559922c59802c59962c59aa1559a81559a61559ae1559b01559ac1559b41559b21459b62759b81859ba1359")\ + X(326 , 1, KeyZ , "Z" , "z" , 0x7A , 122 , 'u', 'z' , '\x1a', "002c5a282c5a082c5a262c5a122c5a0c2c5a1e2c5a1c2c5a062c5a242c5a042c5a0a2c5a102c5a162c5a202c5a182c5a0e2c5a2a2c5a1a2c5a222c5a142c5a7a2c5a2c2c5a2e2c5a022c5a302c5a322c5a342c5a3a2c5a3c2c5a382c5a362c5a9c2c5a402c5a3e2c5a4c2c5a422c5a4e2c5a4a2c5a462c5a54155a442c5a5c2c5a5a2c5a682c5a622c5a662c5a482c5a722c5a6c2c5a502c5a9e2c5a762c5aa02c5a522c5a582c5a562c5a6e2c5a602c5a6a2c5a702c5a742c5a5e2c5a642c5aa2155a782c5a8c155a8e155a82155aa4155a86155a8a155a98155a9a2c5a90155a7e155a94155a88155a84155a7c2c5a92155a80155a96155aaa115aa8115aa6115aae115ab0115aac115ab42c5ab2355ab6315ab8205aba265a")\ + X(328 , 1, AeLigature , "Æ" , "æ" , 0xE6 , 230 , 'u', -1 , -1 , "6828de6627c06028de7427c06427c07827c0")\ + X(330 , 1, AcuteA , "Á" , "á" , 0xE1 , 225 , 'u', -1 , -1 , "9828de7c28de")\ + X(332 , 1, BreveA , "Ă" , "ă" , 0x0103, 259 , 'u', -1 , -1 , "4c1adb961adb")\ + X(334 , 1, CircumflexA , "Â" , "â" , 0xE2 , 226 , 'u', -1 , -1 , "4c2bdc962bdc")\ + X(336 , 1, GraveA , "À" , "à" , 0xE0 , 224 , 'u', -1 , -1 , "462bdc442bdc5828de5628de7e28dc9428dc")\ + X(338 , 1, OgonekA , "Ą" , "ą" , 0x0105, 261 , 'u', -1 , -1 , "8a28deb41051")\ + X(340 , 1, RingA , "Å" , "å" , 0xE5 , 229 , 'u', -1 , -1 , "5c1add5a1add681add661add6c1add601add701add741add641add")\ + X(342 , 1, TildeA , "Ã" , "ã" , 0xE3 , 227 , 'u', -1 , -1 , "aa29de")\ + X(344 , 1, UmlautA , "Ä" , "ä" , 0xE4 , 228 , 'u', -1 , -1 , "5c28de5a28de6c28de9e1bdd7628bf7028de8c28de8e28de8228dea41bdd9028dc8828de8428de")\ + X(346 , 1, AcuteC , "Ć" , "ć" , 0x0107, 263 , 'u', -1 , -1 , "8628de9228de8028de")\ + X(348 , 1, CaronC , "Č" , "č" , 0x010D, 269 , 'u', -1 , -1 , "8627ba9227ba8027bab433bc")\ + X(350 , 1, CedillaC , "Ç" , "ç" , 0xE7 , 231 , 'u', -1 , -1 , "4e27ba4a27ba461bdd541adb441bdd5028de5227c06e2bbf9a34dcb630bf")\ + X(352 , 1, DotAboveC , "Ċ" , "ċ" , 0x010B, 267 , 'u', -1 , -1 , "4029c03e29c0")\ + X(354 , 1, AcuteE , "É" , "é" , 0xE9 , 233 , 'u', -1 , -1 , "4235bf4635bf4435bf9827ba7e27de9427de7c27ba")\ + X(356 , 1, GraveE , "È" , "è" , 0xE8 , 232 , 'u', -1 , -1 , "4628c04428c0581aba561aba7e1aba941aba")\ + X(358 , 1, DotAboveE , "Ė" , "ė" , 0x0117, 279 , 'u', -1 , -1 , "b428de")\ + X(360 , 1, OgonekE , "Ę" , "ę" , 0x0119, 281 , 'u', -1 , -1 , "b435bd")\ + X(362 , 1, UmlautE , "Ë" , "ë" , 0xEB , 235 , 'u', -1 , -1 , "5427ba")\ + X(364 , 1, CrossedD , "Đ" , "đ" , 0x0111, 273 , 'u', -1 , -1 , "861bdd921bdd801bdd")\ + X(366 , 1, BreveG , "Ğ" , "ğ" , 0x011F, 287 , 'u', -1 , -1 , "9a1adbb612ba")\ + X(368 , 1, DotAboveG , "Ġ" , "ġ" , 0x0121, 289 , 'u', -1 , -1 , "401adb3e1adb")\ + X(370 , 1, CrossedH , "Ħ" , "ħ" , 0x0127, 295 , 'u', -1 , -1 , "401bdd3e1bdd")\ + X(372 , 1, AcuteI , "Í" , "í" , 0xED , 237 , 'u', -1 , -1 , "9856e27c29307c56e2")\ + X(374 , 1, CircumflexI , "Î" , "î" , 0xEE , 238 , 'u', -1 , -1 , "4c1bdd961bdd")\ + X(376 , 1, GraveI , "Ì" , "ì" , 0xEC , 236 , 'u', -1 , -1 , "580ddd560ddd")\ + X(378 , 1, OgonekI , "Į" , "į" , 0x012F, 303 , 'u', -1 , -1 , "b41add")\ + X(380 , 1, CrossedL , "Ł" , "ł" , 0x0142, 322 , 'u', -1 , -1 , "8c2bbf822bbf8a27ba")\ + X(382 , 1, CaronN , "Ň" , "ň" , 0x0148, 328 , 'u', -1 , -1 , "9e2bdca42bdc")\ + X(384 , 1, TildeN , "Ñ" , "ñ" , 0xF1 , 241 , 'u', -1 , -1 , "6227c05027c06e27c06a27c0")\ + X(386 , 1, AcuteO , "Ó" , "ó" , 0xF3 , 243 , 'u', -1 , -1 , "8a2bdc980dbb7c0dbbaa1bba")\ + X(388 , 1, CircumflexO , "Ô" , "ô" , 0xF4 , 244 , 'u', -1 , -1 , "9e27baa427ba")\ + X(390 , 1, DoubleAcuteO , "Ő" , "ő" , 0x0151, 337 , 'u', -1 , -1 , "981adb7c1adb")\ + X(392 , 1, GraveO , "Ò" , "ò" , 0xF2 , 242 , 'u', -1 , -1 , "5827c05627c0")\ + X(394 , 1, HornO , "Ơ" , "ơ" , 0x01A1, 417 , 'u', -1 , -1 , "9c1bdd")\ + X(396 , 1, SlashedO , "Ø" , "ø" , 0xF8 , 248 , 'u', -1 , -1 , "6827c06628de6027c07428de6428de")\ + X(398 , 1, TildeO , "Õ" , "õ" , 0xF5 , 245 , 'u', -1 , -1 , "761bdb")\ + X(400 , 1, UmlautO , "Ö" , "ö" , 0xF6 , 246 , 'u', -1 , -1 , "5c27c05a27c06c27c07627ba7027c0780cbb8c27c08e27c08227c09a33bf9027de8827c08427c0b62ddc")\ + X(402 , 1, AcuteS , "Ś" , "ś" , 0x015B, 347 , 'u', -1 , -1 , "8a1bdd")\ + X(404 , 1, CaronS , "Š" , "š" , 0x0161, 353 , 'u', -1 , -1 , "861adb921adb801adbb42146")\ + X(406 , 1, CedillaS , "Ş" , "ş" , 0x015F, 351 , 'u', -1 , -1 , "9a27ba9627bab628de")\ + X(408 , 1, CommaS , "Ș" , "ș" , 0x0219, 537 , 'u', -1 , -1 , "4c27ba")\ + X(410 , 1, CedillaT , "Ţ" , "ţ" , 0x0163, 355 , 'u', -1 , -1 , "9628de")\ + X(412 , 1, CommaT , "Ț" , "ț" , 0x021B, 539 , 'u', -1 , -1 , "4c28de")\ + X(414 , 1, AcuteU , "Ú" , "ú" , 0xFA , 250 , 'u', -1 , -1 , "9e1adba01adba21adba41adb981bdd7c1bdd")\ + X(416 , 1, DoubleAcuteU , "Ű" , "ű" , 0x0171, 369 , 'u', -1 , -1 , "982bdc7c2bdc")\ + X(418 , 1, GraveU , "Ù" , "ù" , 0xF9 , 249 , 'u', -1 , -1 , "4656e24456e2582bbf562bbfaa28c0a828c0a628c0ae28c0b028c0ac28c0")\ + X(420 , 1, HornU , "Ư" , "ư" , 0x01B0, 432 , 'u', -1 , -1 , "9c1adb")\ + X(422 , 1, MacronU , "Ū" , "ū" , 0x016B, 363 , 'u', -1 , -1 , "b42d58")\ + X(424 , 1, OgonekU , "Ų" , "ų" , 0x0173, 371 , 'u', -1 , -1 , "b427c0")\ + X(426 , 1, RingU , "Ů" , "ů" , 0x016F, 367 , 'u', -1 , -1 , "a027baa227ba")\ + X(428 , 1, UmlautU , "Ü" , "ü" , 0xFC , 252 , 'u', -1 , -1 , "761ac08c1aba8e1aba821aba980cbf9a1bdd901aba881aba841aba7c0cbdb622dd")\ + X(430 , 1, CaronZ , "Ž" , "ž" , 0x017E, 382 , 'u', -1 , -1 , "7a0dbb862bdc922bdc802bdcb41157")\ + X(432 , 1, DotAboveZ , "Ż" , "ż" , 0x017C, 380 , 'u', -1 , -1 , "4056e23e2bdc8a1adb")\ + X(434 , 0, Sleep , "Sleep" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(436 , 0, AppStart1 , "AppStart1" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(438 , 0, AppStart2 , "AppStart2" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(440 , 0, AppNewWindow , "AppNewWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(442 , 0, AppOpenWindow , "AppOpenWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(444 , 0, AppHelp , "AppHelp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(446 , 0, AppSave , "AppSave" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(448 , 0, AppFind , "AppFind" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(450 , 0, AppPrint , "AppPrint" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(452 , 0, AppClose , "AppClose" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(454 , 1, AppCut , "AppCut" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(456 , 0, AppCopy , "AppCopy" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(458 , 1, AppPaste , "AppPaste" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(460 , 1, AppUndo , "AppUndo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(462 , 1, AppRedo , "AppRedo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(464 , 0, AppSpeechMode , "AppSpeechMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(466 , 0, AppSpeechCorrection, "AppSpeechCorrect" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(468 , 0, AppSpellCheck , "AppSpellCheck" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(470 , 0, Calculator , "Calculator" , "" , 0 , 0 , 'u', -1 , -1 , "0021b72821b70821b72621b71221b70c21b71e21b71c21b70621b72421b70421b70a21b71021b71621b72021b71821b70e21b72a21b71a21b72221b71421b77a21b72c21b72e21b70221b73021b73221b73421b73a21b73c21b73821b73621b79c21b74021b73e21b74c21b74221b74e21b74a21b74621b75421b74421b75c21b75a21b76821b76221b76621b74821b77221b76c21b75021b79e21b77621b7a021b75221b75821b75621b76e21b76021b76a21b77021b77421b75e21b76421b7a221b77821b78c21b78e21b78221b7a421b78621b78a21b79821b79a21b79021b77e21b79421b78821b78421b77c21b79221b78021b79621b7aa21b7a821b7a621b7ae21b7b021b7ac21b7b421b7b221b7b621b7b821b7ba21b7")\ + X(472 , 0, Mail , "Mail" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(474 , 0, MailSend , "MailSend" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(476 , 0, MailForward , "MailForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(478 , 0, MailReply , "MailReply" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(480 , 0, MediaBassBoost , "MediaBassBoost" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(482 , 0, MediaBassDown , "MediaBassDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(484 , 0, MediaBassUp , "MediaBassUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(486 , 0, MediaChanDown , "MediaChanDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(488 , 0, MediaChanUp , "MediaChanUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(490 , 0, MediaTrebleDown , "MediaTrebleDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(492 , 0, MediaTrebleUp , "MediaTrebleUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(494 , 0, MediaVolMute , "MediaVolMute" , "" , 0 , 57440, 'u', -1 , -1 , "0020ad2820ad0820ad2620ad1220ad0c20ad1e20ad1c20ad0620ad2420ad0420ad0a20ad1020ad1620ad2020ad1820ad0e20ad2a20ad1a20ad2220ad1420ad7a20ad2c20ad2e20ad0220ad3020ad3220ad3420ad3a20ad3c20ad3820ad3620ad9c20ad4020ad3e20ad4c20ad4220ad4e20ad4a20ad4620ad5420ad4420ad5c20ad5a20ad6820ad6220ad6620ad4820ad7220ad6c20ad5020ad9e20ad7620ada020ad5220ad5820ad5620ad6e20ad6020ad6a20ad7020ad7420ad5e20ad6420ada220ad7820ad8c20ad8e20ad8220ada420ad8620ad8a20ad9820ad9a20ad9020ad7e20ad9420ad8820ad8420ad7c20ad9220ad8020ad9620adaa20ada820ada620adae20adb020adac20adb420adb220adb620adb820adba20ad")\ + X(496 , 0, MediaVolDown , "MediaVolDown" , "" , 0 , 57438, 'u', -1 , -1 , "002eae282eae082eae262eae122eae0c2eae1e2eae1c2eae062eae242eae042eae0a2eae102eae162eae202eae182eae0e2eae2a2eae1a2eae222eae142eae7a2eae2c2eae2e2eae022eae302eae322eae342eae3a2eae3c2eae382eae362eae9c2eae402eae3e2eae4c2eae422eae4e2eae4a2eae462eae542eae442eae5c2eae5a2eae682eae622eae662eae482eae722eae6c2eae502eae9e2eae762eaea02eae522eae582eae562eae6e2eae602eae6a2eae702eae742eae5e2eae642eaea22eae782eae8c2eae8e2eae822eaea42eae862eae8a2eae982eae9a2eae902eae7e2eae942eae882eae842eae7c2eae922eae802eae962eaeaa2eaea82eaea62eaeae2eaeb02eaeac2eaeb42eaeb22eaeb62eaeb82eaeba2eae")\ + X(498 , 0, MediaVolUp , "MediaVolUp" , "" , 0 , 57439, 'u', -1 , -1 , "0030af2830af0830af2630af1230af0c30af1e30af1c30af0630af2430af0430af0a30af1030af1630af2030af1830af0e30af2a30af1a30af2230af1430af7a30af2c30af2e30af0230af3030af3230af3430af3a30af3c30af3830af3630af9c30af4030af3e30af4c30af4230af4e30af4a30af4630af5430af4430af5c30af5a30af6830af6230af6630af4830af7230af6c30af5030af9e30af7630afa030af5230af5830af5630af6e30af6030af6a30af7030af7430af5e30af6430afa230af7830af8c30af8e30af8230afa430af8630af8a30af9830af9a30af9030af7e30af9430af8830af8430af7c30af9230af8030af9630afaa30afa830afa630afae30afb030afac30afb430afb230afb630afb830afba30af")\ + X(500 , 0, MediaNext , "MediaNext" , "" , 0 , 57435, 'u', -1 , -1 , "0019b02819b00819b02619b01219b00c19b01e19b01c19b00619b02419b00419b00a19b01019b01619b02019b01819b00e19b02a19b01a19b02219b01419b07a19b02c19b02e19b00219b03019b03219b03419b03a19b03c19b03819b03619b09c19b04019b03e19b04c19b04219b04e19b04a19b04619b05419b04419b05c19b05a19b06819b06219b06619b04819b07219b06c19b05019b09e19b07619b0a019b05219b05819b05619b06e19b06019b06a19b07019b07419b05e19b06419b0a219b07819b08c19b08e19b08219b0a419b08619b08a19b09819b09a19b09019b07e19b09419b08819b08419b07c19b09219b08019b09619b0aa19b0a819b0a619b0ae19b0b019b0ac19b0b419b0b219b0b619b0b819b0ba19b0")\ + X(502 , 0, MediaPrev , "MediaPrev" , "" , 0 , 57436, 'u', -1 , -1 , "0010b12810b10810b12610b11210b10c10b11e10b11c10b10610b12410b10410b10a10b11010b11610b12010b11810b10e10b12a10b11a10b12210b11410b17a10b12c10b12e10b10210b13010b13210b13410b13a10b13c10b13810b13610b19c10b14010b13e10b14c10b14210b14e10b14a10b14610b15410b14410b15c10b15a10b16810b16210b16610b14810b17210b16c10b15010b19e10b17610b1a010b15210b15810b15610b16e10b16010b16a10b17010b17410b15e10b16410b1a210b17810b18c10b18e10b18210b1a410b18610b18a10b19810b19a10b19010b17e10b19410b18810b18410b17c10b19210b18010b19610b1aa10b1a810b1a610b1ae10b1b010b1ac10b1b410b1b210b1b610b1b810b1ba10b1")\ + X(504 , 0, MediaStop , "MediaStop" , "" , 0 , 57432, 'u', -1 , -1 , "0024b22824b20824b22624b21224b20c24b21e24b21c24b20624b22424b20424b20a24b21024b21624b22024b21824b20e24b22a24b21a24b22224b21424b27a24b22c24b22e24b20224b23024b23224b23424b23a24b23c24b23824b23624b29c24b24024b23e24b24c24b24224b24e24b24a24b24624b25424b24424b25c24b25a24b26824b26224b26624b24824b27224b26c24b25024b29e24b27624b2a024b25224b25824b25624b26e24b26024b26a24b27024b27424b25e24b26424b2a224b27824b28c24b28e24b28224b2a424b28624b28a24b29824b29a24b29024b27e24b29424b28824b28424b27c24b29224b28024b29624b2aa24b2a824b2a624b2ae24b2b024b2ac24b2b424b2b224b2b624b2b824b2ba24b2")\ + X(506 , 0, MediaPause , "MediaPause" , "" , 0 , 57429, 'u', -1 , -1 , "")\ + X(508 , 0, MediaPlayPause , "MediaPlayPause" , "" , 0 , 57430, 'u', -1 , -1 , "0022b32822b30822b32622b31222b30c22b31e22b31c22b30622b32422b30422b30a22b31022b31622b32022b31822b30e22b32a22b31a22b32222b31422b37a22b32c22b32e22b30222b33022b33222b33422b33a22b33c22b33822b33622b39c22b34022b33e22b34c22b34222b34e22b34a22b34622b35422b34422b35c22b35a22b36822b36222b36622b34822b37222b36c22b35022b39e22b37622b3a022b35222b35822b35622b36e22b36022b36a22b37022b37422b35e22b36422b3a222b37822b38c22b38e22b38222b3a422b38622b38a22b39822b39a22b39022b37e22b39422b38822b38422b37c22b39222b38022b39622b3aa22b3a822b3a622b3ae22b3b022b3ac22b3b422b3b222b3b622b3b822b3ba22b3")\ + X(510 , 0, MediaPlay , "MediaPlay" , "" , 0 , 57428, 'u', -1 , -1 , "")\ + X(512 , 0, MediaSelectMode , "MediaSelectMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(514 , 0, MediaReverse , "MediaReverse" , "" , 0 , 57431, 'u', -1 , -1 , "")\ + X(516 , 0, MediaRecord , "MediaRecord" , "" , 0 , 57437, 'u', -1 , -1 , "")\ + X(518 , 0, MediaFastForward , "MediaFastForward" , "" , 0 , 57433, 'u', -1 , -1 , "")\ + X(520 , 0, MediaRewind , "MediaRewind" , "" , 0 , 57434, 'u', -1 , -1 , "")\ + X(522 , 0, MicAirToggle , "MicAirToggle" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(524 , 0, MicMute , "MicMute" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(526 , 0, MicVolUp , "MicVolUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(528 , 0, MicVolDown , "MicVolDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(530 , 0, BrowserBackward , "BrowserBackward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(532 , 0, BrowserForward , "BrowserForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(534 , 0, BrowserRefresh , "BrowserRefresh" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(536 , 0, BrowserStop , "BrowserStop" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(538 , 0, BrowserSearch , "BrowserSearch" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(540 , 0, BrowserFavorites , "BrowserFavorites" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(542 , 0, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0032ac2832ac0832ac2632ac1232ac0c32ac1e32ac1c32ac0632ac2432ac0432ac0a32ac1032ac1632ac2032ac1832ac0e32ac2a32ac1a32ac2232ac1432ac7a32ac2c32ac2e32ac0232ac3032ac3232ac3432ac3a32ac3c32ac3832ac3632ac9c32ac4032ac3e32ac4c32ac4232ac4e32ac4a32ac4632ac5432ac4432ac5c32ac5a32ac6832ac6232ac6632ac4832ac7232ac6c32ac5032ac9e32ac7632aca032ac5232ac5832ac5632ac6e32ac6032ac6a32ac7032ac7432ac5e32ac6432aca232ac7832ac8c32ac8e32ac8232aca432ac8632ac8a32ac9832ac9a32ac9032ac7e32ac9432ac8832ac8432ac7c32ac9232ac8032ac9632acaa32aca832aca632acae32acb032acac32acb432acb232acb632acb832acba32ac")\ + X(544 , 0, lastKey , "lastKey" , "" , 0 , 0 , 0 , -1 , -1 , "") + + #define key_list2 \ /*Id Index Vkey Scan KLID CS Mask CS KLID VK SC I Name GenericName KKP base,suffix,ascii,w\ctrl*/\ X(0, 0, 0, 0, 0x00000, 0, 0x0000'00000'00'FF, 1, undef , "undef" , 0 , 'u', -1 , -1 )\ X(1, 0, 0xFF, 0xFF, 0x00409, 0, 0x0100'00000'FF'FF, 0, config , "config" , 0 , 'u', -1 , -1 )\ - X(2, 0xA2, 0x11, 0x1D, 0x00409, 0, 0x0100'00000'00'FF, 0, LeftCtrl , "Ctrl" , 57442, 'u', -1 , -1 )\ - X( 3, 0xA3, 0x11, 0x1D, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, RightCtrl , "Ctrl" , 57448, 'u', -1 , -1 )\ - X(4, 0xA4, 0x12, 0x38, 0x00409, 0, 0x0100'00000'00'FF, 0, LeftAlt , "Alt" , 57443, 'u', -1 , -1 )\ - X( 5, 0xA5, 0x12, 0x38, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, RightAlt , "Alt" , 57449, 'u', -1 , -1 )\ - X(6, 0xA0, 0x10, 0x2A, 0x00409, 0, 0x0000'00000'FF'FF, 0, LeftShift , "Shift" , 57441, 'u', -1 , -1 )\ - X( 7, 0xA1, 0x10, 0x36, 0x00409, 0, 0x0000'00000'FF'FF, 0, RightShift , "Shift" , 57447, 'u', -1 , -1 )\ - X(8, 0x5B, 0x5B, 0x5B, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, LeftSuper , "Super" , 57444, 'u', -1 , -1 )\ - X( 9, 0x5C, 0x5C, 0x5C, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, RightSuper , "Super" , 57450, 'u', -1 , -1 )\ - X(10, 0x5B, 0x5B, 0x5B, 0x00409, 0, 0x0100'00000'00'FF, 0, LeftHyper , "Hyper" , 57445, 'u', -1 , -1 )\ - X( 11, 0x5C, 0x5C, 0x5C, 0x00409, 0, 0x0100'00000'00'FF, 0, RightHyper , "Hyper" , 57451, 'u', -1 , -1 )\ - X(12, 0x5D, 0x5D, 0x5D, 0x00409, ExtendedKey, 0x0000'00000'00'FF, 0, Apps , "Apps" , 57363, 'u', -1 , -1 )\ - X(14, 0x90, 0x90, 0x45, 0x00409, 0, 0x0000'00000'00'FF, 0, NumLock , "NumLock" , 57360, 'u', -1 , -1 )\ - X(16, 0x14, 0x14, 0x3A, 0x00409, 0, 0x0100'00000'00'FF, 0, CapsLock , "CapsLock" , 57358, 'u', -1 , -1 )\ - X(18, 0x91, 0x91, 0x45, 0x00409, 0, 0x0100'00000'00'FF, 0, ScrollLock , "ScrollLock" , 57359, 'u', -1 , -1 )\ - X(20, 0x14, 0x14, 0x3A, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, AltGR , "AltGr" , 57453, 'u', -1 , -1 )/*IsoLevel3Shift*/\ - X(22, 0x91, 0x91, 0x45, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, IsoLevel5Shift , "IsoLevel5Shift" , 57454, 'u', -1 , -1 )\ - X(24, 0x1B, 0x1B, 0x01, 0x00409, 0, 0x0000'00000'00'FF, 1, Esc , "Esc" , 27 , 'u', '\x1b', '\x1b')\ - X(26, 0x20, 0x20, 0x39, 0x00409, 0, 0x0000'00000'00'FF, 1, Space , "Space" , 32 , 'u', '\x20', '\0' )\ - X(28, 0x08, 0x08, 0x0E, 0x00409, 0, 0x0000'00000'00'FF, 1, Backspace , "Backspace" , 127 , 'u', '\x7f', '\x08')\ - X(30, 0x09, 0x09, 0x0F, 0x00409, 0, 0x0000'00000'00'FF, 1, Tab , "Tab" , 9 , 'u', '\x09', '\x09')\ - X(32, 0x03, 0x03, 0x46, 0x00409, 0, 0x0000'00000'FF'FF, 1, Break , "Break" , 0 , 'u', '\x1a', '\x03')\ - X(34, 0x13, 0x13, 0x45, 0x00409, 0, 0x0000'00000'FF'FF, 0, Pause , "Pause" , 57362, 'u', '\x1a', '\x03')\ - X(36, 0x29, 0x29, 0, 0x00409, 0, 0x0000'00000'00'FF, 0, Select , "Select" , 0 , 'u', -1 , -1 )\ - X(38, 0x2C, 0x2C, 0x54, 0x00409, 0, 0x0000'00000'FF'FF, 1, SysRq , "SysRq" , 0 , 'u', -1 , '\x03')\ - X(40, 0x2C, 0x2C, 0x37, 0x00409, ExtendedKey, 0x0100'00000'FF'FF, 0, PrintScreen , "PrintScreen" , 57361, 'u', -1 , -1 )\ - X(42, 0x0D, 0x0D, 0x1C, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyEnter , "Enter" , 13 , 'u', '\x0d', '\x0a')\ - X( 43, 0x0D, 0x0D, 0x1C, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, NumpadEnter , "Enter" , 57414, 'u', '\x0d', '\x0a')\ - X(44, 0x21, 0x21, 0x49, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyPageUp , "PageUp" , 5 , '~', -1 , -1 )\ - X( 45, 0x21, 0x21, 0x49, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadPageUp , "PageUp" , 57421, 'u', -1 , -1 )\ - X(46, 0x22, 0x22, 0x51, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyPageDown , "PageDown" , 6 , '~', -1 , -1 )\ - X( 47, 0x22, 0x22, 0x51, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadPageDown , "PageDown" , 57422, 'u', -1 , -1 )\ - X(48, 0x23, 0x23, 0x4F, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyEnd , "End" , 8 , '~', -1 , -1 )/*don't reorder*/\ - X( 49, 0x23, 0x23, 0x4F, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadEnd , "End" , 57424, 'u', -1 , -1 )/*don't reorder*/\ - X(50, 0x24, 0x24, 0x47, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyHome , "Home" , 7 , '~', -1 , -1 )/*don't reorder*/\ - X( 51, 0x24, 0x24, 0x47, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadHome , "Home" , 57423, 'u', -1 , -1 )/*don't reorder*/\ - X(52, 0x25, 0x25, 0x4B, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyLeftArrow , "LeftArrow" , 1 , 'D', -1 , -1 )/*don't reorder*/\ - X( 53, 0x25, 0x25, 0x4B, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadLeftArrow , "LeftArrow" , 57417, 'u', -1 , -1 )/*don't reorder*/\ - X(54, 0x26, 0x26, 0x48, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyUpArrow , "UpArrow" , 1 , 'A', -1 , -1 )/*don't reorder*/\ - X( 55, 0x26, 0x26, 0x48, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadUpArrow , "UpArrow" , 57419, 'u', -1 , -1 )/*don't reorder*/\ - X(56, 0x27, 0x27, 0x4D, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyRightArrow , "RightArrow" , 1 , 'C', -1 , -1 )/*don't reorder*/\ - X( 57, 0x27, 0x27, 0x4D, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadRightArrow , "RightArrow" , 57418, 'u', -1 , -1 )/*don't reorder*/\ - X(58, 0x28, 0x28, 0x50, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyDownArrow , "DownArrow" , 1 , 'B', -1 , -1 )/*don't reorder*/\ - X( 59, 0x28, 0x28, 0x50, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadDownArrow , "DownArrow" , 57420, 'u', -1 , -1 )/*don't reorder*/\ - X(60, 0x30, 0x30, 0x0B, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key0 , "0" , 48 , 'u', '0' , '0' )\ - X( 61, 0x60, 0x60, 0x52, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad0 , "0" , 57399, 'u', '0' , '0' )\ - X(62, 0x31, 0x31, 0x02, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key1 , "1" , 49 , 'u', '1' , '1' )\ - X( 63, 0x61, 0x61, 0x4F, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad1 , "1" , 57400, 'u', '1' , '1' )\ - X(64, 0x32, 0x32, 0x03, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key2 , "2" , 50 , 'u', '2' , '\0' )\ - X( 65, 0x62, 0x62, 0x50, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad2 , "2" , 57401, 'u', '2' , '\0' )\ - X(66, 0x33, 0x33, 0x04, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key3 , "3" , 51 , 'u', '3' , '\x1b')\ - X( 67, 0x63, 0x63, 0x51, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad3 , "3" , 57402, 'u', '3' , '\x1b')\ - X(68, 0x34, 0x34, 0x05, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key4 , "4" , 52 , 'u', '4' , '\x1c')\ - X( 69, 0x64, 0x64, 0x4B, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad4 , "4" , 57403, 'u', '4' , '\x1c')\ - X(70, 0x35, 0x35, 0x06, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key5 , "5" , 53 , 'u', '5' , '\x1d')\ - X( 71, 0x65, 0x65, 0x4C, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad5 , "5" , 57404, 'u', '5' , '\x1d')\ - X(72, 0x36, 0x36, 0x07, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key6 , "6" , 54 , 'u', '6' , '\x1e')\ - X( 73, 0x66, 0x66, 0x4D, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad6 , "6" , 57405, 'u', '6' , '\x1e')\ - X(74, 0x37, 0x37, 0x08, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key7 , "7" , 55 , 'u', '7' , '\x1f')\ - X( 75, 0x67, 0x67, 0x47, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad7 , "7" , 57406, 'u', '7' , '\x1f')\ - X(76, 0x38, 0x38, 0x09, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key8 , "8" , 56 , 'u', '8' , '\x7f')\ - X( 77, 0x68, 0x68, 0x48, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad8 , "8" , 57407, 'u', '8' , '\x7f')\ - X(78, 0x39, 0x39, 0x0A, 0x00409, 0, 0x0000'00000'FF'FF, 1, Key9 , "9" , 57 , 'u', '9' , '9' )\ - X( 79, 0x69, 0x69, 0x49, 0x00409, NumLockMode, 0x0000'00000'FF'FF, 1, Numpad9 , "9" , 57408, 'u', '9' , '9' )\ - X(80, 0x2D, 0x2D, 0x52, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyInsert , "Insert" , 2 , '~', -1 , -1 )\ - X( 81, 0x2D, 0x2D, 0x52, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadInsert , "Insert" , 57425, 'u', -1 , -1 )\ - X(82, 0x2E, 0x2E, 0x53, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyDelete , "Delete" , 3 , '~', -1 , -1 )\ - X( 83, 0x2E, 0x2E, 0x55, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadDelete , "Delete" , 57426, 'u', -1 , -1 )\ - X(84, 0x0C, 0x0C, 0x4C, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, KeyClear , "Clear" , 1 , 'E', -1 , -1 )\ - X( 85, 0x0C, 0x0C, 0x4C, 0x00409, 0, 0x0100'00000'00'FF, 1, NumpadClear , "Clear" , 57427, '~', -1 , -1 )\ - X(86, 0x6A, 0x6A, 0x09, 0x00409, 0, 0x0000'00000'FF'FF, 1, KeyMultiply , "*" , 0 , 'u', '*' , '*' )\ - X( 87, 0x6A, 0x6A, 0x37, 0x00409, 0, 0x0000'00000'FF'FF, 1, NumpadMultiply , "*" , 57411, 'u', '*' , '*' )\ - X(88, 0x6B, 0x6B, 0x0D, 0x00409, 0, 0x0000'00000'FF'FF, 1, KeyPlus , "Plus" , 43 , 'u', '+' , '+' )\ - X( 89, 0x6B, 0x6B, 0x4E, 0x00409, 0, 0x0000'00000'FF'FF, 1, NumpadPlus , "Plus" , 57413, 'u', '+' , '+' )\ - X(90, 0x6C, 0x6C, 0, 0x00409, 0, 0x0020'00000'00'FF, 1, KeySeparator , "Separator" , 0 , 'u', ',' , ',' )\ - X( 91, 0x6C, 0x6C, 0, 0x00409, NumLockMode, 0x0020'00000'00'FF, 1, NumpadSeparator , "Separator" , 57416, 'u', ',' , ',' )\ - X(92, 0xBD, 0xBD, 0x0C, 0x00409, 0, 0x0000'00000'00'FF, 1, KeyMinus , "Minus" , 45 , 'u', '-' , '-' )\ - X( 93, 0x6D, 0x6D, 0x4A, 0x00409, 0, 0x0000'00000'00'FF, 1, NumpadMinus , "Minus" , 57412, 'u', '-' , '-' )\ - X(94, 0xBE, 0xBE, 0x34, 0x00409, 0, 0x0000'00000'00'FF, 1, KeyPeriod , "." , 46 , 'u', '.' , '.' )\ - X( 95, 0x6E, 0x6E, 0x53, 0x00409, NumLockMode, 0x0000'00000'00'FF, 1, NumpadDecimal , "." , 57409, 'u', '.' , '.' )\ - X(96, 0xBF, 0xBF, 0x35, 0x00409, 0, 0x0000'00000'00'FF, 1, KeySlash , "/" , 47 , 'u', '/' , '\x1f')\ - X( 97, 0x6F, 0x6F, 0x35, 0x00409, ExtendedKey, 0x0000'00000'00'FF, 1, NumpadSlash , "/" , 57410, 'u', '/' , '\x1f')\ - X(98, 0xBB, 0xBB, 0x0D, 0x00409, 0, 0x0100'00000'00'FF, 1, Equal , "=" , 61 , 'u', '=' , '=' )\ - X( 99, 0xBB, 0xBB, 0x0D, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, NumpadEqual , "=" , 57415, 'u', '=' , '=' )\ - X(100, 0xDC, 0xDC, 0x2B, 0x00409, 0, 0x0000'00000'00'FF, 1, BackSlash , "BackSlash" , 92 , 'u', '\\' , '\x1c')\ - X(102, 0xDB, 0xDB, 0x1A, 0x00409, 0, 0x0000'00000'00'FF, 1, OpenBracket , "[" , 91 , 'u', '[' , '\x1b')\ - X(104, 0xDD, 0xDD, 0x1B, 0x00409, 0, 0x0000'00000'00'FF, 1, CloseBracket , "]" , 93 , 'u', ']' , '\x1d')\ - X(106, 0xC0, 0xC0, 0x29, 0x00409, 0, 0x0000'00000'00'FF, 1, BackQuote , "`" , 96 , 'u', '`' , '`' )\ - X(108, 0xDE, 0xDE, 0x28, 0x00409, 0, 0x0000'00000'00'FF, 1, SingleQuote , "'" , 39 , 'u', '\'' , '\'' )\ - X(110, 0xBC, 0xBC, 0x33, 0x00409, 0, 0x0000'00000'00'FF, 1, Comma , "," , 44 , 'u', ',' , ',' )\ - X(112, 0xBA, 0xBA, 0x27, 0x00409, 0, 0x0000'00000'00'FF, 1, Semicolon , ";" , 59 , 'u', ';' , ';' )\ - X(114, 0xBC, 0xBC, 0x33, 0x00415, 0, 0x0000'FFFFF'00'FF, 1, LessThan , "<" , 60 , 'u', ';' , ';' )/*bepo */\ - X(116, 0xBE, 0xBE, 0x34, 0x00418, 0, 0x0000'FFFFF'00'FF, 1, GreaterThan , ">" , 62 , 'u', ';' , ';' )/*bepo */\ - X(118, 0xC0, 0xC0, 0x29, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DeadRing , "°" , 176 , 'u', '"' , '"' )/*qwertz Hungarian*/\ - X(120, 0x33, 0x33, 0x04, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, DoubleQuote , "\"" , 34 , 'u', '"' , '"' )/*azerty*/\ - X(122, 0x33, 0x29, 0xC0, 0x0081A, 0, 0x0000'FFFFF'00'FF, 1, LowQuote , "‚" , 8218 , 'u', -1 , -1 )\ - X(124, 0x33, 0x29, 0xC0, 0x10418, 0, 0x0000'FFFFF'00'FF, 1, DoubleLowQuote , "„" , 8222 , 'u', -1 , -1 )\ - X(126, 0x35, 0x35, 0x06, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, OpenRoundBracket , "(" , 40 , 'u', '(' , '(' )/*azerty*/\ - X(128, 0x38, 0x38, 0x2D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, CloseRoundBracket , ")" , 41 , 'u', ')' , ')' )/*azerty*/\ - X(130, 0x36, 0x36, 0x07, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, AtSign , "@" , 64 , 'u', '@' , '\0' )/*bepo */\ - X(132, 0xDD, 0xDD, 0x0D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Percent , "%" , 37 , 'u', '%' , '%' )/*bepo */\ - X(134, 0xDF, 0xDF, 0x35, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, Exclamation , "!" , 33 , 'u', '!' , '!' )/*azerty*/\ - X(136, 0xBF, 0xBF, 0x2B, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Hash , "#" , 35 , 'u', '#' , '#' )/*qwertz*/\ - X(138, 0x31, 0x31, 0x02, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Ampersand , "&" , 38 , 'u', '&' , '&' )/*azerty*/\ - X(140, 0x38, 0x38, 0x09, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, Underscore , "_" , 95 , 'u', '_' , '\x1f')/*azerty*/\ - X(142, 0x32, 0x32, 0x03, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, LeftGuillemet , "«" , 171 , 'u', -1 , -1 )/*bepo */\ - X(144, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, RightGuillemet , "»" , 187 , 'u', -1 , -1 )/*bepo */\ - X(146, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Dollar , "$" , '$' , 'u', '$' , '$' )\ - X(148, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, PoundSign , "£" , 163 , 'u', -1 , -1 )\ - X(150, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Paragraph , "§" , 167 , 'u', -1 , -1 )\ - X(152, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, MicroSign , "µ" , 181 , 'u', -1 , -1 )\ - X(154, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, AeLigature , "æ" , 230 , 'u', -1 , -1 )\ - X(156, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, TildeO , "õ" , 245 , 'u', -1 , -1 )\ - X(158, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, StrokeO , "ø" , 248 , 'u', -1 , -1 )\ - X(160, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, CrossedD , "đ" , 273 , 'u', -1 , -1 )\ - X(162, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, RingA , "å" , 229 , 'u', -1 , -1 )\ - X(164, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, GraveO , "ò" , 242 , 'u', -1 , -1 )\ - X(166, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, AcuteC , "ć" , 263 , 'u', -1 , -1 )\ - X(168, 0x33, 0x33, 0x04, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, GraveU , "ù" , 249 , 'u', -1 , -1 )\ - X(170, 0xDB, 0xDB, 0x2D, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, Eszett , "ß" , 223 , 'u', -1 , -1 )/*qwertz*/\ - X(172, 0x38, 0x38, 0x09, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteA , "á" , 225 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(174, 0x32, 0x32, 0x03, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, AcuteE , "é" , 233 , 'u', -1 , -1 )/*azerty*/\ - X(176, 0x39, 0x39, 0x0A, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteI , "í" , 237 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(178, 0x38, 0x38, 0x09, 0x0041B, 0, 0x0000'FFFFF'00'FF, 1, AcuteO , "ó" , 243 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(180, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteU , "ú" , 250 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(182, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, AcuteY , "ý" , 253 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(184, 0x34, 0x34, 0x05, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, DoubleAcuteO , "ő" , 337 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(186, 0x39, 0x39, 0x0A, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CedillaC , "ç" , 231 , 'u', -1 , -1 )/*azerty*/\ - X(188, 0x5A, 0x5A, 0x2C, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CircumflexE , "ê" , 234 , 'u', -1 , -1 )/*bepo */\ - X(190, 0x32, 0x32, 0x03, 0x5040C, 0, 0x0000'FFFFF'00'FF, 1, CaronE , "ě" , 283 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(192, 0x33, 0x33, 0x04, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, CaronS , "š" , 353 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(194, 0x34, 0x34, 0x05, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronC , "č" , 269 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(196, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronR , "ř" , 345 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(198, 0x36, 0x36, 0x07, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronZ , "ž" , 282 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(200, 0x32, 0x32, 0x03, 0x0040E, 0, 0x0000'FFFFF'00'FF, 1, CaronL , "ľ" , 318 , 'u', -1 , -1 )/*qwertz Slovak*/\ - X(202, 0x35, 0x35, 0x06, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, CaronT , "ť" , 357 , 'u', -1 , -1 )/*qwertz Slovak*/\ - X(204, 0x30, 0x30, 0x0B, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, GraveA , "à" , 224 , 'u', -1 , -1 )/*azerty*/\ - X(206, 0x37, 0x37, 0x08, 0x00405, 0, 0x0000'FFFFF'00'FF, 1, GraveE , "è" , 232 , 'u', -1 , -1 )/*azerty*/\ - X(208, 0xDE, 0xDE, 0x28, 0x00407, 0, 0x0000'FFFFF'00'FF, 1, UmlautA , "ä" , 228 , 'u', -1 , -1 )/*qwertz*/\ - X(210, 0xBF, 0xBF, 0x27, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautO , "ö" , 246 , 'u', -1 , -1 )/*qwertz*/\ - X(212, 0xBA, 0xBA, 0x1A, 0x5040C, 0, 0x0000'0FFFF'00'FF, 1, UmlautU , "ü" , 252 , 'u', -1 , -1 )/*qwertz*/\ - X(214, 0xBA, 0xBA, 0x27, 0x0040C, 0, 0x0000'FFFFF'00'FF, 1, RingU , "ů" , 367 , 'u', -1 , -1 )/*qwertz Czech*/\ - X(216, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, DeadCircumflex , "^" , 94 , 'u', -1 , -1 )/*qwertz*/\ - X(218, 0xDD, 0xDD, 0x0D, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, DeadAcute , "´" , 180 , 'u', -1 , -1 )/*qwertz*/\ - X(220, 0xC0, 0xC0, 0x29, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, DeadGrave , "`" , 96 , 'u', -1 , -1 )/*bepo */\ - X(222, 0xDD, 0xDD, 0x1A, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, DeadUmlaut , "¨" , 168 , 'u', -1 , -1 )/*azerty*/\ - X(224, 0x4E, 0x4E, 0x31, 0x0040C, 0, 0x0000'FFFFF'00'FF, 0, DeadTilde , "~" , 771 , 'u', -1 , -1 )/*bepo */\ - X(226, 0xDC, 0xDC, 0x29, 0x0040E, 0, 0x0000'FFFFF'00'FF, 0, DeadCaron , "ˇ" , 780 , 'u', -1 , -1 )/*qwertz Hungarian*/\ - X(228, 0xDC, 0xDC, 0x29, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, DeadBreve , "˘" , 774 , 'u', -1 , -1 )/*bepo French*/\ - X(230, 0xDE, 0xDE, 0x28, 0x5040C, 0, 0x0000'FFFFF'00'FF, 0, DeadOgonek , "˛" , 731 , 'u', -1 , -1 )/*bepo French*/\ - X(232, 0x70, 0x70, 0x3B, 0x00409, 0, 0x0000'00000'00'FF, 1, F1 , "F1" , 11 , '~', -1 , -1 )\ - X(234, 0x71, 0x71, 0x3C, 0x00409, 0, 0x0000'00000'00'FF, 1, F2 , "F2" , 12 , '~', -1 , -1 )\ - X(236, 0x72, 0x72, 0x3D, 0x00409, 0, 0x0000'00000'00'FF, 1, F3 , "F3" , 13 , '~', -1 , -1 )\ - X(238, 0x73, 0x73, 0x3E, 0x00409, 0, 0x0000'00000'00'FF, 1, F4 , "F4" , 14 , '~', -1 , -1 )\ - X(240, 0x74, 0x74, 0x3F, 0x00409, 0, 0x0000'00000'00'FF, 1, F5 , "F5" , 15 , '~', -1 , -1 )\ - X(242, 0x75, 0x75, 0x40, 0x00409, 0, 0x0000'00000'00'FF, 1, F6 , "F6" , 17 , '~', -1 , -1 )\ - X(244, 0x76, 0x76, 0x41, 0x00409, 0, 0x0000'00000'00'FF, 1, F7 , "F7" , 18 , '~', -1 , -1 )\ - X(246, 0x77, 0x77, 0x42, 0x00409, 0, 0x0000'00000'00'FF, 1, F8 , "F8" , 19 , '~', -1 , -1 )\ - X(248, 0x78, 0x78, 0x43, 0x00409, 0, 0x0000'00000'00'FF, 1, F9 , "F9" , 20 , '~', -1 , -1 )\ - X(250, 0x79, 0x79, 0x44, 0x00409, 0, 0x0000'00000'00'FF, 1, F10 , "F10" , 21 , '~', -1 , -1 )\ - X(252, 0x7A, 0x7A, 0x57, 0x00409, 0, 0x0000'00000'00'FF, 1, F11 , "F11" , 23 , '~', -1 , -1 )\ - X(254, 0x7B, 0x7B, 0x5B, 0x00409, 0, 0x0000'00000'00'FF, 1, F12 , "F12" , 24 , '~', -1 , -1 )\ - X(256, 0x7C, 0x7C, 0, 0x00409, 0, 0x0000'00000'00'FF, 1, F13 , "F13" , 57376, 'u', -1 , -1 )\ - X(258, 0x7D, 0x7D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F14 , "F14" , 57377, 'u', -1 , -1 )\ - X(260, 0x7E, 0x7E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F15 , "F15" , 57378, 'u', -1 , -1 )\ - X(262, 0x7F, 0x7F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F16 , "F16" , 57379, 'u', -1 , -1 )\ - X(264, 0x80, 0x80, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F17 , "F17" , 57380, 'u', -1 , -1 )\ - X(266, 0x81, 0x81, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F18 , "F18" , 57381, 'u', -1 , -1 )\ - X(268, 0x82, 0x82, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F19 , "F19" , 57382, 'u', -1 , -1 )\ - X(270, 0x83, 0x83, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F20 , "F20" , 57383, 'u', -1 , -1 )\ - X(272, 0x84, 0x84, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F21 , "F21" , 57384, 'u', -1 , -1 )\ - X(274, 0x85, 0x85, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F22 , "F22" , 57385, 'u', -1 , -1 )\ - X(276, 0x86, 0x86, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F23 , "F23" , 57386, 'u', -1 , -1 )\ - X(278, 0x87, 0x87, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, F24 , "F24" , 57387, 'u', -1 , -1 )\ - X(280, 0x7D, 0x7D, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F25 , "F25" , 57388, 'u', -1 , -1 )\ - X(282, 0x7E, 0x7E, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F26 , "F26" , 57389, 'u', -1 , -1 )\ - X(284, 0x7F, 0x7F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F27 , "F27" , 57390, 'u', -1 , -1 )\ - X(286, 0x80, 0x80, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F28 , "F28" , 57391, 'u', -1 , -1 )\ - X(288, 0x81, 0x81, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F29 , "F29" , 57392, 'u', -1 , -1 )\ - X(290, 0x82, 0x82, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F30 , "F30" , 57393, 'u', -1 , -1 )\ - X(292, 0x83, 0x83, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F31 , "F31" , 57394, 'u', -1 , -1 )\ - X(294, 0x84, 0x84, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F32 , "F32" , 57395, 'u', -1 , -1 )\ - X(296, 0x85, 0x85, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F33 , "F33" , 57396, 'u', -1 , -1 )\ - X(298, 0x86, 0x86, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F34 , "F34" , 57397, 'u', -1 , -1 )\ - X(300, 0x87, 0x87, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 1, F35 , "F35" , 57398, 'u', -1 , -1 )\ - X(302, 0x41, 0x41, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyA , "A" , 97 , 'u', 'a' , '\x01')\ - X(304, 0x42, 0x42, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyB , "B" , 98 , 'u', 'b' , '\x02')\ - X(306, 0x43, 0x43, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyC , "C" , 99 , 'u', 'c' , '\x03')\ - X(308, 0x44, 0x44, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyD , "D" , 100 , 'u', 'd' , '\x04')\ - X(310, 0x45, 0x45, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyE , "E" , 101 , 'u', 'e' , '\x05')\ - X(312, 0x46, 0x46, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyF , "F" , 102 , 'u', 'f' , '\x06')\ - X(314, 0x47, 0x47, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyG , "G" , 103 , 'u', 'g' , '\x07')\ - X(316, 0x48, 0x48, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyH , "H" , 104 , 'u', 'h' , '\x08')\ - X(318, 0x49, 0x49, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyI , "I" , 105 , 'u', 'i' , '\x09')\ - X(320, 0x4A, 0x4A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyJ , "J" , 106 , 'u', 'j' , '\x0a')\ - X(322, 0x4B, 0x4B, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyK , "K" , 107 , 'u', 'k' , '\x0b')\ - X(324, 0x4C, 0x4C, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyL , "L" , 108 , 'u', 'l' , '\x0c')\ - X(326, 0x4D, 0x4D, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyM , "M" , 109 , 'u', 'm' , '\x0d')\ - X(328, 0x4E, 0x4E, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyN , "N" , 110 , 'u', 'n' , '\x0e')\ - X(330, 0x4F, 0x4F, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyO , "O" , 111 , 'u', 'o' , '\x0f')\ - X(332, 0x50, 0x50, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyP , "P" , 112 , 'u', 'p' , '\x10')\ - X(334, 0x51, 0x51, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyQ , "Q" , 113 , 'u', 'q' , '\x11')\ - X(336, 0x52, 0x52, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyR , "R" , 114 , 'u', 'r' , '\x12')\ - X(338, 0x53, 0x53, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyS , "S" , 115 , 'u', 's' , '\x13')\ - X(340, 0x54, 0x54, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyT , "T" , 116 , 'u', 't' , '\x14')\ - X(342, 0x55, 0x55, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyU , "U" , 117 , 'u', 'u' , '\x15')\ - X(344, 0x56, 0x56, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyV , "V" , 118 , 'u', 'v' , '\x16')\ - X(346, 0x57, 0x57, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyW , "W" , 119 , 'u', 'w' , '\x17')\ - X(348, 0x58, 0x58, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyX , "X" , 120 , 'u', 'x' , '\x18')\ - X(350, 0x59, 0x59, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyY , "Y" , 121 , 'u', 'y' , '\x19')\ - X(352, 0x5A, 0x5A, 0, 0x00409, 0, 0x0100'00000'00'FF, 1, KeyZ , "Z" , 122 , 'u', 'z' , '\x1a')\ - X(354, 0x5F, 0x5F, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Sleep , "Sleep" , 0 , 'u', -1 , -1 )\ - X(356, 0xB7, 0xB7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Calculator , "Calculator" , 0 , 'u', -1 , -1 )\ - X(368, 0x48, 0x48, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, Mail , "Mail" , 0 , 'u', -1 , -1 )\ - X(360, 0xAD, 0xAD, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolMute , "MediaVolMute" , 57440, 'u', -1 , -1 )\ - X(362, 0xAE, 0xAE, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolDown , "MediaVolDown" , 57438, 'u', -1 , -1 )\ - X(364, 0xAF, 0xAF, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaVolUp , "MediaVolUp" , 57439, 'u', -1 , -1 )\ - X(366, 0xB0, 0xB0, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaNext , "MediaNext" , 57435, 'u', -1 , -1 )\ - X(368, 0xB1, 0xB1, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPrev , "MediaPrev" , 57436, 'u', -1 , -1 )\ - X(370, 0xB2, 0xB2, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaStop , "MediaStop" , 57432, 'u', -1 , -1 )\ - X(372, 0xB2, 0xB2, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPause , "MediaPause" , 57429, 'u', -1 , -1 )\ - X(374, 0xB3, 0xB3, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaPlayPause , "MediaPlayPause" , 57430, 'u', -1 , -1 )\ - X(376, 0xB3, 0xB3, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaPlay , "MediaPlay" , 57428, 'u', -1 , -1 )\ - X(378, 0xB5, 0xB5, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaSelect , "MediaSelect" , 0 , 'u', -1 , -1 )\ - X(380, 0xB8, 0xB8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaReverse , "MediaReverse" , 57431, 'u', -1 , -1 )\ - X(382, 0xB8, 0xB8, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRecord , "MediaRecord" , 57437, 'u', -1 , -1 )\ - X(384, 0xB9, 0xB9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, MediaFastForward , "MediaFastForward", 57433, 'u', -1 , -1 )\ - X(386, 0xB9, 0xB9, 0, 0x00409, 0, 0x0100'00000'00'FF, 0, MediaRewind , "MediaRewind" , 57434, 'u', -1 , -1 )\ - X(388, 0xA6, 0xA6, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserBack , "BrowserBack" , 0 , 'u', -1 , -1 )\ - X(390, 0xA7, 0xA7, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserForward , "BrowserForward" , 0 , 'u', -1 , -1 )\ - X(392, 0xA8, 0xA8, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserRefresh , "BrowserRefresh" , 0 , 'u', -1 , -1 )\ - X(394, 0xA9, 0xA9, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserStop , "BrowserStop" , 0 , 'u', -1 , -1 )\ - X(396, 0xAA, 0xAA, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserSearch , "BrowserSearch" , 0 , 'u', -1 , -1 )\ - X(398, 0xAB, 0xAB, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserFavorites , "BrowserFavorites", 0 , 'u', -1 , -1 )\ - X(400, 0xAC, 0xAC, 0, 0x00409, ExtendedKey, 0x0100'00000'00'FF, 0, BrowserHome , "BrowserHome" , 0 , 'u', -1 , -1 )\ X(402, 0xFF, 0xFF, 0xFF, 0x00000, ExtendedKey, 0x0100'FFFFF'FF'FF, 0, lastKey , "lastKey" , 0 , 0 , -1 , -1 ) // Max 12 bits for KeyId. static constexpr auto idbits = 12; - #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ + /* ID Input Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */ + #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ static constexpr auto Name = KeyId; key_list #undef X @@ -569,29 +666,30 @@ namespace netxs::input static const auto keymap = std::unordered_map { - #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ - { map{ Vkey, Scan, Klid, CtrlState, Mask, #Name, GenericName, Input, KeyId, KKPDef, KKPSuffix, KKPAscii, KKPCtl }, Name }, + #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + { map{ 0,0,0,0 }, Name }, + //{ map{ Vkey, Scan, Klid, CtrlState, Mask, #Name, GenericName, Input, KeyId, KKPDef, KKPSuffix, KKPAscii, KKPCtl }, Name }, key_list #undef X }; static const auto kkpmap = std::unordered_map { - #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ - { KKPDef | (KKPSuffix << 16), KeyId }, + #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + { KKPdef | (KKPsuffix << 16), KeyId }, key_list #undef X }; static const auto specific_names = utf::unordered_map { - #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ + #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ { utf::to_lower(#Name), KeyId }, key_list #undef X }; static const auto generic_names = utf::unordered_map { - #define X(KeyId, Index, Vkey, Scan, Klid, CtrlState, Mask, Input, Name, GenericName, KKPDef, KKPSuffix, KKPAscii, KKPCtl) \ - { utf::to_lower(GenericName), KeyId & -2 }, + #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + { utf::to_lower(Generic), KeyId & -2 }, key_list #undef X }; @@ -680,26 +778,7 @@ namespace netxs::input #undef mouse_list #undef key_list - - template - auto xlat(Args&&... args) - { - auto iter = keymap.find(map{ args... }); - return iter != keymap.end() ? iter->second : key::undef; - } - auto find(si32 vkey, si32 fallback) - { - auto k = fallback; - for (auto& [key, val] : keymap) - { - if ((si32)(key.hash & 0xff) == vkey) - { - k = val & -2; // Generic keys only. - break; - } - } - return k; - } + #undef key_list2 } struct foci @@ -2158,7 +2237,9 @@ namespace netxs::input if (auto it_alone = alone_key.find(v); it_alone != alone_key.end()) { - if (v >= key::KeyEnd && v <= key::KeyDownArrow) + static constexpr auto min = std::min({ key::KeyHome, key::KeyEnd, key::KeyLeftArrow, key::KeyRightArrow, key::KeyUpArrow, key::KeyDownArrow }); + static constexpr auto max = std::max({ key::KeyHome, key::KeyEnd, key::KeyLeftArrow, key::KeyRightArrow, key::KeyUpArrow, key::KeyDownArrow }); + if (v >= min && v <= max) { it_alone->second[1] = decckm ? 'O' : '['; } @@ -2763,6 +2844,46 @@ namespace netxs::input default: break; } } + auto xlat(si32 scancod, bool extflag, si32 keymod, si32 xlayout, si32 klid_fallback) + { + auto klid = input::key::is_layout_supported(xlayout) ? xlayout : klid_fallback; + if (keymod & input::hids::NumLock) + { + // + } + + auto iter = keymap.find(map{ 0,0,0,0 }); + return iter != keymap.end() ? iter->second : key::undef; + } + auto xlat(si32 virtcod, si32 scancod, si32 dwControlKeyState, si32 klid) + { + if (dwControlKeyState & input::key::NumLockMode) + { + // + } + + auto iter = keymap.find(map{ 0,0,0,0 }); + return iter != keymap.end() ? iter->second : key::undef; + } + //template + //auto xlat(Args&&... args) + //{ + // auto iter = keymap.find(map{ args... }); + // return iter != keymap.end() ? iter->second : key::undef; + //} + auto find(si32 vkey, si32 fallback) + { + auto k = fallback; + for (auto& [key, val] : keymap) + { + if ((si32)(key.hash & 0xff) == vkey) + { + k = val & -2; // Generic keys only. + break; + } + } + return k; + } } namespace bindings From e179c3b86a3f53e101e2e6bc3cbd01c762913d11 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 02:25:51 +0500 Subject: [PATCH 26/71] #943 WIP: Fix key names (unix builds) --- src/netxs/desktopio/input.hpp | 2 +- src/netxs/desktopio/system.hpp | 18 +++++++++--------- src/netxs/desktopio/terminal.hpp | 1 + 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 31f3a860f4..2e1fdd94dd 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -401,7 +401,7 @@ namespace netxs::input X( 175, 1, NumpadMinus , "Minus" , "-" , 0x2D , 57412, 'u', '-' , '-' , "004a6d284a6d084a6d264a6d124a6d0c4a6d1e4a6d1c4a6d064a6d244a6d044a6d0a4a6d104a6d164a6d204a6d184a6d0e4a6d2a4a6d1a4a6d224a6d144a6d7a4a6d2c4a6d2e4a6d024a6d304a6d324a6d344a6d3a4a6d3c4a6d384a6d364a6d9c4a6d404a6d3e4a6d4c4a6d424a6d4e4a6d4a4a6d464a6d544a6d444a6d5c4a6d5a4a6d684a6d624a6d664a6d484a6d724a6d6c4a6d504a6d9e4a6d764a6da04a6d524a6d584a6d564a6d6e4a6d604a6d6a4a6d704a6d744a6d5e4a6d644a6da24a6d784a6d8c4a6d8e4a6d824a6da44a6d864a6d8a4a6d984a6d9a4a6d904a6d7e4a6d944a6d884a6d844a6d7c4a6d924a6d804a6d964a6daa4a6da84a6da64a6dae4a6db04a6dac4a6db44a6db24a6db64a6db84a6dba4a6d")\ X(176 , 1, KeyEqual , "=" , "=" , 0x3D , 61 , 'u', '=' , '=' , "000dbb280dbb080dbb260dbb120dbb0c0dbb1e0dbb1c0dbb060dbb240dbb040dbb0a0dbb100dbb160dbb200dbb180dbb0e0dbb2a0dbb1a0dbb220dbb140dbb2c0dbb2e0dbb020dbb300dbb320dbb340dbb3a0dbb3c0dbb380dbb360dbb400dbb3e0dbb4c0dbb420dbb4e0dbb4a0dbb460dbb540dbb440dbb5035df9e0cbda00cbda20cbba40cbfaa0dbba80dbba60dbbae35bbb035bbac35bbb21bbbb81bbbba1bbb")\ X( 177, 1, NumpadEqual , "=" , "=" , 0x3D , 57415, 'u', '=' , '=' , "")\ - X(178 , 1, KeyDot , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be2834be0834be2634be1234be0c34be1e34be1c34be0634be2434be0434be0a34be1034be1634be2034be1834be0e34be2a34be1a34be2234be1434be7a34be2c34be2e34be0234be3034be3234be3434be3a34be3c34be3834be3634be9c34be4034be3e34be4c34be4234be4e34be4a34be4634be5434be4434be5c34be5a34be6834be6234be6634be4834be7234be6c34be5034be9e34be7634bea034be5234be5834be5634be6e34be6034be6a34be7034be7434be5e34be6434bea234be7834be8c34be8e34be8234bea434be8634be8a34be9834be9a35be9034be7e34be9434be8834be8434be7c34be9234be8034be9634beb212beb634beb813beba18be")\ + X(178 , 1, KeyPeriod , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be2834be0834be2634be1234be0c34be1e34be1c34be0634be2434be0434be0a34be1034be1634be2034be1834be0e34be2a34be1a34be2234be1434be7a34be2c34be2e34be0234be3034be3234be3434be3a34be3c34be3834be3634be9c34be4034be3e34be4c34be4234be4e34be4a34be4634be5434be4434be5c34be5a34be6834be6234be6634be4834be7234be6c34be5034be9e34be7634bea034be5234be5834be5634be6e34be6034be6a34be7034be7434be5e34be6434bea234be7834be8c34be8e34be8234bea434be8634be8a34be9834be9a35be9034be7e34be9434be8834be8434be7c34be9234be8034be9634beb212beb634beb813beba18be")\ X( 179, 1, NumpadDecimal , "." , "." , 0x2E , 57409, 'u', '.' , '.' , "00536e28536e08536e26536e12536e0c536e1e536e1c536e06536e24536e04536e0a536e10536e16536e20536e18536e0e536e2a536e1a536e22536e14536e7a536e2c536e2e536e02536e30536e32536e34536e3a536e3c536e38536e36536e9c536e40536e3e536e4c536e42536e4e536e4a536e46536e54536e44536e5c536e5a536e68536e62536e66536e48536e72536e6c536e50536e9e536e76536ea0536e52536e58536e56536e6e536e60536e6a536e70536e74536e5e536e64536ea2536e78536e8c536e8e536e82536ea4536e86536e8a536e98536e9a536e90536e7e536e94536e88536e84536e7c536e92536e80536e96536eaa536ea8536ea6536eae536eb0536eac536eb4536eb2536eb6536eb8536eba536e")\ X(180 , 1, KeyComma , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "0033bc2833bc0833bc2633bc1233bc0c33bc1e33bc1c33bc0633bc2433bc0433bc0a33bc1033bc1633bc2033bc1833bc0e33bc2a33bc1a33bc2233bc1433bc7a33bc2c33bc2e33bc0233bc3033bc3233bc3433bc3a33bc3c33bc3833bc3633bc9c33bc4033bc3e33bc4c33bc4233bc4e33bc4a33bc4633bc5433bc4433bc5c33bc5a33bc6833bc6233bc6633bc4833bc7233bc6c33bc5033bc9e33bc7633bca033bc5233bc5833bc5633bc6e33bc6033bc6a33bc7033bc7433bc5e33bc6433bca233bc7833bc8c33bc8e33bc8233bca433bc8633bc8a33bc9833bc9a2bbc9033bc7e33bc9433bc8833bc8433bc7c33bc9233bc8033bc9633bcaa32bca832bca632bcae32bcb032bcac32bcb211bcb635bcb82fbcba33bc")\ X( 181, 1, NumpadPoint , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "007ec2287ec2087ec2267ec2127ec20c7ec21e7ec21c7ec2067ec2247ec2047ec20a7ec2107ec2167ec2207ec2187ec20e7ec22a7ec21a7ec2227ec2147ec27a7ec22c7ec22e7ec2027ec2307ec2327ec2347ec23a7ec23c7ec2387ec2367ec29c7ec2407ec23e7ec24c7ec2427ec24e7ec24a7ec2467ec2547ec2447ec25c7ec25a7ec2687ec2627ec2667ec2487ec2727ec26c7ec2507ec29e7ec2767ec2a07ec2527ec2587ec2567ec26e7ec2607ec26a7ec2707ec2747ec25e7ec2647ec2a27ec2787ec28c7ec28e7ec2827ec2a47ec2867ec28a7ec2987ec29a7ec2907ec27e7ec2947ec2887ec2847ec27c7ec2927ec2807ec2967ec2aa7ec2a87ec2a67ec2ae7ec2b07ec2ac7ec2b47ec2b27ec2b67ec2b87ec2ba7ec2")\ diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 461b1eb71f..ff48a52dce 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5819,30 +5819,30 @@ namespace netxs::os { "\x29" , { ")", key::Key0 | (hids::LShift << key::idbits) }}, { "\x2a" , { "*", key::KeyMultiply }}, { "\x2b" , { "+", key::KeyPlus }}, - { "\x2c" , { ",", key::Comma }}, + { "\x2c" , { ",", key::KeyComma }}, { "\x2d" , { "-", key::KeyMinus }}, { "\x2e" , { ".", key::KeyPeriod }}, { "\x2f" , { "/", key::KeySlash }}, { "\x3a" , { ":", key::Semicolon | (hids::LShift << key::idbits) }}, { "\x3b" , { ";", key::Semicolon }}, - { "\x3c" , { "<", key::Comma | (hids::LShift << key::idbits) }}, - { "\x3d" , { "=", key::Equal }}, + { "\x3c" , { "<", key::KeyComma | (hids::LShift << key::idbits) }}, + { "\x3d" , { "=", key::KeyEqual }}, { "\x3e" , { ">", key::KeyPeriod | (hids::LShift << key::idbits) }}, { "\x3f" , { "?", key::KeySlash | (hids::LShift << key::idbits) }}, { "\x40" , { "@", key::Key2 | (hids::LShift << key::idbits) }}, - { "\x5b" , { "[", key::OpenBracket }}, + { "\x5b" , { "[", key::OpenSquareBracket }}, { "\x5c" , { "\\", key::BackSlash }}, - { "\x5d" , { "]", key::CloseBracket }}, + { "\x5d" , { "]", key::CloseSquareBracket }}, { "\x5e" , { "^", key::Key6 | (hids::LShift << key::idbits) }}, { "\x5f" , { "_", key::KeyMinus | (hids::LShift << key::idbits) }}, { "\x60" , { "`", key::BackQuote }}, - { "\x7b" , { "{", key::OpenBracket | (hids::LShift << key::idbits) }}, - { "\x7c" , { "|", key::BackSlash | (hids::LShift << key::idbits) }}, - { "\x7d" , { "}", key::CloseBracket | (hids::LShift << key::idbits) }}, - { "\x7e" , { "~", key::BackQuote | (hids::LShift << key::idbits) }}, + { "\x7b" , { "{", key::OpenSquareBracket | (hids::LShift << key::idbits) }}, + { "\x7c" , { "|", key::BackSlash | (hids::LShift << key::idbits) }}, + { "\x7d" , { "}", key::CloseSquareBracket | (hids::LShift << key::idbits) }}, + { "\x7e" , { "~", key::BackQuote | (hids::LShift << key::idbits) }}, { "\033[5~" , { "", key::KeyPageUp }}, { "\033[6~" , { "", key::KeyPageDown }}, diff --git a/src/netxs/desktopio/terminal.hpp b/src/netxs/desktopio/terminal.hpp index 224acd2e75..467b77f63a 100644 --- a/src/netxs/desktopio/terminal.hpp +++ b/src/netxs/desktopio/terminal.hpp @@ -10227,6 +10227,7 @@ namespace netxs::ui case keybd::type::deadkey: deadkey_preview = gear.keystat == input::key::pressed ? gear.cluster : ""; if (io_log) log("%%Deadkey preview: ", prompt::key, ansi::hi(deadkey_preview.size() ? deadkey_preview : " ")); + [[fallthroght]] case keybd::type::keypress: if (defcfg.resetonkey && gear.doinput()) { From 6caf98e8eeb265fc61e882dcff782cbcd46a70a4 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 02:28:08 +0500 Subject: [PATCH 27/71] #943 WIP: Typo --- src/netxs/desktopio/terminal.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/netxs/desktopio/terminal.hpp b/src/netxs/desktopio/terminal.hpp index 467b77f63a..0a58aee759 100644 --- a/src/netxs/desktopio/terminal.hpp +++ b/src/netxs/desktopio/terminal.hpp @@ -10227,7 +10227,7 @@ namespace netxs::ui case keybd::type::deadkey: deadkey_preview = gear.keystat == input::key::pressed ? gear.cluster : ""; if (io_log) log("%%Deadkey preview: ", prompt::key, ansi::hi(deadkey_preview.size() ? deadkey_preview : " ")); - [[fallthroght]] + [[fallthrough]] case keybd::type::keypress: if (defcfg.resetonkey && gear.doinput()) { From b5820a6a9c6b28053e79b4044283f60e53c88b0a Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 02:33:35 +0500 Subject: [PATCH 28/71] #943 WIP: Typo --- src/netxs/desktopio/terminal.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/netxs/desktopio/terminal.hpp b/src/netxs/desktopio/terminal.hpp index 0a58aee759..c1178aee3b 100644 --- a/src/netxs/desktopio/terminal.hpp +++ b/src/netxs/desktopio/terminal.hpp @@ -10227,7 +10227,7 @@ namespace netxs::ui case keybd::type::deadkey: deadkey_preview = gear.keystat == input::key::pressed ? gear.cluster : ""; if (io_log) log("%%Deadkey preview: ", prompt::key, ansi::hi(deadkey_preview.size() ? deadkey_preview : " ")); - [[fallthrough]] + [[fallthrough]]; case keybd::type::keypress: if (defcfg.resetonkey && gear.doinput()) { From 25350beae93f6bc48468c3c20939b8cb2b9e8811 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:47:07 +0500 Subject: [PATCH 29/71] #943 WIP: Drop input::key::config --- CMakeSettings.json | 2 +- src/netxs/desktopio/input.hpp | 179 ++++++++++++++++++++------------- src/netxs/desktopio/system.hpp | 20 ---- src/netxs/desktopio/utf.hpp | 23 +++-- 4 files changed, 124 insertions(+), 100 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index 2e7d8e3251..adb0d9618d 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -13,7 +13,7 @@ // /Od Disable all compiler optimizations. // /RTC1 Enable stack frame run-time checking (local variables uninitialized) and detects when smaller variables are assigned larger values and data is lost. // /W4 Set the compiler warning level to 4 (maximum standard level). - "WIN32_CXX_FLAGS_DEBUG": "/MTd /DDEBUG /Zi /Ob0 /Od /RTC1 /W4", + "WIN32_CXX_FLAGS_DEBUG": "/MTd /DDEBUG /Zi /Ob0 /Od /RTC1 /W4 /constexpr:steps 10000000", // /MT Static release build (don't rely on the shared dlls). // /DNDEBUG Define the preprocessor symbol NDEBUG to disable assertions. // /O2 Optimize speed (and code size). diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 2e1fdd94dd..fddab66163 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -268,9 +268,9 @@ namespace netxs::input // 7 bit Layout Index | 8 bit Base Scancode // (0 - 93) | (0 - 255) // Extended Bit (0 or 1) - auto key_hash(si32 scan, si32 klid) + auto key_hash(si32 klid, si32 scan, bool extflag) { - auto hash = (ui16)((scan & 0xFF) | ((!!(scan & ExtendedKey)) << 8) | (input::key::supported_klids[input::key::klid_hash(klid)].index << 9)); + auto hash = (ui16)((scan & 0xFF) | ((si32)extflag << 8) | (input::key::supported_klids[input::key::klid_hash(klid)].index << 9)); return hash; } @@ -280,19 +280,19 @@ namespace netxs::input #define key_list \ /* ID Input Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */\ X(0 , 1, undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(1 , 0, config , "config" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(1 , 0, invalid , "invalid" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(2 , 0, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001da2281da2081da2261da2121da20c1da21e1da21c1da2061da2241da2041da20a1da2101da2161da2201da2181da20e1da22a1da21a1da2221da2141da27a1da22c1da22e1da2021da2301da2321da2341da23a1da23c1da2381da2361da29c1da2401da23e1da24c1da2421da24e1da24a1da2461da2541da2441da25c1da25a1da2681da2621da2661da2481da2721da26c1da2501da29e1da2761da2a01da2521da2581da2561da26e1da2601da26a1da2701da2741da25e1da2641da2a21da2781da28c1da28e1da2821da2a41da2861da28a1da2981da29a1da2901da27e1da2941da2881da2841da27c1da2921da2801da2961da2aa1da2a81da2a61da2ae1da2b01da2ac1da2b41da2b21da2b61da2b81da2ba1da2")\ - X( 3 , 0, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "001da3281da3081da3261da3121da30c1da31e1da31c1da3061da3241da3041da30a1da3101da3161da3201da3181da30e1da32a1da31a1da3221da3141da37a1da32c1da32e1da3021d19301da3321da3341da33a1da33c1da3381da3361da39c1da3401da33e1da34c1da3421da34e1da34a1da3461da3541da3441ddf5c1da35a1da3681da3621da3661da3481da3721da36c1da3501da39e1da3761da3a01da3521da3581da3561da36e1da3601da36a1da3701da3741da35e1da3641da3a21da3781da38c1da38e1da3821da3a41da3861da38a1da3981da39a1da3901da37e1da3941da3881da3841da37c1da3921da3801da3961da3aa1da3a81da3a61da3ae1da3b01da3ac1da3b41da3b21da3b61da3b81da3ba1da3")\ + X( 3 , 0, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011da3291da3091da3271da3131da30d1da31f1da31d1da3071da3251da3051da30b1da3111da3171da3211da3191da30f1da32b1da31b1da3231da3151da37b1da32d1da32f1da3031d19311da3331da3351da33b1da33d1da3391da3371da39d1da3411da33f1da34d1da3431da34f1da34b1da3471da3551da3451ddf5d1da35b1da3691da3631da3671da3491da3731da36d1da3511da39f1da3771da3a11da3531da3591da3571da36f1da3611da36b1da3711da3751da35f1da3651da3a31da3791da38d1da38f1da3831da3a51da3871da38b1da3991da39b1da3911da37f1da3951da3891da3851da37d1da3931da3811da3971da3ab1da3a91da3a71da3af1da3b11da3ad1da3b51da3b31da3b71da3b91da3bb1da3")\ X(4 , 0, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038a42838a40838a42638a41238a40c38a41e38a41c38a40638a42438a40438a40a38a41038a41638a42038a41838a40e38a42a38a41a38a42238a41438a47a38a42c38a42e38a40238a43038a43238a43438a43a38a43c38a43838a43638a49c38a44038a43e38a44c38a44238a44e38a44a38a44638a45438a44438a45c38a45a38a46838a46238a46638a44838a47238a46c38a45038a49e38a47638a4a038a45238a45838a45638a46e38a46038a46a38a47038a47438a45e38a46438a4a238a47838a48c38a48e38a48238a4a438a48638a48a38a49838a49a38a49038a47e38a49438a48838a48438a47c38a49238a48038a49638a4aa38a4a838a4a638a4ae38a4b038a4ac38a4b438a4b238a4b638a4b838a4ba38a4")\ - X( 5 , 0, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0038a52838a50838a52638a51238a50c38a51e38a51c38a50638a52438a50438a50a38a51038a51638a52038a51838a50e38a52a38a51a38a52238a51438a57a38a52c38a52e38a50238153038a53238a53438a53a38a53c38a53838a53638a59c38a54038a53e38a54c38a54238a54e38a54a38a54638a55438a54438a55c38a55a38a56838a56238a56638a54838a57238a56c38a55038a59e38a57638a5a038a55238a55838a55638a56e38a56038a56a38a57038a57438a55e38a56438a5a238a57838a58c38a58e38a58238a5a438a58638a58a38a59838a59a38a59038a57e38a59438a58838a58438a57c38a59238a58038a59638a5aa38a5a838a5a638a5ae38a5b038a5ac38a5b438a5b238a5b638a5b838a5ba38a5")\ + X( 5 , 0, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138a52938a50938a52738a51338a50d38a51f38a51d38a50738a52538a50538a50b38a51138a51738a52138a51938a50f38a52b38a51b38a52338a51538a57b38a52d38a52f38a50338153138a53338a53538a53b38a53d38a53938a53738a59d38a54138a53f38a54d38a54338a54f38a54b38a54738a55538a54538a55d38a55b38a56938a56338a56738a54938a57338a56d38a55138a59f38a57738a5a138a55338a55938a55738a56f38a56138a56b38a57138a57538a55f38a56538a5a338a57938a58d38a58f38a58338a5a538a58738a58b38a59938a59b38a59138a57f38a59538a58938a58538a57d38a59338a58138a59738a5ab38a5a938a5a738a5af38a5b138a5ad38a5b538a5b338a5b738a5b938a5bb38a5")\ X(6 , 0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002aa0282aa0082aa0262aa0122aa00c2aa01e2aa01c2aa0062aa0242aa0042aa00a2aa0102aa0162aa0202aa0182aa00e2aa02a2aa01a2aa0222aa0142aa07a2aa02c2aa02e2aa0022aa0302aa0322aa0342aa03a2aa03c2aa0382aa0362aa09c2aa0402aa03e2aa04c2aa0422aa04e2aa04a2aa0462aa0542aa0442aa05c2aa05a2aa0682aa0622aa0662aa0482aa0722aa06c2aa0502aa09e2aa0762aa0a02aa0522aa0582aa0562aa06e2aa0602aa06a2aa0702aa0742aa05e2aa0642aa0a22aa0782aa08c2aa08e2aa0822aa0a42aa0862aa08a2aa0982aa09a2aa0902aa07e2aa0942aa0882aa0842aa07c2aa0922aa0802aa0962aa0aa2aa0a82aa0a62aa0ae2aa0b02aa0ac2aa0b42aa0b22aa0b62aa0b82aa0ba2aa0")\ X( 7 , 0, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036a12836a10836a12636a11236a10c36a11e36a11c36a10636a12436a10436a10a36a11036a11636a12036a11836a10e36a12a36a11a36a12236a11436a17a36a12c36a12e36a10236a13036a13236a13436a13a36a13c36a13836a13636a19c36a14036a13e36a14c36a14236a14e36a14a36a14636a15436a14436a15c36a15a36a16836a16236a16636a14836a17236a16c36a15036a19e36a17636a1a036a15236a15836a15636a16e36a16036a16a36a17036a17436a15e36a16436a1a236a17836a18c36a18e36a18236a1a436a18636a18a36a19836a19a36a19036a17e36a19436a18836a18436a17c36a19236a18036a19636a1aa36a1a836a1a636a1ae36a1b036a1ac36a1b436a1b236a1b636a1b836a1ba36a1")\ - X(8 , 0, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "005b5b285b5b085b5b265b5b125b5b0c5b5b1e5b5b1c5b5b065b5b245b5b045b5b0a5b5b105b5b165b5b205b5b185b5b0e5b5b2a5b5b1a5b5b225b5b145b5b7a5b5b2c5b5b2e5b5b025b5b305b5b325b5b345b5b3a5b5b3c5b5b385b5b365b5b9c5b5b405b5b3e5b5b4c5b5b425b5b4e5b5b4a5b5b465b5b545b5b445b5b5c5b5b5a5b5b685b5b625b5b665b5b725b5b6c5b5b505b5b9e5b5b765b5ba05b5b525b5b585b5b565b5b6e5b5b605b5b6a5b5b705b5b745b5b5e5b5b645b5ba25b5b785b5b8c5b5b8e5b5b825b5ba45b5b865b5b8a5b5b985b5b9a5b5b905b5b7e5b5b945b5b885b5b845b5baa5b5ba85b5ba65b5bae5b5bb05b5bac5b5bb45b5bb25b5bb65b5bb85b5bba5b5b")\ - X( 9 , 0, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "005c5c285c5c085c5c265c5c125c5c0c5c5c1e5c5c1c5c5c065c5c245c5c045c5c0a5c5c105c5c165c5c205c5c185c5c0e5c5c2a5c5c1a5c5c225c5c145c5c7a5c5c2c5c5c2e5c5c025c5c305c5c325c5c345c5c3a5c5c3c5c5c385c5c365c5c9c5c5c405c5c3e5c5c4c5c5c425c5c4e5c5c4a5c5c465c5c545c5c445c5c5c5c5c5a5c5c685c5c625c5c665c5c485c5c725c5c6c5c5c505c5c9e5c5c765c5ca05c5c525c5c585c5c565c5c6e5c5c605c5c6a5c5c705c5c745c5c5e5c5c645c5ca25c5c785c5c8c5c5c8e5c5c825c5ca45c5c865c5c8a5c5c985c5c9a5c5c905c5c7e5c5c945c5c885c5c845c5c7c5c5c925c5c805c5c965c5caa5c5ca85c5ca65c5cae5c5cb05c5cac5c5cb45c5cb25c5cb65c5cb85c5cba5c5c")\ + X(8 , 0, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "015b5b295b5b095b5b275b5b135b5b0d5b5b1f5b5b1d5b5b075b5b255b5b055b5b0b5b5b115b5b175b5b215b5b195b5b0f5b5b2b5b5b1b5b5b235b5b155b5b7b5b5b2d5b5b2f5b5b035b5b315b5b335b5b355b5b3b5b5b3d5b5b395b5b375b5b9d5b5b415b5b3f5b5b4d5b5b435b5b4f5b5b4b5b5b475b5b555b5b455b5b5d5b5b5b5b5b695b5b635b5b675b5b735b5b6d5b5b515b5b9f5b5b775b5ba15b5b535b5b595b5b575b5b6f5b5b615b5b6b5b5b715b5b755b5b5f5b5b655b5ba35b5b795b5b8d5b5b8f5b5b835b5ba55b5b875b5b8b5b5b995b5b9b5b5b915b5b7f5b5b955b5b895b5b855b5bab5b5ba95b5ba75b5baf5b5bb15b5bad5b5bb55b5bb35b5bb75b5bb95b5bbb5b5b")\ + X( 9 , 0, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "015c5c295c5c095c5c275c5c135c5c0d5c5c1f5c5c1d5c5c075c5c255c5c055c5c0b5c5c115c5c175c5c215c5c195c5c0f5c5c2b5c5c1b5c5c235c5c155c5c7b5c5c2d5c5c2f5c5c035c5c315c5c335c5c355c5c3b5c5c3d5c5c395c5c375c5c9d5c5c415c5c3f5c5c4d5c5c435c5c4f5c5c4b5c5c475c5c555c5c455c5c5d5c5c5b5c5c695c5c635c5c675c5c495c5c735c5c6d5c5c515c5c9f5c5c775c5ca15c5c535c5c595c5c575c5c6f5c5c615c5c6b5c5c715c5c755c5c5f5c5c655c5ca35c5c795c5c8d5c5c8f5c5c835c5ca55c5c875c5c8b5c5c995c5c9b5c5c915c5c7f5c5c955c5c895c5c855c5c7d5c5c935c5c815c5c975c5cab5c5ca95c5ca75c5caf5c5cb15c5cad5c5cb55c5cb35c5cb75c5cb95c5cbb5c5c")\ X(10 , 0, LeftHyper , "Hyper" , "" , 0 , 57445, 'u', -1 , -1 , "")\ X( 11 , 0, RightHyper , "Hyper" , "" , 0 , 57451, 'u', -1 , -1 , "")\ X(12 , 0, AltGR , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ - X(14 , 0, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0045902845900845902645901245900c45901e45901c45900645902445900445900a45901045901645902045901845900e45902a45901a45902245901445907a45902c45902e45900245903045903245903445903a45903c45903845903645909c45904045903e45904c45904245904e45904a45904645905445904445905c45905a45906845906245906645904845907245906c45905045909e4590764590a045905245905845905645906e45906045906a45907045907445905e4590644590a245907845908c45908e4590824590a445908645908a45909845909a45909045907e45909445908845908445907c4590924590804590964590aa4590a84590a64590ae4590b04590ac4590b44590b24590b64590b84590ba4590")\ + X(14 , 0, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0145902945900945902745901345900d45901f45901d45900745902545900545900b45901145901745902145901945900f45902b45901b45902345901545907b45902d45902f45900345903145903345903545903b45903d45903945903745909d45904145903f45904d45904345904f45904b45904745905545904545905d45905b45906945906345906745904945907345906d45905145909f4590774590a145905345905945905745906f45906145906b45907145907545905f4590654590a345907945908d45908f4590834590a545908745908b45909945909b45909145907f45909545908945908545907d4590934590814590974590ab4590a94590a74590af4590b14590ad4590b54590b34590b74590b94590bb4590")\ X(16 , 0, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14283a14083a14263a14123a140c3a141e3a141c3a14063a14243a14043a140a3a14103a14163a14203a14183a140e3a142a3a141a3a14223a14143a147a3a142c3a142e3a14023a14303a14323a14343a143a3a143c3a14383a14363a149c3a14403a143e3a144c3a14423a144e3a144a3a14463a14543a14443a145c3a145a3a14683a14623a14663a14483a14723a146c3a14503a149e3a14763a14a03a14523a14583a14563a146e3a14603a146a3a14703a14743a145e3a14643a14a23a14783a148c3a148e3a14823a14a43a14863a148a3a14983a149a3a14903a147e3a14943a14883a14843a147c3a14923a14803a14963a14aa3a14a83a14a63a14ae3a14b03a14ac3a14b43a14b23a14b63a14b83a14ba3a14")\ X(18 , 0, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046912846910846912646911246910c46911e46911c46910646912446910446910a46911046911646912046911846910e46912a46911a46912246911446917a46912c46912e46910246913046913246913446913a46913c46913846913646919c46914046913e46914c46914246914e46914a46914646915446914446915c46915a46916846916246916646914846917246916c46915046919e4691764691a046915246915846915646916e46916046916a46917046917446915e4691644691a246917846918c46918e4691824691a446918646918a46919846919a46919046917e46919446918846918446917c4691924691804691964691aa4691a84691a64691ae4691b04691ac4691b44691b24691b64691b84691ba4691")\ X(20 , 0, Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0670f2")\ @@ -301,7 +301,7 @@ namespace netxs::input X(26 , 0, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "02f119")\ X(28 , 0, Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "02f215")\ X(30 , 0, IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "")\ - X(32 , 0, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "005d5d285d5d085d5d265d5d125d5d0c5d5d1e5d5d1c5d5d065d5d245d5d045d5d0a5d5d105d5d165d5d205d5d185d5d0e5d5d2a5d5d1a5d5d225d5d145d5d7a5d5d2c5d5d2e5d5d025d5d305d5d325d5d345d5d3a5d5d3c5d5d385d5d365d5d9c5d5d405d5d3e5d5d4c5d5d425d5d4e5d5d4a5d5d465d5d545d5d445d5d5c5d5d5a5d5d685d5d625d5d665d5d725d5d6c5d5d505d5d9e5d5d765d5da05d5d525d5d585d5d565d5d6e5d5d605d5d6a5d5d705d5d745d5d5e5d5d645d5da25d5d785d5d8c5d5d8e5d5d825d5da45d5d865d5d8a5d5d985d5d9a5d5d905d5d7e5d5d945d5d885d5d845d5daa5d5da85d5da65d5dae5d5db05d5dac5d5db45d5db25d5db65d5db85d5dba5d5d")\ + X(32 , 0, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "015d5d295d5d095d5d275d5d135d5d0d5d5d1f5d5d1d5d5d075d5d255d5d055d5d0b5d5d115d5d175d5d215d5d195d5d0f5d5d2b5d5d1b5d5d235d5d155d5d7b5d5d2d5d5d2f5d5d035d5d315d5d335d5d355d5d3b5d5d3d5d5d395d5d375d5d9d5d5d415d5d3f5d5d4d5d5d435d5d4f5d5d4b5d5d475d5d555d5d455d5d5d5d5d5b5d5d695d5d635d5d675d5d735d5d6d5d5d515d5d9f5d5d775d5da15d5d535d5d595d5d575d5d6f5d5d615d5d6b5d5d715d5d755d5d5f5d5d655d5da35d5d795d5d8d5d5d8f5d5d835d5da55d5d875d5d8b5d5d995d5d9b5d5d915d5d7f5d5d955d5d895d5d855d5dab5d5da95d5da75d5daf5d5db15d5dad5d5db55d5db35d5db75d5db95d5dbb5d5d")\ X(34 , 0, Select , "Select" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(36 , 0, Fn , "Fn" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(38 , 0, F1 , "F1" , "" , 0 , 11 , '~', -1 , -1 , "003b70283b70083b70263b70123b700c3b701e3b701c3b70063b70243b70043b700a3b70103b70163b70203b70183b700e3b702a3b701a3b70223b70143b707a3b702c3b702e3b70023b70303b70323b70343b703a3b703c3b70383b70363b709c3b70403b703e3b704c3b70423b704e3b704a3b70463b70543b70443b705c3b705a3b70683b70623b70663b70483b70723b706c3b70503b709e3b70763b70a03b70523b70583b70563b706e3b70603b706a3b70703b70743b705e3b70643b70a23b70783b708c3b708e3b70823b70a43b70863b708a3b70983b709a3b70903b707e3b70943b70883b70843b707c3b70923b70803b70963b70aa3b70a83b70a63b70ae3b70b03b70ac3b70b43b70b23b70b63b70b83b70ba3b70")\ @@ -339,37 +339,37 @@ namespace netxs::input X(102 , 0, F33 , "F33" , "" , 0 , 57396, 'u', -1 , -1 , "")\ X(104 , 0, F34 , "F34" , "" , 0 , 57397, 'u', -1 , -1 , "")\ X(106 , 0, F35 , "F35" , "" , 0 , 57398, 'u', -1 , -1 , "")\ - X(108 , 0, PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "00372c28372c08372c26372c12372c0c372c1e372c1c372c06372c24372c04372c0a372c10372c16372c20372c18372c0e372c2a372c1a372c22372c14372c7a372c2c372c2e372c02372c30372c32372c34372c3a372c3c372c38372c36372c9c372c40372c3e372c4c372c42372c4e372c4a372c46372c54372c44372c5c372c5a372c68372c62372c66372c48372c72372c6c372c50372c9e372c76372ca0372c52372c58372c56372c6e372c60372c6a372c70372c74372c5e372c64372ca2372c78372c8c372c8e372c82372ca4372c86372c8a372c98372c9a372c90372c7e372c94372c88372c84372c7c372c92372c80372c96372caa372ca8372ca6372cae372cb0372cac372cb4372cb2372cb6372cb8372cba372c")\ + X(108 , 0, PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "01372c29372c09372c27372c13372c0d372c1f372c1d372c07372c25372c05372c0b372c11372c17372c21372c19372c0f372c2b372c1b372c23372c15372c7b372c2d372c2f372c03372c31372c33372c35372c3b372c3d372c39372c37372c9d372c41372c3f372c4d372c43372c4f372c4b372c47372c55372c45372c5d372c5b372c69372c63372c67372c49372c73372c6d372c51372c9f372c77372ca1372c53372c59372c57372c6f372c61372c6b372c71372c75372c5f372c65372ca3372c79372c8d372c8f372c83372ca5372c87372c8b372c99372c9b372c91372c7f372c95372c89372c85372c7d372c93372c81372c97372cab372ca9372ca7372caf372cb1372cad372cb5372cb3372cb7372cb9372cbb372c")\ X(110 , 0, Pause , "Pause" , "" , 0 , 57362, 'u', '\x1a', '\x03', "0045902845900845902645901245900c45901e45901c45900645902445900445900a45901045901645902045901845900e45902a45901a45902245901445907a45902c45902e45900245903045903245903445903a45903c45903845903645909c45904045903e45904c45904245904e45904a45904645905445904445905c45905a45906845906245906645904845907245906c45905045909e4590764590a045905245905845905645906e45906045906a45907045907445905e4590644590a245907845908c45908e4590824590a445908645908a45909845909a45909045907e45909445908845908445907c4590924590804590964590aa4590a84590a64590ae4590b04590ac4590b44590b24590b64590b84590ba4590")\ - X(112 , 1, Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0046032846030846032646031246030c46031e46031c46030646032446030446030a46031046031646032046031846030e46032a46031a46032246031446037a46032c46032e46030246033046033246033446033a46033c46033846033646039c46034046033e46034c46034246034e46034a46034646035446034446035c46035a46036846036246036646034846037246036c46035046039e4603764603a046035246035846035646036e46036046036a46037046037446035e4603644603a246037846038c46038e4603824603a446038646038a46039846039a46039046037e46039446038846038446037c4603924603804603964603aa4603a84603a64603ae4603b04603ac4603b44603b24603b64603b84603ba4603")\ + X(112 , 1, Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0146032946030946032746031346030d46031f46031d46030746032546030546030b46031146031746032146031946030f46032b46031b46032346031546037b46032d46032f46030346033146033346033546033b46033d46033946033746039d46034146033f46034d46034346034f46034b46034746035546034546035d46035b46036946036346036746034946037346036d46035146039f4603774603a146035346035946035746036f46036146036b46037146037546035f4603654603a346037946038d46038f4603834603a546038746038b46039946039b46039146037f46039546038946038546037d4603934603814603974603ab4603a94603a74603af4603b14603ad4603b54603b34603b74603b94603bb4603")\ X(114 , 1, SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c28542c08542c26542c12542c0c542c1e542c1c542c06542c24542c04542c0a542c10542c16542c20542c18542c0e542c2a542c1a542c22542c7a542c2c542c2e542c02542c30542c32542c34542c3a542c40542c3e542c4c542c4e542c4a542c54542c5c542c5a542c68542c62542c66542c48542c72542c6c542c9e542c76542ca0542ca2542c8c542c8e542c82542ca4542c86542c8a542c98542c9a542c7c542c92542c80542c96542caa542ca8542cb4542cb6542cb8542cba542c")\ X(116 , 1, Esc , "Esc" , "\x1B", 0x1b , 27 , 'u', '\x1b', '\x1b', "00011b28011b08011b26011b12011b0c011b1e011b1c011b06011b24011b04011b0a011b10011b16011b20011b18011b0e011b2a011b1a011b22011b14011b7a011b2c011b2e011b02011b30011b32011b34011b3a011b3c011b38011b36011b9c011b40011b3e011b4c011b42011b4e011b4a011b46011b54011b44011b5c011b5a011b68011b62011b66011b48011b72011b6c011b50011b9e011b76011ba0011b52011b58011b56011b6e011b60011b6a011b70011b74011b5e011b64011ba2011b78011b8c011b8e011b82011ba4011b86011b8a011b98011b9a011b90011b7e011b94011b88011b84011b7c011b92011b80011b96011baa011ba8011ba6011bae011bb0011bac011bb4011bb2011bb6011bb8011bba011b")\ X(118 , 1, Tab , "Tab" , "\x09", 0x09 , 9 , 'u', '\x09', '\x09', "000f09280f09080f09260f09120f090c0f091e0f091c0f09060f09240f09040f090a0f09100f09160f09200f09180f090e0f092a0f091a0f09220f09140f097a0f092c0f092e0f09020f09300f09320f09340f093a0f093c0f09380f09360f099c0f09400f093e0f094c0f09420f094e0f094a0f09460f09540f09440f095c0f095a0f09680f09620f09660f09480f09720f096c0f09500f099e0f09760f09a00f09520f09580f09560f096e0f09600f096a0f09700f09740f095e0f09640f09a20f09780f098c0f098e0f09820f09a40f09860f098a0f09980f099a0f09900f097e0f09940f09880f09840f097c0f09920f09800f09960f09aa0f09a80f09a60f09ae0f09b00f09ac0f09b40f09b20f09b60f09b80f09ba0f09")\ X(120 , 1, Backspace , "Backspace" , "\x08", 0x08 , 127 , 'u', '\x7f', '\x08', "000e08280e08080e08260e08120e080c0e081e0e081c0e08060e08240e08040e080a0e08100e08160e08200e08180e080e0e082a0e081a0e08220e08140e087a0e082c0e082e0e08020e08300e08320e08340e083a0e083c0e08380e08360e089c0e08400e083e0e084c0e08420e084e0e084a0e08460e08540e08440e085c0e085a0e08680e08620e08660e08480e08720e086c0e08500e089e0e08760e08a00e08520e08580e08560e086e0e08600e086a0e08700e08740e085e0e08640e08a20e08780e088c0e088e0e08820e08a40e08860e088a0e08980e089a0e08900e087e0e08940e08880e08840e087c0e08920e08800e08960e08aa0e08a80e08a60e08ae0e08b00e08ac0e08b40e08b20e08b60e08b80e08ba0e08")\ X(122 , 1, Space , "Space" , "\x20", 0x20 , 32 , 'u', '\x20', '\0' , "0039202839200839202639201239200c39201e39201c39200639202439200439200a39201039201639202039201839200e39202a39201a39202239201439207a39202c39202e39200239203039203239203439203a39203c39203839203639209c39204039203e39204c39204239204e39204a39204639205439204439205c39205a39206839206239206639204839207239206c39205039209e3920763920a039205239205839205639206e39206039206a39207039207439205e3920643920a239207839208c39208e3920823920a439208639208a39209839209a39209039207e39209439208839208439207c3920923920803920963920aa3920a83920a63920ae3920b03920ac3920b43920b23920b63920b83920ba3920")\ X(124 , 1, KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d281c0d081c0d261c0d121c0d0c1c0d1e1c0d1c1c0d061c0d241c0d041c0d0a1c0d101c0d161c0d201c0d181c0d0e1c0d2a1c0d1a1c0d221c0d141c0d7a1c0d2c1c0d2e1c0d021c0d301c0d321c0d341c0d3a1c0d3c1c0d381c0d361c0d9c1c0d401c0d3e1c0d4c1c0d421c0d4e1c0d4a1c0d461c0d541c0d441c0d5c1c0d5a1c0d681c0d621c0d661c0d481c0d721c0d6c1c0d501c0d9e1c0d761c0da01c0d521c0d581c0d561c0d6e1c0d601c0d6a1c0d701c0d741c0d5e1c0d641c0da21c0d781c0d8c1c0d8e1c0d821c0da41c0d861c0d8a1c0d981c0d9a1c0d901c0d7e1c0d941c0d881c0d841c0d7c1c0d921c0d801c0d961c0daa1c0da81c0da61c0dae1c0db01c0dac1c0db41c0db21c0db61c0db81c0dba1c0d")\ - X( 125, 1, NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "001c0d281c0d081c0d261c0d121c0d0c1c0d1e1c0d1c1c0d061c0d241c0d041c0d0a1c0d101c0d161c0d201c0d181c0d0e1c0d2a1c0d1a1c0d221c0d141c0d7a1c0d2c1c0d2e1c0d021c0d301c0d321c0d341c0d3a1c0d3c1c0d381c0d361c0d9c1c0d401c0d3e1c0d4c1c0d421c0d4e1c0d4a1c0d461c0d541c0d441c0d5c1c0d5a1c0d681c0d621c0d661c0d481c0d721c0d6c1c0d501c0d9e1c0d761c0da01c0d521c0d581c0d561c0d6e1c0d601c0d6a1c0d701c0d741c0d5e1c0d641c0da21c0d781c0d8c1c0d8e1c0d821c0da41c0d861c0d8a1c0d981c0d9a1c0d901c0d7e1c0d941c0d881c0d841c0d7c1c0d921c0d801c0d961c0daa1c0da81c0da61c0dae1c0db01c0dac1c0db41c0db21c0db61c0db81c0dba1c0d")\ - X(126 , 1, KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "00522d28522d08522d26522d12522d0c522d1e522d1c522d06522d24522d04522d0a522d10522d16522d20522d18522d0e522d2a522d1a522d22522d14522d7a522d2c522d2e522d02522d30522d32522d34522d3a522d3c522d38522d36522d9c522d40522d3e522d4c522d42522d4e522d4a522d46522d54522d44522d5c522d5a522d68522d62522d66522d48522d72522d6c522d50522d9e522d76522da0522d52522d58522d56522d6e522d60522d6a522d70522d74522d5e522d64522da2522d78522d8c522d8e522d82522da4522d86522d8a522d98522d9a522d90522d7e522d94522d88522d84522d7c522d92522d80522d96522daa522da8522da6522dae522db0522dac522db4522db2522db6522db8522dba522d")\ + X( 125, 1, NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "011c0d291c0d091c0d271c0d131c0d0d1c0d1f1c0d1d1c0d071c0d251c0d051c0d0b1c0d111c0d171c0d211c0d191c0d0f1c0d2b1c0d1b1c0d231c0d151c0d7b1c0d2d1c0d2f1c0d031c0d311c0d331c0d351c0d3b1c0d3d1c0d391c0d371c0d9d1c0d411c0d3f1c0d4d1c0d431c0d4f1c0d4b1c0d471c0d551c0d451c0d5d1c0d5b1c0d691c0d631c0d671c0d491c0d731c0d6d1c0d511c0d9f1c0d771c0da11c0d531c0d591c0d571c0d6f1c0d611c0d6b1c0d711c0d751c0d5f1c0d651c0da31c0d791c0d8d1c0d8f1c0d831c0da51c0d871c0d8b1c0d991c0d9b1c0d911c0d7f1c0d951c0d891c0d851c0d7d1c0d931c0d811c0d971c0dab1c0da91c0da71c0daf1c0db11c0dad1c0db51c0db31c0db71c0db91c0dbb1c0d")\ + X(126 , 1, KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "01522d29522d09522d27522d13522d0d522d1f522d1d522d07522d25522d05522d0b522d11522d17522d21522d19522d0f522d2b522d1b522d23522d15522d7b522d2d522d2f522d03522d31522d33522d35522d3b522d3d522d39522d37522d9d522d41522d3f522d4d522d43522d4f522d4b522d47522d55522d45522d5d522d5b522d69522d63522d67522d49522d73522d6d522d51522d9f522d77522da1522d53522d59522d57522d6f522d61522d6b522d71522d75522d5f522d65522da3522d79522d8d522d8f522d83522da5522d87522d8b522d99522d9b522d91522d7f522d95522d89522d85522d7d522d93522d81522d97522dab522da9522da7522daf522db1522dad522db5522db3522db7522db9522dbb522d")\ X( 127, 1, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00522d28522d08522d26522d12522d0c522d1e522d1c522d06522d24522d04522d0a522d10522d16522d20522d18522d0e522d2a522d1a522d22522d14522d7a522d2c522d2e522d02522d30522d32522d34522d3a522d3c522d38522d36522d9c522d40522d3e522d4c522d42522d4e522d4a522d46522d54522d44522d5c522d5a522d68522d62522d66522d48522d72522d6c522d50522d9e522d76522da0522d52522d58522d56522d6e522d60522d6a522d70522d74522d5e522d64522da2522d78522d8c522d8e522d82522da4522d86522d8a522d98522d9a522d90522d7e522d94522d88522d84522d7c522d92522d80522d96522daa522da8522da6522dae522db0522dac522db4522db2522db6522db8522dba522d")\ - X(128 , 1, KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "00532e28532e08532e26532e12532e0c532e1e532e1c532e06532e24532e04532e0a532e10532e16532e20532e18532e0e532e2a532e1a532e22532e14532e7a532e2c532e2e532e02532e30532e32532e34532e3a532e3c532e38532e36532e9c532e40532e3e532e4c532e42532e4e532e4a532e46532e54532e44532e5c532e5a532e68532e62532e66532e48532e72532e6c532e50532e9e532e76532ea0532e52532e58532e56532e6e532e60532e6a532e70532e74532e5e532e64532ea2532e78532e8c532e8e532e82532ea4532e86532e8a532e98532e9a532e90532e7e532e94532e88532e84532e7c532e92532e80532e96532eaa532ea8532ea6532eae532eb0532eac532eb4532eb2532eb6532eb8532eba532e")\ + X(128 , 1, KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "01532e29532e09532e27532e13532e0d532e1f532e1d532e07532e25532e05532e0b532e11532e17532e21532e19532e0f532e2b532e1b532e23532e15532e7b532e2d532e2f532e03532e31532e33532e35532e3b532e3d532e39532e37532e9d532e41532e3f532e4d532e43532e4f532e4b532e47532e55532e45532e5d532e5b532e69532e63532e67532e49532e73532e6d532e51532e9f532e77532ea1532e53532e59532e57532e6f532e61532e6b532e71532e75532e5f532e65532ea3532e79532e8d532e8f532e83532ea5532e87532e8b532e99532e9b532e91532e7f532e95532e89532e85532e7d532e93532e81532e97532eab532ea9532ea7532eaf532eb1532ead532eb5532eb3532eb7532eb9532ebb532e")\ X( 129, 1, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00532e28532e08532e26532e12532e0c532e1e532e1c532e06532e24532e04532e0a532e10532e16532e20532e18532e0e532e2a532e1a532e22532e14532e7a532e2c532e2e532e02532e30532e32532e34532e3a532e3c532e38532e36532e9c532e40532e3e532e4c532e42532e4e532e4a532e46532e54532e44532e5c532e5a532e68532e62532e66532e48532e72532e6c532e50532e9e532e76532ea0532e52532e58532e56532e6e532e60532e6a532e70532e74532e5e532e64532ea2532e78532e8c532e8e532e82532ea4532e86532e8a532e98532e9a532e90532e7e532e94532e88532e84532e7c532e92532e80532e96532eaa532ea8532ea6532eae532eb0532eac532eb4532eb2532eb6532eb8532eba532e")\ X(130 , 1, KeyClear , "Clear" , "" , 0 , 1 , 'E', -1 , -1 , "")\ X( 131, 1, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "004c0c284c0c084c0c264c0c124c0c0c4c0c1e4c0c1c4c0c064c0c244c0c044c0c0a4c0c104c0c164c0c204c0c184c0c0e4c0c2a4c0c1a4c0c224c0c144c0c7a4c0c2c4c0c2e4c0c024c0c304c0c324c0c344c0c3a4c0c3c4c0c384c0c364c0c9c4c0c404c0c3e4c0c4c4c0c424c0c4e4c0c4a4c0c464c0c544c0c444c0c5c4c0c5a4c0c684c0c624c0c664c0c484c0c724c0c6c4c0c504c0c9e4c0c764c0ca04c0c524c0c584c0c564c0c6e4c0c604c0c6a4c0c704c0c744c0c5e4c0c644c0ca24c0c784c0c8c4c0c8e4c0c824c0ca44c0c864c0c8a4c0c984c0c9a4c0c904c0c7e4c0c944c0c884c0c844c0c7c4c0c924c0c804c0c964c0caa4c0ca84c0ca64c0cae4c0cb04c0cac4c0cb44c0cb24c0cb64c0cb84c0cba4c0c")\ - X(132 , 1, KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0049212849210849212649211249210c49211e49211c49210649212449210449210a49211049211649212049211849210e49212a49211a49212249211449217a49212c49212e49210249213049213249213449213a49213c49213849213649219c49214049213e49214c49214249214e49214a49214649215449214449215c49215a49216849216249216649214849217249216c49215049219e4921764921a049215249215849215649216e49216049216a49217049217449215e4921644921a249217849218c49218e4921824921a449218649218a49219849219a49219049217e49219449218849218449217c4921924921804921964921aa4921a84921a64921ae4921b04921ac4921b44921b24921b64921b84921ba4921")\ + X(132 , 1, KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0149212949210949212749211349210d49211f49211d49210749212549210549210b49211149211749212149211949210f49212b49211b49212349211549217b49212d49212f49210349213149213349213549213b49213d49213949213749219d49214149213f49214d49214349214f49214b49214749215549214549215d49215b49216949216349216749214949217349216d49215149219f4921774921a149215349215949215749216f49216149216b49217149217549215f4921654921a349217949218d49218f4921834921a549218749218b49219949219b49219149217f49219549218949218549217d4921934921814921974921ab4921a94921a74921af4921b14921ad4921b54921b34921b74921b94921bb4921")\ X( 133, 1, NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0049212849210849212649211249210c49211e49211c49210649212449210449210a49211049211649212049211849210e49212a49211a49212249211449217a49212c49212e49210249213049213249213449213a49213c49213849213649219c49214049213e49214c49214249214e49214a49214649215449214449215c49215a49216849216249216649214849217249216c49215049219e4921764921a049215249215849215649216e49216049216a49217049217449215e4921644921a249217849218c49218e4921824921a449218649218a49219849219a49219049217e49219449218849218449217c4921924921804921964921aa4921a84921a64921ae4921b04921ac4921b44921b24921b64921b84921ba4921")\ - X(134 , 1, KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0051222851220851222651221251220c51221e51221c51220651222451220451220a51221051221651222051221851220e51222a51221a51222251221451227a51222c51222e51220251223051223251223451223a51223c51223851223651229c51224051223e51224c51224251224e51224a51224651225451224451225c51225a51226851226251226651224851227251226c51225051229e5122765122a051225251225851225651226e51226051226a51227051227451225e5122645122a251227851228c51228e5122825122a451228651228a51229851229a51229051227e51229451228851228451227c5122925122805122965122aa5122a85122a65122ae5122b05122ac5122b45122b25122b65122b85122ba5122")\ + X(134 , 1, KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0151222951220951222751221351220d51221f51221d51220751222551220551220b51221151221751222151221951220f51222b51221b51222351221551227b51222d51222f51220351223151223351223551223b51223d51223951223751229d51224151223f51224d51224351224f51224b51224751225551224551225d51225b51226951226351226751224951227351226d51225151229f5122775122a151225351225951225751226f51226151226b51227151227551225f5122655122a351227951228d51228f5122835122a551228751228b51229951229b51229151227f51229551228951228551227d5122935122815122975122ab5122a95122a75122af5122b15122ad5122b55122b35122b75122b95122bb5122")\ X( 135, 1, NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0051222851220851222651221251220c51221e51221c51220651222451220451220a51221051221651222051221851220e51222a51221a51222251221451227a51222c51222e51220251223051223251223451223a51223c51223851223651229c51224051223e51224c51224251224e51224a51224651225451224451225c51225a51226851226251226651224851227251226c51225051229e5122765122a051225251225851225651226e51226051226a51227051227451225e5122645122a251227851228c51228e5122825122a451228651228a51229851229a51229051227e51229451228851228451227c5122925122805122965122aa5122a85122a65122ae5122b05122ac5122b45122b25122b65122b85122ba5122")\ - X(136 , 1, KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0047242847240847242647241247240c47241e47241c47240647242447240447240a47241047241647242047241847240e47242a47241a47242247241447247a47242c47242e47240247243047243247243447243a47243c47243847243647249c47244047243e47244c47244247244e47244a47244647245447244447245c47245a47246847246247246647244847247247246c47245047249e4724764724a047245247245847245647246e47246047246a47247047247447245e4724644724a247247847248c47248e4724824724a447248647248a47249847249a47249047247e47249447248847248447247c4724924724804724964724aa4724a84724a64724ae4724b04724ac4724b44724b24724b64724b84724ba4724")\ + X(136 , 1, KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0147242947240947242747241347240d47241f47241d47240747242547240547240b47241147241747242147241947240f47242b47241b47242347241547247b47242d47242f47240347243147243347243547243b47243d47243947243747249d47244147243f47244d47244347244f47244b47244747245547244547245d47245b47246947246347246747244947247347246d47245147249f4724774724a147245347245947245747246f47246147246b47247147247547245f4724654724a347247947248d47248f4724834724a547248747248b47249947249b47249147247f47249547248947248547247d4724934724814724974724ab4724a94724a74724af4724b14724ad4724b54724b34724b74724b94724bb4724")\ X( 137, 1, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0047242847240847242647241247240c47241e47241c47240647242447240447240a47241047241647242047241847240e47242a47241a47242247241447247a47242c47242e47240247243047243247243447243a47243c47243847243647249c47244047243e47244c47244247244e47244a47244647245447244447245c47245a47246847246247246647244847247247246c47245047249e4724764724a047245247245847245647246e47246047246a47247047247447245e4724644724a247247847248c47248e4724824724a447248647248a47249847249a47249047247e47249447248847248447247c4724924724804724964724aa4724a84724a64724ae4724b04724ac4724b44724b24724b64724b84724ba4724")\ - X(138 , 1, KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "004f23284f23084f23264f23124f230c4f231e4f231c4f23064f23244f23044f230a4f23104f23164f23204f23184f230e4f232a4f231a4f23224f23144f237a4f232c4f232e4f23024f23304f23324f23344f233a4f233c4f23384f23364f239c4f23404f233e4f234c4f23424f234e4f234a4f23464f23544f23444f235c4f235a4f23684f23624f23664f23484f23724f236c4f23504f239e4f23764f23a04f23524f23584f23564f236e4f23604f236a4f23704f23744f235e4f23644f23a24f23784f238c4f238e4f23824f23a44f23864f238a4f23984f239a4f23904f237e4f23944f23884f23844f237c4f23924f23804f23964f23aa4f23a84f23a64f23ae4f23b04f23ac4f23b44f23b24f23b64f23b84f23ba4f23")\ + X(138 , 1, KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "014f23294f23094f23274f23134f230d4f231f4f231d4f23074f23254f23054f230b4f23114f23174f23214f23194f230f4f232b4f231b4f23234f23154f237b4f232d4f232f4f23034f23314f23334f23354f233b4f233d4f23394f23374f239d4f23414f233f4f234d4f23434f234f4f234b4f23474f23554f23454f235d4f235b4f23694f23634f23674f23494f23734f236d4f23514f239f4f23774f23a14f23534f23594f23574f236f4f23614f236b4f23714f23754f235f4f23654f23a34f23794f238d4f238f4f23834f23a54f23874f238b4f23994f239b4f23914f237f4f23954f23894f23854f237d4f23934f23814f23974f23ab4f23a94f23a74f23af4f23b14f23ad4f23b54f23b34f23b74f23b94f23bb4f23")\ X( 139, 1, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "004f23284f23084f23264f23124f230c4f231e4f231c4f23064f23244f23044f230a4f23104f23164f23204f23184f230e4f232a4f231a4f23224f23144f237a4f232c4f232e4f23024f23304f23324f23344f233a4f233c4f23384f23364f239c4f23404f233e4f234c4f23424f234e4f234a4f23464f23544f23444f235c4f235a4f23684f23624f23664f23484f23724f236c4f23504f239e4f23764f23a04f23524f23584f23564f236e4f23604f236a4f23704f23744f235e4f23644f23a24f23784f238c4f238e4f23824f23a44f23864f238a4f23984f239a4f23904f237e4f23944f23884f23844f237c4f23924f23804f23964f23aa4f23a84f23a64f23ae4f23b04f23ac4f23b44f23b24f23b64f23b84f23ba4f23")\ - X(140 , 1, KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "004b25284b25084b25264b25124b250c4b251e4b251c4b25064b25244b25044b250a4b25104b25164b25204b25184b250e4b252a4b251a4b25224b25144b257a4b252c4b252e4b25024b25304b25324b25344b253a4b253c4b25384b25364b259c4b25404b253e4b254c4b25424b254e4b254a4b25464b25544b25444b255c4b255a4b25684b25624b25664b25484b25724b256c4b25504b259e4b25764b25a04b25524b25584b25564b256e4b25604b256a4b25704b25744b255e4b25644b25a24b25784b258c4b258e4b25824b25a44b25864b258a4b25984b259a4b25904b257e4b25944b25884b25844b257c4b25924b25804b25964b25aa4b25a84b25a64b25ae4b25b04b25ac4b25b44b25b24b25b64b25b84b25ba4b25")\ + X(140 , 1, KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "014b25294b25094b25274b25134b250d4b251f4b251d4b25074b25254b25054b250b4b25114b25174b25214b25194b250f4b252b4b251b4b25234b25154b257b4b252d4b252f4b25034b25314b25334b25354b253b4b253d4b25394b25374b259d4b25414b253f4b254d4b25434b254f4b254b4b25474b25554b25454b255d4b255b4b25694b25634b25674b25494b25734b256d4b25514b259f4b25774b25a14b25534b25594b25574b256f4b25614b256b4b25714b25754b255f4b25654b25a34b25794b258d4b258f4b25834b25a54b25874b258b4b25994b259b4b25914b257f4b25954b25894b25854b257d4b25934b25814b25974b25ab4b25a94b25a74b25af4b25b14b25ad4b25b54b25b34b25b74b25b94b25bb4b25")\ X( 141, 1, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "004b25284b25084b25264b25124b250c4b251e4b251c4b25064b25244b25044b250a4b25104b25164b25204b25184b250e4b252a4b251a4b25224b25144b257a4b252c4b252e4b25024b25304b25324b25344b253a4b253c4b25384b25364b259c4b25404b253e4b254c4b25424b254e4b254a4b25464b25544b25444b255c4b255a4b25684b25624b25664b25484b25724b256c4b25504b259e4b25764b25a04b25524b25584b25564b256e4b25604b256a4b25704b25744b255e4b25644b25a24b25784b258c4b258e4b25824b25a44b25864b258a4b25984b259a4b25904b257e4b25944b25884b25844b257c4b25924b25804b25964b25aa4b25a84b25a64b25ae4b25b04b25ac4b25b44b25b24b25b64b25b84b25ba4b25")\ - X(142 , 1, KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "004d27284d27084d27264d27124d270c4d271e4d271c4d27064d27244d27044d270a4d27104d27164d27204d27184d270e4d272a4d271a4d27224d27144d277a4d272c4d272e4d27024d27304d27324d27344d273a4d273c4d27384d27364d279c4d27404d273e4d274c4d27424d274e4d274a4d27464d27544d27444d275c4d275a4d27684d27624d27664d27484d27724d276c4d27504d279e4d27764d27a04d27524d27584d27564d276e4d27604d276a4d27704d27744d275e4d27644d27a24d27784d278c4d278e4d27824d27a44d27864d278a4d27984d279a4d27904d277e4d27944d27884d27844d277c4d27924d27804d27964d27aa4d27a84d27a64d27ae4d27b04d27ac4d27b44d27b24d27b64d27b84d27ba4d27")\ + X(142 , 1, KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "014d27294d27094d27274d27134d270d4d271f4d271d4d27074d27254d27054d270b4d27114d27174d27214d27194d270f4d272b4d271b4d27234d27154d277b4d272d4d272f4d27034d27314d27334d27354d273b4d273d4d27394d27374d279d4d27414d273f4d274d4d27434d274f4d274b4d27474d27554d27454d275d4d275b4d27694d27634d27674d27494d27734d276d4d27514d279f4d27774d27a14d27534d27594d27574d276f4d27614d276b4d27714d27754d275f4d27654d27a34d27794d278d4d278f4d27834d27a54d27874d278b4d27994d279b4d27914d277f4d27954d27894d27854d277d4d27934d27814d27974d27ab4d27a94d27a74d27af4d27b14d27ad4d27b54d27b34d27b74d27b94d27bb4d27")\ X( 143, 1, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "004d27284d27084d27264d27124d270c4d271e4d271c4d27064d27244d27044d270a4d27104d27164d27204d27184d270e4d272a4d271a4d27224d27144d277a4d272c4d272e4d27024d27304d27324d27344d273a4d273c4d27384d27364d279c4d27404d273e4d274c4d27424d274e4d274a4d27464d27544d27444d275c4d275a4d27684d27624d27664d27484d27724d276c4d27504d279e4d27764d27a04d27524d27584d27564d276e4d27604d276a4d27704d27744d275e4d27644d27a24d27784d278c4d278e4d27824d27a44d27864d278a4d27984d279a4d27904d277e4d27944d27884d27844d277c4d27924d27804d27964d27aa4d27a84d27a64d27ae4d27b04d27ac4d27b44d27b24d27b64d27b84d27ba4d27")\ - X(144 , 1, KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0048262848260848262648261248260c48261e48261c48260648262448260448260a48261048261648262048261848260e48262a48261a48262248261448267a48262c48262e48260248263048263248263448263a48263c48263848263648269c48264048263e48264c48264248264e48264a48264648265448264448265c48265a48266848266248266648264848267248266c48265048269e4826764826a048265248265848265648266e48266048266a48267048267448265e4826644826a248267848268c48268e4826824826a448268648268a48269848269a48269048267e48269448268848268448267c4826924826804826964826aa4826a84826a64826ae4826b04826ac4826b44826b24826b64826b84826ba4826")\ + X(144 , 1, KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0148262948260948262748261348260d48261f48261d48260748262548260548260b48261148261748262148261948260f48262b48261b48262348261548267b48262d48262f48260348263148263348263548263b48263d48263948263748269d48264148263f48264d48264348264f48264b48264748265548264548265d48265b48266948266348266748264948267348266d48265148269f4826774826a148265348265948265748266f48266148266b48267148267548265f4826654826a348267948268d48268f4826834826a548268748268b48269948269b48269148267f48269548268948268548267d4826934826814826974826ab4826a94826a74826af4826b14826ad4826b54826b34826b74826b94826bb4826")\ X( 145, 1, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0048262848260848262648261248260c48261e48261c48260648262448260448260a48261048261648262048261848260e48262a48261a48262248261448267a48262c48262e48260248263048263248263448263a48263c48263848263648269c48264048263e48264c48264248264e48264a48264648265448264448265c48265a48266848266248266648264848267248266c48265048269e4826764826a048265248265848265648266e48266048266a48267048267448265e4826644826a248267848268c48268e4826824826a448268648268a48269848269a48269048267e48269448268848268448267c4826924826804826964826aa4826a84826a64826ae4826b04826ac4826b44826b24826b64826b84826ba4826")\ - X(146 , 1, KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0050282850280850282650281250280c50281e50281c50280650282450280450280a50281050281650282050281850280e50282a50281a50282250281450287a50282c50282e50280250283050283250283450283a50283c50283850283650289c50284050283e50284c50284250284e50284a50284650285450284450285c50285a50286850286250286650284850287250286c50285050289e5028765028a050285250285850285650286e50286050286a50287050287450285e5028645028a250287850288c50288e5028825028a450288650288a50289850289a50289050287e50289450288850288450287c5028925028805028965028aa5028a85028a65028ae5028b05028ac5028b45028b25028b65028b85028ba5028")\ + X(146 , 1, KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0150282950280950282750281350280d50281f50281d50280750282550280550280b50281150281750282150281950280f50282b50281b50282350281550287b50282d50282f50280350283150283350283550283b50283d50283950283750289d50284150283f50284d50284350284f50284b50284750285550284550285d50285b50286950286350286750284950287350286d50285150289f5028775028a150285350285950285750286f50286150286b50287150287550285f5028655028a350287950288d50288f5028835028a550288750288b50289950289b50289150287f50289550288950288550287d5028935028815028975028ab5028a95028a75028af5028b15028ad5028b55028b35028b75028b95028bb5028")\ X( 147, 1, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0050282850280850282650281250280c50281e50281c50280650282450280450280a50281050281650282050281850280e50282a50281a50282250281450287a50282c50282e50280250283050283250283450283a50283c50283850283650289c50284050283e50284c50284250284e50284a50284650285450284450285c50285a50286850286250286650284850287250286c50285050289e5028765028a050285250285850285650286e50286050286a50287050287450285e5028645028a250287850288c50288e5028825028a450288650288a50289850289a50289050287e50289450288850288450287c5028925028805028965028aa5028a85028a65028ae5028b05028ac5028b45028b25028b65028b85028ba5028")\ X(148 , 1, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30280b30080b30260b30120b300c0b301e0b301c0b30060b30240b30040b300a0b30100b30160b30200b30180b300e0b302a0b301a0b30220b30140b307a0b302c0b302e0b30020b30300b30320b30340b303a0b303c0b30380b30360b309c0b30400b303e0b304c0b30420b304e0b304a0b30460b30540b30440b305c0b305a0b30680b30620b30660b30480b30720b306c0b30500b309e0b30760b30a00b30520b30580b30560b306e0b30600b306a0b30700b30740b305e0b30640b30a20b30780b308c0b308e0b30820b30a40b30860b308a0b30982930980bc09a0b30900b307e0b30940b30880b30840b307c0bc0920b30800b30960b30aa0b30a80b30a60b30ae0b30b00b30ac0b30b40b30b20b30b60b30b82d30ba3430")\ X( 149, 1, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052602852600852602652601252600c52601e52601c52600652602452600452600a52601052601652602052601852600e52602a52601a52602252601452607a52602c52602e52600252603052603252603452603a52603c52603852603652609c52604052603e52604c52604252604e52604a52604652605452604452605c52605a52606852606252606652604852607252606c52605052609e5260765260a052605252605852605652606e52606052606a52607052607452605e5260645260a252607852608c52608e5260825260a452608652608a52609852609a52609052607e52609452608852608452607c5260925260805260965260aa5260a85260a65260ae5260b05260ac5260b45260b25260b65260b85260ba5260")\ @@ -394,7 +394,7 @@ namespace netxs::input X(168 , 1, KeyMultiply , "*" , "*" , 0x2A , 42 , 'u', '*' , '*' , "5e1bba9a0cdfaa2bdca82bdca62bdc")\ X( 169, 1, NumpadMultiply , "*" , "*" , 0x2A , 57411, 'u', '*' , '*' , "00376a28376a08376a26376a12376a0c376a1e376a1c376a06376a24376a04376a0a376a10376a16376a20376a18376a0e376a2a376a1a376a22376a14376a7a376a2c376a2e376a02376a30376a32376a34376a3a376a3c376a38376a36376a9c376a40376a3e376a4c376a42376a4e376a4a376a46376a54376a44376a5c376a5a376a68376a62376a66376a48376a72376a6c376a50376a9e376a76376aa0376a52376a58376a56376a6e376a60376a6a376a70376a74376a5e376a64376aa2376a78376a8c376a8e376a82376aa4376a86376a8a376a98376a9a376a90376a7e376a94376a88376a84376a7c376a92376a80376a96376aaa376aa8376aa6376aae376ab0376aac376ab4376ab2376ab6376ab8376aba376a")\ X(170 , 1, KeySlash , "/" , "/" , 0x2F , 47 , 'u', '/' , '\x1f', "0035bf2835bf0835bf2635bf1235bf0c35bf1e35bf1c35bf0635bf2435bf0435bf0a35bf1035bf1635bf2035bf1835bf0e35bf2a35bf1a35bf2235bf1435bf7a35bf2c35bf2e35bf0235bf3035bf3235bf3435bf3a35bf3c35bf3835bf3635bf9c35bf4035bf3e35bf4c35bf4e73c14a73c15435bf4429de5e0cdbb21abfb60cbbb80bbfba04bf")\ - X( 171, 1, NumpadDivide , "/" , "/" , 0x2F , 57410, 'u', '/' , '\x1f', "00356f28356f08356f26356f12356f0c356f1e356f1c356f06356f24356f04356f0a356f10356f16356f20356f18356f0e356f2a356f1a356f22356f14356f7a356f2c356f2e356f02356f30356f32356f34356f3a356f3c356f38356f36356f9c356f40356f3e356f4c356f42356f4e356f4a356f46356f54356f44356f5c356f5a356f68356f62356f66356f48356f72356f6c356f50356f9e356f76356fa0356f52356f58356f56356f6e356f60356f6a356f70356f74356f5e356f64356fa2356f78356f8c356f8e356f82356fa4356f86356f8a356f98356f9a356f90356f7e356f94356f88356f84356f7c356f92356f80356f96356faa356fa8356fa6356fae356fb0356fac356fb4356fb2356fb6356fb8356fba356f")\ + X( 171, 1, NumpadDivide , "/" , "/" , 0x2F , 57410, 'u', '/' , '\x1f', "01356f29356f09356f27356f13356f0d356f1f356f1d356f07356f25356f05356f0b356f11356f17356f21356f19356f0f356f2b356f1b356f23356f15356f7b356f2d356f2f356f03356f31356f33356f35356f3b356f3d356f39356f37356f9d356f41356f3f356f4d356f43356f4f356f4b356f47356f55356f45356f5d356f5b356f69356f63356f67356f49356f73356f6d356f51356f9f356f77356fa1356f53356f59356f57356f6f356f61356f6b356f71356f75356f5f356f65356fa3356f79356f8d356f8f356f83356fa5356f87356f8b356f99356f9b356f91356f7f356f95356f89356f85356f7d356f93356f81356f97356fab356fa9356fa7356faf356fb1356fad356fb5356fb3356fb7356fb9356fbb356f")\ X(172 , 1, KeyPlus , "Plus" , "+" , 0x2B , 43 , 'u', '+' , '+' , "5c0cbb5a0cbb680cbb621bbb660cbb480dbb721abb6c0cbb760cbd521abb581bbb561bbb6e1bbb600cbb6a1bbb700cbb740cbb5e27bb640cbb782bbf8c1bbb8e1bbb821bbb860dbb8a0cbb881bbb841bbb920dbb800dbb960cbdb629c0")\ X( 173, 1, NumpadPlus , "Plus" , "+" , 0x2B , 57413, 'u', '+' , '+' , "004e6b284e6b084e6b264e6b124e6b0c4e6b1e4e6b1c4e6b064e6b244e6b044e6b0a4e6b104e6b164e6b204e6b184e6b0e4e6b2a4e6b1a4e6b224e6b144e6b7a4e6b2c4e6b2e4e6b024e6b304e6b324e6b344e6b3a4e6b3c4e6b384e6b364e6b9c4e6b404e6b3e4e6b4c4e6b424e6b4e4e6b4a4e6b464e6b544e6b444e6b5c4e6b5a4e6b684e6b624e6b664e6b484e6b724e6b6c4e6b504e6b9e4e6b764e6ba04e6b524e6b584e6b564e6b6e4e6b604e6b6a4e6b704e6b744e6b5e4e6b644e6ba24e6b784e6b8c4e6b8e4e6b824e6ba44e6b864e6b8a4e6b984e6b9a4e6b904e6b7e4e6b944e6b884e6b844e6b7c4e6b924e6b804e6b964e6baa4e6ba84e6ba64e6bae4e6bb04e6bac4e6bb44e6bb24e6bb64e6bb84e6bba4e6b")\ X(174 , 1, KeyMinus , "Minus" , "-" , 0x2D , 45 , 'u', '-' , '-' , "000cbd280cbd080cbd260cbd120cbd0c0cbd1e0cbd1c0cbd060cbd240cbd040cbd0a0cbd100cbd160cbd200cbd180cbd0e0cbd2a0cbd1a0cbd220cbd140cbd7a0cbd2c0cbd2e0cbd020cbd300cbd320cbd340cbd3a0cbd3c0cbd380cbd360cbd9c0cbd400cbd3e0cbd4c0cbd420cbd4e0cbd4a0cbd460cbd540cbd440cbd5c35bd5a35bd6835bd6235bd6635bd4835bd7235bd6c35bd500cbd9e35bf7635dda035bf5235bd5835bd5635bd6e35bd6035bd6a35bd7035bd7435bd5e35bd6435bda235bd780ddb8c35bd8e35bd8235bda435bd8635bd8a35bd9835bd9a0dbd9035bd7e35bd9435bd8835bd8435bd7c35bf9235bd8035bd9635bfae0dbdb00dbdac0dbdb228bdb60dbdb828bdba1ebd")\ @@ -549,7 +549,7 @@ namespace netxs::input X(464 , 0, AppSpeechMode , "AppSpeechMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(466 , 0, AppSpeechCorrection, "AppSpeechCorrect" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(468 , 0, AppSpellCheck , "AppSpellCheck" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(470 , 0, Calculator , "Calculator" , "" , 0 , 0 , 'u', -1 , -1 , "0021b72821b70821b72621b71221b70c21b71e21b71c21b70621b72421b70421b70a21b71021b71621b72021b71821b70e21b72a21b71a21b72221b71421b77a21b72c21b72e21b70221b73021b73221b73421b73a21b73c21b73821b73621b79c21b74021b73e21b74c21b74221b74e21b74a21b74621b75421b74421b75c21b75a21b76821b76221b76621b74821b77221b76c21b75021b79e21b77621b7a021b75221b75821b75621b76e21b76021b76a21b77021b77421b75e21b76421b7a221b77821b78c21b78e21b78221b7a421b78621b78a21b79821b79a21b79021b77e21b79421b78821b78421b77c21b79221b78021b79621b7aa21b7a821b7a621b7ae21b7b021b7ac21b7b421b7b221b7b621b7b821b7ba21b7")\ + X(470 , 0, Calculator , "Calculator" , "" , 0 , 0 , 'u', -1 , -1 , "0121b72921b70921b72721b71321b70d21b71f21b71d21b70721b72521b70521b70b21b71121b71721b72121b71921b70f21b72b21b71b21b72321b71521b77b21b72d21b72f21b70321b73121b73321b73521b73b21b73d21b73921b73721b79d21b74121b73f21b74d21b74321b74f21b74b21b74721b75521b74521b75d21b75b21b76921b76321b76721b74921b77321b76d21b75121b79f21b77721b7a121b75321b75921b75721b76f21b76121b76b21b77121b77521b75f21b76521b7a321b77921b78d21b78f21b78321b7a521b78721b78b21b79921b79b21b79121b77f21b79521b78921b78521b77d21b79321b78121b79721b7ab21b7a921b7a721b7af21b7b121b7ad21b7b521b7b321b7b721b7b921b7bb21b7")\ X(472 , 0, Mail , "Mail" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(474 , 0, MailSend , "MailSend" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(476 , 0, MailForward , "MailForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ @@ -561,14 +561,14 @@ namespace netxs::input X(488 , 0, MediaChanUp , "MediaChanUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(490 , 0, MediaTrebleDown , "MediaTrebleDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(492 , 0, MediaTrebleUp , "MediaTrebleUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(494 , 0, MediaVolMute , "MediaVolMute" , "" , 0 , 57440, 'u', -1 , -1 , "0020ad2820ad0820ad2620ad1220ad0c20ad1e20ad1c20ad0620ad2420ad0420ad0a20ad1020ad1620ad2020ad1820ad0e20ad2a20ad1a20ad2220ad1420ad7a20ad2c20ad2e20ad0220ad3020ad3220ad3420ad3a20ad3c20ad3820ad3620ad9c20ad4020ad3e20ad4c20ad4220ad4e20ad4a20ad4620ad5420ad4420ad5c20ad5a20ad6820ad6220ad6620ad4820ad7220ad6c20ad5020ad9e20ad7620ada020ad5220ad5820ad5620ad6e20ad6020ad6a20ad7020ad7420ad5e20ad6420ada220ad7820ad8c20ad8e20ad8220ada420ad8620ad8a20ad9820ad9a20ad9020ad7e20ad9420ad8820ad8420ad7c20ad9220ad8020ad9620adaa20ada820ada620adae20adb020adac20adb420adb220adb620adb820adba20ad")\ - X(496 , 0, MediaVolDown , "MediaVolDown" , "" , 0 , 57438, 'u', -1 , -1 , "002eae282eae082eae262eae122eae0c2eae1e2eae1c2eae062eae242eae042eae0a2eae102eae162eae202eae182eae0e2eae2a2eae1a2eae222eae142eae7a2eae2c2eae2e2eae022eae302eae322eae342eae3a2eae3c2eae382eae362eae9c2eae402eae3e2eae4c2eae422eae4e2eae4a2eae462eae542eae442eae5c2eae5a2eae682eae622eae662eae482eae722eae6c2eae502eae9e2eae762eaea02eae522eae582eae562eae6e2eae602eae6a2eae702eae742eae5e2eae642eaea22eae782eae8c2eae8e2eae822eaea42eae862eae8a2eae982eae9a2eae902eae7e2eae942eae882eae842eae7c2eae922eae802eae962eaeaa2eaea82eaea62eaeae2eaeb02eaeac2eaeb42eaeb22eaeb62eaeb82eaeba2eae")\ - X(498 , 0, MediaVolUp , "MediaVolUp" , "" , 0 , 57439, 'u', -1 , -1 , "0030af2830af0830af2630af1230af0c30af1e30af1c30af0630af2430af0430af0a30af1030af1630af2030af1830af0e30af2a30af1a30af2230af1430af7a30af2c30af2e30af0230af3030af3230af3430af3a30af3c30af3830af3630af9c30af4030af3e30af4c30af4230af4e30af4a30af4630af5430af4430af5c30af5a30af6830af6230af6630af4830af7230af6c30af5030af9e30af7630afa030af5230af5830af5630af6e30af6030af6a30af7030af7430af5e30af6430afa230af7830af8c30af8e30af8230afa430af8630af8a30af9830af9a30af9030af7e30af9430af8830af8430af7c30af9230af8030af9630afaa30afa830afa630afae30afb030afac30afb430afb230afb630afb830afba30af")\ - X(500 , 0, MediaNext , "MediaNext" , "" , 0 , 57435, 'u', -1 , -1 , "0019b02819b00819b02619b01219b00c19b01e19b01c19b00619b02419b00419b00a19b01019b01619b02019b01819b00e19b02a19b01a19b02219b01419b07a19b02c19b02e19b00219b03019b03219b03419b03a19b03c19b03819b03619b09c19b04019b03e19b04c19b04219b04e19b04a19b04619b05419b04419b05c19b05a19b06819b06219b06619b04819b07219b06c19b05019b09e19b07619b0a019b05219b05819b05619b06e19b06019b06a19b07019b07419b05e19b06419b0a219b07819b08c19b08e19b08219b0a419b08619b08a19b09819b09a19b09019b07e19b09419b08819b08419b07c19b09219b08019b09619b0aa19b0a819b0a619b0ae19b0b019b0ac19b0b419b0b219b0b619b0b819b0ba19b0")\ - X(502 , 0, MediaPrev , "MediaPrev" , "" , 0 , 57436, 'u', -1 , -1 , "0010b12810b10810b12610b11210b10c10b11e10b11c10b10610b12410b10410b10a10b11010b11610b12010b11810b10e10b12a10b11a10b12210b11410b17a10b12c10b12e10b10210b13010b13210b13410b13a10b13c10b13810b13610b19c10b14010b13e10b14c10b14210b14e10b14a10b14610b15410b14410b15c10b15a10b16810b16210b16610b14810b17210b16c10b15010b19e10b17610b1a010b15210b15810b15610b16e10b16010b16a10b17010b17410b15e10b16410b1a210b17810b18c10b18e10b18210b1a410b18610b18a10b19810b19a10b19010b17e10b19410b18810b18410b17c10b19210b18010b19610b1aa10b1a810b1a610b1ae10b1b010b1ac10b1b410b1b210b1b610b1b810b1ba10b1")\ - X(504 , 0, MediaStop , "MediaStop" , "" , 0 , 57432, 'u', -1 , -1 , "0024b22824b20824b22624b21224b20c24b21e24b21c24b20624b22424b20424b20a24b21024b21624b22024b21824b20e24b22a24b21a24b22224b21424b27a24b22c24b22e24b20224b23024b23224b23424b23a24b23c24b23824b23624b29c24b24024b23e24b24c24b24224b24e24b24a24b24624b25424b24424b25c24b25a24b26824b26224b26624b24824b27224b26c24b25024b29e24b27624b2a024b25224b25824b25624b26e24b26024b26a24b27024b27424b25e24b26424b2a224b27824b28c24b28e24b28224b2a424b28624b28a24b29824b29a24b29024b27e24b29424b28824b28424b27c24b29224b28024b29624b2aa24b2a824b2a624b2ae24b2b024b2ac24b2b424b2b224b2b624b2b824b2ba24b2")\ + X(494 , 0, MediaVolMute , "MediaVolMute" , "" , 0 , 57440, 'u', -1 , -1 , "0120ad2920ad0920ad2720ad1320ad0d20ad1f20ad1d20ad0720ad2520ad0520ad0b20ad1120ad1720ad2120ad1920ad0f20ad2b20ad1b20ad2320ad1520ad7b20ad2d20ad2f20ad0320ad3120ad3320ad3520ad3b20ad3d20ad3920ad3720ad9d20ad4120ad3f20ad4d20ad4320ad4f20ad4b20ad4720ad5520ad4520ad5d20ad5b20ad6920ad6320ad6720ad4920ad7320ad6d20ad5120ad9f20ad7720ada120ad5320ad5920ad5720ad6f20ad6120ad6b20ad7120ad7520ad5f20ad6520ada320ad7920ad8d20ad8f20ad8320ada520ad8720ad8b20ad9920ad9b20ad9120ad7f20ad9520ad8920ad8520ad7d20ad9320ad8120ad9720adab20ada920ada720adaf20adb120adad20adb520adb320adb720adb920adbb20ad")\ + X(496 , 0, MediaVolDown , "MediaVolDown" , "" , 0 , 57438, 'u', -1 , -1 , "012eae292eae092eae272eae132eae0d2eae1f2eae1d2eae072eae252eae052eae0b2eae112eae172eae212eae192eae0f2eae2b2eae1b2eae232eae152eae7b2eae2d2eae2f2eae032eae312eae332eae352eae3b2eae3d2eae392eae372eae9d2eae412eae3f2eae4d2eae432eae4f2eae4b2eae472eae552eae452eae5d2eae5b2eae692eae632eae672eae492eae732eae6d2eae512eae9f2eae772eaea12eae532eae592eae572eae6f2eae612eae6b2eae712eae752eae5f2eae652eaea32eae792eae8d2eae8f2eae832eaea52eae872eae8b2eae992eae9b2eae912eae7f2eae952eae892eae852eae7d2eae932eae812eae972eaeab2eaea92eaea72eaeaf2eaeb12eaead2eaeb52eaeb32eaeb72eaeb92eaebb2eae")\ + X(498 , 0, MediaVolUp , "MediaVolUp" , "" , 0 , 57439, 'u', -1 , -1 , "0130af2930af0930af2730af1330af0d30af1f30af1d30af0730af2530af0530af0b30af1130af1730af2130af1930af0f30af2b30af1b30af2330af1530af7b30af2d30af2f30af0330af3130af3330af3530af3b30af3d30af3930af3730af9d30af4130af3f30af4d30af4330af4f30af4b30af4730af5530af4530af5d30af5b30af6930af6330af6730af4930af7330af6d30af5130af9f30af7730afa130af5330af5930af5730af6f30af6130af6b30af7130af7530af5f30af6530afa330af7930af8d30af8f30af8330afa530af8730af8b30af9930af9b30af9130af7f30af9530af8930af8530af7d30af9330af8130af9730afab30afa930afa730afaf30afb130afad30afb530afb330afb730afb930afbb30af")\ + X(500 , 0, MediaNext , "MediaNext" , "" , 0 , 57435, 'u', -1 , -1 , "0119b02919b00919b02719b01319b00d19b01f19b01d19b00719b02519b00519b00b19b01119b01719b02119b01919b00f19b02b19b01b19b02319b01519b07b19b02d19b02f19b00319b03119b03319b03519b03b19b03d19b03919b03719b09d19b04119b03f19b04d19b04319b04f19b04b19b04719b05519b04519b05d19b05b19b06919b06319b06719b04919b07319b06d19b05119b09f19b07719b0a119b05319b05919b05719b06f19b06119b06b19b07119b07519b05f19b06519b0a319b07919b08d19b08f19b08319b0a519b08719b08b19b09919b09b19b09119b07f19b09519b08919b08519b07d19b09319b08119b09719b0ab19b0a919b0a719b0af19b0b119b0ad19b0b519b0b319b0b719b0b919b0bb19b0")\ + X(502 , 0, MediaPrev , "MediaPrev" , "" , 0 , 57436, 'u', -1 , -1 , "0110b12910b10910b12710b11310b10d10b11f10b11d10b10710b12510b10510b10b10b11110b11710b12110b11910b10f10b12b10b11b10b12310b11510b17b10b12d10b12f10b10310b13110b13310b13510b13b10b13d10b13910b13710b19d10b14110b13f10b14d10b14310b14f10b14b10b14710b15510b14510b15d10b15b10b16910b16310b16710b14910b17310b16d10b15110b19f10b17710b1a110b15310b15910b15710b16f10b16110b16b10b17110b17510b15f10b16510b1a310b17910b18d10b18f10b18310b1a510b18710b18b10b19910b19b10b19110b17f10b19510b18910b18510b17d10b19310b18110b19710b1ab10b1a910b1a710b1af10b1b110b1ad10b1b510b1b310b1b710b1b910b1bb10b1")\ + X(504 , 0, MediaStop , "MediaStop" , "" , 0 , 57432, 'u', -1 , -1 , "0124b22924b20924b22724b21324b20d24b21f24b21d24b20724b22524b20524b20b24b21124b21724b22124b21924b20f24b22b24b21b24b22324b21524b27b24b22d24b22f24b20324b23124b23324b23524b23b24b23d24b23924b23724b29d24b24124b23f24b24d24b24324b24f24b24b24b24724b25524b24524b25d24b25b24b26924b26324b26724b24924b27324b26d24b25124b29f24b27724b2a124b25324b25924b25724b26f24b26124b26b24b27124b27524b25f24b26524b2a324b27924b28d24b28f24b28324b2a524b28724b28b24b29924b29b24b29124b27f24b29524b28924b28524b27d24b29324b28124b29724b2ab24b2a924b2a724b2af24b2b124b2ad24b2b524b2b324b2b724b2b924b2bb24b2")\ X(506 , 0, MediaPause , "MediaPause" , "" , 0 , 57429, 'u', -1 , -1 , "")\ - X(508 , 0, MediaPlayPause , "MediaPlayPause" , "" , 0 , 57430, 'u', -1 , -1 , "0022b32822b30822b32622b31222b30c22b31e22b31c22b30622b32422b30422b30a22b31022b31622b32022b31822b30e22b32a22b31a22b32222b31422b37a22b32c22b32e22b30222b33022b33222b33422b33a22b33c22b33822b33622b39c22b34022b33e22b34c22b34222b34e22b34a22b34622b35422b34422b35c22b35a22b36822b36222b36622b34822b37222b36c22b35022b39e22b37622b3a022b35222b35822b35622b36e22b36022b36a22b37022b37422b35e22b36422b3a222b37822b38c22b38e22b38222b3a422b38622b38a22b39822b39a22b39022b37e22b39422b38822b38422b37c22b39222b38022b39622b3aa22b3a822b3a622b3ae22b3b022b3ac22b3b422b3b222b3b622b3b822b3ba22b3")\ + X(508 , 0, MediaPlayPause , "MediaPlayPause" , "" , 0 , 57430, 'u', -1 , -1 , "0122b32922b30922b32722b31322b30d22b31f22b31d22b30722b32522b30522b30b22b31122b31722b32122b31922b30f22b32b22b31b22b32322b31522b37b22b32d22b32f22b30322b33122b33322b33522b33b22b33d22b33922b33722b39d22b34122b33f22b34d22b34322b34f22b34b22b34722b35522b34522b35d22b35b22b36922b36322b36722b34922b37322b36d22b35122b39f22b37722b3a122b35322b35922b35722b36f22b36122b36b22b37122b37522b35f22b36522b3a322b37922b38d22b38f22b38322b3a522b38722b38b22b39922b39b22b39122b37f22b39522b38922b38522b37d22b39322b38122b39722b3ab22b3a922b3a722b3af22b3b122b3ad22b3b522b3b322b3b722b3b922b3bb22b3")\ X(510 , 0, MediaPlay , "MediaPlay" , "" , 0 , 57428, 'u', -1 , -1 , "")\ X(512 , 0, MediaSelectMode , "MediaSelectMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(514 , 0, MediaReverse , "MediaReverse" , "" , 0 , 57431, 'u', -1 , -1 , "")\ @@ -585,7 +585,7 @@ namespace netxs::input X(536 , 0, BrowserStop , "BrowserStop" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(538 , 0, BrowserSearch , "BrowserSearch" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(540 , 0, BrowserFavorites , "BrowserFavorites" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(542 , 0, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0032ac2832ac0832ac2632ac1232ac0c32ac1e32ac1c32ac0632ac2432ac0432ac0a32ac1032ac1632ac2032ac1832ac0e32ac2a32ac1a32ac2232ac1432ac7a32ac2c32ac2e32ac0232ac3032ac3232ac3432ac3a32ac3c32ac3832ac3632ac9c32ac4032ac3e32ac4c32ac4232ac4e32ac4a32ac4632ac5432ac4432ac5c32ac5a32ac6832ac6232ac6632ac4832ac7232ac6c32ac5032ac9e32ac7632aca032ac5232ac5832ac5632ac6e32ac6032ac6a32ac7032ac7432ac5e32ac6432aca232ac7832ac8c32ac8e32ac8232aca432ac8632ac8a32ac9832ac9a32ac9032ac7e32ac9432ac8832ac8432ac7c32ac9232ac8032ac9632acaa32aca832aca632acae32acb032acac32acb432acb232acb632acb832acba32ac")\ + X(542 , 0, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0132ac2932ac0932ac2732ac1332ac0d32ac1f32ac1d32ac0732ac2532ac0532ac0b32ac1132ac1732ac2132ac1932ac0f32ac2b32ac1b32ac2332ac1532ac7b32ac2d32ac2f32ac0332ac3132ac3332ac3532ac3b32ac3d32ac3932ac3732ac9d32ac4132ac3f32ac4d32ac4332ac4f32ac4b32ac4732ac5532ac4532ac5d32ac5b32ac6932ac6332ac6732ac4932ac7332ac6d32ac5132ac9f32ac7732aca132ac5332ac5932ac5732ac6f32ac6132ac6b32ac7132ac7532ac5f32ac6532aca332ac7932ac8d32ac8f32ac8332aca532ac8732ac8b32ac9932ac9b32ac9132ac7f32ac9532ac8932ac8532ac7d32ac9332ac8132ac9732acab32aca932aca732acaf32acb132acad32acb532acb332acb732acb932acbb32ac")\ X(544 , 0, lastKey , "lastKey" , "" , 0 , 0 , 0 , -1 , -1 , "") #define key_list2 \ @@ -596,12 +596,40 @@ namespace netxs::input // Max 12 bits for KeyId. static constexpr auto idbits = 12; - /* ID Input Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */ #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ static constexpr auto Name = KeyId; key_list #undef X + static constexpr auto key_map = [] + { + auto m = std::array{}; + auto fill = [&](si32 KeyId, qiew codes) + { + while (codes) + { + auto key_hash = utf::to_int_from_hex_str(codes.pop_front(6)) >> 8; + //if (m[key_hash]) log("key duplicates"); + m[key_hash] = (si16)KeyId; + } + }; + #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + {\ + auto codes = qiew{ PhysicalCode };\ + while (codes)\ + {\ + auto key_hash = utf::to_int_from_hex_str(codes.pop_front(6)) >> 8;\ + if (m[key_hash]) m[key_hash] = (si16)0xff;\ + else m[key_hash] = (si16)KeyId;\ + }\ + } + //if (m[key_hash]) log("key duplicates"); + //fill(KeyId, qiew{ PhysicalCode }); + key_list + #undef X + return m; + }(); + struct map { si64 hash; // map: Key hash. @@ -630,7 +658,8 @@ namespace netxs::input si32 KKPAscii; si32 KKPCtl; }; - static auto data = std::vector(input::key::lastKey); + //static auto data = std::array{}; + static auto data = std::array{}; return data[std::clamp(keycode, 0, input::key::lastKey - 1)]; } @@ -653,6 +682,29 @@ namespace netxs::input .KKPCtl = KKPCtl }; hash = (si64)(keymask & (vk | (sc << 8) | (klid << 16) | ((si64)cs << 36))); } + static void set(si32 id, bool doinput, view specific_keyname, view generic_keyname, si32 KKPdef, si32 KKPsuffix, si32 KKPascii, si32 wCtl, qiew PhysicalCode) + { + auto vk = 0; + auto sc = 0; + auto klid = 0; + if (PhysicalCode) + { + auto v = utf::to_int_from_hex_str(qiew{ PhysicalCode }.substr(0, 6)); + vk = v & 0xFF; + sc = (v >> 8) & 0xFF; + klid = v >> 17; + } + data(id) = { .name = specific_keyname, + .generic = generic_keyname, + .vkey = vk, + .scan = sc, + .klid = klid, + .edit = doinput, + .KKPDef = KKPdef, + .KKPSuffix = KKPsuffix, + .KKPAscii = KKPascii, + .KKPCtl = wCtl }; + } bool operator == (map const& m) const = default; struct hashproc @@ -667,11 +719,20 @@ namespace netxs::input static const auto keymap = std::unordered_map { #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ - { map{ 0,0,0,0 }, Name }, - //{ map{ Vkey, Scan, Klid, CtrlState, Mask, #Name, GenericName, Input, KeyId, KKPDef, KKPSuffix, KKPAscii, KKPCtl }, Name }, + { map{ 0,0,0,0 }, KeyId }, key_list #undef X }; + + static const auto _init0 = [] + { + //todo move it to std::array + #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + map::set(KeyId, Input, #Name, Generic, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode); + key_list + #undef X + return true; + }(); static const auto kkpmap = std::unordered_map { #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ @@ -1814,25 +1875,14 @@ namespace netxs::input void take(syskeybd& k) { keybd_disabled = faux; - if (k.keycode == key::config) // Receive three layout related values coded as codepoints: nullkey keycode, '/' keycode+mods, '?' keycode+mods. + if (tooltip.visible) { - auto i = utf::cpit{ k.cluster }; - keybd::nullkey = i.next().cdpoint; - auto slash = i.next().cdpoint; - auto quest = i.next().cdpoint; - other_key = build_other_key(slash, quest); - } - else - { - if (tooltip.visible) - { - tooltip.hide(); - } - keybd::vkevent = indexer.get_kbchord_hint(k.vkchord); - keybd::scevent = indexer.get_kbchord_hint(k.scchord); - keybd::chevent = indexer.get_kbchord_hint(k.chchord); - keybd::update(k); + tooltip.hide(); } + keybd::vkevent = indexer.get_kbchord_hint(k.vkchord); + keybd::scevent = indexer.get_kbchord_hint(k.scchord); + keybd::chevent = indexer.get_kbchord_hint(k.chchord); + keybd::update(k); } auto take(sysboard& b) { @@ -2344,7 +2394,7 @@ namespace netxs::input k.vkchord.clear(); k.scchord.clear(); k.chchord.clear(); - auto vk_valid = k.keycode > input::key::config; + auto vk_valid = k.keycode > input::key::invalid; auto sc_valid = k.scancod > 0; if (!keyout || k.keystat != input::key::released) { @@ -2367,7 +2417,7 @@ namespace netxs::input } else if (!same) // Exclude repeated key. { - if (keyid <= input::key::config) vk_valid = faux; + if (keyid <= input::key::invalid) vk_valid = faux; if (val.scode == 0) sc_valid = faux; if (vk_valid) push_keyid(true, k.vkchord, keyid); if (sc_valid) push_scode(true, k.scchord, val.scode); @@ -2851,9 +2901,9 @@ namespace netxs::input { // } - - auto iter = keymap.find(map{ 0,0,0,0 }); - return iter != keymap.end() ? iter->second : key::undef; + auto hash = input::key::key_hash(klid, scancod, extflag); + auto keyid = input::key::key_map[hash]; + return keyid; } auto xlat(si32 virtcod, si32 scancod, si32 dwControlKeyState, si32 klid) { @@ -2871,19 +2921,6 @@ namespace netxs::input // auto iter = keymap.find(map{ args... }); // return iter != keymap.end() ? iter->second : key::undef; //} - auto find(si32 vkey, si32 fallback) - { - auto k = fallback; - for (auto& [key, val] : keymap) - { - if ((si32)(key.hash & 0xff) == vkey) - { - k = val & -2; // Generic keys only. - break; - } - } - return k; - } } namespace bindings diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index ff48a52dce..8ef369fc57 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5283,26 +5283,6 @@ namespace netxs::os oldval = newval; } }; - if (os::stdin_fd != os::invalid_fd) // Check and update keyboard layout. - { - auto true_null = nt::takevkey<'\0'>().base; - auto slash_key = nt::takevkey< '/'>().base; - auto quest_key = nt::takevkey< '?'>().base; - if ((true_null & 0xff) != '2' // Send update for non-US keyboard layouts. - || (slash_key & 0xff) != VK_OEM_2 - || (quest_key & 0xff) != VK_OEM_2) - { - true_null = input::key::find(true_null & 0xff, input::key::Key2); - slash_key = input::key::find(slash_key & 0xff, input::key::KeySlash) | (slash_key & 0xff00); - quest_key = input::key::find(quest_key & 0xff, input::key::KeySlash) | (quest_key & 0xff00); - k.keycode = input::key::config; - k.cluster.clear(); - utf::to_utf_from_code(true_null, k.cluster); - utf::to_utf_from_code(slash_key, k.cluster); - utf::to_utf_from_code(quest_key, k.cluster); - keybd(k); - } - } auto waits = os::stdin_fd != os::invalid_fd ? std::vector{ (fd_t)os::signals::alarm, (fd_t)alarm, os::stdin_fd } : std::vector{ (fd_t)os::signals::alarm, (fd_t)alarm }; while (alive) diff --git a/src/netxs/desktopio/utf.hpp b/src/netxs/desktopio/utf.hpp index 0e2d1084ae..a0a9369cba 100644 --- a/src/netxs/desktopio/utf.hpp +++ b/src/netxs/desktopio/utf.hpp @@ -1106,8 +1106,8 @@ namespace netxs::utf constexpr qiew(char const* ptr, auto&&... len) noexcept : view(ptr, std::forward(len)...) { } constexpr qiew& operator = (qiew const&) noexcept = default; - operator text () const { return text{ data(), size() }; } - explicit operator bool () const { return view::length(); } + operator text () const { return text{ data(), size() }; } + constexpr explicit operator bool () const { return view::length(); } // qiew: Clear. constexpr auto clear() @@ -1122,16 +1122,23 @@ namespace netxs::utf // qiew: Convert to text. auto str() const { return operator text(); } // qiew: Peek front char. - si32 front() const { return (byte)view::front(); } + constexpr si32 front() const { return (byte)view::front(); } // qiew: Pop front. - auto pop_front() + constexpr auto pop_front() { auto c = view::front(); view::remove_prefix(1); return c; } + // qiew: Pop front. + constexpr auto pop_front(si32 n) + { + auto crop = substr(0, n); + view::remove_prefix(n); + return crop; + } // qiew: Pop back. - auto pop_back() + constexpr auto pop_back() { auto c = view::back(); view::remove_suffix(1); @@ -1151,7 +1158,7 @@ namespace netxs::utf return n; } // qiew: Pop the front sequence of the same chars and return their count + 1. - auto pop_all(char c) + constexpr auto pop_all(char c) { auto n = 1; while (length() && view::front() == c) @@ -1173,7 +1180,7 @@ namespace netxs::utf return faux; } // qiew: Return true and pop the front char when it is equal to c. - auto pop_if(char c) + constexpr auto pop_if(char c) { if (length() && view::front() == c) { @@ -1188,7 +1195,7 @@ namespace netxs::utf using unordered_map = std::unordered_map; template - auto to_int_from_hex_str(auto&& text_or_wide) + constexpr auto to_int_from_hex_str(auto const& text_or_wide) { auto num = A{}; for(auto c : text_or_wide) From 1fbe4aea52c12d7d29a794cefc7ada2628608fce Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 20:39:31 +0500 Subject: [PATCH 30/71] #943 WIP: Fix numpad collisions --- src/netxs/desktopio/input.hpp | 48 +++++++++++++++-------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index fddab66163..321e903cba 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -350,27 +350,27 @@ namespace netxs::input X(124 , 1, KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d281c0d081c0d261c0d121c0d0c1c0d1e1c0d1c1c0d061c0d241c0d041c0d0a1c0d101c0d161c0d201c0d181c0d0e1c0d2a1c0d1a1c0d221c0d141c0d7a1c0d2c1c0d2e1c0d021c0d301c0d321c0d341c0d3a1c0d3c1c0d381c0d361c0d9c1c0d401c0d3e1c0d4c1c0d421c0d4e1c0d4a1c0d461c0d541c0d441c0d5c1c0d5a1c0d681c0d621c0d661c0d481c0d721c0d6c1c0d501c0d9e1c0d761c0da01c0d521c0d581c0d561c0d6e1c0d601c0d6a1c0d701c0d741c0d5e1c0d641c0da21c0d781c0d8c1c0d8e1c0d821c0da41c0d861c0d8a1c0d981c0d9a1c0d901c0d7e1c0d941c0d881c0d841c0d7c1c0d921c0d801c0d961c0daa1c0da81c0da61c0dae1c0db01c0dac1c0db41c0db21c0db61c0db81c0dba1c0d")\ X( 125, 1, NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "011c0d291c0d091c0d271c0d131c0d0d1c0d1f1c0d1d1c0d071c0d251c0d051c0d0b1c0d111c0d171c0d211c0d191c0d0f1c0d2b1c0d1b1c0d231c0d151c0d7b1c0d2d1c0d2f1c0d031c0d311c0d331c0d351c0d3b1c0d3d1c0d391c0d371c0d9d1c0d411c0d3f1c0d4d1c0d431c0d4f1c0d4b1c0d471c0d551c0d451c0d5d1c0d5b1c0d691c0d631c0d671c0d491c0d731c0d6d1c0d511c0d9f1c0d771c0da11c0d531c0d591c0d571c0d6f1c0d611c0d6b1c0d711c0d751c0d5f1c0d651c0da31c0d791c0d8d1c0d8f1c0d831c0da51c0d871c0d8b1c0d991c0d9b1c0d911c0d7f1c0d951c0d891c0d851c0d7d1c0d931c0d811c0d971c0dab1c0da91c0da71c0daf1c0db11c0dad1c0db51c0db31c0db71c0db91c0dbb1c0d")\ X(126 , 1, KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "01522d29522d09522d27522d13522d0d522d1f522d1d522d07522d25522d05522d0b522d11522d17522d21522d19522d0f522d2b522d1b522d23522d15522d7b522d2d522d2f522d03522d31522d33522d35522d3b522d3d522d39522d37522d9d522d41522d3f522d4d522d43522d4f522d4b522d47522d55522d45522d5d522d5b522d69522d63522d67522d49522d73522d6d522d51522d9f522d77522da1522d53522d59522d57522d6f522d61522d6b522d71522d75522d5f522d65522da3522d79522d8d522d8f522d83522da5522d87522d8b522d99522d9b522d91522d7f522d95522d89522d85522d7d522d93522d81522d97522dab522da9522da7522daf522db1522dad522db5522db3522db7522db9522dbb522d")\ - X( 127, 1, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00522d28522d08522d26522d12522d0c522d1e522d1c522d06522d24522d04522d0a522d10522d16522d20522d18522d0e522d2a522d1a522d22522d14522d7a522d2c522d2e522d02522d30522d32522d34522d3a522d3c522d38522d36522d9c522d40522d3e522d4c522d42522d4e522d4a522d46522d54522d44522d5c522d5a522d68522d62522d66522d48522d72522d6c522d50522d9e522d76522da0522d52522d58522d56522d6e522d60522d6a522d70522d74522d5e522d64522da2522d78522d8c522d8e522d82522da4522d86522d8a522d98522d9a522d90522d7e522d94522d88522d84522d7c522d92522d80522d96522daa522da8522da6522dae522db0522dac522db4522db2522db6522db8522dba522d")\ + X( 127, 1, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "0080282880280880282680281280280c80281e80281c80280680282480280480280a80281080281680282080281880280e80282a80281a80282280281480287a80282c80282e80280280283080283280283480283a80283c80283880283680289c80284080283e80284c80284280284e80284a80284680285480284480285c80285a80286880286280286680284880287280286c80285080289e8028768028a080285280285880285680286e80286080286a80287080287480285e8028648028a280287880288c80288e8028828028a480288680288a80289880289a80289080287e80289480288880288480287c8028928028808028968028aa8028a88028a68028ae8028b08028ac8028b48028b28028b68028b88028ba8028")\ X(128 , 1, KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "01532e29532e09532e27532e13532e0d532e1f532e1d532e07532e25532e05532e0b532e11532e17532e21532e19532e0f532e2b532e1b532e23532e15532e7b532e2d532e2f532e03532e31532e33532e35532e3b532e3d532e39532e37532e9d532e41532e3f532e4d532e43532e4f532e4b532e47532e55532e45532e5d532e5b532e69532e63532e67532e49532e73532e6d532e51532e9f532e77532ea1532e53532e59532e57532e6f532e61532e6b532e71532e75532e5f532e65532ea3532e79532e8d532e8f532e83532ea5532e87532e8b532e99532e9b532e91532e7f532e95532e89532e85532e7d532e93532e81532e97532eab532ea9532ea7532eaf532eb1532ead532eb5532eb3532eb7532eb9532ebb532e")\ - X( 129, 1, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00532e28532e08532e26532e12532e0c532e1e532e1c532e06532e24532e04532e0a532e10532e16532e20532e18532e0e532e2a532e1a532e22532e14532e7a532e2c532e2e532e02532e30532e32532e34532e3a532e3c532e38532e36532e9c532e40532e3e532e4c532e42532e4e532e4a532e46532e54532e44532e5c532e5a532e68532e62532e66532e48532e72532e6c532e50532e9e532e76532ea0532e52532e58532e56532e6e532e60532e6a532e70532e74532e5e532e64532ea2532e78532e8c532e8e532e82532ea4532e86532e8a532e98532e9a532e90532e7e532e94532e88532e84532e7c532e92532e80532e96532eaa532ea8532ea6532eae532eb0532eac532eb4532eb2532eb6532eb8532eba532e")\ + X( 129, 1, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "008f23288f23088f23268f23128f230c8f231e8f231c8f23068f23248f23048f230a8f23108f23168f23208f23188f230e8f232a8f231a8f23228f23148f237a8f232c8f232e8f23028f23308f23328f23348f233a8f233c8f23388f23368f239c8f23408f233e8f234c8f23428f234e8f234a8f23468f23548f23448f235c8f235a8f23688f23628f23668f23488f23728f236c8f23508f239e8f23768f23a08f23528f23588f23568f236e8f23608f236a8f23708f23748f235e8f23648f23a28f23788f238c8f238e8f23828f23a48f23868f238a8f23988f239a8f23908f237e8f23948f23888f23848f237c8f23928f23808f23968f23aa8f23a88f23a68f23ae8f23b08f23ac8f23b48f23b28f23b68f23b88f23ba8f23")\ X(130 , 1, KeyClear , "Clear" , "" , 0 , 1 , 'E', -1 , -1 , "")\ - X( 131, 1, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "004c0c284c0c084c0c264c0c124c0c0c4c0c1e4c0c1c4c0c064c0c244c0c044c0c0a4c0c104c0c164c0c204c0c184c0c0e4c0c2a4c0c1a4c0c224c0c144c0c7a4c0c2c4c0c2e4c0c024c0c304c0c324c0c344c0c3a4c0c3c4c0c384c0c364c0c9c4c0c404c0c3e4c0c4c4c0c424c0c4e4c0c4a4c0c464c0c544c0c444c0c5c4c0c5a4c0c684c0c624c0c664c0c484c0c724c0c6c4c0c504c0c9e4c0c764c0ca04c0c524c0c584c0c564c0c6e4c0c604c0c6a4c0c704c0c744c0c5e4c0c644c0ca24c0c784c0c8c4c0c8e4c0c824c0ca44c0c864c0c8a4c0c984c0c9a4c0c904c0c7e4c0c944c0c884c0c844c0c7c4c0c924c0c804c0c964c0caa4c0ca84c0ca64c0cae4c0cb04c0cac4c0cb44c0cb24c0cb64c0cb84c0cba4c0c")\ + X( 131, 1, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "00832e28832e08832e26832e12832e0c832e1e832e1c832e06832e24832e04832e0a832e10832e16832e20832e18832e0e832e2a832e1a832e22832e14832e7a832e2c832e2e832e02832e30832e32832e34832e3a832e3c832e38832e36832e9c832e40832e3e832e4c832e42832e4e832e4a832e46832e54832e44832e5c832e5a832e68832e62832e66832e48832e72832e6c832e50832e9e832e76832ea0832e52832e58832e56832e6e832e60832e6a832e70832e74832e5e832e64832ea2832e78832e8c832e8e832e82832ea4832e86832e8a832e98832e9a832e90832e7e832e94832e88832e84832e7c832e92832e80832e96832eaa832ea8832ea6832eae832eb0832eac832eb4832eb2832eb6832eb8832eba832e")\ X(132 , 1, KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0149212949210949212749211349210d49211f49211d49210749212549210549210b49211149211749212149211949210f49212b49211b49212349211549217b49212d49212f49210349213149213349213549213b49213d49213949213749219d49214149213f49214d49214349214f49214b49214749215549214549215d49215b49216949216349216749214949217349216d49215149219f4921774921a149215349215949215749216f49216149216b49217149217549215f4921654921a349217949218d49218f4921834921a549218749218b49219949219b49219149217f49219549218949218549217d4921934921814921974921ab4921a94921a74921af4921b14921ad4921b54921b34921b74921b94921bb4921")\ - X( 133, 1, NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0049212849210849212649211249210c49211e49211c49210649212449210449210a49211049211649212049211849210e49212a49211a49212249211449217a49212c49212e49210249213049213249213449213a49213c49213849213649219c49214049213e49214c49214249214e49214a49214649215449214449215c49215a49216849216249216649214849217249216c49215049219e4921764921a049215249215849215649216e49216049216a49217049217449215e4921644921a249217849218c49218e4921824921a449218649218a49219849219a49219049217e49219449218849218449217c4921924921804921964921aa4921a84921a64921ae4921b04921ac4921b44921b24921b64921b84921ba4921")\ + X( 133, 1, NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0089212889210889212689211289210c89211e89211c89210689212489210489210a89211089211689212089211889210e89212a89211a89212289211489217a89212c89212e89210289213089213289213489213a89213c89213889213689219c89214089213e89214c89214289214e89214a89214689215489214489215c89215a89216889216289216689214889217289216c89215089219e8921768921a089215289215889215689216e89216089216a89217089217489215e8921648921a289217889218c89218e8921828921a489218689218a89219889219a89219089217e89219489218889218489217c8921928921808921968921aa8921a88921a68921ae8921b08921ac8921b48921b28921b68921b88921ba8921")\ X(134 , 1, KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0151222951220951222751221351220d51221f51221d51220751222551220551220b51221151221751222151221951220f51222b51221b51222351221551227b51222d51222f51220351223151223351223551223b51223d51223951223751229d51224151223f51224d51224351224f51224b51224751225551224551225d51225b51226951226351226751224951227351226d51225151229f5122775122a151225351225951225751226f51226151226b51227151227551225f5122655122a351227951228d51228f5122835122a551228751228b51229951229b51229151227f51229551228951228551227d5122935122815122975122ab5122a95122a75122af5122b15122ad5122b55122b35122b75122b95122bb5122")\ - X( 135, 1, NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0051222851220851222651221251220c51221e51221c51220651222451220451220a51221051221651222051221851220e51222a51221a51222251221451227a51222c51222e51220251223051223251223451223a51223c51223851223651229c51224051223e51224c51224251224e51224a51224651225451224451225c51225a51226851226251226651224851227251226c51225051229e5122765122a051225251225851225651226e51226051226a51227051227451225e5122645122a251227851228c51228e5122825122a451228651228a51229851229a51229051227e51229451228851228451227c5122925122805122965122aa5122a85122a65122ae5122b05122ac5122b45122b25122b65122b85122ba5122")\ + X( 135, 1, NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0081222881220881222681221281220c81221e81221c81220681222481220481220a81221081221681222081221881220e81222a81221a81222281221481227a81222c81222e81220281223081223281223481223a81223c81223881223681229c81224081223e81224c81224281224e81224a81224681225481224481225c81225a81226881226281226681224881227281226c81225081229e8122768122a081225281225881225681226e81226081226a81227081227481225e8122648122a281227881228c81228e8122828122a481228681228a81229881229a81229081227e81229481228881228481227c8122928122808122968122aa8122a88122a68122ae8122b08122ac8122b48122b28122b68122b88122ba8122")\ X(136 , 1, KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0147242947240947242747241347240d47241f47241d47240747242547240547240b47241147241747242147241947240f47242b47241b47242347241547247b47242d47242f47240347243147243347243547243b47243d47243947243747249d47244147243f47244d47244347244f47244b47244747245547244547245d47245b47246947246347246747244947247347246d47245147249f4724774724a147245347245947245747246f47246147246b47247147247547245f4724654724a347247947248d47248f4724834724a547248747248b47249947249b47249147247f47249547248947248547247d4724934724814724974724ab4724a94724a74724af4724b14724ad4724b54724b34724b74724b94724bb4724")\ - X( 137, 1, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0047242847240847242647241247240c47241e47241c47240647242447240447240a47241047241647242047241847240e47242a47241a47242247241447247a47242c47242e47240247243047243247243447243a47243c47243847243647249c47244047243e47244c47244247244e47244a47244647245447244447245c47245a47246847246247246647244847247247246c47245047249e4724764724a047245247245847245647246e47246047246a47247047247447245e4724644724a247247847248c47248e4724824724a447248647248a47249847249a47249047247e47249447248847248447247c4724924724804724964724aa4724a84724a64724ae4724b04724ac4724b44724b24724b64724b84724ba4724")\ + X( 137, 1, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "00822d28822d08822d26822d12822d0c822d1e822d1c822d06822d24822d04822d0a822d10822d16822d20822d18822d0e822d2a822d1a822d22822d14822d7a822d2c822d2e822d02822d30822d32822d34822d3a822d3c822d38822d36822d9c822d40822d3e822d4c822d42822d4e822d4a822d46822d54822d44822d5c822d5a822d68822d62822d66822d48822d72822d6c822d50822d9e822d76822da0822d52822d58822d56822d6e822d60822d6a822d70822d74822d5e822d64822da2822d78822d8c822d8e822d82822da4822d86822d8a822d98822d9a822d90822d7e822d94822d88822d84822d7c822d92822d80822d96822daa822da8822da6822dae822db0822dac822db4822db2822db6822db8822dba822d")\ X(138 , 1, KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "014f23294f23094f23274f23134f230d4f231f4f231d4f23074f23254f23054f230b4f23114f23174f23214f23194f230f4f232b4f231b4f23234f23154f237b4f232d4f232f4f23034f23314f23334f23354f233b4f233d4f23394f23374f239d4f23414f233f4f234d4f23434f234f4f234b4f23474f23554f23454f235d4f235b4f23694f23634f23674f23494f23734f236d4f23514f239f4f23774f23a14f23534f23594f23574f236f4f23614f236b4f23714f23754f235f4f23654f23a34f23794f238d4f238f4f23834f23a54f23874f238b4f23994f239b4f23914f237f4f23954f23894f23854f237d4f23934f23814f23974f23ab4f23a94f23a74f23af4f23b14f23ad4f23b54f23b34f23b74f23b94f23bb4f23")\ - X( 139, 1, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "004f23284f23084f23264f23124f230c4f231e4f231c4f23064f23244f23044f230a4f23104f23164f23204f23184f230e4f232a4f231a4f23224f23144f237a4f232c4f232e4f23024f23304f23324f23344f233a4f233c4f23384f23364f239c4f23404f233e4f234c4f23424f234e4f234a4f23464f23544f23444f235c4f235a4f23684f23624f23664f23484f23724f236c4f23504f239e4f23764f23a04f23524f23584f23564f236e4f23604f236a4f23704f23744f235e4f23644f23a24f23784f238c4f238e4f23824f23a44f23864f238a4f23984f239a4f23904f237e4f23944f23884f23844f237c4f23924f23804f23964f23aa4f23a84f23a64f23ae4f23b04f23ac4f23b44f23b24f23b64f23b84f23ba4f23")\ + X( 139, 1, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "0087242887240887242687241287240c87241e87241c87240687242487240487240a87241087241687242087241887240e87242a87241a87242287241487247a87242c87242e87240287243087243287243487243a87243c87243887243687249c87244087243e87244c87244287244e87244a87244687245487244487245c87245a87246887246287246687244887247287246c87245087249e8724768724a087245287245887245687246e87246087246a87247087247487245e8724648724a287247887248c87248e8724828724a487248687248a87249887249a87249087247e87249487248887248487247c8724928724808724968724aa8724a88724a68724ae8724b08724ac8724b48724b28724b68724b88724ba8724")\ X(140 , 1, KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "014b25294b25094b25274b25134b250d4b251f4b251d4b25074b25254b25054b250b4b25114b25174b25214b25194b250f4b252b4b251b4b25234b25154b257b4b252d4b252f4b25034b25314b25334b25354b253b4b253d4b25394b25374b259d4b25414b253f4b254d4b25434b254f4b254b4b25474b25554b25454b255d4b255b4b25694b25634b25674b25494b25734b256d4b25514b259f4b25774b25a14b25534b25594b25574b256f4b25614b256b4b25714b25754b255f4b25654b25a34b25794b258d4b258f4b25834b25a54b25874b258b4b25994b259b4b25914b257f4b25954b25894b25854b257d4b25934b25814b25974b25ab4b25a94b25a74b25af4b25b14b25ad4b25b54b25b34b25b74b25b94b25bb4b25")\ - X( 141, 1, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "004b25284b25084b25264b25124b250c4b251e4b251c4b25064b25244b25044b250a4b25104b25164b25204b25184b250e4b252a4b251a4b25224b25144b257a4b252c4b252e4b25024b25304b25324b25344b253a4b253c4b25384b25364b259c4b25404b253e4b254c4b25424b254e4b254a4b25464b25544b25444b255c4b255a4b25684b25624b25664b25484b25724b256c4b25504b259e4b25764b25a04b25524b25584b25564b256e4b25604b256a4b25704b25744b255e4b25644b25a24b25784b258c4b258e4b25824b25a44b25864b258a4b25984b259a4b25904b257e4b25944b25884b25844b257c4b25924b25804b25964b25aa4b25a84b25a64b25ae4b25b04b25ac4b25b44b25b24b25b64b25b84b25ba4b25")\ + X( 141, 1, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "008d27288d27088d27268d27128d270c8d271e8d271c8d27068d27248d27048d270a8d27108d27168d27208d27188d270e8d272a8d271a8d27228d27148d277a8d272c8d272e8d27028d27308d27328d27348d273a8d273c8d27388d27368d279c8d27408d273e8d274c8d27428d274e8d274a8d27468d27548d27448d275c8d275a8d27688d27628d27668d27488d27728d276c8d27508d279e8d27768d27a08d27528d27588d27568d276e8d27608d276a8d27708d27748d275e8d27648d27a28d27788d278c8d278e8d27828d27a48d27868d278a8d27988d279a8d27908d277e8d27948d27888d27848d277c8d27928d27808d27968d27aa8d27a88d27a68d27ae8d27b08d27ac8d27b48d27b28d27b68d27b88d27ba8d27")\ X(142 , 1, KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "014d27294d27094d27274d27134d270d4d271f4d271d4d27074d27254d27054d270b4d27114d27174d27214d27194d270f4d272b4d271b4d27234d27154d277b4d272d4d272f4d27034d27314d27334d27354d273b4d273d4d27394d27374d279d4d27414d273f4d274d4d27434d274f4d274b4d27474d27554d27454d275d4d275b4d27694d27634d27674d27494d27734d276d4d27514d279f4d27774d27a14d27534d27594d27574d276f4d27614d276b4d27714d27754d275f4d27654d27a34d27794d278d4d278f4d27834d27a54d27874d278b4d27994d279b4d27914d277f4d27954d27894d27854d277d4d27934d27814d27974d27ab4d27a94d27a74d27af4d27b14d27ad4d27b54d27b34d27b74d27b94d27bb4d27")\ - X( 143, 1, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "004d27284d27084d27264d27124d270c4d271e4d271c4d27064d27244d27044d270a4d27104d27164d27204d27184d270e4d272a4d271a4d27224d27144d277a4d272c4d272e4d27024d27304d27324d27344d273a4d273c4d27384d27364d279c4d27404d273e4d274c4d27424d274e4d274a4d27464d27544d27444d275c4d275a4d27684d27624d27664d27484d27724d276c4d27504d279e4d27764d27a04d27524d27584d27564d276e4d27604d276a4d27704d27744d275e4d27644d27a24d27784d278c4d278e4d27824d27a44d27864d278a4d27984d279a4d27904d277e4d27944d27884d27844d277c4d27924d27804d27964d27aa4d27a84d27a64d27ae4d27b04d27ac4d27b44d27b24d27b64d27b84d27ba4d27")\ + X( 143, 1, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "0088262888260888262688261288260c88261e88261c88260688262488260488260a88261088261688262088261888260e88262a88261a88262288261488267a88262c88262e88260288263088263288263488263a88263c88263888263688269c88264088263e88264c88264288264e88264a88264688265488264488265c88265a88266888266288266688264888267288266c88265088269e8826768826a088265288265888265688266e88266088266a88267088267488265e8826648826a288267888268c88268e8826828826a488268688268a88269888269a88269088267e88269488268888268488267c8826928826808826968826aa8826a88826a68826ae8826b08826ac8826b48826b28826b68826b88826ba8826")\ X(144 , 1, KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0148262948260948262748261348260d48261f48261d48260748262548260548260b48261148261748262148261948260f48262b48261b48262348261548267b48262d48262f48260348263148263348263548263b48263d48263948263748269d48264148263f48264d48264348264f48264b48264748265548264548265d48265b48266948266348266748264948267348266d48265148269f4826774826a148265348265948265748266f48266148266b48267148267548265f4826654826a348267948268d48268f4826834826a548268748268b48269948269b48269148267f48269548268948268548267d4826934826814826974826ab4826a94826a74826af4826b14826ad4826b54826b34826b74826b94826bb4826")\ - X( 145, 1, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0048262848260848262648261248260c48261e48261c48260648262448260448260a48261048261648262048261848260e48262a48261a48262248261448267a48262c48262e48260248263048263248263448263a48263c48263848263648269c48264048263e48264c48264248264e48264a48264648265448264448265c48265a48266848266248266648264848267248266c48265048269e4826764826a048265248265848265648266e48266048266a48267048267448265e4826644826a248267848268c48268e4826824826a448268648268a48269848269a48269048267e48269448268848268448267c4826924826804826964826aa4826a84826a64826ae4826b04826ac4826b44826b24826b64826b84826ba4826")\ + X( 145, 1, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "008c0c288c0c088c0c268c0c128c0c0c8c0c1e8c0c1c8c0c068c0c248c0c048c0c0a8c0c108c0c168c0c208c0c188c0c0e8c0c2a8c0c1a8c0c228c0c148c0c7a8c0c2c8c0c2e8c0c028c0c308c0c328c0c348c0c3a8c0c3c8c0c388c0c368c0c9c8c0c408c0c3e8c0c4c8c0c428c0c4e8c0c4a8c0c468c0c548c0c448c0c5c8c0c5a8c0c688c0c628c0c668c0c488c0c728c0c6c8c0c508c0c9e8c0c768c0ca08c0c528c0c588c0c568c0c6e8c0c608c0c6a8c0c708c0c748c0c5e8c0c648c0ca28c0c788c0c8c8c0c8e8c0c828c0ca48c0c868c0c8a8c0c988c0c9a8c0c908c0c7e8c0c948c0c888c0c848c0c7c8c0c928c0c808c0c968c0caa8c0ca88c0ca68c0cae8c0cb08c0cac8c0cb48c0cb28c0cb68c0cb88c0cba8c0c")\ X(146 , 1, KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0150282950280950282750281350280d50281f50281d50280750282550280550280b50281150281750282150281950280f50282b50281b50282350281550287b50282d50282f50280350283150283350283550283b50283d50283950283750289d50284150283f50284d50284350284f50284b50284750285550284550285d50285b50286950286350286750284950287350286d50285150289f5028775028a150285350285950285750286f50286150286b50287150287550285f5028655028a350287950288d50288f5028835028a550288750288b50289950289b50289150287f50289550288950288550287d5028935028815028975028ab5028a95028a75028af5028b15028ad5028b55028b35028b75028b95028bb5028")\ - X( 147, 1, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0050282850280850282650281250280c50281e50281c50280650282450280450280a50281050281650282050281850280e50282a50281a50282250281450287a50282c50282e50280250283050283250283450283a50283c50283850283650289c50284050283e50284c50284250284e50284a50284650285450284450285c50285a50286850286250286650284850287250286c50285050289e5028765028a050285250285850285650286e50286050286a50287050287450285e5028645028a250287850288c50288e5028825028a450288650288a50289850289a50289050287e50289450288850288450287c5028925028805028965028aa5028a85028a65028ae5028b05028ac5028b45028b25028b65028b85028ba5028")\ + X( 147, 1, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "008b25288b25088b25268b25128b250c8b251e8b251c8b25068b25248b25048b250a8b25108b25168b25208b25188b250e8b252a8b251a8b25228b25148b257a8b252c8b252e8b25028b25308b25328b25348b253a8b253c8b25388b25368b259c8b25408b253e8b254c8b25428b254e8b254a8b25468b25548b25448b255c8b255a8b25688b25628b25668b25488b25728b256c8b25508b259e8b25768b25a08b25528b25588b25568b256e8b25608b256a8b25708b25748b255e8b25648b25a28b25788b258c8b258e8b25828b25a48b25868b258a8b25988b259a8b25908b257e8b25948b25888b25848b257c8b25928b25808b25968b25aa8b25a88b25a68b25ae8b25b08b25ac8b25b48b25b28b25b68b25b88b25ba8b25")\ X(148 , 1, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30280b30080b30260b30120b300c0b301e0b301c0b30060b30240b30040b300a0b30100b30160b30200b30180b300e0b302a0b301a0b30220b30140b307a0b302c0b302e0b30020b30300b30320b30340b303a0b303c0b30380b30360b309c0b30400b303e0b304c0b30420b304e0b304a0b30460b30540b30440b305c0b305a0b30680b30620b30660b30480b30720b306c0b30500b309e0b30760b30a00b30520b30580b30560b306e0b30600b306a0b30700b30740b305e0b30640b30a20b30780b308c0b308e0b30820b30a40b30860b308a0b30982930980bc09a0b30900b307e0b30940b30880b30840b307c0bc0920b30800b30960b30aa0b30a80b30a60b30ae0b30b00b30ac0b30b40b30b20b30b60b30b82d30ba3430")\ X( 149, 1, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052602852600852602652601252600c52601e52601c52600652602452600452600a52601052601652602052601852600e52602a52601a52602252601452607a52602c52602e52600252603052603252603452603a52603c52603852603652609c52604052603e52604c52604252604e52604a52604652605452604452605c52605a52606852606252606652604852607252606c52605052609e5260765260a052605252605852605652606e52606052606a52607052607452605e5260645260a252607852608c52608e5260825260a452608652608a52609852609a52609052607e52609452608852608452607c5260925260805260965260aa5260a85260a65260ae5260b05260ac5260b45260b25260b65260b85260ba5260")\ X(150 , 1, Key1 , "1" , "1" , 0x31 , 49 , 'u', '1' , '1' , "0002312802310802312602311202310c02311e02311c02310602312402310402310a02311002311602312002311802310e02312a02311a02312202311402317a02312c02312e02310202313002313202313402313a02313c02313802313602319c02314002313e02314c02314202314e02314a02314602315402314402315c02315a02316802316202316602314802317202316c02315002319e0231760231a002315202315802315602316e02316002316a02317002317402315e0231640231a202317802318c02318e0231820231a402318602318a02319802319a02319002317e02319402318802318402317c0231920231800231960231aa0231a80231a60231ae0231b00231ac0231b40231b20231b60231b80231ba0d31")\ @@ -609,22 +609,12 @@ namespace netxs::input while (codes) { auto key_hash = utf::to_int_from_hex_str(codes.pop_front(6)) >> 8; - //if (m[key_hash]) log("key duplicates"); + if (m[key_hash]) log("key duplicates"); // It won't compile if collide. m[key_hash] = (si16)KeyId; } }; #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ - {\ - auto codes = qiew{ PhysicalCode };\ - while (codes)\ - {\ - auto key_hash = utf::to_int_from_hex_str(codes.pop_front(6)) >> 8;\ - if (m[key_hash]) m[key_hash] = (si16)0xff;\ - else m[key_hash] = (si16)KeyId;\ - }\ - } - //if (m[key_hash]) log("key duplicates"); - //fill(KeyId, qiew{ PhysicalCode }); + fill(KeyId, qiew{ PhysicalCode }); key_list #undef X return m; @@ -658,7 +648,6 @@ namespace netxs::input si32 KKPAscii; si32 KKPCtl; }; - //static auto data = std::array{}; static auto data = std::array{}; return data[std::clamp(keycode, 0, input::key::lastKey - 1)]; } @@ -2894,14 +2883,17 @@ namespace netxs::input default: break; } } - auto xlat(si32 scancod, bool extflag, si32 keymod, si32 xlayout, si32 klid_fallback) + auto xlat(si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 klid_fallback) { auto klid = input::key::is_layout_supported(xlayout) ? xlayout : klid_fallback; - if (keymod & input::hids::NumLock) + if (!(keymod & input::hids::NumLock) && !extflag + && ((sc >= 0x47 && sc <= 0x49) // 7 8 9 + || (sc >= 0x4B && sc <= 0x4D) // 4 5 6 + || (sc >= 0x4F && sc <= 0x53))) // 1 2 3 // 0->ins .->del { - // + sc = 0x80 | (sc & 0xF); // ala 0x4* -> 0x8* if no numlock } - auto hash = input::key::key_hash(klid, scancod, extflag); + auto hash = input::key::key_hash(klid, sc, extflag); auto keyid = input::key::key_map[hash]; return keyid; } From 9397697f911453c8c8c90f5064e811109a35ebba Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 21:17:07 +0500 Subject: [PATCH 31/71] #943 WIP: Fix numpad hashes --- src/netxs/desktopio/input.hpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 321e903cba..c26a29c363 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -350,27 +350,27 @@ namespace netxs::input X(124 , 1, KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d281c0d081c0d261c0d121c0d0c1c0d1e1c0d1c1c0d061c0d241c0d041c0d0a1c0d101c0d161c0d201c0d181c0d0e1c0d2a1c0d1a1c0d221c0d141c0d7a1c0d2c1c0d2e1c0d021c0d301c0d321c0d341c0d3a1c0d3c1c0d381c0d361c0d9c1c0d401c0d3e1c0d4c1c0d421c0d4e1c0d4a1c0d461c0d541c0d441c0d5c1c0d5a1c0d681c0d621c0d661c0d481c0d721c0d6c1c0d501c0d9e1c0d761c0da01c0d521c0d581c0d561c0d6e1c0d601c0d6a1c0d701c0d741c0d5e1c0d641c0da21c0d781c0d8c1c0d8e1c0d821c0da41c0d861c0d8a1c0d981c0d9a1c0d901c0d7e1c0d941c0d881c0d841c0d7c1c0d921c0d801c0d961c0daa1c0da81c0da61c0dae1c0db01c0dac1c0db41c0db21c0db61c0db81c0dba1c0d")\ X( 125, 1, NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "011c0d291c0d091c0d271c0d131c0d0d1c0d1f1c0d1d1c0d071c0d251c0d051c0d0b1c0d111c0d171c0d211c0d191c0d0f1c0d2b1c0d1b1c0d231c0d151c0d7b1c0d2d1c0d2f1c0d031c0d311c0d331c0d351c0d3b1c0d3d1c0d391c0d371c0d9d1c0d411c0d3f1c0d4d1c0d431c0d4f1c0d4b1c0d471c0d551c0d451c0d5d1c0d5b1c0d691c0d631c0d671c0d491c0d731c0d6d1c0d511c0d9f1c0d771c0da11c0d531c0d591c0d571c0d6f1c0d611c0d6b1c0d711c0d751c0d5f1c0d651c0da31c0d791c0d8d1c0d8f1c0d831c0da51c0d871c0d8b1c0d991c0d9b1c0d911c0d7f1c0d951c0d891c0d851c0d7d1c0d931c0d811c0d971c0dab1c0da91c0da71c0daf1c0db11c0dad1c0db51c0db31c0db71c0db91c0dbb1c0d")\ X(126 , 1, KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "01522d29522d09522d27522d13522d0d522d1f522d1d522d07522d25522d05522d0b522d11522d17522d21522d19522d0f522d2b522d1b522d23522d15522d7b522d2d522d2f522d03522d31522d33522d35522d3b522d3d522d39522d37522d9d522d41522d3f522d4d522d43522d4f522d4b522d47522d55522d45522d5d522d5b522d69522d63522d67522d49522d73522d6d522d51522d9f522d77522da1522d53522d59522d57522d6f522d61522d6b522d71522d75522d5f522d65522da3522d79522d8d522d8f522d83522da5522d87522d8b522d99522d9b522d91522d7f522d95522d89522d85522d7d522d93522d81522d97522dab522da9522da7522daf522db1522dad522db5522db3522db7522db9522dbb522d")\ - X( 127, 1, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "0080282880280880282680281280280c80281e80281c80280680282480280480280a80281080281680282080281880280e80282a80281a80282280281480287a80282c80282e80280280283080283280283480283a80283c80283880283680289c80284080283e80284c80284280284e80284a80284680285480284480285c80285a80286880286280286680284880287280286c80285080289e8028768028a080285280285880285680286e80286080286a80287080287480285e8028648028a280287880288c80288e8028828028a480288680288a80289880289a80289080287e80289480288880288480287c8028928028808028968028aa8028a88028a68028ae8028b08028ac8028b48028b28028b68028b88028ba8028")\ + X( 127, 1, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00822d28822d08822d26822d12822d0c822d1e822d1c822d06822d24822d04822d0a822d10822d16822d20822d18822d0e822d2a822d1a822d22822d14822d7a822d2c822d2e822d02822d30822d32822d34822d3a822d3c822d38822d36822d9c822d40822d3e822d4c822d42822d4e822d4a822d46822d54822d44822d5c822d5a822d68822d62822d66822d48822d72822d6c822d50822d9e822d76822da0822d52822d58822d56822d6e822d60822d6a822d70822d74822d5e822d64822da2822d78822d8c822d8e822d82822da4822d86822d8a822d98822d9a822d90822d7e822d94822d88822d84822d7c822d92822d80822d96822daa822da8822da6822dae822db0822dac822db4822db2822db6822db8822dba822d")\ X(128 , 1, KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "01532e29532e09532e27532e13532e0d532e1f532e1d532e07532e25532e05532e0b532e11532e17532e21532e19532e0f532e2b532e1b532e23532e15532e7b532e2d532e2f532e03532e31532e33532e35532e3b532e3d532e39532e37532e9d532e41532e3f532e4d532e43532e4f532e4b532e47532e55532e45532e5d532e5b532e69532e63532e67532e49532e73532e6d532e51532e9f532e77532ea1532e53532e59532e57532e6f532e61532e6b532e71532e75532e5f532e65532ea3532e79532e8d532e8f532e83532ea5532e87532e8b532e99532e9b532e91532e7f532e95532e89532e85532e7d532e93532e81532e97532eab532ea9532ea7532eaf532eb1532ead532eb5532eb3532eb7532eb9532ebb532e")\ - X( 129, 1, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "008f23288f23088f23268f23128f230c8f231e8f231c8f23068f23248f23048f230a8f23108f23168f23208f23188f230e8f232a8f231a8f23228f23148f237a8f232c8f232e8f23028f23308f23328f23348f233a8f233c8f23388f23368f239c8f23408f233e8f234c8f23428f234e8f234a8f23468f23548f23448f235c8f235a8f23688f23628f23668f23488f23728f236c8f23508f239e8f23768f23a08f23528f23588f23568f236e8f23608f236a8f23708f23748f235e8f23648f23a28f23788f238c8f238e8f23828f23a48f23868f238a8f23988f239a8f23908f237e8f23948f23888f23848f237c8f23928f23808f23968f23aa8f23a88f23a68f23ae8f23b08f23ac8f23b48f23b28f23b68f23b88f23ba8f23")\ + X( 129, 1, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00832e28832e08832e26832e12832e0c832e1e832e1c832e06832e24832e04832e0a832e10832e16832e20832e18832e0e832e2a832e1a832e22832e14832e7a832e2c832e2e832e02832e30832e32832e34832e3a832e3c832e38832e36832e9c832e40832e3e832e4c832e42832e4e832e4a832e46832e54832e44832e5c832e5a832e68832e62832e66832e48832e72832e6c832e50832e9e832e76832ea0832e52832e58832e56832e6e832e60832e6a832e70832e74832e5e832e64832ea2832e78832e8c832e8e832e82832ea4832e86832e8a832e98832e9a832e90832e7e832e94832e88832e84832e7c832e92832e80832e96832eaa832ea8832ea6832eae832eb0832eac832eb4832eb2832eb6832eb8832eba832e")\ X(130 , 1, KeyClear , "Clear" , "" , 0 , 1 , 'E', -1 , -1 , "")\ - X( 131, 1, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "00832e28832e08832e26832e12832e0c832e1e832e1c832e06832e24832e04832e0a832e10832e16832e20832e18832e0e832e2a832e1a832e22832e14832e7a832e2c832e2e832e02832e30832e32832e34832e3a832e3c832e38832e36832e9c832e40832e3e832e4c832e42832e4e832e4a832e46832e54832e44832e5c832e5a832e68832e62832e66832e48832e72832e6c832e50832e9e832e76832ea0832e52832e58832e56832e6e832e60832e6a832e70832e74832e5e832e64832ea2832e78832e8c832e8e832e82832ea4832e86832e8a832e98832e9a832e90832e7e832e94832e88832e84832e7c832e92832e80832e96832eaa832ea8832ea6832eae832eb0832eac832eb4832eb2832eb6832eb8832eba832e")\ + X( 131, 1, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "008c0c288c0c088c0c268c0c128c0c0c8c0c1e8c0c1c8c0c068c0c248c0c048c0c0a8c0c108c0c168c0c208c0c188c0c0e8c0c2a8c0c1a8c0c228c0c148c0c7a8c0c2c8c0c2e8c0c028c0c308c0c328c0c348c0c3a8c0c3c8c0c388c0c368c0c9c8c0c408c0c3e8c0c4c8c0c428c0c4e8c0c4a8c0c468c0c548c0c448c0c5c8c0c5a8c0c688c0c628c0c668c0c488c0c728c0c6c8c0c508c0c9e8c0c768c0ca08c0c528c0c588c0c568c0c6e8c0c608c0c6a8c0c708c0c748c0c5e8c0c648c0ca28c0c788c0c8c8c0c8e8c0c828c0ca48c0c868c0c8a8c0c988c0c9a8c0c908c0c7e8c0c948c0c888c0c848c0c7c8c0c928c0c808c0c968c0caa8c0ca88c0ca68c0cae8c0cb08c0cac8c0cb48c0cb28c0cb68c0cb88c0cba8c0c")\ X(132 , 1, KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0149212949210949212749211349210d49211f49211d49210749212549210549210b49211149211749212149211949210f49212b49211b49212349211549217b49212d49212f49210349213149213349213549213b49213d49213949213749219d49214149213f49214d49214349214f49214b49214749215549214549215d49215b49216949216349216749214949217349216d49215149219f4921774921a149215349215949215749216f49216149216b49217149217549215f4921654921a349217949218d49218f4921834921a549218749218b49219949219b49219149217f49219549218949218549217d4921934921814921974921ab4921a94921a74921af4921b14921ad4921b54921b34921b74921b94921bb4921")\ X( 133, 1, NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0089212889210889212689211289210c89211e89211c89210689212489210489210a89211089211689212089211889210e89212a89211a89212289211489217a89212c89212e89210289213089213289213489213a89213c89213889213689219c89214089213e89214c89214289214e89214a89214689215489214489215c89215a89216889216289216689214889217289216c89215089219e8921768921a089215289215889215689216e89216089216a89217089217489215e8921648921a289217889218c89218e8921828921a489218689218a89219889219a89219089217e89219489218889218489217c8921928921808921968921aa8921a88921a68921ae8921b08921ac8921b48921b28921b68921b88921ba8921")\ X(134 , 1, KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0151222951220951222751221351220d51221f51221d51220751222551220551220b51221151221751222151221951220f51222b51221b51222351221551227b51222d51222f51220351223151223351223551223b51223d51223951223751229d51224151223f51224d51224351224f51224b51224751225551224551225d51225b51226951226351226751224951227351226d51225151229f5122775122a151225351225951225751226f51226151226b51227151227551225f5122655122a351227951228d51228f5122835122a551228751228b51229951229b51229151227f51229551228951228551227d5122935122815122975122ab5122a95122a75122af5122b15122ad5122b55122b35122b75122b95122bb5122")\ X( 135, 1, NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0081222881220881222681221281220c81221e81221c81220681222481220481220a81221081221681222081221881220e81222a81221a81222281221481227a81222c81222e81220281223081223281223481223a81223c81223881223681229c81224081223e81224c81224281224e81224a81224681225481224481225c81225a81226881226281226681224881227281226c81225081229e8122768122a081225281225881225681226e81226081226a81227081227481225e8122648122a281227881228c81228e8122828122a481228681228a81229881229a81229081227e81229481228881228481227c8122928122808122968122aa8122a88122a68122ae8122b08122ac8122b48122b28122b68122b88122ba8122")\ X(136 , 1, KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0147242947240947242747241347240d47241f47241d47240747242547240547240b47241147241747242147241947240f47242b47241b47242347241547247b47242d47242f47240347243147243347243547243b47243d47243947243747249d47244147243f47244d47244347244f47244b47244747245547244547245d47245b47246947246347246747244947247347246d47245147249f4724774724a147245347245947245747246f47246147246b47247147247547245f4724654724a347247947248d47248f4724834724a547248747248b47249947249b47249147247f47249547248947248547247d4724934724814724974724ab4724a94724a74724af4724b14724ad4724b54724b34724b74724b94724bb4724")\ - X( 137, 1, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "00822d28822d08822d26822d12822d0c822d1e822d1c822d06822d24822d04822d0a822d10822d16822d20822d18822d0e822d2a822d1a822d22822d14822d7a822d2c822d2e822d02822d30822d32822d34822d3a822d3c822d38822d36822d9c822d40822d3e822d4c822d42822d4e822d4a822d46822d54822d44822d5c822d5a822d68822d62822d66822d48822d72822d6c822d50822d9e822d76822da0822d52822d58822d56822d6e822d60822d6a822d70822d74822d5e822d64822da2822d78822d8c822d8e822d82822da4822d86822d8a822d98822d9a822d90822d7e822d94822d88822d84822d7c822d92822d80822d96822daa822da8822da6822dae822db0822dac822db4822db2822db6822db8822dba822d")\ + X( 137, 1, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0087242887240887242687241287240c87241e87241c87240687242487240487240a87241087241687242087241887240e87242a87241a87242287241487247a87242c87242e87240287243087243287243487243a87243c87243887243687249c87244087243e87244c87244287244e87244a87244687245487244487245c87245a87246887246287246687244887247287246c87245087249e8724768724a087245287245887245687246e87246087246a87247087247487245e8724648724a287247887248c87248e8724828724a487248687248a87249887249a87249087247e87249487248887248487247c8724928724808724968724aa8724a88724a68724ae8724b08724ac8724b48724b28724b68724b88724ba8724")\ X(138 , 1, KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "014f23294f23094f23274f23134f230d4f231f4f231d4f23074f23254f23054f230b4f23114f23174f23214f23194f230f4f232b4f231b4f23234f23154f237b4f232d4f232f4f23034f23314f23334f23354f233b4f233d4f23394f23374f239d4f23414f233f4f234d4f23434f234f4f234b4f23474f23554f23454f235d4f235b4f23694f23634f23674f23494f23734f236d4f23514f239f4f23774f23a14f23534f23594f23574f236f4f23614f236b4f23714f23754f235f4f23654f23a34f23794f238d4f238f4f23834f23a54f23874f238b4f23994f239b4f23914f237f4f23954f23894f23854f237d4f23934f23814f23974f23ab4f23a94f23a74f23af4f23b14f23ad4f23b54f23b34f23b74f23b94f23bb4f23")\ - X( 139, 1, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "0087242887240887242687241287240c87241e87241c87240687242487240487240a87241087241687242087241887240e87242a87241a87242287241487247a87242c87242e87240287243087243287243487243a87243c87243887243687249c87244087243e87244c87244287244e87244a87244687245487244487245c87245a87246887246287246687244887247287246c87245087249e8724768724a087245287245887245687246e87246087246a87247087247487245e8724648724a287247887248c87248e8724828724a487248687248a87249887249a87249087247e87249487248887248487247c8724928724808724968724aa8724a88724a68724ae8724b08724ac8724b48724b28724b68724b88724ba8724")\ + X( 139, 1, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "008f23288f23088f23268f23128f230c8f231e8f231c8f23068f23248f23048f230a8f23108f23168f23208f23188f230e8f232a8f231a8f23228f23148f237a8f232c8f232e8f23028f23308f23328f23348f233a8f233c8f23388f23368f239c8f23408f233e8f234c8f23428f234e8f234a8f23468f23548f23448f235c8f235a8f23688f23628f23668f23488f23728f236c8f23508f239e8f23768f23a08f23528f23588f23568f236e8f23608f236a8f23708f23748f235e8f23648f23a28f23788f238c8f238e8f23828f23a48f23868f238a8f23988f239a8f23908f237e8f23948f23888f23848f237c8f23928f23808f23968f23aa8f23a88f23a68f23ae8f23b08f23ac8f23b48f23b28f23b68f23b88f23ba8f23")\ X(140 , 1, KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "014b25294b25094b25274b25134b250d4b251f4b251d4b25074b25254b25054b250b4b25114b25174b25214b25194b250f4b252b4b251b4b25234b25154b257b4b252d4b252f4b25034b25314b25334b25354b253b4b253d4b25394b25374b259d4b25414b253f4b254d4b25434b254f4b254b4b25474b25554b25454b255d4b255b4b25694b25634b25674b25494b25734b256d4b25514b259f4b25774b25a14b25534b25594b25574b256f4b25614b256b4b25714b25754b255f4b25654b25a34b25794b258d4b258f4b25834b25a54b25874b258b4b25994b259b4b25914b257f4b25954b25894b25854b257d4b25934b25814b25974b25ab4b25a94b25a74b25af4b25b14b25ad4b25b54b25b34b25b74b25b94b25bb4b25")\ - X( 141, 1, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "008d27288d27088d27268d27128d270c8d271e8d271c8d27068d27248d27048d270a8d27108d27168d27208d27188d270e8d272a8d271a8d27228d27148d277a8d272c8d272e8d27028d27308d27328d27348d273a8d273c8d27388d27368d279c8d27408d273e8d274c8d27428d274e8d274a8d27468d27548d27448d275c8d275a8d27688d27628d27668d27488d27728d276c8d27508d279e8d27768d27a08d27528d27588d27568d276e8d27608d276a8d27708d27748d275e8d27648d27a28d27788d278c8d278e8d27828d27a48d27868d278a8d27988d279a8d27908d277e8d27948d27888d27848d277c8d27928d27808d27968d27aa8d27a88d27a68d27ae8d27b08d27ac8d27b48d27b28d27b68d27b88d27ba8d27")\ + X( 141, 1, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "008b25288b25088b25268b25128b250c8b251e8b251c8b25068b25248b25048b250a8b25108b25168b25208b25188b250e8b252a8b251a8b25228b25148b257a8b252c8b252e8b25028b25308b25328b25348b253a8b253c8b25388b25368b259c8b25408b253e8b254c8b25428b254e8b254a8b25468b25548b25448b255c8b255a8b25688b25628b25668b25488b25728b256c8b25508b259e8b25768b25a08b25528b25588b25568b256e8b25608b256a8b25708b25748b255e8b25648b25a28b25788b258c8b258e8b25828b25a48b25868b258a8b25988b259a8b25908b257e8b25948b25888b25848b257c8b25928b25808b25968b25aa8b25a88b25a68b25ae8b25b08b25ac8b25b48b25b28b25b68b25b88b25ba8b25")\ X(142 , 1, KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "014d27294d27094d27274d27134d270d4d271f4d271d4d27074d27254d27054d270b4d27114d27174d27214d27194d270f4d272b4d271b4d27234d27154d277b4d272d4d272f4d27034d27314d27334d27354d273b4d273d4d27394d27374d279d4d27414d273f4d274d4d27434d274f4d274b4d27474d27554d27454d275d4d275b4d27694d27634d27674d27494d27734d276d4d27514d279f4d27774d27a14d27534d27594d27574d276f4d27614d276b4d27714d27754d275f4d27654d27a34d27794d278d4d278f4d27834d27a54d27874d278b4d27994d279b4d27914d277f4d27954d27894d27854d277d4d27934d27814d27974d27ab4d27a94d27a74d27af4d27b14d27ad4d27b54d27b34d27b74d27b94d27bb4d27")\ - X( 143, 1, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "0088262888260888262688261288260c88261e88261c88260688262488260488260a88261088261688262088261888260e88262a88261a88262288261488267a88262c88262e88260288263088263288263488263a88263c88263888263688269c88264088263e88264c88264288264e88264a88264688265488264488265c88265a88266888266288266688264888267288266c88265088269e8826768826a088265288265888265688266e88266088266a88267088267488265e8826648826a288267888268c88268e8826828826a488268688268a88269888269a88269088267e88269488268888268488267c8826928826808826968826aa8826a88826a68826ae8826b08826ac8826b48826b28826b68826b88826ba8826")\ + X( 143, 1, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "008d27288d27088d27268d27128d270c8d271e8d271c8d27068d27248d27048d270a8d27108d27168d27208d27188d270e8d272a8d271a8d27228d27148d277a8d272c8d272e8d27028d27308d27328d27348d273a8d273c8d27388d27368d279c8d27408d273e8d274c8d27428d274e8d274a8d27468d27548d27448d275c8d275a8d27688d27628d27668d27488d27728d276c8d27508d279e8d27768d27a08d27528d27588d27568d276e8d27608d276a8d27708d27748d275e8d27648d27a28d27788d278c8d278e8d27828d27a48d27868d278a8d27988d279a8d27908d277e8d27948d27888d27848d277c8d27928d27808d27968d27aa8d27a88d27a68d27ae8d27b08d27ac8d27b48d27b28d27b68d27b88d27ba8d27")\ X(144 , 1, KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0148262948260948262748261348260d48261f48261d48260748262548260548260b48261148261748262148261948260f48262b48261b48262348261548267b48262d48262f48260348263148263348263548263b48263d48263948263748269d48264148263f48264d48264348264f48264b48264748265548264548265d48265b48266948266348266748264948267348266d48265148269f4826774826a148265348265948265748266f48266148266b48267148267548265f4826654826a348267948268d48268f4826834826a548268748268b48269948269b48269148267f48269548268948268548267d4826934826814826974826ab4826a94826a74826af4826b14826ad4826b54826b34826b74826b94826bb4826")\ - X( 145, 1, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "008c0c288c0c088c0c268c0c128c0c0c8c0c1e8c0c1c8c0c068c0c248c0c048c0c0a8c0c108c0c168c0c208c0c188c0c0e8c0c2a8c0c1a8c0c228c0c148c0c7a8c0c2c8c0c2e8c0c028c0c308c0c328c0c348c0c3a8c0c3c8c0c388c0c368c0c9c8c0c408c0c3e8c0c4c8c0c428c0c4e8c0c4a8c0c468c0c548c0c448c0c5c8c0c5a8c0c688c0c628c0c668c0c488c0c728c0c6c8c0c508c0c9e8c0c768c0ca08c0c528c0c588c0c568c0c6e8c0c608c0c6a8c0c708c0c748c0c5e8c0c648c0ca28c0c788c0c8c8c0c8e8c0c828c0ca48c0c868c0c8a8c0c988c0c9a8c0c908c0c7e8c0c948c0c888c0c848c0c7c8c0c928c0c808c0c968c0caa8c0ca88c0ca68c0cae8c0cb08c0cac8c0cb48c0cb28c0cb68c0cb88c0cba8c0c")\ + X( 145, 1, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0088262888260888262688261288260c88261e88261c88260688262488260488260a88261088261688262088261888260e88262a88261a88262288261488267a88262c88262e88260288263088263288263488263a88263c88263888263688269c88264088263e88264c88264288264e88264a88264688265488264488265c88265a88266888266288266688264888267288266c88265088269e8826768826a088265288265888265688266e88266088266a88267088267488265e8826648826a288267888268c88268e8826828826a488268688268a88269888269a88269088267e88269488268888268488267c8826928826808826968826aa8826a88826a68826ae8826b08826ac8826b48826b28826b68826b88826ba8826")\ X(146 , 1, KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0150282950280950282750281350280d50281f50281d50280750282550280550280b50281150281750282150281950280f50282b50281b50282350281550287b50282d50282f50280350283150283350283550283b50283d50283950283750289d50284150283f50284d50284350284f50284b50284750285550284550285d50285b50286950286350286750284950287350286d50285150289f5028775028a150285350285950285750286f50286150286b50287150287550285f5028655028a350287950288d50288f5028835028a550288750288b50289950289b50289150287f50289550288950288550287d5028935028815028975028ab5028a95028a75028af5028b15028ad5028b55028b35028b75028b95028bb5028")\ - X( 147, 1, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "008b25288b25088b25268b25128b250c8b251e8b251c8b25068b25248b25048b250a8b25108b25168b25208b25188b250e8b252a8b251a8b25228b25148b257a8b252c8b252e8b25028b25308b25328b25348b253a8b253c8b25388b25368b259c8b25408b253e8b254c8b25428b254e8b254a8b25468b25548b25448b255c8b255a8b25688b25628b25668b25488b25728b256c8b25508b259e8b25768b25a08b25528b25588b25568b256e8b25608b256a8b25708b25748b255e8b25648b25a28b25788b258c8b258e8b25828b25a48b25868b258a8b25988b259a8b25908b257e8b25948b25888b25848b257c8b25928b25808b25968b25aa8b25a88b25a68b25ae8b25b08b25ac8b25b48b25b28b25b68b25b88b25ba8b25")\ + X( 147, 1, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0080282880280880282680281280280c80281e80281c80280680282480280480280a80281080281680282080281880280e80282a80281a80282280281480287a80282c80282e80280280283080283280283480283a80283c80283880283680289c80284080283e80284c80284280284e80284a80284680285480284480285c80285a80286880286280286680284880287280286c80285080289e8028768028a080285280285880285680286e80286080286a80287080287480285e8028648028a280287880288c80288e8028828028a480288680288a80289880289a80289080287e80289480288880288480287c8028928028808028968028aa8028a88028a68028ae8028b08028ac8028b48028b28028b68028b88028ba8028")\ X(148 , 1, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30280b30080b30260b30120b300c0b301e0b301c0b30060b30240b30040b300a0b30100b30160b30200b30180b300e0b302a0b301a0b30220b30140b307a0b302c0b302e0b30020b30300b30320b30340b303a0b303c0b30380b30360b309c0b30400b303e0b304c0b30420b304e0b304a0b30460b30540b30440b305c0b305a0b30680b30620b30660b30480b30720b306c0b30500b309e0b30760b30a00b30520b30580b30560b306e0b30600b306a0b30700b30740b305e0b30640b30a20b30780b308c0b308e0b30820b30a40b30860b308a0b30982930980bc09a0b30900b307e0b30940b30880b30840b307c0bc0920b30800b30960b30aa0b30a80b30a60b30ae0b30b00b30ac0b30b40b30b20b30b60b30b82d30ba3430")\ X( 149, 1, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052602852600852602652601252600c52601e52601c52600652602452600452600a52601052601652602052601852600e52602a52601a52602252601452607a52602c52602e52600252603052603252603452603a52603c52603852603652609c52604052603e52604c52604252604e52604a52604652605452604452605c52605a52606852606252606652604852607252606c52605052609e5260765260a052605252605852605652606e52606052606a52607052607452605e5260645260a252607852608c52608e5260825260a452608652608a52609852609a52609052607e52609452608852608452607c5260925260805260965260aa5260a85260a65260ae5260b05260ac5260b45260b25260b65260b85260ba5260")\ X(150 , 1, Key1 , "1" , "1" , 0x31 , 49 , 'u', '1' , '1' , "0002312802310802312602311202310c02311e02311c02310602312402310402310a02311002311602312002311802310e02312a02311a02312202311402317a02312c02312e02310202313002313202313402313a02313c02313802313602319c02314002313e02314c02314202314e02314a02314602315402314402315c02315a02316802316202316602314802317202316c02315002319e0231760231a002315202315802315602316e02316002316a02317002317402315e0231640231a202317802318c02318e0231820231a402318602318a02319802319a02319002317e02319402318802318402317c0231920231800231960231aa0231a80231a60231ae0231b00231ac0231b40231b20231b60231b80231ba0d31")\ From 714e1dd413e93d3d993b872d69d0fec619b47464 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 22:05:24 +0500 Subject: [PATCH 32/71] #943 WIP: Fix CapsLock behavior (shifted/unshited) --- src/netxs/desktopio/gui.hpp | 6 ++++-- src/netxs/desktopio/input.hpp | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index b255b2dbae..fd8653b890 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -5571,14 +5571,16 @@ namespace netxs::gui auto flags = extflag ? 1u : 0u; flags |= 2; // 2 PDT_SHAREABLE (don't touch our thread state). auto vk_un = std::array{}; + vk_un[vkey::capslock] = vkstat[vkey::capslock]; auto rc = ::ToUnicodeEx(virtcod, scancod, vk_un.data(), buf.data(), 8, flags, current_layout); if (rc > 0) { utf::to_utf(buf.data(), rc, unshift); } auto vk_sh = std::array{}; - vk_sh[vkey::shift ] = 0x80; - vk_sh[vkey::lshift] = 0x80; + vk_sh[vkey::capslock] = vkstat[vkey::capslock]; + vk_sh[vkey::shift ] = 0x80; + vk_sh[vkey::lshift ] = 0x80; rc = ::ToUnicodeEx(virtcod, scancod, vk_sh.data(), buf.data(), 8, flags, current_layout); if (rc > 0) { diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index c26a29c363..4bdc7759ff 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -270,6 +270,7 @@ namespace netxs::input // Extended Bit (0 or 1) auto key_hash(si32 klid, si32 scan, bool extflag) { + assert(input::key::supported_klids[input::key::klid_hash(klid)].klid == klid); auto hash = (ui16)((scan & 0xFF) | ((si32)extflag << 8) | (input::key::supported_klids[input::key::klid_hash(klid)].index << 9)); return hash; } @@ -2885,7 +2886,9 @@ namespace netxs::input } auto xlat(si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 klid_fallback) { - auto klid = input::key::is_layout_supported(xlayout) ? xlayout : klid_fallback; + auto klid = input::key::is_layout_supported(xlayout) ? xlayout + : klid_fallback ? klid_fallback + : input::key::latin_klids[0]; if (!(keymod & input::hids::NumLock) && !extflag && ((sc >= 0x47 && sc <= 0x49) // 7 8 9 || (sc >= 0x4B && sc <= 0x4D) // 4 5 6 From 83fd1e437784bd57a2ec1a07a7b79b380f653973 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 22:18:58 +0500 Subject: [PATCH 33/71] #943 WIP: Fix KKP 'Separator' (NumpadPoint) --- src/netxs/desktopio/input.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 4bdc7759ff..82dfdbb13c 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -2890,9 +2890,9 @@ namespace netxs::input : klid_fallback ? klid_fallback : input::key::latin_klids[0]; if (!(keymod & input::hids::NumLock) && !extflag - && ((sc >= 0x47 && sc <= 0x49) // 7 8 9 - || (sc >= 0x4B && sc <= 0x4D) // 4 5 6 - || (sc >= 0x4F && sc <= 0x53))) // 1 2 3 // 0->ins .->del + && ((sc >= 0x47 && sc <= 0x49) // 7 8 9 -> Home Up PgUp + || (sc >= 0x4B && sc <= 0x4D) // 4 5 6 -> Left Clear Right + || (sc >= 0x4F && sc <= 0x53))) // 1 2 3 -> End Down PgDn // 0->Ins .->Del { sc = 0x80 | (sc & 0xF); // ala 0x4* -> 0x8* if no numlock } From 7f7cb3678f23d5eb090b9574eacd76e9be1595d9 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 22:19:34 +0500 Subject: [PATCH 34/71] #943 WIP: Fix KKP 'Separator' (NumpadPoint) --- src/netxs/desktopio/input.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 82dfdbb13c..3cb7f138b7 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -405,7 +405,7 @@ namespace netxs::input X(178 , 1, KeyPeriod , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be2834be0834be2634be1234be0c34be1e34be1c34be0634be2434be0434be0a34be1034be1634be2034be1834be0e34be2a34be1a34be2234be1434be7a34be2c34be2e34be0234be3034be3234be3434be3a34be3c34be3834be3634be9c34be4034be3e34be4c34be4234be4e34be4a34be4634be5434be4434be5c34be5a34be6834be6234be6634be4834be7234be6c34be5034be9e34be7634bea034be5234be5834be5634be6e34be6034be6a34be7034be7434be5e34be6434bea234be7834be8c34be8e34be8234bea434be8634be8a34be9834be9a35be9034be7e34be9434be8834be8434be7c34be9234be8034be9634beb212beb634beb813beba18be")\ X( 179, 1, NumpadDecimal , "." , "." , 0x2E , 57409, 'u', '.' , '.' , "00536e28536e08536e26536e12536e0c536e1e536e1c536e06536e24536e04536e0a536e10536e16536e20536e18536e0e536e2a536e1a536e22536e14536e7a536e2c536e2e536e02536e30536e32536e34536e3a536e3c536e38536e36536e9c536e40536e3e536e4c536e42536e4e536e4a536e46536e54536e44536e5c536e5a536e68536e62536e66536e48536e72536e6c536e50536e9e536e76536ea0536e52536e58536e56536e6e536e60536e6a536e70536e74536e5e536e64536ea2536e78536e8c536e8e536e82536ea4536e86536e8a536e98536e9a536e90536e7e536e94536e88536e84536e7c536e92536e80536e96536eaa536ea8536ea6536eae536eb0536eac536eb4536eb2536eb6536eb8536eba536e")\ X(180 , 1, KeyComma , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "0033bc2833bc0833bc2633bc1233bc0c33bc1e33bc1c33bc0633bc2433bc0433bc0a33bc1033bc1633bc2033bc1833bc0e33bc2a33bc1a33bc2233bc1433bc7a33bc2c33bc2e33bc0233bc3033bc3233bc3433bc3a33bc3c33bc3833bc3633bc9c33bc4033bc3e33bc4c33bc4233bc4e33bc4a33bc4633bc5433bc4433bc5c33bc5a33bc6833bc6233bc6633bc4833bc7233bc6c33bc5033bc9e33bc7633bca033bc5233bc5833bc5633bc6e33bc6033bc6a33bc7033bc7433bc5e33bc6433bca233bc7833bc8c33bc8e33bc8233bca433bc8633bc8a33bc9833bc9a2bbc9033bc7e33bc9433bc8833bc8433bc7c33bc9233bc8033bc9633bcaa32bca832bca632bcae32bcb032bcac32bcb211bcb635bcb82fbcba33bc")\ - X( 181, 1, NumpadPoint , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "007ec2287ec2087ec2267ec2127ec20c7ec21e7ec21c7ec2067ec2247ec2047ec20a7ec2107ec2167ec2207ec2187ec20e7ec22a7ec21a7ec2227ec2147ec27a7ec22c7ec22e7ec2027ec2307ec2327ec2347ec23a7ec23c7ec2387ec2367ec29c7ec2407ec23e7ec24c7ec2427ec24e7ec24a7ec2467ec2547ec2447ec25c7ec25a7ec2687ec2627ec2667ec2487ec2727ec26c7ec2507ec29e7ec2767ec2a07ec2527ec2587ec2567ec26e7ec2607ec26a7ec2707ec2747ec25e7ec2647ec2a27ec2787ec28c7ec28e7ec2827ec2a47ec2867ec28a7ec2987ec29a7ec2907ec27e7ec2947ec2887ec2847ec27c7ec2927ec2807ec2967ec2aa7ec2a87ec2a67ec2ae7ec2b07ec2ac7ec2b47ec2b27ec2b67ec2b87ec2ba7ec2")\ + X( 181, 1, NumpadPoint , "," , "," , 0x2C , 57416, 'u', ',' , ',' , "007ec2287ec2087ec2267ec2127ec20c7ec21e7ec21c7ec2067ec2247ec2047ec20a7ec2107ec2167ec2207ec2187ec20e7ec22a7ec21a7ec2227ec2147ec27a7ec22c7ec22e7ec2027ec2307ec2327ec2347ec23a7ec23c7ec2387ec2367ec29c7ec2407ec23e7ec24c7ec2427ec24e7ec24a7ec2467ec2547ec2447ec25c7ec25a7ec2687ec2627ec2667ec2487ec2727ec26c7ec2507ec29e7ec2767ec2a07ec2527ec2587ec2567ec26e7ec2607ec26a7ec2707ec2747ec25e7ec2647ec2a27ec2787ec28c7ec28e7ec2827ec2a47ec2867ec28a7ec2987ec29a7ec2907ec27e7ec2947ec2887ec2847ec27c7ec2927ec2807ec2967ec2aa7ec2a87ec2a67ec2ae7ec2b07ec2ac7ec2b47ec2b27ec2b67ec2b87ec2ba7ec2")\ X(182 , 1, Colon , ":" , ":" , 0x3A , 58 , 'u', ':' , ':' , "aa34bfa834bfa634bfae34bfb034bfac34bf")\ X(184 , 1, Semicolon , ";" , ";" , 0x3B , 59 , 'u', ';' , ';' , "0027ba2827ba0827ba2627ba1227ba0c27ba1e27ba1c27ba0627ba2427ba0427ba0a27ba1027ba1627ba2027ba1827ba0e27ba2a27ba1a27ba2227ba1427ba7a27ba2c27ba2e27ba0227ba3027ba3227ba3427ba3a27ba3c27ba3827ba3627ba9c27ba4027ba3e27ba4227ba4e35bf4a35bf4627ba4427ba9e29c0a029c0a229c0a429c0aa33bea833bea633beae33beb033beac33beb22cbab81ababa10ba")\ X(186 , 1, TurnedComma , "ʻ" , "ʻ" , 0x02BB, 699 , 'u', -1 , -1 , "2e28de")\ From 958edbb3b15fcf9b75403fc81edf06e6483dfd3e Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 18 Jun 2026 23:49:44 +0500 Subject: [PATCH 35/71] #943 WIP: Implement xlat for win32 console api (not yet complete) --- src/netxs/desktopio/gui.hpp | 47 +------------- src/netxs/desktopio/input.hpp | 116 +++++++++++++++++++++++++++++++--- 2 files changed, 108 insertions(+), 55 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index fd8653b890..8134a7ec5d 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -18,6 +18,7 @@ namespace netxs::gui { namespace e2 = netxs::events::userland::e2; + namespace vkey = netxs::input::vkey; using namespace ui; using bits = netxs::raster>; @@ -3015,52 +3016,6 @@ namespace netxs::gui static constexpr auto tooltip = 1 << (__COUNTER__ - _counter); static constexpr auto all = -1; }; - struct vkey - { - static constexpr auto lbutton = 0x01; // VK_LBUTTON; - static constexpr auto rbutton = 0x02; // VK_RBUTTON; - static constexpr auto mbutton = 0x04; // VK_MBUTTON; - static constexpr auto xbutton1 = 0x05; // VK_XBUTTON1; - static constexpr auto xbutton2 = 0x06; // VK_XBUTTON2; - - static constexpr auto shift = 0x10; // VK_SHIFT; - static constexpr auto control = 0x11; // VK_CONTROL; - static constexpr auto alt = 0x12; // VK_MENU; - static constexpr auto lshift = 0xA0; // VK_LSHIFT; - static constexpr auto rshift = 0xA1; // VK_RSHIFT; - static constexpr auto lcontrol = 0xA2; // VK_LCONTROL; - static constexpr auto rcontrol = 0xA3; // VK_RCONTROL; - static constexpr auto lalt = 0xA4; // VK_LMENU; - static constexpr auto ralt = 0xA5; // VK_RMENU; - static constexpr auto lsuper = 0x5B; // VK_LWIN; - static constexpr auto rsuper = 0x5C; // VK_RWIN; - - static constexpr auto enter = 0x0D; // VK_RETURN; - static constexpr auto left = 0x25; // VK_LEFT; - static constexpr auto up = 0x26; // VK_UP; - static constexpr auto right = 0x27; // VK_RIGHT; - static constexpr auto down = 0x28; // VK_DOWN; - static constexpr auto end = 0x23; // VK_END; - static constexpr auto home = 0x24; // VK_HOME; - - static constexpr auto f11 = 0x7A; // VK_F11; - static constexpr auto f12 = 0x7B; // VK_F12; - - static constexpr auto key_0 = '0'; // VK_0; - - static constexpr auto numlock = 0x90; // VK_NUMLOCK; - static constexpr auto capslock = 0x14; // VK_CAPITAL; - static constexpr auto scrllock = 0x91; // VK_SCROLL; - static constexpr auto kana = 0x15; // VK_KANA; - static constexpr auto oem_loya = 0x95; // VK_OEM_FJ_LOYA; - static constexpr auto oem_roya = 0x96; // VK_OEM_FJ_ROYA; - - static constexpr auto oem_copy = 0xF2; // VK_OEM_COPY; - static constexpr auto oem_auto = 0xF3; // VK_OEM_AUTO; - static constexpr auto oem_enlw = 0xF4; // VK_OEM_ENLW; - - static constexpr auto packet = 0xE7; // VK_PACKET; - }; struct cont { si32 cmd; diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 3cb7f138b7..2c7112dcbe 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -61,6 +61,71 @@ namespace netxs::input namespace events = netxs::events::userland::hids; + namespace vkey + { + static constexpr auto lbutton = 0x01; // VK_LBUTTON + static constexpr auto rbutton = 0x02; // VK_RBUTTON + static constexpr auto mbutton = 0x04; // VK_MBUTTON + static constexpr auto xbutton1 = 0x05; // VK_XBUTTON1 + static constexpr auto xbutton2 = 0x06; // VK_XBUTTON2 + + static constexpr auto shift = 0x10; // VK_SHIFT + static constexpr auto control = 0x11; // VK_CONTROL + static constexpr auto alt = 0x12; // VK_MENU + static constexpr auto lshift = 0xA0; // VK_LSHIFT + static constexpr auto rshift = 0xA1; // VK_RSHIFT + static constexpr auto lcontrol = 0xA2; // VK_LCONTROL + static constexpr auto rcontrol = 0xA3; // VK_RCONTROL + static constexpr auto lalt = 0xA4; // VK_LMENU + static constexpr auto ralt = 0xA5; // VK_RMENU + static constexpr auto lsuper = 0x5B; // VK_LWIN + static constexpr auto rsuper = 0x5C; // VK_RWIN + + static constexpr auto clear = 0x0C; // VK_CLEAR + static constexpr auto enter = 0x0D; // VK_RETURN + static constexpr auto pgup = 0x21; // VK_PRIOR + static constexpr auto pgdn = 0x22; // VK_NEXT + static constexpr auto end = 0x23; // VK_END + static constexpr auto home = 0x24; // VK_HOME + static constexpr auto left = 0x25; // VK_LEFT + static constexpr auto up = 0x26; // VK_UP + static constexpr auto right = 0x27; // VK_RIGHT + static constexpr auto down = 0x28; // VK_DOWN + static constexpr auto insert = 0x2D; // VK_INSERT + static constexpr auto del = 0x2E; // VK_DELETE + static constexpr auto divide = 0x6F; // VK_DIVIDE + + static constexpr auto f11 = 0x7A; // VK_F11 + static constexpr auto f12 = 0x7B; // VK_F12 + + static constexpr auto key_0 = '0'; // VK_0 + + static constexpr auto numlock = 0x90; // VK_NUMLOCK + static constexpr auto capslock = 0x14; // VK_CAPITAL + static constexpr auto scrllock = 0x91; // VK_SCROLL + static constexpr auto kana = 0x15; // VK_KANA + static constexpr auto oem_loya = 0x95; // VK_OEM_FJ_LOYA + static constexpr auto oem_roya = 0x96; // VK_OEM_FJ_ROYA + static constexpr auto intl_yen = 0xDC; // VK_OEM_5 + + static constexpr auto oem_copy = 0xF2; // VK_OEM_COPY + static constexpr auto oem_auto = 0xF3; // VK_OEM_AUTO + static constexpr auto oem_enlw = 0xF4; // VK_OEM_ENLW + + static constexpr auto numpad0 = 0x60; // VK_NUMPAD0 + static constexpr auto numpad1 = 0x61; // VK_NUMPAD1 + static constexpr auto numpad2 = 0x62; // VK_NUMPAD2 + static constexpr auto numpad3 = 0x63; // VK_NUMPAD3 + static constexpr auto numpad4 = 0x64; // VK_NUMPAD4 + static constexpr auto numpad5 = 0x65; // VK_NUMPAD5 + static constexpr auto numpad6 = 0x66; // VK_NUMPAD6 + static constexpr auto numpad7 = 0x67; // VK_NUMPAD7 + static constexpr auto numpad8 = 0x68; // VK_NUMPAD8 + static constexpr auto numpad9 = 0x69; // VK_NUMPAD9 + static constexpr auto numpadD = 0x6E; // VK_DECIMAL + + static constexpr auto packet = 0xE7; // VK_PACKET + } namespace key { static constexpr auto ExtendedKey = 0x0100; // ENHANCED_KEY @@ -2884,28 +2949,61 @@ namespace netxs::input default: break; } } - auto xlat(si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 klid_fallback) + void fix_numpad(auto& sc, bool numlock, bool extflag) { - auto klid = input::key::is_layout_supported(xlayout) ? xlayout - : klid_fallback ? klid_fallback - : input::key::latin_klids[0]; - if (!(keymod & input::hids::NumLock) && !extflag + if (!numlock && !extflag && ((sc >= 0x47 && sc <= 0x49) // 7 8 9 -> Home Up PgUp || (sc >= 0x4B && sc <= 0x4D) // 4 5 6 -> Left Clear Right || (sc >= 0x4F && sc <= 0x53))) // 1 2 3 -> End Down PgDn // 0->Ins .->Del { sc = 0x80 | (sc & 0xF); // ala 0x4* -> 0x8* if no numlock } + } + void fix_Numpad_Yen_Slash(auto& vk, auto& sc, bool numlock, bool extflag) + { + if (sc == 0x53/*NumpadDecimal*/ && numlock ) vk = vkey::numpadD; + else if (sc == 0x7D/*IntlYen*/ ) vk = vkey::intl_yen; + else if (numlock && !extflag && sc >= 0x47 && sc <= 0x53) + { + switch (vk) + { + case vkey::home: vk = vkey::numpad7; break; // sc 0x47 + case vkey::up: vk = vkey::numpad8; break; // sc 0x48 + case vkey::pgup: vk = vkey::numpad9; break; // sc 0x49 (Page Up) + case vkey::left: vk = vkey::numpad4; break; // sc 0x4B + case vkey::clear: vk = vkey::numpad5; break; // sc 0x4C (Num 5) + case vkey::right: vk = vkey::numpad6; break; // sc 0x4D + case vkey::end: vk = vkey::numpad1; break; // sc 0x4F + case vkey::down: vk = vkey::numpad2; break; // sc 0x50 + case vkey::pgdn: vk = vkey::numpad3; break; // sc 0x51 (Page Down) + case vkey::insert: vk = vkey::numpad0; break; // sc 0x52 + case vkey::del: vk = vkey::numpadD; break; // sc 0x53 (Dot/Comma) + } + } + else if (extflag && sc == 0x35 && vk != vkey::divide) // Extended Numpad Slash (scan=0xE035) + { + vk = vkey::divide; + } + else fix_numpad(sc, numlock, extflag); + } + auto xlat(si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 klid_fallback) + { + auto klid = input::key::is_layout_supported(xlayout) ? xlayout + : klid_fallback ? klid_fallback + : input::key::latin_klids[0]; + auto numlock = keymod & input::hids::NumLock; + fix_numpad(sc, numlock, extflag); auto hash = input::key::key_hash(klid, sc, extflag); auto keyid = input::key::key_map[hash]; return keyid; } auto xlat(si32 virtcod, si32 scancod, si32 dwControlKeyState, si32 klid) { - if (dwControlKeyState & input::key::NumLockMode) - { - // - } + auto extflag = dwControlKeyState & input::key::ExtendedKey; + auto numlock = dwControlKeyState & input::key::NumLockMode; + auto vk = virtcod; + auto sc = scancod; + fix_Numpad_Yen_Slash(vk, sc, numlock, extflag); auto iter = keymap.find(map{ 0,0,0,0 }); return iter != keymap.end() ? iter->second : key::undef; From 5ae78d862fe000f8d2184b9ec7e1296183ee0f86 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 19 Jun 2026 13:43:15 +0500 Subject: [PATCH 36/71] #943 WIP: Implement xlat for win32 console api --- src/netxs/desktopio/gui.hpp | 2 +- src/netxs/desktopio/input.hpp | 88 +++++++++++++++++++++++++--------- src/netxs/desktopio/system.hpp | 7 ++- 3 files changed, 72 insertions(+), 25 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 8134a7ec5d..fcf6d8f770 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -4661,7 +4661,7 @@ namespace netxs::gui gear.virtcod = virtcod; gear.scancod = scancod; keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); - auto keycode = input::key::xlat(scancod, extflag, keymod, xlayout, klid_fallback); + auto keycode = input::key::xlat(virtcod, scancod, extflag, keymod, xlayout, klid_fallback); if ((gear.keystat == input::key::released || keycode != gear.keycode) && keystat == input::key::repeated) keystat = input::key::pressed; // LeftMod+RightMod press is treated by the OS as a repeated LeftMod. gear.keystat = keystat; gear.keycode = keycode; diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 2c7112dcbe..939e39b951 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -685,6 +685,32 @@ namespace netxs::input #undef X return m; }(); + static const auto vk_map = [] + { + struct keyrec + { + si16 code; + si16 scan; + si32 klid; + }; + auto m = std::array, 256>{}; + auto fill = [&](si16 KeyId, qiew codes) + { + while (codes) + { + auto key_hash = utf::to_int_from_hex_str(codes.pop_front(6)); + auto vkey = key_hash & 0xFF; + auto scan = (si16)(key_hash >> 8) & 0x1FF; + auto klid = (si32)(key_hash >> 17); + m[vkey].push_back({ .code = KeyId, .scan = scan, .klid = klid }); + } + }; + #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + fill(KeyId, qiew{ PhysicalCode }); + key_list + #undef X + return m; + }(); struct map { @@ -2986,34 +3012,52 @@ namespace netxs::input } else fix_numpad(sc, numlock, extflag); } - auto xlat(si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 klid_fallback) + auto xlat(si32 vk, si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 layout_fallback, si32& layout_hint) { - auto klid = input::key::is_layout_supported(xlayout) ? xlayout - : klid_fallback ? klid_fallback - : input::key::latin_klids[0]; + auto keyid = key::undef; auto numlock = keymod & input::hids::NumLock; - fix_numpad(sc, numlock, extflag); - auto hash = input::key::key_hash(klid, sc, extflag); - auto keyid = input::key::key_map[hash]; + if (xlayout) + { + auto klid = input::key::is_layout_supported(xlayout) ? xlayout + : layout_fallback ? layout_fallback + : input::key::latin_klids[0]; + fix_numpad(sc, numlock, extflag); + auto hash = input::key::key_hash(klid, sc, extflag); + keyid = (si32)input::key::key_map[hash]; + } + else + { + fix_Numpad_Yen_Slash(vk, sc, numlock, extflag); + sc |= extflag << 8; + auto& code_scan_klid_list = input::key::vk_map[vk]; + auto new_layout_hint = layout_hint; + for (auto [code, scan, klid] : code_scan_klid_list) + { + if (scan == sc) + { + if (new_layout_hint == layout_hint && klid != layout_hint) // Best effort. + { + keyid = code; + new_layout_hint = klid; + if (layout_hint == 0) break; + } + else if (klid == layout_hint) // Exact match. + { + keyid = code; + new_layout_hint = klid; + break; + } + } + } + std::swap(new_layout_hint, layout_hint); + } return keyid; } - auto xlat(si32 virtcod, si32 scancod, si32 dwControlKeyState, si32 klid) + auto xlat(si32 vk, si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 layout_fallback) { - auto extflag = dwControlKeyState & input::key::ExtendedKey; - auto numlock = dwControlKeyState & input::key::NumLockMode; - auto vk = virtcod; - auto sc = scancod; - fix_Numpad_Yen_Slash(vk, sc, numlock, extflag); - - auto iter = keymap.find(map{ 0,0,0,0 }); - return iter != keymap.end() ? iter->second : key::undef; + auto unused_hint = 0; + return xlat(vk, sc, extflag, keymod, xlayout, layout_fallback, unused_hint); } - //template - //auto xlat(Args&&... args) - //{ - // auto iter = keymap.find(map{ args... }); - // return iter != keymap.end() ? iter->second : key::undef; - //} } namespace bindings diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 8ef369fc57..bd826e2148 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5247,6 +5247,8 @@ namespace netxs::os { if constexpr (debugmode) log(prompt::tty, "Reading thread started", ' ', utf::to_hex_0x(std::this_thread::get_id())); auto alive = true; + auto layout_hint = 0; + auto layout_fallback = 0; auto gear_id = id_t{ 1 }; // Non-zero id. auto p_txtdata = text{}; auto chords = input::key::kmap{}; @@ -5370,7 +5372,7 @@ namespace netxs::os k.extflag = r.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY; k.virtcod = r.Event.KeyEvent.wVirtualKeyCode; k.scancod = r.Event.KeyEvent.wVirtualScanCode; - k.keycode = input::key::xlat(k.virtcod, k.scancod, (si32)r.Event.KeyEvent.dwControlKeyState, k.xlayout); + k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, k.ctlstat, k.xlayout, layout_fallback, layout_hint); k.keystat = r.Event.KeyEvent.bKeyDown ? (chords.exist(k.keycode) ? input::key::repeated : input::key::pressed) : input::key::released; k.cluster = toutf; chords.build(k); @@ -5397,7 +5399,7 @@ namespace netxs::os k.virtcod = r.Event.KeyEvent.wVirtualKeyCode; k.scancod = r.Event.KeyEvent.wVirtualScanCode; k.cluster = toutf; - k.keycode = input::key::xlat(k.virtcod, k.scancod, (si32)r.Event.KeyEvent.dwControlKeyState, k.xlayout); + k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, k.ctlstat, k.xlayout, layout_fallback, layout_hint); if (r.Event.KeyEvent.wRepeatCount-- > 0) { k.keystat = input::key::pressed; @@ -5434,6 +5436,7 @@ namespace netxs::os break; case nt::console::event::kb_layout: k.xlayout = reinterpret_cast(&r)->klid; + if (input::key::is_layout_supported(k.xlayout)) layout_fallback = k.xlayout; break; case nt::console::event::style: style(deco{ reinterpret_cast(&r)->format }); From cfcd0991f0e835e296b76a4db85fe33599255ad3 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 19 Jun 2026 16:04:27 +0500 Subject: [PATCH 37/71] #943 WIP: Fix deadkey reset --- src/netxs/desktopio/gui.hpp | 6 +++++- src/netxs/desktopio/input.hpp | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index fcf6d8f770..125be3b2a1 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -5519,8 +5519,12 @@ namespace netxs::gui { shifted.clear(); unshift.clear(); - if (scancod && virtcod >= 0x30 && virtcod <= 0xE6 && virtcod != last_deadkey_vkey) // Alphanumeric + punctuation (excluding deadkeys). + auto is_printable = scancod && ((virtcod >= 0x30 && virtcod <= 0x5A) + || (virtcod >= 0x60 && virtcod <= 0x6F) + || (virtcod >= 0xB8 && virtcod <= 0xE6)); + if (is_printable && virtcod != last_deadkey_vkey) // Alphanumeric + punctuation (excluding deadkeys). { + log("Call ::ToUnicodeEx with vk=%% sc=%%", virtcod, scancod); auto buf = wide(8, 0); auto current_layout = ::GetKeyboardLayout(0); auto flags = extflag ? 1u : 0u; diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 939e39b951..15d6224621 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -700,7 +700,7 @@ namespace netxs::input { auto key_hash = utf::to_int_from_hex_str(codes.pop_front(6)); auto vkey = key_hash & 0xFF; - auto scan = (si16)(key_hash >> 8) & 0x1FF; + auto scan = (si16)((key_hash >> 8) & 0x1FF); auto klid = (si32)(key_hash >> 17); m[vkey].push_back({ .code = KeyId, .scan = scan, .klid = klid }); } From 2cdec4c9dc7e6899e7f2a63c848d44b9d2b9fd04 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 19 Jun 2026 16:04:43 +0500 Subject: [PATCH 38/71] #943 WIP: Fix deadkey reset --- src/netxs/desktopio/gui.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 125be3b2a1..1310055fe4 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -5524,7 +5524,6 @@ namespace netxs::gui || (virtcod >= 0xB8 && virtcod <= 0xE6)); if (is_printable && virtcod != last_deadkey_vkey) // Alphanumeric + punctuation (excluding deadkeys). { - log("Call ::ToUnicodeEx with vk=%% sc=%%", virtcod, scancod); auto buf = wide(8, 0); auto current_layout = ::GetKeyboardLayout(0); auto flags = extflag ? 1u : 0u; From a9e95bfac9c1d5a1b25742db5e5a53e2dabcfecd Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 19 Jun 2026 17:37:52 +0500 Subject: [PATCH 39/71] #943 WIP: Make input::key::vk_map constexpr --- src/netxs/desktopio/input.hpp | 59 +++++++++++++++++++++++----------- src/netxs/desktopio/system.hpp | 2 +- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 15d6224621..a69ffa6f87 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -685,30 +685,49 @@ namespace netxs::input #undef X return m; }(); - static const auto vk_map = [] + + static constexpr auto vk_map = [] { struct keyrec { si16 code; si16 scan; - si32 klid; + utfx unic; + si16 klid; + si16 vkey; + struct cmp + { + auto operator()(keyrec const& r, si32 vkey) const { return r.vkey < vkey; } + auto operator()(si32 vkey, keyrec const& r) const { return vkey < r.vkey; } + }; }; - auto m = std::array, 256>{}; - auto fill = [&](si16 KeyId, qiew codes) + constexpr auto total_hash_count = [] + { + auto total_hash_count = 0; + #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + total_hash_count += (si32)qiew{ PhysicalCode }.size() / 6; + key_list + #undef X + return total_hash_count; + }(); + auto m = std::array{}; + auto i = 0; + auto fill = [&](si16 KeyId, utfx unic, qiew codes) { while (codes) { auto key_hash = utf::to_int_from_hex_str(codes.pop_front(6)); - auto vkey = key_hash & 0xFF; + auto vkey = (si16)(key_hash & 0xFF); auto scan = (si16)((key_hash >> 8) & 0x1FF); - auto klid = (si32)(key_hash >> 17); - m[vkey].push_back({ .code = KeyId, .scan = scan, .klid = klid }); + auto klid = (si16)(key_hash >> 17); + m[i++] = { .code = KeyId, .scan = scan, .unic = unic, .klid = klid, .vkey = vkey }; } }; #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ - fill(KeyId, qiew{ PhysicalCode }); + fill(KeyId, Uc, qiew{ PhysicalCode }); key_list #undef X + std::sort(m.begin(), m.end(), [](auto& a, auto& b){ return a.vkey < b.vkey; }); return m; }(); @@ -3029,27 +3048,29 @@ namespace netxs::input { fix_Numpad_Yen_Slash(vk, sc, numlock, extflag); sc |= extflag << 8; - auto& code_scan_klid_list = input::key::vk_map[vk]; auto new_layout_hint = layout_hint; - for (auto [code, scan, klid] : code_scan_klid_list) + using keyrec = std::decay_t; + auto [head, tail] = std::equal_range(input::key::vk_map.begin(), input::key::vk_map.end(), vk, keyrec::cmp{}); + while (head != tail) { - if (scan == sc) + auto& r = *head++; + if (r.scan == sc) { - if (new_layout_hint == layout_hint && klid != layout_hint) // Best effort. + if (new_layout_hint == layout_hint && r.klid != layout_hint) // Best effort. { - keyid = code; - new_layout_hint = klid; - if (layout_hint == 0) break; + keyid = r.code; + new_layout_hint = r.klid; + if (layout_hint == -1) break; // If there are no hints, then a match with the scancode is enough. } - else if (klid == layout_hint) // Exact match. + else if (r.klid == layout_hint) // Exact match. { - keyid = code; - new_layout_hint = klid; + keyid = r.code; + new_layout_hint = r.klid; break; } } } - std::swap(new_layout_hint, layout_hint); + layout_hint = new_layout_hint; } return keyid; } diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index bd826e2148..29d741043a 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5247,7 +5247,7 @@ namespace netxs::os { if constexpr (debugmode) log(prompt::tty, "Reading thread started", ' ', utf::to_hex_0x(std::this_thread::get_id())); auto alive = true; - auto layout_hint = 0; + auto layout_hint = -1; auto layout_fallback = 0; auto gear_id = id_t{ 1 }; // Non-zero id. auto p_txtdata = text{}; From 02f0c6648dc8a3c2330829cef4c8fef7516dc262 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 19 Jun 2026 18:03:10 +0500 Subject: [PATCH 40/71] #943 WIP: Keep layouts sorted for lookup --- src/netxs/desktopio/input.hpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index a69ffa6f87..2e9dbdeb9c 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -654,11 +654,6 @@ namespace netxs::input X(542 , 0, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0132ac2932ac0932ac2732ac1332ac0d32ac1f32ac1d32ac0732ac2532ac0532ac0b32ac1132ac1732ac2132ac1932ac0f32ac2b32ac1b32ac2332ac1532ac7b32ac2d32ac2f32ac0332ac3132ac3332ac3532ac3b32ac3d32ac3932ac3732ac9d32ac4132ac3f32ac4d32ac4332ac4f32ac4b32ac4732ac5532ac4532ac5d32ac5b32ac6932ac6332ac6732ac4932ac7332ac6d32ac5132ac9f32ac7732aca132ac5332ac5932ac5732ac6f32ac6132ac6b32ac7132ac7532ac5f32ac6532aca332ac7932ac8d32ac8f32ac8332aca532ac8732ac8b32ac9932ac9b32ac9132ac7f32ac9532ac8932ac8532ac7d32ac9332ac8132ac9732acab32aca932aca732acaf32acb132acad32acb532acb332acb732acb932acbb32ac")\ X(544 , 0, lastKey , "lastKey" , "" , 0 , 0 , 0 , -1 , -1 , "") - #define key_list2 \ - /*Id Index Vkey Scan KLID CS Mask CS KLID VK SC I Name GenericName KKP base,suffix,ascii,w\ctrl*/\ - X(0, 0, 0, 0, 0x00000, 0, 0x0000'00000'00'FF, 1, undef , "undef" , 0 , 'u', -1 , -1 )\ - X(1, 0, 0xFF, 0xFF, 0x00409, 0, 0x0100'00000'FF'FF, 0, config , "config" , 0 , 'u', -1 , -1 )\ - X(402, 0xFF, 0xFF, 0xFF, 0x00000, ExtendedKey, 0x0100'FFFFF'FF'FF, 0, lastKey , "lastKey" , 0 , 0 , -1 , -1 ) // Max 12 bits for KeyId. static constexpr auto idbits = 12; @@ -685,7 +680,6 @@ namespace netxs::input #undef X return m; }(); - static constexpr auto vk_map = [] { struct keyrec @@ -693,7 +687,7 @@ namespace netxs::input si16 code; si16 scan; utfx unic; - si16 klid; + si16 klid; // Sorted klid index. si16 vkey; struct cmp { @@ -727,7 +721,11 @@ namespace netxs::input fill(KeyId, Uc, qiew{ PhysicalCode }); key_list #undef X - std::sort(m.begin(), m.end(), [](auto& a, auto& b){ return a.vkey < b.vkey; }); + std::sort(m.begin(), m.end(), [](auto& a, auto& b) + { + if (a.vkey != b.vkey) return a.vkey < b.vkey; + else return a.klid < b.klid; + }); return m; }(); @@ -939,7 +937,6 @@ namespace netxs::input #undef mouse_list #undef key_list - #undef key_list2 } struct foci From 9f325ee4b59adb50d0df5f583386b8c92e858a05 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 19 Jun 2026 22:25:33 +0500 Subject: [PATCH 41/71] #943 WIP: Fix deadkey preview lifetime (+kblayout tracking) --- src/netxs/desktopio/gui.hpp | 41 +++++++++++++++++++++++++------- src/netxs/desktopio/input.hpp | 9 ++++--- src/netxs/desktopio/system.hpp | 13 ++++++++-- src/netxs/desktopio/terminal.hpp | 23 ++++++++++++++---- 4 files changed, 69 insertions(+), 17 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 1310055fe4..0016e56140 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3517,7 +3517,15 @@ namespace netxs::gui virtual void layer_timer_stop(layer& s, ui32 eventid) = 0; virtual void keybd_sync_state(si32 virtcod = 0) = 0; - virtual void keybd_sync_layout() = 0; + virtual void keybd_sync_layout() + { + auto& gear = *stream.gears; + gear.payload = input::keybd::type::kblayout; + gear.xlayout = xlayout; + chords.reset(gear, faux); // faux: Keep pressed key state. + stream_keybd(gear); + gear.payload = input::keybd::type::keypress; + } virtual void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) = 0; virtual void keybd_read_vkstat() = 0; virtual void keybd_wipe_vkstat() = 0; @@ -3528,6 +3536,7 @@ namespace netxs::gui virtual bool keybd_read_pressed(si32 virtcod) = 0; virtual bool keybd_test_pressed(si32 virtcod) = 0; virtual si32 keybd_read_media(si16 cmd, ui16 uDevice, ui16 dwKeys) = 0; + virtual void keybd_reset_deadkey() = 0; virtual void mouse_capture(si32 captured_by) = 0; virtual void mouse_release(si32 released_by) = 0; @@ -4891,9 +4900,13 @@ namespace netxs::gui keybd_read_vkstat(); // It must be called in current thread. for (auto target : target_list.value()) window_send_command(target, ipc::main_focus, local_target); } - else if (target_list) // Send to all that the focus is going to lost. + else { - for (auto target : target_list.value()) window_send_command(target, ipc::drop_focus); + keybd_reset_deadkey(); // Force reset deadkey state if it is. Windows doesn't reset deadkey state when refocusing but all other platforms do. + if (target_list) // Send to all that the focus is going to lost. + { + for (auto target : target_list.value()) window_send_command(target, ipc::drop_focus); + } } } } @@ -5515,6 +5528,14 @@ namespace netxs::gui ::EndDeferWindowPos(lock); } //todo static + void keybd_reset_deadkey() + { + auto uc = L' '; + auto ks = std::array{}; + auto vk = input::key::map::data(input::key::Space).vkey; + auto sc = input::key::map::data(input::key::Space).scan; + ::ToUnicodeEx(vk, sc, ks.data(), &uc, 1, 0, 0); + } void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) { shifted.clear(); @@ -5527,7 +5548,7 @@ namespace netxs::gui auto buf = wide(8, 0); auto current_layout = ::GetKeyboardLayout(0); auto flags = extflag ? 1u : 0u; - flags |= 2; // 2 PDT_SHAREABLE (don't touch our thread state). + flags |= 2; // ToUnicodeEx will translate scancodes marked as key break events in addition to its usual treatment of key make events. auto vk_un = std::array{}; vk_un[vkey::capslock] = vkstat[vkey::capslock]; auto rc = ::ToUnicodeEx(virtcod, scancod, vk_un.data(), buf.data(), 8, flags, current_layout); @@ -5785,8 +5806,7 @@ namespace netxs::gui keybd_sync_state(); auto klid_buf = wide(KL_NAMELENGTH - 1/*exclude trailing null*/, '\0'); ::GetKeyboardLayoutNameW(klid_buf.data()); - auto klid = utf::to_int_from_hex_str(klid_buf); - log("%%Keyboard layout changed to ", prompt::gui, utf::adjust(utf::to_hex(klid), 8, "0", true)); + auto klid = utf::to_int_from_hex_str(klid_buf); if (!klid_fallback) { if (input::key::is_layout_supported(klid)) @@ -5799,7 +5819,11 @@ namespace netxs::gui klid_fallback = keybd_find_layout(); // Looking for klid fallback. } } - xlayout = klid; + if (std::exchange(xlayout, klid) != klid) + { + log("%%Keyboard layout changed to ", prompt::gui, utf::adjust(utf::to_hex(klid), 8, "0", true)); + winbase::keybd_sync_layout(); + } } si32 keybd_read_media(si16 cmd, ui16 uDevice, ui16 dwKeys) { @@ -5920,7 +5944,7 @@ namespace netxs::gui auto target_list = mfocus.copy(); auto local_hwnd = (ui32)master.hWnd; auto state_data = COPYDATASTRUCT{ .dwData = ipc::pass_state, .cbData = (DWORD)vkstat.size(), .lpData = (void*)vkstat.data() }; - auto input_data = COPYDATASTRUCT{ .dwData = ipc::pass_input, .cbData = (DWORD)block.size(), .lpData = (void*)block.data() }; + auto input_data = COPYDATASTRUCT{ .dwData = ipc::pass_input, .cbData = (DWORD)block.size(), .lpData = (void*)block.data() }; for (auto target : target_list) // Send to group focused targets. { if (target != local_hwnd) @@ -6201,6 +6225,7 @@ namespace netxs::gui void keybd_sync_layout() {} void keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, bool /*extflag*/, text& /*shifted*/, text& /*unshift*/) {} void keybd_sync_state(si32 /*virtcod*/) {} + void keybd_reset_deadkey() {} bool layer_create(layer& /*s*/, winbase* /*host_ptr*/ = nullptr, twod /*win_coord*/ = {}, twod /*grid_size*/ = {}, dent /*border_dent*/ = {}, twod /*cell_size*/ = {}) { return true; } void layer_move_all() {} void layer_present(layer& /*s*/) {} diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 2e9dbdeb9c..2901cea407 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -2430,15 +2430,18 @@ namespace netxs::input cmap pushed{}; // kmap: Pushed key map. bool keyout{}; // kmap: Some key has left the key chord. - void reset(auto& k) + void reset(auto& k, bool full = true) { k.vkchord.clear(); k.scchord.clear(); k.chchord.clear(); k.shifted.clear(); k.unshift.clear(); - pushed.clear(); - keyout = {}; + if (full) + { + pushed.clear(); + keyout = {}; + } } auto exist(si32 keyid) { diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 29d741043a..cb2b1e503d 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5435,9 +5435,18 @@ namespace netxs::os } break; case nt::console::event::kb_layout: - k.xlayout = reinterpret_cast(&r)->klid; - if (input::key::is_layout_supported(k.xlayout)) layout_fallback = k.xlayout; + { + auto new_layout = reinterpret_cast(&r)->klid; + if (std::exchange(k.xlayout, new_layout) != new_layout) + { + if (input::key::is_layout_supported(k.xlayout)) layout_fallback = k.xlayout; + k.payload = input::keybd::type::kblayout; + chords.reset(k, faux); // faux: Keep pressed key state. + keybd(k); + k.payload = input::keybd::type::keypress; + } break; + } case nt::console::event::style: style(deco{ reinterpret_cast(&r)->format }); break; diff --git a/src/netxs/desktopio/terminal.hpp b/src/netxs/desktopio/terminal.hpp index c1178aee3b..e67ae5a7dc 100644 --- a/src/netxs/desktopio/terminal.hpp +++ b/src/netxs/desktopio/terminal.hpp @@ -563,6 +563,7 @@ namespace netxs::ui auto focused = !!count; if (std::exchange(state, focused) != state) { + owner.set_deadkey_preview(); owner.ipccon.focus(focused, encod); if (!focused && owner.ime_on) owner.ime_on = faux; } @@ -10219,14 +10220,21 @@ namespace netxs::ui imefmt.flow::compose(imebox, test); return composit_cursor; } + void set_deadkey_preview(qiew cluster = {}) + { + auto changed = std::exchange(deadkey_preview, cluster) != cluster; + if (io_log && changed) log("%%Deadkey preview: ", prompt::key, ansi::hi(deadkey_preview.size() ? deadkey_preview : " ")); + } void key_event(hids& gear, bool forced_event = faux) { if (!forced_event && gear.touched && !rawkbd) return; switch (gear.payload) { case keybd::type::deadkey: - deadkey_preview = gear.keystat == input::key::pressed ? gear.cluster : ""; - if (io_log) log("%%Deadkey preview: ", prompt::key, ansi::hi(deadkey_preview.size() ? deadkey_preview : " ")); + if (gear.keystat == input::key::pressed) + { + set_deadkey_preview(gear.cluster); + } [[fallthrough]]; case keybd::type::keypress: if (defcfg.resetonkey && gear.doinput()) @@ -10236,7 +10244,14 @@ namespace netxs::ui follow[axis::X] = true; follow[axis::Y] = true; } - if (gear.payload == keybd::type::keypress) ipccon.keybd(gear, decckm, kbmode); + if (gear.payload == keybd::type::keypress) + { + if (deadkey_preview.size() && gear.cluster.size()) // Reset deadkey preview on input. + { + set_deadkey_preview(); + } + ipccon.keybd(gear, decckm, kbmode); + } if (forced_event || !gear.touched || gear.keystat != input::key::released || rawkbd) gear.set_handled(faux); break; case keybd::type::imeinput: @@ -10269,7 +10284,7 @@ namespace netxs::ui else unsync = std::exchange(ime_on, imebox.length()) != ime_on; break; case keybd::type::kblayout: - //todo + if (deadkey_preview.size()) set_deadkey_preview(); break; } } From 3fcd7c8781b308a7b52ab8e9398f2e6bcaf9237e Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sun, 21 Jun 2026 21:20:45 +0500 Subject: [PATCH 42/71] #943 WIP: Change key detection logic --- src/netxs/desktopio/gui.hpp | 5 + src/netxs/desktopio/input.hpp | 788 +++++++++++++++++----------------- 2 files changed, 397 insertions(+), 396 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 0016e56140..739bfcabc7 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -5775,6 +5775,11 @@ namespace netxs::gui auto layout_count = ::GetKeyboardLayoutList(0, nullptr); auto layouts = std::vector(layout_count); ::GetKeyboardLayoutList(layout_count, layouts.data()); + if constexpr (debugmode) + { + log("Installed layouts:"); + for (auto hkl : layouts) log(" %%", hkl); + } auto old_hkl = ::GetKeyboardLayout(0); // Save current layout. for (auto hkl : layouts) // Iterate over existing layouts. { diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 2901cea407..ed9123da49 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -143,6 +143,7 @@ namespace netxs::input static constexpr auto cluster_sign = 0x20; static constexpr auto mouse_sign = 0x10; + //todo drop struct layout { static constexpr auto _counter = __COUNTER__ + 1; @@ -154,7 +155,7 @@ namespace netxs::input static constexpr auto colemak = __COUNTER__ - _counter; static constexpr auto bepo = __COUNTER__ - _counter; }; - + //todo drop struct klid // Latin-based Keyboard Layouts (20 klids). { static constexpr auto k00000409 = 0x00000409; // English (US) | United States Standard | `qwerty` @@ -178,6 +179,7 @@ namespace netxs::input static constexpr auto k00000415 = 0x00000415; // Polish (Poland) | Polish (Programmers) | `qwerty` static constexpr auto k00000418 = 0x00000418; // Romanian | Romanian Standard | `qwertz` }; + //todo drop auto get_layout_type(si32 klid) { if (klid == 0x00000409 || klid == 0) return layout::qwerty; @@ -197,109 +199,103 @@ namespace netxs::input static constexpr auto latin_klids = std::to_array( { - 0x00000409, // US - 0x00000412, // Korean - 0x00000468, // Hausa - 0x00000411, // Japanese - 0x00000432, // Setswana - 0x00050408, // Greek Latin - 0x00000415, // Polish (Programmers) - 0x00000404, // Chinese (Traditional) - US - 0x00004009, // English (India) - 0x00020418, // Romanian (Programmers) - 0x00020409, // United States-International - 0x00020405, // Czech Programmers - 0x00000c04, // Chinese (Traditional, Hong Kong S.A.R.) - US - 0x00000804, // Chinese (Simplified) - US - 0x00020426, // Latvian (Standard) - 0x00000481, // Maori - 0x00001404, // Chinese (Traditional, Macao S.A.R.) - US - 0x00010402, // Bulgarian (Latin) - 0x00000470, // Igbo - 0x0000046c, // Sesotho sa Leboa - 0x0000046a, // Yoruba - 0x00001004, // Chinese (Simplified, Singapore) - US - 0x00010426, // Latvian (QWERTY) - 0x00000475, // Hawaiian - 0x00050409, // US English Table for IBM Arabic 238_L - 0x0001045d, // Inuktitut - Naqittaut - 0x0000085d, // Inuktitut - Latin - 0x00001809, // Irish - 0x00011809, // Scottish Gaelic - 0x00000452, // United Kingdom Extended - 0x00000809, // United Kingdom - 0x0000043a, // Maltese 47-Key - 0x0001043a, // Maltese 48-Key - 0x00001009, // Canadian French - 0x00011009, // Canadian Multilingual Standard - 0x00000c0c, // Canadian French (Legacy) - 0x00040408, // Greek (319) Latin - 0x00000416, // Portuguese (Brazil ABNT) - 0x00010418, // Romanian (Standard) - 0x00010416, // Portuguese (Brazil ABNT2) - 0x0001040a, // Spanish Variation - 0x00000816, // Portuguese - 0x0000041c, // Albanian - 0x00000410, // Italian - 0x00010410, // Italian (142) - 0x0000041d, // Swedish - 0x0000083b, // Swedish with Sami - 0x00000413, // Dutch - 0x00000414, // Norwegian - 0x00000474, // Guarani - 0x00000406, // Danish - 0x0000046f, // Greenlandic - 0x0000043b, // Norwegian with Sami - 0x0000080a, // Latin American - 0x0001083b, // Finnish with Sami - 0x0000040a, // Spanish - 0x0000040b, // Finnish - 0x00030408, // Greek (220) Latin - 0x00000438, // Faeroese - 0x00000425, // Estonian - 0x0000040f, // Icelandic - 0x00010427, // Lithuanian - 0x0001040e, // Hungarian 101-key - 0x0000100c, // Swiss French - 0x00000424, // Slovenian - 0x0001042e, // Sorbian Extended - 0x00000407, // German - 0x0000081a, // Serbian (Latin) - 0x00010407, // German (IBM) - 0x00010415, // Polish (214) - 0x0000042e, // Sorbian Standard (Legacy) - 0x0002042e, // Sorbian Standard - 0x00000807, // Swiss German - 0x0000041a, // Standard - 0x0000046e, // Luxembourgish - 0x00000418, // Romanian (Legacy) - 0x0000040e, // Hungarian - 0x0000041f, // Turkish Q - 0x0000042a, // Vietnamese - 0x0001041b, // Slovak (QWERTY) - 0x00010405, // Czech (QWERTY) - 0x00000405, // Czech - 0x0000041b, // Slovak - 0x0000040c, // French - 0x0000085f, // Central Atlas Tamazight - 0x00000488, // Wolof - 0x0001080c, // Belgian (Comma) - 0x0000080c, // Belgian French - 0x00000813, // Belgian (Period) - 0x00010409, // United States-Dvorak - 0x00020427, // Lithuanian Standard - 0x0001041f, // Turkish F - 0x00040409, // United States-Dvorak for right hand - 0x00030409, // United States-Dvorak for left hand + /*500*/ 0x00000409, // US + /*360*/ 0x00000411, // Japanese + /*360*/ 0x00000415, // Polish (Programmers) + /*360*/ 0x00020405, // Czech Programmers + /*360*/ 0x00020418, // Romanian (Programmers) + /*360*/ 0x00010426, // Latvian (QWERTY) + /*360*/ 0x00020426, // Latvian (Standard) + /*360*/ 0x00050408, // Greek Latin + /*360*/ 0x00004009, // English (India) + /*360*/ 0x0000046a, // Yoruba + /*360*/ 0x00000468, // Hausa + /*360*/ 0x00000470, // Igbo + /*360*/ 0x00000481, // Maori + /*360*/ 0x0000046c, // Sesotho sa Leboa + /*353*/ 0x00020409, // United States-International + /*353*/ 0x00010427, // Lithuanian + /*353*/ 0x00000475, // Hawaiian + /*348*/ 0x00000412, // Korean + /*346*/ 0x00050409, // US English Table for IBM Arabic 238_L + /*344*/ 0x0001045d, // Inuktitut - Naqittaut + /*344*/ 0x0000085d, // Inuktitut - Latin + /*343*/ 0x00000452, // United Kingdom Extended + /*336*/ 0x00000809, // United Kingdom + /*336*/ 0x00011809, // Scottish Gaelic + /*336*/ 0x00001809, // Irish + /*332*/ 0x0000042a, // Vietnamese + /*332*/ 0x0000043a, // Maltese 47-Key + /*332*/ 0x0001043a, // Maltese 48-Key + /*318*/ 0x00010418, // Romanian (Standard) + /*313*/ 0x00001009, // Canadian French + /*311*/ 0x00000416, // Portuguese (Brazil ABNT) + /*311*/ 0x00000c0c, // Canadian French (Legacy) + /*308*/ 0x0000041c, // Albanian + /*305*/ 0x00011009, // Canadian Multilingual Standard + /*299*/ 0x0001083b, // Finnish with Sami + /*299*/ 0x00030408, // Greek (220) Latin + /*299*/ 0x00040408, // Greek (319) Latin + /*299*/ 0x0000043b, // Norwegian with Sami + /*299*/ 0x0000041d, // Swedish + /*299*/ 0x0000046f, // Greenlandic + /*299*/ 0x00000474, // Guarani + /*297*/ 0x00010405, // Czech (QWERTY) + /*297*/ 0x0001040a, // Spanish Variation + /*297*/ 0x00000425, // Estonian + /*297*/ 0x0001041b, // Slovak (QWERTY) + /*294*/ 0x00000410, // Italian + /*294*/ 0x00010410, // Italian (142) + /*294*/ 0x00000816, // Portuguese + /*292*/ 0x00000406, // Danish + /*292*/ 0x0000040b, // Finnish + /*292*/ 0x00000413, // Dutch + /*292*/ 0x00000414, // Norwegian + /*292*/ 0x0000040a, // Spanish + /*292*/ 0x0000080a, // Latin American + /*292*/ 0x00000438, // Faeroese + /*291*/ 0x00000405, // Czech + /*290*/ 0x0000040f, // Icelandic + /*289*/ 0x00010415, // Polish (214) + /*289*/ 0x0000041b, // Slovak + /*289*/ 0x0001042e, // Sorbian Extended + /*289*/ 0x0002042e, // Sorbian Standard + /*289*/ 0x0000042e, // Sorbian Standard (Legacy) + /*289*/ 0x0000081a, // Serbian (Latin) + /*285*/ 0x0000040e, // Hungarian + /*282*/ 0x00000407, // German + /*282*/ 0x00020407, // German Extended (E1) + /*282*/ 0x00030407, // German Extended (E2) + /*282*/ 0x00010407, // German (IBM) + /*282*/ 0x0000046e, // Luxembourgish + /*282*/ 0x00000807, // Swiss German + /*282*/ 0x0000041f, // Turkish Q + /*277*/ 0x0001040e, // Hungarian 101-key + /*275*/ 0x00000424, // Slovenian + /*275*/ 0x00060409, // Colemak + /*273*/ 0x00000418, // Romanian (Legacy) + /*267*/ 0x0000085f, // Central Atlas Tamazight + /*267*/ 0x00000488, // Wolof + /*266*/ 0x0001040c, // French (Standard, AZERTY) + /*260*/ 0x0000040c, // French (Legacy, AZERTY) + /*257*/ 0x00000813, // Belgian (Period) + /*257*/ 0x0001080c, // Belgian (Comma) + /*256*/ 0x00020427, // Lithuanian Standard + /*188*/ 0x00010409, // United States-Dvorak + /*172*/ 0x0001041f, // Turkish F + /*165*/ 0x00040409, // United States-Dvorak for right hand + /*160*/ 0x00030409, // United States-Dvorak for left hand + /*155*/ 0x0002040c, // French (Standard, BÉPO) }); - // modul=161(0x000000a1) | prime=221868(0x000362ac) | shift=374331(0x0005b63b) | MIN=2 | MAX=159 | DELTA=157 - static constexpr auto klid_prime = 221868u; - static constexpr auto klid_shift = 374331u; - static constexpr auto klid_modul = 161u; static constexpr auto klid_hash(si32 klid) { - auto uniq = (((ui32)klid ^ (ui32)klid_prime) * (ui32)klid_shift) % (ui32)klid_modul; - return uniq; + auto iter = std::ranges::find(latin_klids, klid); + if (iter != latin_klids.end()) + { + return (si32)std::distance(latin_klids.begin(), iter); + } + else + return 0; } static constexpr auto supported_klids = [] // This won't compile if there are collisions. { @@ -309,15 +305,11 @@ namespace netxs::input si32 index; }; auto index = 0; - auto klids = std::array{}; + auto klids = std::array{}; for (auto klid : input::key::latin_klids) // Check hash collisions. { - auto uniq = input::key::klid_hash(klid); - if (klids[uniq].klid != 0) - { - log("Hash collision detected. Try to update prime/shift/modul."); - } - klids[uniq] = { (si32)klid, index++ }; + klids[index] = { (si32)klid, index }; + index++; } return klids; }(); @@ -336,7 +328,7 @@ namespace netxs::input auto key_hash(si32 klid, si32 scan, bool extflag) { assert(input::key::supported_klids[input::key::klid_hash(klid)].klid == klid); - auto hash = (ui16)((scan & 0xFF) | ((si32)extflag << 8) | (input::key::supported_klids[input::key::klid_hash(klid)].index << 9)); + auto hash = (ui16)((scan & 0xFF) | ((si32)extflag << 8) | (input::key::klid_hash(klid) << 9)); return hash; } @@ -347,53 +339,53 @@ namespace netxs::input /* ID Input Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */\ X(0 , 1, undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(1 , 0, invalid , "invalid" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(2 , 0, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001da2281da2081da2261da2121da20c1da21e1da21c1da2061da2241da2041da20a1da2101da2161da2201da2181da20e1da22a1da21a1da2221da2141da27a1da22c1da22e1da2021da2301da2321da2341da23a1da23c1da2381da2361da29c1da2401da23e1da24c1da2421da24e1da24a1da2461da2541da2441da25c1da25a1da2681da2621da2661da2481da2721da26c1da2501da29e1da2761da2a01da2521da2581da2561da26e1da2601da26a1da2701da2741da25e1da2641da2a21da2781da28c1da28e1da2821da2a41da2861da28a1da2981da29a1da2901da27e1da2941da2881da2841da27c1da2921da2801da2961da2aa1da2a81da2a61da2ae1da2b01da2ac1da2b41da2b21da2b61da2b81da2ba1da2")\ - X( 3 , 0, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011da3291da3091da3271da3131da30d1da31f1da31d1da3071da3251da3051da30b1da3111da3171da3211da3191da30f1da32b1da31b1da3231da3151da37b1da32d1da32f1da3031d19311da3331da3351da33b1da33d1da3391da3371da39d1da3411da33f1da34d1da3431da34f1da34b1da3471da3551da3451ddf5d1da35b1da3691da3631da3671da3491da3731da36d1da3511da39f1da3771da3a11da3531da3591da3571da36f1da3611da36b1da3711da3751da35f1da3651da3a31da3791da38d1da38f1da3831da3a51da3871da38b1da3991da39b1da3911da37f1da3951da3891da3851da37d1da3931da3811da3971da3ab1da3a91da3a71da3af1da3b11da3ad1da3b51da3b31da3b71da3b91da3bb1da3")\ - X(4 , 0, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038a42838a40838a42638a41238a40c38a41e38a41c38a40638a42438a40438a40a38a41038a41638a42038a41838a40e38a42a38a41a38a42238a41438a47a38a42c38a42e38a40238a43038a43238a43438a43a38a43c38a43838a43638a49c38a44038a43e38a44c38a44238a44e38a44a38a44638a45438a44438a45c38a45a38a46838a46238a46638a44838a47238a46c38a45038a49e38a47638a4a038a45238a45838a45638a46e38a46038a46a38a47038a47438a45e38a46438a4a238a47838a48c38a48e38a48238a4a438a48638a48a38a49838a49a38a49038a47e38a49438a48838a48438a47c38a49238a48038a49638a4aa38a4a838a4a638a4ae38a4b038a4ac38a4b438a4b238a4b638a4b838a4ba38a4")\ - X( 5 , 0, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138a52938a50938a52738a51338a50d38a51f38a51d38a50738a52538a50538a50b38a51138a51738a52138a51938a50f38a52b38a51b38a52338a51538a57b38a52d38a52f38a50338153138a53338a53538a53b38a53d38a53938a53738a59d38a54138a53f38a54d38a54338a54f38a54b38a54738a55538a54538a55d38a55b38a56938a56338a56738a54938a57338a56d38a55138a59f38a57738a5a138a55338a55938a55738a56f38a56138a56b38a57138a57538a55f38a56538a5a338a57938a58d38a58f38a58338a5a538a58738a58b38a59938a59b38a59138a57f38a59538a58938a58538a57d38a59338a58138a59738a5ab38a5a938a5a738a5af38a5b138a5ad38a5b538a5b338a5b738a5b938a5bb38a5")\ - X(6 , 0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002aa0282aa0082aa0262aa0122aa00c2aa01e2aa01c2aa0062aa0242aa0042aa00a2aa0102aa0162aa0202aa0182aa00e2aa02a2aa01a2aa0222aa0142aa07a2aa02c2aa02e2aa0022aa0302aa0322aa0342aa03a2aa03c2aa0382aa0362aa09c2aa0402aa03e2aa04c2aa0422aa04e2aa04a2aa0462aa0542aa0442aa05c2aa05a2aa0682aa0622aa0662aa0482aa0722aa06c2aa0502aa09e2aa0762aa0a02aa0522aa0582aa0562aa06e2aa0602aa06a2aa0702aa0742aa05e2aa0642aa0a22aa0782aa08c2aa08e2aa0822aa0a42aa0862aa08a2aa0982aa09a2aa0902aa07e2aa0942aa0882aa0842aa07c2aa0922aa0802aa0962aa0aa2aa0a82aa0a62aa0ae2aa0b02aa0ac2aa0b42aa0b22aa0b62aa0b82aa0ba2aa0")\ - X( 7 , 0, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036a12836a10836a12636a11236a10c36a11e36a11c36a10636a12436a10436a10a36a11036a11636a12036a11836a10e36a12a36a11a36a12236a11436a17a36a12c36a12e36a10236a13036a13236a13436a13a36a13c36a13836a13636a19c36a14036a13e36a14c36a14236a14e36a14a36a14636a15436a14436a15c36a15a36a16836a16236a16636a14836a17236a16c36a15036a19e36a17636a1a036a15236a15836a15636a16e36a16036a16a36a17036a17436a15e36a16436a1a236a17836a18c36a18e36a18236a1a436a18636a18a36a19836a19a36a19036a17e36a19436a18836a18436a17c36a19236a18036a19636a1aa36a1a836a1a636a1ae36a1b036a1ac36a1b436a1b236a1b636a1b836a1ba36a1")\ - X(8 , 0, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "015b5b295b5b095b5b275b5b135b5b0d5b5b1f5b5b1d5b5b075b5b255b5b055b5b0b5b5b115b5b175b5b215b5b195b5b0f5b5b2b5b5b1b5b5b235b5b155b5b7b5b5b2d5b5b2f5b5b035b5b315b5b335b5b355b5b3b5b5b3d5b5b395b5b375b5b9d5b5b415b5b3f5b5b4d5b5b435b5b4f5b5b4b5b5b475b5b555b5b455b5b5d5b5b5b5b5b695b5b635b5b675b5b735b5b6d5b5b515b5b9f5b5b775b5ba15b5b535b5b595b5b575b5b6f5b5b615b5b6b5b5b715b5b755b5b5f5b5b655b5ba35b5b795b5b8d5b5b8f5b5b835b5ba55b5b875b5b8b5b5b995b5b9b5b5b915b5b7f5b5b955b5b895b5b855b5bab5b5ba95b5ba75b5baf5b5bb15b5bad5b5bb55b5bb35b5bb75b5bb95b5bbb5b5b")\ - X( 9 , 0, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "015c5c295c5c095c5c275c5c135c5c0d5c5c1f5c5c1d5c5c075c5c255c5c055c5c0b5c5c115c5c175c5c215c5c195c5c0f5c5c2b5c5c1b5c5c235c5c155c5c7b5c5c2d5c5c2f5c5c035c5c315c5c335c5c355c5c3b5c5c3d5c5c395c5c375c5c9d5c5c415c5c3f5c5c4d5c5c435c5c4f5c5c4b5c5c475c5c555c5c455c5c5d5c5c5b5c5c695c5c635c5c675c5c495c5c735c5c6d5c5c515c5c9f5c5c775c5ca15c5c535c5c595c5c575c5c6f5c5c615c5c6b5c5c715c5c755c5c5f5c5c655c5ca35c5c795c5c8d5c5c8f5c5c835c5ca55c5c875c5c8b5c5c995c5c9b5c5c915c5c7f5c5c955c5c895c5c855c5c7d5c5c935c5c815c5c975c5cab5c5ca95c5ca75c5caf5c5cb15c5cad5c5cb55c5cb35c5cb75c5cb95c5cbb5c5c")\ + X(2 , 0, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001da2061da2101da20e1da2141da2161da2021da20a1da20c1da2181da2041da2081da21a1da2121da2201da21e1da21c1da2221da2241da2281da2261da22a1da2301da22e1da22c1da2341da2361da2321da2381da23a1da23e1da23c1da2401da2421da2441da2461da2481da24e1da2501da24a1da24c1da2521da2561da2581da2541da25a1da25c1da25e1da2601da2641da26c1da2621da26a1da2661da2681da26e1da2701da2721da27c1da2741da2761da2781da27a1da27e1da2801da2861da2821da2841da2881da28a1da28c1da28e1da2921da2901da2941da2961da2981da29a1da29c1da2a01da29e1da2a21da2a41da2a61da2a81da2aa1da2ac1da2")\ + X( 3 , 0, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011da3071da3111da30f1da3151da3171da3031da30b1da30d1da3191da3051da3091da31b1da3131da3211da31f1da31d1da3231d19251da3291da3271da32b1da3311da32f1da32d1da3351da3371da3331da3391da33b1da33f1da33d1da3411da3431ddf451da3471da3491da34f1da3511da34b1da34d1da3531da3571da3591da3551da35b1da35d1da35f1da3611da3651da36d1da3631da36b1da3671da3691da36f1da3711da3731da37d1da3751da3771da3791da37b1da37f1da3811da3871da3831da3851da3891da38b1da38d1da38f1da3931da3911da3951da3971da3991da39b1da39d1da3a11da39f1da3a31da3a51da3a71da3a91da3ab1da3ad1da3")\ + X(4 , 0, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038a40638a41038a40e38a41438a41638a40238a40a38a40c38a41838a40438a40838a41a38a41238a42038a41e38a41c38a42238a42438a42838a42638a42a38a43038a42e38a42c38a43438a43638a43238a43838a43a38a43e38a43c38a44038a44238a44438a44638a44838a44e38a45038a44a38a44c38a45238a45638a45838a45438a45a38a45c38a45e38a46038a46438a46c38a46238a46a38a46638a46838a46e38a47038a47238a47c38a47438a47638a47838a47a38a47e38a48038a48638a48238a48438a48838a48a38a48c38a48e38a49238a49038a49438a49638a49838a49a38a49c38a4a038a49e38a4a238a4a438a4a638a4a838a4aa38a4ac38a4")\ + X( 5 , 0, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138a50738a51138a50f38a51538a51738a50338a50b38a50d38a51938a50538a50938a51b38a51338a52138a51f38a51d38a52338152538a52938a52738a52b38a53138a52f38a52d38a53538a53738a53338a53938a53b38a53f38a53d38a54138a54338a54538a54738a54938a54f38a55138a54b38a54d38a55338a55738a55938a55538a55b38a55d38a55f38a56138a56538a56d38a56338a56b38a56738a56938a56f38a57138a57338a57d38a57538a57738a57938a57b38a57f38a58138a58738a58338a58538a58938a58b38a58d38a58f38a59338a59138a59538a59738a59938a59b38a59d38a5a138a59f38a5a338a5a538a5a738a5a938a5ab38a5ad38a5")\ + X(6 , 0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002aa0062aa0102aa00e2aa0142aa0162aa0022aa00a2aa00c2aa0182aa0042aa0082aa01a2aa0122aa0202aa01e2aa01c2aa0222aa0242aa0282aa0262aa02a2aa0302aa02e2aa02c2aa0342aa0362aa0322aa0382aa03a2aa03e2aa03c2aa0402aa0422aa0442aa0462aa0482aa04e2aa0502aa04a2aa04c2aa0522aa0562aa0582aa0542aa05a2aa05c2aa05e2aa0602aa0642aa06c2aa0622aa06a2aa0662aa0682aa06e2aa0702aa0722aa07c2aa0742aa0762aa0782aa07a2aa07e2aa0802aa0862aa0822aa0842aa0882aa08a2aa08c2aa08e2aa0922aa0902aa0942aa0962aa0982aa09a2aa09c2aa0a02aa09e2aa0a22aa0a42aa0a62aa0a82aa0aa2aa0ac2aa0")\ + X( 7 , 0, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036a10636a11036a10e36a11436a11636a10236a10a36a10c36a11836a10436a10836a11a36a11236a12036a11e36a11c36a12236a12436a12836a12636a12a36a13036a12e36a12c36a13436a13636a13236a13836a13a36a13e36a13c36a14036a14236a14436a14636a14836a14e36a15036a14a36a14c36a15236a15636a15836a15436a15a36a15c36a15e36a16036a16436a16c36a16236a16a36a16636a16836a16e36a17036a17236a17c36a17436a17636a17836a17a36a17e36a18036a18636a18236a18436a18836a18a36a18c36a18e36a19236a19036a19436a19636a19836a19a36a19c36a1a036a19e36a1a236a1a436a1a636a1a836a1aa36a1ac36a1")\ + X(8 , 0, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "015b5b075b5b115b5b0f5b5b155b5b175b5b035b5b0b5b5b0d5b5b195b5b055b5b095b5b1b5b5b135b5b215b5b1f5b5b1d5b5b235b5b255b5b295b5b275b5b2b5b5b315b5b2f5b5b2d5b5b355b5b375b5b335b5b395b5b3b5b5b3f5b5b3d5b5b415b5b435b5b455b5b475b5b4f5b5b515b5b4b5b5b4d5b5b535b5b575b5b595b5b555b5b5b5b5b5d5b5b5f5b5b615b5b655b5b6d5b5b635b5b6b5b5b675b5b695b5b6f5b5b715b5b735b5b7d5b5b755b5b775b5b795b5b7b5b5b7f5b5b815b5b875b5b835b5b855b5b895b5b8b5b5b8d5b5b935b5b975b5b995b5b9b5b5b9d5b5ba15b5b9f5b5ba35b5ba55b5ba75b5ba95b5bab5b5bad5b5b")\ + X( 9 , 0, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "015c5c075c5c115c5c0f5c5c155c5c175c5c035c5c0b5c5c0d5c5c195c5c055c5c095c5c1b5c5c135c5c215c5c1f5c5c1d5c5c235c5c255c5c295c5c275c5c2b5c5c315c5c2f5c5c2d5c5c355c5c375c5c335c5c395c5c3b5c5c3f5c5c3d5c5c415c5c435c5c455c5c475c5c495c5c4f5c5c515c5c4b5c5c4d5c5c535c5c575c5c595c5c555c5c5b5c5c5d5c5c5f5c5c615c5c655c5c6d5c5c635c5c6b5c5c675c5c695c5c6f5c5c715c5c735c5c7d5c5c755c5c775c5c795c5c7b5c5c7f5c5c815c5c875c5c835c5c855c5c895c5c8b5c5c8d5c5c8f5c5c935c5c915c5c955c5c975c5c995c5c9b5c5c9d5c5ca15c5c9f5c5ca35c5ca55c5ca75c5ca95c5cab5c5cad5c5c")\ X(10 , 0, LeftHyper , "Hyper" , "" , 0 , 57445, 'u', -1 , -1 , "")\ X( 11 , 0, RightHyper , "Hyper" , "" , 0 , 57451, 'u', -1 , -1 , "")\ X(12 , 0, AltGR , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ - X(14 , 0, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0145902945900945902745901345900d45901f45901d45900745902545900545900b45901145901745902145901945900f45902b45901b45902345901545907b45902d45902f45900345903145903345903545903b45903d45903945903745909d45904145903f45904d45904345904f45904b45904745905545904545905d45905b45906945906345906745904945907345906d45905145909f4590774590a145905345905945905745906f45906145906b45907145907545905f4590654590a345907945908d45908f4590834590a545908745908b45909945909b45909145907f45909545908945908545907d4590934590814590974590ab4590a94590a74590af4590b14590ad4590b54590b34590b74590b94590bb4590")\ - X(16 , 0, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14283a14083a14263a14123a140c3a141e3a141c3a14063a14243a14043a140a3a14103a14163a14203a14183a140e3a142a3a141a3a14223a14143a147a3a142c3a142e3a14023a14303a14323a14343a143a3a143c3a14383a14363a149c3a14403a143e3a144c3a14423a144e3a144a3a14463a14543a14443a145c3a145a3a14683a14623a14663a14483a14723a146c3a14503a149e3a14763a14a03a14523a14583a14563a146e3a14603a146a3a14703a14743a145e3a14643a14a23a14783a148c3a148e3a14823a14a43a14863a148a3a14983a149a3a14903a147e3a14943a14883a14843a147c3a14923a14803a14963a14aa3a14a83a14a63a14ae3a14b03a14ac3a14b43a14b23a14b63a14b83a14ba3a14")\ - X(18 , 0, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046912846910846912646911246910c46911e46911c46910646912446910446910a46911046911646912046911846910e46912a46911a46912246911446917a46912c46912e46910246913046913246913446913a46913c46913846913646919c46914046913e46914c46914246914e46914a46914646915446914446915c46915a46916846916246916646914846917246916c46915046919e4691764691a046915246915846915646916e46916046916a46917046917446915e4691644691a246917846918c46918e4691824691a446918646918a46919846919a46919046917e46919446918846918446917c4691924691804691964691aa4691a84691a64691ae4691b04691ac4691b44691b24691b64691b84691ba4691")\ - X(20 , 0, Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0670f2")\ - X(22 , 0, Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "06791c")\ - X(24 , 0, Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "067b1d")\ - X(26 , 0, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "02f119")\ - X(28 , 0, Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "02f215")\ + X(14 , 0, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0145900745901145900f45901545901745900345900b45900d45901945900545900945901b45901345902145901f45901d45902345902545902945902745902b45903145902f45902d45903545903745903345903945903b45903f45903d45904145904345904545904745904945904f45905145904b45904d45905345905745905945905545905b45905d45905f45906145906545906d45906345906b45906745906945906f45907145907345907d45907545907745907945907b45907f45908145908745908345908545908945908b45908d45908f45909345909145909545909745909945909b45909d4590a145909f4590a34590a54590a74590a94590ab4590ad4590")\ + X(16 , 0, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14063a14103a140e3a14143a14163a14023a140a3a140c3a14183a14043a14083a141a3a14123a14203a141e3a141c3a14223a14243a14283a14263a142a3a14303a142e3a142c3a14343a14363a14323a14383a143a3a143e3a143c3a14403a14423a14443a14463a14483a144e3a14503a144a3a144c3a14523a14563a14583a14543a145a3a145c3a145e3a14603a14643a146c3a14623a146a3a14663a14683a146e3a14703a14723a147c3a14743a14763a14783a147a3a147e3a14803a14863a14823a14843a14883a148a3a148c3a148e3a14923a14903a14943a14963a14983a149a3a149c3a14a03a149e3a14a23a14a43a14a63a14a83a14aa3a14ac3a14")\ + X(18 , 0, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046910646911046910e46911446911646910246910a46910c46911846910446910846911a46911246912046911e46911c46912246912446912846912646912a46913046912e46912c46913446913646913246913846913a46913e46913c46914046914246914446914646914846914e46915046914a46914c46915246915646915846915446915a46915c46915e46916046916446916c46916246916a46916646916846916e46917046917246917c46917446917646917846917a46917e46918046918646918246918446918846918a46918c46918e46919246919046919446919646919846919a46919c4691a046919e4691a24691a44691a64691a84691aa4691ac4691")\ + X(20 , 0, Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0270f2")\ + X(22 , 0, Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "02791c")\ + X(24 , 0, Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "027b1d")\ + X(26 , 0, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "22f119")\ + X(28 , 0, Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "22f215")\ X(30 , 0, IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "")\ - X(32 , 0, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "015d5d295d5d095d5d275d5d135d5d0d5d5d1f5d5d1d5d5d075d5d255d5d055d5d0b5d5d115d5d175d5d215d5d195d5d0f5d5d2b5d5d1b5d5d235d5d155d5d7b5d5d2d5d5d2f5d5d035d5d315d5d335d5d355d5d3b5d5d3d5d5d395d5d375d5d9d5d5d415d5d3f5d5d4d5d5d435d5d4f5d5d4b5d5d475d5d555d5d455d5d5d5d5d5b5d5d695d5d635d5d675d5d735d5d6d5d5d515d5d9f5d5d775d5da15d5d535d5d595d5d575d5d6f5d5d615d5d6b5d5d715d5d755d5d5f5d5d655d5da35d5d795d5d8d5d5d8f5d5d835d5da55d5d875d5d8b5d5d995d5d9b5d5d915d5d7f5d5d955d5d895d5d855d5dab5d5da95d5da75d5daf5d5db15d5dad5d5db55d5db35d5db75d5db95d5dbb5d5d")\ + X(32 , 0, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "015d5d075d5d115d5d0f5d5d155d5d175d5d035d5d0b5d5d0d5d5d195d5d055d5d095d5d1b5d5d135d5d215d5d1f5d5d1d5d5d235d5d255d5d295d5d275d5d2b5d5d315d5d2f5d5d2d5d5d355d5d375d5d335d5d395d5d3b5d5d3f5d5d3d5d5d415d5d435d5d455d5d475d5d4f5d5d515d5d4b5d5d4d5d5d535d5d575d5d595d5d555d5d5b5d5d5d5d5d5f5d5d615d5d655d5d6d5d5d635d5d6b5d5d675d5d695d5d6f5d5d715d5d735d5d7d5d5d755d5d775d5d795d5d7b5d5d7f5d5d815d5d875d5d835d5d855d5d895d5d8b5d5d8d5d5d935d5d975d5d995d5d9b5d5d9d5d5da15d5d9f5d5da35d5da55d5da75d5da95d5dab5d5dad5d5d")\ X(34 , 0, Select , "Select" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(36 , 0, Fn , "Fn" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(38 , 0, F1 , "F1" , "" , 0 , 11 , '~', -1 , -1 , "003b70283b70083b70263b70123b700c3b701e3b701c3b70063b70243b70043b700a3b70103b70163b70203b70183b700e3b702a3b701a3b70223b70143b707a3b702c3b702e3b70023b70303b70323b70343b703a3b703c3b70383b70363b709c3b70403b703e3b704c3b70423b704e3b704a3b70463b70543b70443b705c3b705a3b70683b70623b70663b70483b70723b706c3b70503b709e3b70763b70a03b70523b70583b70563b706e3b70603b706a3b70703b70743b705e3b70643b70a23b70783b708c3b708e3b70823b70a43b70863b708a3b70983b709a3b70903b707e3b70943b70883b70843b707c3b70923b70803b70963b70aa3b70a83b70a63b70ae3b70b03b70ac3b70b43b70b23b70b63b70b83b70ba3b70")\ - X(40 , 0, F2 , "F2" , "" , 0 , 12 , '~', -1 , -1 , "003c71283c71083c71263c71123c710c3c711e3c711c3c71063c71243c71043c710a3c71103c71163c71203c71183c710e3c712a3c711a3c71223c71143c717a3c712c3c712e3c71023c71303c71323c71343c713a3c713c3c71383c71363c719c3c71403c713e3c714c3c71423c714e3c714a3c71463c71543c71443c715c3c715a3c71683c71623c71663c71483c71723c716c3c71503c719e3c71763c71a03c71523c71583c71563c716e3c71603c716a3c71703c71743c715e3c71643c71a23c71783c718c3c718e3c71823c71a43c71863c718a3c71983c719a3c71903c717e3c71943c71883c71843c717c3c71923c71803c71963c71aa3c71a83c71a63c71ae3c71b03c71ac3c71b43c71b23c71b63c71b83c71ba3c71")\ - X(42 , 0, F3 , "F3" , "" , 0 , 13 , '~', -1 , -1 , "003d72283d72083d72263d72123d720c3d721e3d721c3d72063d72243d72043d720a3d72103d72163d72203d72183d720e3d722a3d721a3d72223d72143d727a3d722c3d722e3d72023d72303d72323d72343d723a3d723c3d72383d72363d729c3d72403d723e3d724c3d72423d724e3d724a3d72463d72543d72443d725c3d725a3d72683d72623d72663d72483d72723d726c3d72503d729e3d72763d72a03d72523d72583d72563d726e3d72603d726a3d72703d72743d725e3d72643d72a23d72783d728c3d728e3d72823d72a43d72863d728a3d72983d729a3d72903d727e3d72943d72883d72843d727c3d72923d72803d72963d72aa3d72a83d72a63d72ae3d72b03d72ac3d72b43d72b23d72b63d72b83d72ba3d72")\ - X(44 , 0, F4 , "F4" , "" , 0 , 14 , '~', -1 , -1 , "003e73283e73083e73263e73123e730c3e731e3e731c3e73063e73243e73043e730a3e73103e73163e73203e73183e730e3e732a3e731a3e73223e73143e737a3e732c3e732e3e73023e73303e73323e73343e733a3e733c3e73383e73363e739c3e73403e733e3e734c3e73423e734e3e734a3e73463e73543e73443e735c3e735a3e73683e73623e73663e73483e73723e736c3e73503e739e3e73763e73a03e73523e73583e73563e736e3e73603e736a3e73703e73743e735e3e73643e73a23e73783e738c3e738e3e73823e73a43e73863e738a3e73983e739a3e73903e737e3e73943e73883e73843e737c3e73923e73803e73963e73aa3e73a83e73a63e73ae3e73b03e73ac3e73b43e73b23e73b63e73b83e73ba3e73")\ - X(46 , 0, F5 , "F5" , "" , 0 , 15 , '~', -1 , -1 , "003f74283f74083f74263f74123f740c3f741e3f741c3f74063f74243f74043f740a3f74103f74163f74203f74183f740e3f742a3f741a3f74223f74143f747a3f742c3f742e3f74023f74303f74323f74343f743a3f743c3f74383f74363f749c3f74403f743e3f744c3f74423f744e3f744a3f74463f74543f74443f745c3f745a3f74683f74623f74663f74483f74723f746c3f74503f749e3f74763f74a03f74523f74583f74563f746e3f74603f746a3f74703f74743f745e3f74643f74a23f74783f748c3f748e3f74823f74a43f74863f748a3f74983f749a3f74903f747e3f74943f74883f74843f747c3f74923f74803f74963f74aa3f74a83f74a63f74ae3f74b03f74ac3f74b43f74b23f74b63f74b83f74ba3f74")\ - X(48 , 0, F6 , "F6" , "" , 0 , 17 , '~', -1 , -1 , "0040752840750840752640751240750c40751e40751c40750640752440750440750a40751040751640752040751840750e40752a40751a40752240751440757a40752c40752e40750240753040753240753440753a40753c40753840753640759c40754040753e40754c40754240754e40754a40754640755440754440755c40755a40756840756240756640754840757240756c40755040759e4075764075a040755240755840755640756e40756040756a40757040757440755e4075644075a240757840758c40758e4075824075a440758640758a40759840759a40759040757e40759440758840758440757c4075924075804075964075aa4075a84075a64075ae4075b04075ac4075b44075b24075b64075b84075ba4075")\ - X(50 , 0, F7 , "F7" , "" , 0 , 18 , '~', -1 , -1 , "0041762841760841762641761241760c41761e41761c41760641762441760441760a41761041761641762041761841760e41762a41761a41762241761441767a41762c41762e41760241763041763241763441763a41763c41763841763641769c41764041763e41764c41764241764e41764a41764641765441764441765c41765a41766841766241766641764841767241766c41765041769e4176764176a041765241765841765641766e41766041766a41767041767441765e4176644176a241767841768c41768e4176824176a441768641768a41769841769a41769041767e41769441768841768441767c4176924176804176964176aa4176a84176a64176ae4176b04176ac4176b44176b24176b64176b84176ba4176")\ - X(52 , 0, F8 , "F8" , "" , 0 , 19 , '~', -1 , -1 , "0042772842770842772642771242770c42771e42771c42770642772442770442770a42771042771642772042771842770e42772a42771a42772242771442777a42772c42772e42770242773042773242773442773a42773c42773842773642779c42774042773e42774c42774242774e42774a42774642775442774442775c42775a42776842776242776642774842777242776c42775042779e4277764277a042775242775842775642776e42776042776a42777042777442775e4277644277a242777842778c42778e4277824277a442778642778a42779842779a42779042777e42779442778842778442777c4277924277804277964277aa4277a84277a64277ae4277b04277ac4277b44277b24277b64277b84277ba4277")\ - X(54 , 0, F9 , "F9" , "" , 0 , 20 , '~', -1 , -1 , "0043782843780843782643781243780c43781e43781c43780643782443780443780a43781043781643782043781843780e43782a43781a43782243781443787a43782c43782e43780243783043783243783443783a43783c43783843783643789c43784043783e43784c43784243784e43784a43784643785443784443785c43785a43786843786243786643784843787243786c43785043789e4378764378a043785243785843785643786e43786043786a43787043787443785e4378644378a243787843788c43788e4378824378a443788643788a43789843789a43789043787e43789443788843788443787c4378924378804378964378aa4378a84378a64378ae4378b04378ac4378b44378b24378b64378b84378ba4378")\ - X(56 , 0, F10 , "F10" , "" , 0 , 21 , '~', -1 , -1 , "0044792844790844792644791244790c44791e44791c44790644792444790444790a44791044791644792044791844790e44792a44791a44792244791444797a44792c44792e44790244793044793244793444793a44793c44793844793644799c44794044793e44794c44794244794e44794a44794644795444794444795c44795a44796844796244796644794844797244796c44795044799e4479764479a044795244795844795644796e44796044796a44797044797444795e4479644479a244797844798c44798e4479824479a444798644798a44799844799a44799044797e44799444798844798444797c4479924479804479964479aa4479a84479a64479ae4479b04479ac4479b44479b24479b64479b84479ba4479")\ - X(58 , 0, F11 , "F11" , "" , 0 , 23 , '~', -1 , -1 , "00577a28577a08577a26577a12577a0c577a1e577a1c577a06577a24577a04577a0a577a10577a16577a20577a18577a0e577a2a577a1a577a22577a14577a7a577a2c577a2e577a02577a30577a32577a34577a3a577a3c577a38577a36577a9c577a40577a3e577a4c577a42577a4e577a4a577a46577a54577a44577a5c577a5a577a68577a62577a66577a48577a72577a6c577a50577a9e577a76577aa0577a52577a58577a56577a6e577a60577a6a577a70577a74577a5e577a64577aa2577a78577a8c577a8e577a82577aa4577a86577a8a577a98577a9a577a90577a7e577a94577a88577a84577a7c577a92577a80577a96577aaa577aa8577aa6577aae577ab0577aac577ab4577ab2577ab6577ab8577aba577a")\ - X(60 , 0, F12 , "F12" , "" , 0 , 24 , '~', -1 , -1 , "00587b28587b08587b26587b12587b0c587b1e587b1c587b06587b24587b04587b0a587b10587b16587b20587b18587b0e587b2a587b1a587b22587b14587b7a587b2c587b2e587b02587b30587b32587b34587b3a587b3c587b38587b36587b9c587b40587b3e587b4c587b42587b4e587b4a587b46587b54587b44587b5c587b5a587b68587b62587b66587b48587b72587b6c587b50587b9e587b76587ba0587b52587b58587b56587b6e587b60587b6a587b70587b74587b5e587b64587ba2587b78587b8c587b8e587b82587ba4587b86587b8a587b98587b9a587b90587b7e587b94587b88587b84587b7c587b92587b80587b96587baa587ba8587ba6587bae587bb0587bac587bb4587bb2587bb6587bb8587bba587b")\ - X(62 , 0, F13 , "F13" , "" , 0 , 57376, 'u', -1 , -1 , "00647c28647c08647c26647c12647c0c647c1e647c1c647c06647c24647c04647c0a647c10647c16647c20647c18647c0e647c2a647c1a647c22647c14647c7a647c2c647c2e647c02647c30647c32647c34647c3a647c3c647c38647c36647c9c647c40647c3e647c4c647c42647c4e647c4a647c46647c54647c44647c5c647c5a647c68647c62647c66647c48647c72647c6c647c50647c9e647c76647ca0647c52647c58647c56647c6e647c60647c6a647c70647c74647c5e647c64647ca2647c78647c8c647c8e647c82647ca4647c86647c8a647c98647c9a647c90647c7e647c94647c88647c84647c7c647c92647c80647c96647caa647ca8647ca6647cae647cb0647cac647cb4647cb2647cb6647cb8647cba647c")\ - X(64 , 0, F14 , "F14" , "" , 0 , 57377, 'u', -1 , -1 , "00657d28657d08657d26657d12657d0c657d1e657d1c657d06657d24657d04657d0a657d10657d16657d20657d18657d0e657d2a657d1a657d22657d14657d7a657d2c657d2e657d02657d30657d32657d34657d3a657d3c657d38657d36657d9c657d40657d3e657d4c657d42657d4e657d4a657d46657d54657d44657d5c657d5a657d68657d62657d66657d48657d72657d6c657d50657d9e657d76657da0657d52657d58657d56657d6e657d60657d6a657d70657d74657d5e657d64657da2657d78657d8c657d8e657d82657da4657d86657d8a657d98657d9a657d90657d7e657d94657d88657d84657d7c657d92657d80657d96657daa657da8657da6657dae657db0657dac657db4657db2657db6657db8657dba657d")\ - X(66 , 0, F15 , "F15" , "" , 0 , 57378, 'u', -1 , -1 , "00667e28667e08667e26667e12667e0c667e1e667e1c667e06667e24667e04667e0a667e10667e16667e20667e18667e0e667e2a667e1a667e22667e14667e7a667e2c667e2e667e02667e30667e32667e34667e3a667e3c667e38667e36667e9c667e40667e3e667e4c667e42667e4e667e4a667e46667e54667e44667e5c667e5a667e68667e62667e66667e48667e72667e6c667e50667e9e667e76667ea0667e52667e58667e56667e6e667e60667e6a667e70667e74667e5e667e64667ea2667e78667e8c667e8e667e82667ea4667e86667e8a667e98667e9a667e90667e7e667e94667e88667e84667e7c667e92667e80667e96667eaa667ea8667ea6667eae667eb0667eac667eb4667eb2667eb6667eb8667eba667e")\ - X(68 , 0, F16 , "F16" , "" , 0 , 57379, 'u', -1 , -1 , "00677f28677f08677f26677f12677f0c677f1e677f1c677f06677f24677f04677f0a677f10677f16677f20677f18677f0e677f2a677f1a677f22677f14677f7a677f2c677f2e677f02677f30677f32677f34677f3a677f3c677f38677f36677f9c677f40677f3e677f4c677f42677f4e677f4a677f46677f54677f44677f5c677f5a677f68677f62677f66677f48677f72677f6c677f50677f9e677f76677fa0677f52677f58677f56677f6e677f60677f6a677f70677f74677f5e677f64677fa2677f78677f8c677f8e677f82677fa4677f86677f8a677f98677f9a677f90677f7e677f94677f88677f84677f7c677f92677f80677f96677faa677fa8677fa6677fae677fb0677fac677fb4677fb2677fb6677fb8677fba677f")\ - X(70 , 0, F17 , "F17" , "" , 0 , 57380, 'u', -1 , -1 , "0068802868800868802668801268800c68801e68801c68800668802468800468800a68801068801668802068801868800e68802a68801a68802268801468807a68802c68802e68800268803068803268803468803a68803c68803868803668809c68804068803e68804c68804268804e68804a68804668805468804468805c68805a68806868806268806668804868807268806c68805068809e6880766880a068805268805868805668806e68806068806a68807068807468805e6880646880a268807868808c68808e6880826880a468808668808a68809868809a68809068807e68809468808868808468807c6880926880806880966880aa6880a86880a66880ae6880b06880ac6880b46880b26880b66880b86880ba6880")\ - X(72 , 0, F18 , "F18" , "" , 0 , 57381, 'u', -1 , -1 , "0069812869810869812669811269810c69811e69811c69810669812469810469810a69811069811669812069811869810e69812a69811a69812269811469817a69812c69812e69810269813069813269813469813a69813c69813869813669819c69814069813e69814c69814269814e69814a69814669815469814469815c69815a69816869816269816669814869817269816c69815069819e6981766981a069815269815869815669816e69816069816a69817069817469815e6981646981a269817869818c69818e6981826981a469818669818a69819869819a69819069817e69819469818869818469817c6981926981806981966981aa6981a86981a66981ae6981b06981ac6981b46981b26981b66981b86981ba6981")\ - X(74 , 0, F19 , "F19" , "" , 0 , 57382, 'u', -1 , -1 , "006a82286a82086a82266a82126a820c6a821e6a821c6a82066a82246a82046a820a6a82106a82166a82206a82186a820e6a822a6a821a6a82226a82146a827a6a822c6a822e6a82026a82306a82326a82346a823a6a823c6a82386a82366a829c6a82406a823e6a824c6a82426a824e6a824a6a82466a82546a82446a825c6a825a6a82686a82626a82666a82486a82726a826c6a82506a829e6a82766a82a06a82526a82586a82566a826e6a82606a826a6a82706a82746a825e6a82646a82a26a82786a828c6a828e6a82826a82a46a82866a828a6a82986a829a6a82906a827e6a82946a82886a82846a827c6a82926a82806a82966a82aa6a82a86a82a66a82ae6a82b06a82ac6a82b46a82b26a82b66a82b86a82ba6a82")\ - X(76 , 0, F20 , "F20" , "" , 0 , 57383, 'u', -1 , -1 , "006b83286b83086b83266b83126b830c6b831e6b831c6b83066b83246b83046b830a6b83106b83166b83206b83186b830e6b832a6b831a6b83226b83146b837a6b832c6b832e6b83026b83306b83326b83346b833a6b833c6b83386b83366b839c6b83406b833e6b834c6b83426b834e6b834a6b83466b83546b83446b835c6b835a6b83686b83626b83666b83486b83726b836c6b83506b839e6b83766b83a06b83526b83586b83566b836e6b83606b836a6b83706b83746b835e6b83646b83a26b83786b838c6b838e6b83826b83a46b83866b838a6b83986b839a6b83906b837e6b83946b83886b83846b837c6b83926b83806b83966b83aa6b83a86b83a66b83ae6b83b06b83ac6b83b46b83b26b83b66b83b86b83ba6b83")\ - X(78 , 0, F21 , "F21" , "" , 0 , 57384, 'u', -1 , -1 , "006c84286c84086c84266c84126c840c6c841e6c841c6c84066c84246c84046c840a6c84106c84166c84206c84186c840e6c842a6c841a6c84226c84146c847a6c842c6c842e6c84026c84306c84326c84346c843a6c843c6c84386c84366c849c6c84406c843e6c844c6c84426c844e6c844a6c84466c84546c84446c845c6c845a6c84686c84626c84666c84486c84726c846c6c84506c849e6c84766c84a06c84526c84586c84566c846e6c84606c846a6c84706c84746c845e6c84646c84a26c84786c848c6c848e6c84826c84a46c84866c848a6c84986c849a6c84906c847e6c84946c84886c84846c847c6c84926c84806c84966c84aa6c84a86c84a66c84ae6c84b06c84ac6c84b46c84b26c84b66c84b86c84ba6c84")\ - X(80 , 0, F22 , "F22" , "" , 0 , 57385, 'u', -1 , -1 , "006d85286d85086d85266d85126d850c6d851e6d851c6d85066d85246d85046d850a6d85106d85166d85206d85186d850e6d852a6d851a6d85226d85146d857a6d852c6d852e6d85026d85306d85326d85346d853a6d853c6d85386d85366d859c6d85406d853e6d854c6d85426d854e6d854a6d85466d85546d85446d855c6d855a6d85686d85626d85666d85486d85726d856c6d85506d859e6d85766d85a06d85526d85586d85566d856e6d85606d856a6d85706d85746d855e6d85646d85a26d85786d858c6d858e6d85826d85a46d85866d858a6d85986d859a6d85906d857e6d85946d85886d85846d857c6d85926d85806d85966d85aa6d85a86d85a66d85ae6d85b06d85ac6d85b46d85b26d85b66d85b86d85ba6d85")\ - X(82 , 0, F23 , "F23" , "" , 0 , 57386, 'u', -1 , -1 , "006e86286e86086e86266e86126e860c6e861e6e861c6e86066e86246e86046e860a6e86106e86166e86206e86186e860e6e862a6e861a6e86226e86146e867a6e862c6e862e6e86026e86306e86326e86346e863a6e863c6e86386e86366e869c6e86406e863e6e864c6e86426e864e6e864a6e86466e86546e86446e865c6e865a6e86686e86626e86666e86486e86726e866c6e86506e869e6e86766e86a06e86526e86586e86566e866e6e86606e866a6e86706e86746e865e6e86646e86a26e86786e868c6e868e6e86826e86a46e86866e868a6e86986e869a6e86906e867e6e86946e86886e86846e867c6e86926e86806e86966e86aa6e86a86e86a66e86ae6e86b06e86ac6e86b46e86b26e86b66e86b86e86ba6e86")\ - X(84 , 0, F24 , "F24" , "" , 0 , 57387, 'u', -1 , -1 , "006f87286f87086f87266f87126f870c6f871e6f871c6f87066f87246f87046f870a6f87106f87166f87206f87186f870e6f872a6f871a6f87226f87146f877a6f872c6f872e6f87026f87306f87326f87346f873a6f873c6f87386f87366f879c6f87406f873e6f874c6f87426f874e6f874a6f87466f87546f87446f875c6f875a6f87686f87626f87666f87486f87726f876c6f87506f879e6f87766f87a06f87526f87586f87566f876e6f87606f876a6f87706f87746f875e6f87646f87a26f87786f878c6f878e6f87826f87a46f87866f878a6f87986f879a6f87906f877e6f87946f87886f87846f877c6f87926f87806f87966f87aa6f87a86f87a66f87ae6f87b06f87ac6f87b46f87b26f87b66f87b86f87ba6f87")\ + X(38 , 0, F1 , "F1" , "" , 0 , 11 , '~', -1 , -1 , "003b70063b70103b700e3b70143b70163b70023b700a3b700c3b70183b70043b70083b701a3b70123b70203b701e3b701c3b70223b70243b70283b70263b702a3b70303b702e3b702c3b70343b70363b70323b70383b703a3b703e3b703c3b70403b70423b70443b70463b70483b704e3b70503b704a3b704c3b70523b70563b70583b70543b705a3b705c3b705e3b70603b70643b706c3b70623b706a3b70663b70683b706e3b70703b70723b707c3b70743b70763b70783b707a3b707e3b70803b70863b70823b70843b70883b708a3b708c3b708e3b70923b70903b70943b70963b70983b709a3b709c3b70a03b709e3b70a23b70a43b70a63b70a83b70aa3b70ac3b70")\ + X(40 , 0, F2 , "F2" , "" , 0 , 12 , '~', -1 , -1 , "003c71063c71103c710e3c71143c71163c71023c710a3c710c3c71183c71043c71083c711a3c71123c71203c711e3c711c3c71223c71243c71283c71263c712a3c71303c712e3c712c3c71343c71363c71323c71383c713a3c713e3c713c3c71403c71423c71443c71463c71483c714e3c71503c714a3c714c3c71523c71563c71583c71543c715a3c715c3c715e3c71603c71643c716c3c71623c716a3c71663c71683c716e3c71703c71723c717c3c71743c71763c71783c717a3c717e3c71803c71863c71823c71843c71883c718a3c718c3c718e3c71923c71903c71943c71963c71983c719a3c719c3c71a03c719e3c71a23c71a43c71a63c71a83c71aa3c71ac3c71")\ + X(42 , 0, F3 , "F3" , "" , 0 , 13 , '~', -1 , -1 , "003d72063d72103d720e3d72143d72163d72023d720a3d720c3d72183d72043d72083d721a3d72123d72203d721e3d721c3d72223d72243d72283d72263d722a3d72303d722e3d722c3d72343d72363d72323d72383d723a3d723e3d723c3d72403d72423d72443d72463d72483d724e3d72503d724a3d724c3d72523d72563d72583d72543d725a3d725c3d725e3d72603d72643d726c3d72623d726a3d72663d72683d726e3d72703d72723d727c3d72743d72763d72783d727a3d727e3d72803d72863d72823d72843d72883d728a3d728c3d728e3d72923d72903d72943d72963d72983d729a3d729c3d72a03d729e3d72a23d72a43d72a63d72a83d72aa3d72ac3d72")\ + X(44 , 0, F4 , "F4" , "" , 0 , 14 , '~', -1 , -1 , "003e73063e73103e730e3e73143e73163e73023e730a3e730c3e73183e73043e73083e731a3e73123e73203e731e3e731c3e73223e73243e73283e73263e732a3e73303e732e3e732c3e73343e73363e73323e73383e733a3e733e3e733c3e73403e73423e73443e73463e73483e734e3e73503e734a3e734c3e73523e73563e73583e73543e735a3e735c3e735e3e73603e73643e736c3e73623e736a3e73663e73683e736e3e73703e73723e737c3e73743e73763e73783e737a3e737e3e73803e73863e73823e73843e73883e738a3e738c3e738e3e73923e73903e73943e73963e73983e739a3e739c3e73a03e739e3e73a23e73a43e73a63e73a83e73aa3e73ac3e73")\ + X(46 , 0, F5 , "F5" , "" , 0 , 15 , '~', -1 , -1 , "003f74063f74103f740e3f74143f74163f74023f740a3f740c3f74183f74043f74083f741a3f74123f74203f741e3f741c3f74223f74243f74283f74263f742a3f74303f742e3f742c3f74343f74363f74323f74383f743a3f743e3f743c3f74403f74423f74443f74463f74483f744e3f74503f744a3f744c3f74523f74563f74583f74543f745a3f745c3f745e3f74603f74643f746c3f74623f746a3f74663f74683f746e3f74703f74723f747c3f74743f74763f74783f747a3f747e3f74803f74863f74823f74843f74883f748a3f748c3f748e3f74923f74903f74943f74963f74983f749a3f749c3f74a03f749e3f74a23f74a43f74a63f74a83f74aa3f74ac3f74")\ + X(48 , 0, F6 , "F6" , "" , 0 , 17 , '~', -1 , -1 , "0040750640751040750e40751440751640750240750a40750c40751840750440750840751a40751240752040751e40751c40752240752440752840752640752a40753040752e40752c40753440753640753240753840753a40753e40753c40754040754240754440754640754840754e40755040754a40754c40755240755640755840755440755a40755c40755e40756040756440756c40756240756a40756640756840756e40757040757240757c40757440757640757840757a40757e40758040758640758240758440758840758a40758c40758e40759240759040759440759640759840759a40759c4075a040759e4075a24075a44075a64075a84075aa4075ac4075")\ + X(50 , 0, F7 , "F7" , "" , 0 , 18 , '~', -1 , -1 , "0041760641761041760e41761441761641760241760a41760c41761841760441760841761a41761241762041761e41761c41762241762441762841762641762a41763041762e41762c41763441763641763241763841763a41763e41763c41764041764241764441764641764841764e41765041764a41764c41765241765641765841765441765a41765c41765e41766041766441766c41766241766a41766641766841766e41767041767241767c41767441767641767841767a41767e41768041768641768241768441768841768a41768c41768e41769241769041769441769641769841769a41769c4176a041769e4176a24176a44176a64176a84176aa4176ac4176")\ + X(52 , 0, F8 , "F8" , "" , 0 , 19 , '~', -1 , -1 , "0042770642771042770e42771442771642770242770a42770c42771842770442770842771a42771242772042771e42771c42772242772442772842772642772a42773042772e42772c42773442773642773242773842773a42773e42773c42774042774242774442774642774842774e42775042774a42774c42775242775642775842775442775a42775c42775e42776042776442776c42776242776a42776642776842776e42777042777242777c42777442777642777842777a42777e42778042778642778242778442778842778a42778c42778e42779242779042779442779642779842779a42779c4277a042779e4277a24277a44277a64277a84277aa4277ac4277")\ + X(54 , 0, F9 , "F9" , "" , 0 , 20 , '~', -1 , -1 , "0043780643781043780e43781443781643780243780a43780c43781843780443780843781a43781243782043781e43781c43782243782443782843782643782a43783043782e43782c43783443783643783243783843783a43783e43783c43784043784243784443784643784843784e43785043784a43784c43785243785643785843785443785a43785c43785e43786043786443786c43786243786a43786643786843786e43787043787243787c43787443787643787843787a43787e43788043788643788243788443788843788a43788c43788e43789243789043789443789643789843789a43789c4378a043789e4378a24378a44378a64378a84378aa4378ac4378")\ + X(56 , 0, F10 , "F10" , "" , 0 , 21 , '~', -1 , -1 , "0044790644791044790e44791444791644790244790a44790c44791844790444790844791a44791244792044791e44791c44792244792444792844792644792a44793044792e44792c44793444793644793244793844793a44793e44793c44794044794244794444794644794844794e44795044794a44794c44795244795644795844795444795a44795c44795e44796044796444796c44796244796a44796644796844796e44797044797244797c44797444797644797844797a44797e44798044798644798244798444798844798a44798c44798e44799244799044799444799644799844799a44799c4479a044799e4479a24479a44479a64479a84479aa4479ac4479")\ + X(58 , 0, F11 , "F11" , "" , 0 , 23 , '~', -1 , -1 , "00577a06577a10577a0e577a14577a16577a02577a0a577a0c577a18577a04577a08577a1a577a12577a20577a1e577a1c577a22577a24577a28577a26577a2a577a30577a2e577a2c577a34577a36577a32577a38577a3a577a3e577a3c577a40577a42577a44577a46577a48577a4e577a50577a4a577a4c577a52577a56577a58577a54577a5a577a5c577a5e577a60577a64577a6c577a62577a6a577a66577a68577a6e577a70577a72577a7c577a74577a76577a78577a7a577a7e577a80577a86577a82577a84577a88577a8a577a8c577a8e577a92577a90577a94577a96577a98577a9a577a9c577aa0577a9e577aa2577aa4577aa6577aa8577aaa577aac577a")\ + X(60 , 0, F12 , "F12" , "" , 0 , 24 , '~', -1 , -1 , "00587b06587b10587b0e587b14587b16587b02587b0a587b0c587b18587b04587b08587b1a587b12587b20587b1e587b1c587b22587b24587b28587b26587b2a587b30587b2e587b2c587b34587b36587b32587b38587b3a587b3e587b3c587b40587b42587b44587b46587b48587b4e587b50587b4a587b4c587b52587b56587b58587b54587b5a587b5c587b5e587b60587b64587b6c587b62587b6a587b66587b68587b6e587b70587b72587b7c587b74587b76587b78587b7a587b7e587b80587b86587b82587b84587b88587b8a587b8c587b8e587b92587b90587b94587b96587b98587b9a587b9c587ba0587b9e587ba2587ba4587ba6587ba8587baa587bac587b")\ + X(62 , 0, F13 , "F13" , "" , 0 , 57376, 'u', -1 , -1 , "00647c06647c10647c0e647c14647c16647c02647c0a647c0c647c18647c04647c08647c1a647c12647c20647c1e647c1c647c22647c24647c28647c26647c2a647c30647c2e647c2c647c34647c36647c32647c38647c3a647c3e647c3c647c40647c42647c44647c46647c48647c4e647c50647c4a647c4c647c52647c56647c58647c54647c5a647c5c647c5e647c60647c64647c6c647c62647c6a647c66647c68647c6e647c70647c72647c7c647c74647c76647c78647c7a647c7e647c80647c86647c82647c84647c88647c8a647c8c647c8e647c92647c90647c94647c96647c98647c9a647c9c647ca0647c9e647ca2647ca4647ca6647ca8647caa647cac647c")\ + X(64 , 0, F14 , "F14" , "" , 0 , 57377, 'u', -1 , -1 , "00657d06657d10657d0e657d14657d16657d02657d0a657d0c657d18657d04657d08657d1a657d12657d20657d1e657d1c657d22657d24657d28657d26657d2a657d30657d2e657d2c657d34657d36657d32657d38657d3a657d3e657d3c657d40657d42657d44657d46657d48657d4e657d50657d4a657d4c657d52657d56657d58657d54657d5a657d5c657d5e657d60657d64657d6c657d62657d6a657d66657d68657d6e657d70657d72657d7c657d74657d76657d78657d7a657d7e657d80657d86657d82657d84657d88657d8a657d8c657d8e657d92657d90657d94657d96657d98657d9a657d9c657da0657d9e657da2657da4657da6657da8657daa657dac657d")\ + X(66 , 0, F15 , "F15" , "" , 0 , 57378, 'u', -1 , -1 , "00667e06667e10667e0e667e14667e16667e02667e0a667e0c667e18667e04667e08667e1a667e12667e20667e1e667e1c667e22667e24667e28667e26667e2a667e30667e2e667e2c667e34667e36667e32667e38667e3a667e3e667e3c667e40667e42667e44667e46667e48667e4e667e50667e4a667e4c667e52667e56667e58667e54667e5a667e5c667e5e667e60667e64667e6c667e62667e6a667e66667e68667e6e667e70667e72667e7c667e74667e76667e78667e7a667e7e667e80667e86667e82667e84667e88667e8a667e8c667e8e667e92667e90667e94667e96667e98667e9a667e9c667ea0667e9e667ea2667ea4667ea6667ea8667eaa667eac667e")\ + X(68 , 0, F16 , "F16" , "" , 0 , 57379, 'u', -1 , -1 , "00677f06677f10677f0e677f14677f16677f02677f0a677f0c677f18677f04677f08677f1a677f12677f20677f1e677f1c677f22677f24677f28677f26677f2a677f30677f2e677f2c677f34677f36677f32677f38677f3a677f3e677f3c677f40677f42677f44677f46677f48677f4e677f50677f4a677f4c677f52677f56677f58677f54677f5a677f5c677f5e677f60677f64677f6c677f62677f6a677f66677f68677f6e677f70677f72677f7c677f74677f76677f78677f7a677f7e677f80677f86677f82677f84677f88677f8a677f8c677f8e677f92677f90677f94677f96677f98677f9a677f9c677fa0677f9e677fa2677fa4677fa6677fa8677faa677fac677f")\ + X(70 , 0, F17 , "F17" , "" , 0 , 57380, 'u', -1 , -1 , "0068800668801068800e68801468801668800268800a68800c68801868800468800868801a68801268802068801e68801c68802268802468802868802668802a68803068802e68802c68803468803668803268803868803a68803e68803c68804068804268804468804668804868804e68805068804a68804c68805268805668805868805468805a68805c68805e68806068806468806c68806268806a68806668806868806e68807068807268807c68807468807668807868807a68807e68808068808668808268808468808868808a68808c68808e68809268809068809468809668809868809a68809c6880a068809e6880a26880a46880a66880a86880aa6880ac6880")\ + X(72 , 0, F18 , "F18" , "" , 0 , 57381, 'u', -1 , -1 , "0069810669811069810e69811469811669810269810a69810c69811869810469810869811a69811269812069811e69811c69812269812469812869812669812a69813069812e69812c69813469813669813269813869813a69813e69813c69814069814269814469814669814869814e69815069814a69814c69815269815669815869815469815a69815c69815e69816069816469816c69816269816a69816669816869816e69817069817269817c69817469817669817869817a69817e69818069818669818269818469818869818a69818c69818e69819269819069819469819669819869819a69819c6981a069819e6981a26981a46981a66981a86981aa6981ac6981")\ + X(74 , 0, F19 , "F19" , "" , 0 , 57382, 'u', -1 , -1 , "006a82066a82106a820e6a82146a82166a82026a820a6a820c6a82186a82046a82086a821a6a82126a82206a821e6a821c6a82226a82246a82286a82266a822a6a82306a822e6a822c6a82346a82366a82326a82386a823a6a823e6a823c6a82406a82426a82446a82466a82486a824e6a82506a824a6a824c6a82526a82566a82586a82546a825a6a825c6a825e6a82606a82646a826c6a82626a826a6a82666a82686a826e6a82706a82726a827c6a82746a82766a82786a827a6a827e6a82806a82866a82826a82846a82886a828a6a828c6a828e6a82926a82906a82946a82966a82986a829a6a829c6a82a06a829e6a82a26a82a46a82a66a82a86a82aa6a82ac6a82")\ + X(76 , 0, F20 , "F20" , "" , 0 , 57383, 'u', -1 , -1 , "006b83066b83106b830e6b83146b83166b83026b830a6b830c6b83186b83046b83086b831a6b83126b83206b831e6b831c6b83226b83246b83286b83266b832a6b83306b832e6b832c6b83346b83366b83326b83386b833a6b833e6b833c6b83406b83426b83446b83466b83486b834e6b83506b834a6b834c6b83526b83566b83586b83546b835a6b835c6b835e6b83606b83646b836c6b83626b836a6b83666b83686b836e6b83706b83726b837c6b83746b83766b83786b837a6b837e6b83806b83866b83826b83846b83886b838a6b838c6b838e6b83926b83906b83946b83966b83986b839a6b839c6b83a06b839e6b83a26b83a46b83a66b83a86b83aa6b83ac6b83")\ + X(78 , 0, F21 , "F21" , "" , 0 , 57384, 'u', -1 , -1 , "006c84066c84106c840e6c84146c84166c84026c840a6c840c6c84186c84046c84086c841a6c84126c84206c841e6c841c6c84226c84246c84286c84266c842a6c84306c842e6c842c6c84346c84366c84326c84386c843a6c843e6c843c6c84406c84426c84446c84466c84486c844e6c84506c844a6c844c6c84526c84566c84586c84546c845a6c845c6c845e6c84606c84646c846c6c84626c846a6c84666c84686c846e6c84706c84726c847c6c84746c84766c84786c847a6c847e6c84806c84866c84826c84846c84886c848a6c848c6c848e6c84926c84906c84946c84966c84986c849a6c849c6c84a06c849e6c84a26c84a46c84a66c84a86c84aa6c84ac6c84")\ + X(80 , 0, F22 , "F22" , "" , 0 , 57385, 'u', -1 , -1 , "006d85066d85106d850e6d85146d85166d85026d850a6d850c6d85186d85046d85086d851a6d85126d85206d851e6d851c6d85226d85246d85286d85266d852a6d85306d852e6d852c6d85346d85366d85326d85386d853a6d853e6d853c6d85406d85426d85446d85466d85486d854e6d85506d854a6d854c6d85526d85566d85586d85546d855a6d855c6d855e6d85606d85646d856c6d85626d856a6d85666d85686d856e6d85706d85726d857c6d85746d85766d85786d857a6d857e6d85806d85866d85826d85846d85886d858a6d858c6d858e6d85926d85906d85946d85966d85986d859a6d859c6d85a06d859e6d85a26d85a46d85a66d85a86d85aa6d85ac6d85")\ + X(82 , 0, F23 , "F23" , "" , 0 , 57386, 'u', -1 , -1 , "006e86066e86106e860e6e86146e86166e86026e860a6e860c6e86186e86046e86086e861a6e86126e86206e861e6e861c6e86226e86246e86286e86266e862a6e86306e862e6e862c6e86346e86366e86326e86386e863a6e863e6e863c6e86406e86426e86446e86466e86486e864e6e86506e864a6e864c6e86526e86566e86586e86546e865a6e865c6e865e6e86606e86646e866c6e86626e866a6e86666e86686e866e6e86706e86726e867c6e86746e86766e86786e867a6e867e6e86806e86866e86826e86846e86886e868a6e868c6e868e6e86926e86906e86946e86966e86986e869a6e869c6e86a06e869e6e86a26e86a46e86a66e86a86e86aa6e86ac6e86")\ + X(84 , 0, F24 , "F24" , "" , 0 , 57387, 'u', -1 , -1 , "006f87066f87106f870e6f87146f87166f87026f870a6f870c6f87186f87046f87086f871a6f87126f87206f871e6f871c6f87226f87246f87286f87266f872a6f87306f872e6f872c6f87346f87366f87326f87386f873a6f873e6f873c6f87406f87426f87446f87466f87486f874e6f87506f874a6f874c6f87526f87566f87586f87546f875a6f875c6f875e6f87606f87646f876c6f87626f876a6f87666f87686f876e6f87706f87726f877c6f87746f87766f87786f877a6f877e6f87806f87866f87826f87846f87886f878a6f878c6f878e6f87926f87906f87946f87966f87986f879a6f879c6f87a06f879e6f87a26f87a46f87a66f87a86f87aa6f87ac6f87")\ X(86 , 0, F25 , "F25" , "" , 0 , 57388, 'u', -1 , -1 , "")\ X(88 , 0, F26 , "F26" , "" , 0 , 57389, 'u', -1 , -1 , "")\ X(90 , 0, F27 , "F27" , "" , 0 , 57390, 'u', -1 , -1 , "")\ @@ -405,254 +397,258 @@ namespace netxs::input X(102 , 0, F33 , "F33" , "" , 0 , 57396, 'u', -1 , -1 , "")\ X(104 , 0, F34 , "F34" , "" , 0 , 57397, 'u', -1 , -1 , "")\ X(106 , 0, F35 , "F35" , "" , 0 , 57398, 'u', -1 , -1 , "")\ - X(108 , 0, PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "01372c29372c09372c27372c13372c0d372c1f372c1d372c07372c25372c05372c0b372c11372c17372c21372c19372c0f372c2b372c1b372c23372c15372c7b372c2d372c2f372c03372c31372c33372c35372c3b372c3d372c39372c37372c9d372c41372c3f372c4d372c43372c4f372c4b372c47372c55372c45372c5d372c5b372c69372c63372c67372c49372c73372c6d372c51372c9f372c77372ca1372c53372c59372c57372c6f372c61372c6b372c71372c75372c5f372c65372ca3372c79372c8d372c8f372c83372ca5372c87372c8b372c99372c9b372c91372c7f372c95372c89372c85372c7d372c93372c81372c97372cab372ca9372ca7372caf372cb1372cad372cb5372cb3372cb7372cb9372cbb372c")\ - X(110 , 0, Pause , "Pause" , "" , 0 , 57362, 'u', '\x1a', '\x03', "0045902845900845902645901245900c45901e45901c45900645902445900445900a45901045901645902045901845900e45902a45901a45902245901445907a45902c45902e45900245903045903245903445903a45903c45903845903645909c45904045903e45904c45904245904e45904a45904645905445904445905c45905a45906845906245906645904845907245906c45905045909e4590764590a045905245905845905645906e45906045906a45907045907445905e4590644590a245907845908c45908e4590824590a445908645908a45909845909a45909045907e45909445908845908445907c4590924590804590964590aa4590a84590a64590ae4590b04590ac4590b44590b24590b64590b84590ba4590")\ - X(112 , 1, Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0146032946030946032746031346030d46031f46031d46030746032546030546030b46031146031746032146031946030f46032b46031b46032346031546037b46032d46032f46030346033146033346033546033b46033d46033946033746039d46034146033f46034d46034346034f46034b46034746035546034546035d46035b46036946036346036746034946037346036d46035146039f4603774603a146035346035946035746036f46036146036b46037146037546035f4603654603a346037946038d46038f4603834603a546038746038b46039946039b46039146037f46039546038946038546037d4603934603814603974603ab4603a94603a74603af4603b14603ad4603b54603b34603b74603b94603bb4603")\ - X(114 , 1, SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c28542c08542c26542c12542c0c542c1e542c1c542c06542c24542c04542c0a542c10542c16542c20542c18542c0e542c2a542c1a542c22542c7a542c2c542c2e542c02542c30542c32542c34542c3a542c40542c3e542c4c542c4e542c4a542c54542c5c542c5a542c68542c62542c66542c48542c72542c6c542c9e542c76542ca0542ca2542c8c542c8e542c82542ca4542c86542c8a542c98542c9a542c7c542c92542c80542c96542caa542ca8542cb4542cb6542cb8542cba542c")\ - X(116 , 1, Esc , "Esc" , "\x1B", 0x1b , 27 , 'u', '\x1b', '\x1b', "00011b28011b08011b26011b12011b0c011b1e011b1c011b06011b24011b04011b0a011b10011b16011b20011b18011b0e011b2a011b1a011b22011b14011b7a011b2c011b2e011b02011b30011b32011b34011b3a011b3c011b38011b36011b9c011b40011b3e011b4c011b42011b4e011b4a011b46011b54011b44011b5c011b5a011b68011b62011b66011b48011b72011b6c011b50011b9e011b76011ba0011b52011b58011b56011b6e011b60011b6a011b70011b74011b5e011b64011ba2011b78011b8c011b8e011b82011ba4011b86011b8a011b98011b9a011b90011b7e011b94011b88011b84011b7c011b92011b80011b96011baa011ba8011ba6011bae011bb0011bac011bb4011bb2011bb6011bb8011bba011b")\ - X(118 , 1, Tab , "Tab" , "\x09", 0x09 , 9 , 'u', '\x09', '\x09', "000f09280f09080f09260f09120f090c0f091e0f091c0f09060f09240f09040f090a0f09100f09160f09200f09180f090e0f092a0f091a0f09220f09140f097a0f092c0f092e0f09020f09300f09320f09340f093a0f093c0f09380f09360f099c0f09400f093e0f094c0f09420f094e0f094a0f09460f09540f09440f095c0f095a0f09680f09620f09660f09480f09720f096c0f09500f099e0f09760f09a00f09520f09580f09560f096e0f09600f096a0f09700f09740f095e0f09640f09a20f09780f098c0f098e0f09820f09a40f09860f098a0f09980f099a0f09900f097e0f09940f09880f09840f097c0f09920f09800f09960f09aa0f09a80f09a60f09ae0f09b00f09ac0f09b40f09b20f09b60f09b80f09ba0f09")\ - X(120 , 1, Backspace , "Backspace" , "\x08", 0x08 , 127 , 'u', '\x7f', '\x08', "000e08280e08080e08260e08120e080c0e081e0e081c0e08060e08240e08040e080a0e08100e08160e08200e08180e080e0e082a0e081a0e08220e08140e087a0e082c0e082e0e08020e08300e08320e08340e083a0e083c0e08380e08360e089c0e08400e083e0e084c0e08420e084e0e084a0e08460e08540e08440e085c0e085a0e08680e08620e08660e08480e08720e086c0e08500e089e0e08760e08a00e08520e08580e08560e086e0e08600e086a0e08700e08740e085e0e08640e08a20e08780e088c0e088e0e08820e08a40e08860e088a0e08980e089a0e08900e087e0e08940e08880e08840e087c0e08920e08800e08960e08aa0e08a80e08a60e08ae0e08b00e08ac0e08b40e08b20e08b60e08b80e08ba0e08")\ - X(122 , 1, Space , "Space" , "\x20", 0x20 , 32 , 'u', '\x20', '\0' , "0039202839200839202639201239200c39201e39201c39200639202439200439200a39201039201639202039201839200e39202a39201a39202239201439207a39202c39202e39200239203039203239203439203a39203c39203839203639209c39204039203e39204c39204239204e39204a39204639205439204439205c39205a39206839206239206639204839207239206c39205039209e3920763920a039205239205839205639206e39206039206a39207039207439205e3920643920a239207839208c39208e3920823920a439208639208a39209839209a39209039207e39209439208839208439207c3920923920803920963920aa3920a83920a63920ae3920b03920ac3920b43920b23920b63920b83920ba3920")\ - X(124 , 1, KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d281c0d081c0d261c0d121c0d0c1c0d1e1c0d1c1c0d061c0d241c0d041c0d0a1c0d101c0d161c0d201c0d181c0d0e1c0d2a1c0d1a1c0d221c0d141c0d7a1c0d2c1c0d2e1c0d021c0d301c0d321c0d341c0d3a1c0d3c1c0d381c0d361c0d9c1c0d401c0d3e1c0d4c1c0d421c0d4e1c0d4a1c0d461c0d541c0d441c0d5c1c0d5a1c0d681c0d621c0d661c0d481c0d721c0d6c1c0d501c0d9e1c0d761c0da01c0d521c0d581c0d561c0d6e1c0d601c0d6a1c0d701c0d741c0d5e1c0d641c0da21c0d781c0d8c1c0d8e1c0d821c0da41c0d861c0d8a1c0d981c0d9a1c0d901c0d7e1c0d941c0d881c0d841c0d7c1c0d921c0d801c0d961c0daa1c0da81c0da61c0dae1c0db01c0dac1c0db41c0db21c0db61c0db81c0dba1c0d")\ - X( 125, 1, NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "011c0d291c0d091c0d271c0d131c0d0d1c0d1f1c0d1d1c0d071c0d251c0d051c0d0b1c0d111c0d171c0d211c0d191c0d0f1c0d2b1c0d1b1c0d231c0d151c0d7b1c0d2d1c0d2f1c0d031c0d311c0d331c0d351c0d3b1c0d3d1c0d391c0d371c0d9d1c0d411c0d3f1c0d4d1c0d431c0d4f1c0d4b1c0d471c0d551c0d451c0d5d1c0d5b1c0d691c0d631c0d671c0d491c0d731c0d6d1c0d511c0d9f1c0d771c0da11c0d531c0d591c0d571c0d6f1c0d611c0d6b1c0d711c0d751c0d5f1c0d651c0da31c0d791c0d8d1c0d8f1c0d831c0da51c0d871c0d8b1c0d991c0d9b1c0d911c0d7f1c0d951c0d891c0d851c0d7d1c0d931c0d811c0d971c0dab1c0da91c0da71c0daf1c0db11c0dad1c0db51c0db31c0db71c0db91c0dbb1c0d")\ - X(126 , 1, KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "01522d29522d09522d27522d13522d0d522d1f522d1d522d07522d25522d05522d0b522d11522d17522d21522d19522d0f522d2b522d1b522d23522d15522d7b522d2d522d2f522d03522d31522d33522d35522d3b522d3d522d39522d37522d9d522d41522d3f522d4d522d43522d4f522d4b522d47522d55522d45522d5d522d5b522d69522d63522d67522d49522d73522d6d522d51522d9f522d77522da1522d53522d59522d57522d6f522d61522d6b522d71522d75522d5f522d65522da3522d79522d8d522d8f522d83522da5522d87522d8b522d99522d9b522d91522d7f522d95522d89522d85522d7d522d93522d81522d97522dab522da9522da7522daf522db1522dad522db5522db3522db7522db9522dbb522d")\ - X( 127, 1, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00822d28822d08822d26822d12822d0c822d1e822d1c822d06822d24822d04822d0a822d10822d16822d20822d18822d0e822d2a822d1a822d22822d14822d7a822d2c822d2e822d02822d30822d32822d34822d3a822d3c822d38822d36822d9c822d40822d3e822d4c822d42822d4e822d4a822d46822d54822d44822d5c822d5a822d68822d62822d66822d48822d72822d6c822d50822d9e822d76822da0822d52822d58822d56822d6e822d60822d6a822d70822d74822d5e822d64822da2822d78822d8c822d8e822d82822da4822d86822d8a822d98822d9a822d90822d7e822d94822d88822d84822d7c822d92822d80822d96822daa822da8822da6822dae822db0822dac822db4822db2822db6822db8822dba822d")\ - X(128 , 1, KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "01532e29532e09532e27532e13532e0d532e1f532e1d532e07532e25532e05532e0b532e11532e17532e21532e19532e0f532e2b532e1b532e23532e15532e7b532e2d532e2f532e03532e31532e33532e35532e3b532e3d532e39532e37532e9d532e41532e3f532e4d532e43532e4f532e4b532e47532e55532e45532e5d532e5b532e69532e63532e67532e49532e73532e6d532e51532e9f532e77532ea1532e53532e59532e57532e6f532e61532e6b532e71532e75532e5f532e65532ea3532e79532e8d532e8f532e83532ea5532e87532e8b532e99532e9b532e91532e7f532e95532e89532e85532e7d532e93532e81532e97532eab532ea9532ea7532eaf532eb1532ead532eb5532eb3532eb7532eb9532ebb532e")\ - X( 129, 1, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00832e28832e08832e26832e12832e0c832e1e832e1c832e06832e24832e04832e0a832e10832e16832e20832e18832e0e832e2a832e1a832e22832e14832e7a832e2c832e2e832e02832e30832e32832e34832e3a832e3c832e38832e36832e9c832e40832e3e832e4c832e42832e4e832e4a832e46832e54832e44832e5c832e5a832e68832e62832e66832e48832e72832e6c832e50832e9e832e76832ea0832e52832e58832e56832e6e832e60832e6a832e70832e74832e5e832e64832ea2832e78832e8c832e8e832e82832ea4832e86832e8a832e98832e9a832e90832e7e832e94832e88832e84832e7c832e92832e80832e96832eaa832ea8832ea6832eae832eb0832eac832eb4832eb2832eb6832eb8832eba832e")\ + X(108 , 0, PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "01372c07372c11372c0f372c15372c17372c03372c0b372c0d372c19372c05372c09372c1b372c13372c21372c1f372c1d372c23372c25372c29372c27372c2b372c31372c2f372c2d372c35372c37372c33372c39372c3b372c3f372c3d372c41372c43372c45372c47372c49372c4f372c51372c4b372c4d372c53372c57372c59372c55372c5b372c5d372c5f372c61372c65372c6d372c63372c6b372c67372c69372c6f372c71372c73372c7d372c75372c77372c79372c7b372c7f372c81372c87372c83372c85372c89372c8b372c8d372c8f372c93372c91372c95372c97372c99372c9b372c9d372ca1372c9f372ca3372ca5372ca7372ca9372cab372cad372c")\ + X(110 , 0, Pause , "Pause" , "" , 0 , 57362, 'u', '\x1a', '\x03', "0045900645901045900e45901445901645900245900a45900c45901845900445900845901a45901245902045901e45901c45902245902445902845902645902a45903045902e45902c45903445903645903245903845903a45903e45903c45904045904245904445904645904845904e45905045904a45904c45905245905645905845905445905a45905c45905e45906045906445906c45906245906a45906645906845906e45907045907245907c45907445907645907845907a45907e45908045908645908245908445908845908a45908c45908e45909245909045909445909645909845909a45909c4590a045909e4590a24590a44590a64590a84590aa4590ac4590")\ + X(112 , 1, Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0146030746031146030f46031546031746030346030b46030d46031946030546030946031b46031346032146031f46031d46032346032546032946032746032b46033146032f46032d46033546033746033346033946033b46033f46033d46034146034346034546034746034946034f46035146034b46034d46035346035746035946035546035b46035d46035f46036146036546036d46036346036b46036746036946036f46037146037346037d46037546037746037946037b46037f46038146038746038346038546038946038b46038d46038f46039346039146039546039746039946039b46039d4603a146039f4603a34603a54603a74603a94603ab4603ad4603")\ + X(114 , 1, SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c06542c10542c0e542c14542c16542c02542c0a542c0c542c18542c04542c08542c1a542c12542c20542c1e542c22542c24542c28542c26542c2a542c34542c36542c38542c3c542c40542c44542c46542c48542c4e542c50542c4a542c4c542c52542c56542c58542c6e542c72542c7c542c74542c76542c78542c7a542c7e542c8c542c8e542c92542c90542c94542c96542c98542ca2542ca6542ca8542caa542c")\ + X(116 , 1, Esc , "Esc" , "\x1B", 0x1b , 27 , 'u', '\x1b', '\x1b', "00011b06011b10011b0e011b14011b16011b02011b0a011b0c011b18011b04011b08011b1a011b12011b20011b1e011b1c011b22011b24011b28011b26011b2a011b30011b2e011b2c011b34011b36011b32011b38011b3a011b3e011b3c011b40011b42011b44011b46011b48011b4e011b50011b4a011b4c011b52011b56011b58011b54011b5a011b5c011b5e011b60011b64011b6c011b62011b6a011b66011b68011b6e011b70011b72011b7c011b74011b76011b78011b7a011b7e011b80011b86011b82011b84011b88011b8a011b8c011b8e011b92011b90011b94011b96011b98011b9a011b9c011ba0011b9e011ba2011ba4011ba6011ba8011baa011bac011b")\ + X(118 , 1, Tab , "Tab" , "\x09", 0x09 , 9 , 'u', '\x09', '\x09', "000f09060f09100f090e0f09140f09160f09020f090a0f090c0f09180f09040f09080f091a0f09120f09200f091e0f091c0f09220f09240f09280f09260f092a0f09300f092e0f092c0f09340f09360f09320f09380f093a0f093e0f093c0f09400f09420f09440f09460f09480f094e0f09500f094a0f094c0f09520f09560f09580f09540f095a0f095c0f095e0f09600f09640f096c0f09620f096a0f09660f09680f096e0f09700f09720f097c0f09740f09760f09780f097a0f097e0f09800f09860f09820f09840f09880f098a0f098c0f098e0f09920f09900f09940f09960f09980f099a0f099c0f09a00f099e0f09a20f09a40f09a60f09a80f09aa0f09ac0f09")\ + X(120 , 1, Backspace , "Backspace" , "\x08", 0x08 , 127 , 'u', '\x7f', '\x08', "000e08060e08100e080e0e08140e08160e08020e080a0e080c0e08180e08040e08080e081a0e08120e08200e081e0e081c0e08220e08240e08280e08260e082a0e08300e082e0e082c0e08340e08360e08320e08380e083a0e083e0e083c0e08400e08420e08440e08460e08480e084e0e08500e084a0e084c0e08520e08560e08580e08540e085a0e085c0e085e0e08600e08640e086c0e08620e086a0e08660e08680e086e0e08700e08720e087c0e08740e08760e08780e087a0e087e0e08800e08860e08820e08840e08880e088a0e088c0e088e0e08920e08900e08940e08960e08980e089a0e089c0e08a00e089e0e08a20e08a40e08a60e08a80e08aa0e08ac0e08")\ + X(122 , 1, Space , "Space" , "\x20", 0x20 , 32 , 'u', '\x20', '\0' , "0039200639201039200e39201439201639200239200a39200c39201839200439200839201a39201239202039201e39201c39202239202439202839202639202a39203039202e39202c39203439203639203239203839203a39203e39203c39204039204239204439204639204839204e39205039204a39204c39205239205639205839205439205a39205c39205e39206039206439206c39206239206a39206639206839206e39207039207239207c39207439207639207839207a39207e39208039208639208239208439208839208a39208c39208e39209239209039209439209639209839209a39209c3920a039209e3920a23920a43920a63920a83920aa3920ac3920")\ + X(124 , 1, KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d061c0d101c0d0e1c0d141c0d161c0d021c0d0a1c0d0c1c0d181c0d041c0d081c0d1a1c0d121c0d201c0d1e1c0d1c1c0d221c0d241c0d281c0d261c0d2a1c0d301c0d2e1c0d2c1c0d341c0d361c0d321c0d381c0d3a1c0d3e1c0d3c1c0d401c0d421c0d441c0d461c0d481c0d4e1c0d501c0d4a1c0d4c1c0d521c0d561c0d581c0d541c0d5a1c0d5c1c0d5e1c0d601c0d641c0d6c1c0d621c0d6a1c0d661c0d681c0d6e1c0d701c0d721c0d7c1c0d741c0d761c0d781c0d7a1c0d7e1c0d801c0d861c0d821c0d841c0d881c0d8a1c0d8c1c0d8e1c0d921c0d901c0d941c0d961c0d981c0d9a1c0d9c1c0da01c0d9e1c0da21c0da41c0da61c0da81c0daa1c0dac1c0d")\ + X( 125, 1, NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "011c0d071c0d111c0d0f1c0d151c0d171c0d031c0d0b1c0d0d1c0d191c0d051c0d091c0d1b1c0d131c0d211c0d1f1c0d1d1c0d231c0d251c0d291c0d271c0d2b1c0d311c0d2f1c0d2d1c0d351c0d371c0d331c0d391c0d3b1c0d3f1c0d3d1c0d411c0d431c0d451c0d471c0d491c0d4f1c0d511c0d4b1c0d4d1c0d531c0d571c0d591c0d551c0d5b1c0d5d1c0d5f1c0d611c0d651c0d6d1c0d631c0d6b1c0d671c0d691c0d6f1c0d711c0d731c0d7d1c0d751c0d771c0d791c0d7b1c0d7f1c0d811c0d871c0d831c0d851c0d891c0d8b1c0d8d1c0d8f1c0d931c0d911c0d951c0d971c0d991c0d9b1c0d9d1c0da11c0d9f1c0da31c0da51c0da71c0da91c0dab1c0dad1c0d")\ + X(126 , 1, KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "01522d07522d11522d0f522d15522d17522d03522d0b522d0d522d19522d05522d09522d1b522d13522d21522d1f522d1d522d23522d25522d29522d27522d2b522d31522d2f522d2d522d35522d37522d33522d39522d3b522d3f522d3d522d41522d43522d45522d47522d49522d4f522d51522d4b522d4d522d53522d57522d59522d55522d5b522d5d522d5f522d61522d65522d6d522d63522d6b522d67522d69522d6f522d71522d73522d7d522d75522d77522d79522d7b522d7f522d81522d87522d83522d85522d89522d8b522d8d522d8f522d93522d91522d95522d97522d99522d9b522d9d522da1522d9f522da3522da5522da7522da9522dab522dad522d")\ + X( 127, 1, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00822d06822d10822d0e822d14822d16822d02822d0a822d0c822d18822d04822d08822d1a822d12822d20822d1e822d1c822d22822d24822d28822d26822d2a822d30822d2e822d2c822d34822d36822d32822d38822d3a822d3e822d3c822d40822d42822d44822d46822d48822d4e822d50822d4a822d4c822d52822d56822d58822d54822d5a822d5c822d5e822d60822d64822d6c822d62822d6a822d66822d68822d6e822d70822d72822d7c822d74822d76822d78822d7a822d7e822d80822d86822d82822d84822d88822d8a822d8c822d8e822d92822d90822d94822d96822d98822d9a822d9c822da0822d9e822da2822da4822da6822da8822daa822dac822d")\ + X(128 , 1, KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "01532e07532e11532e0f532e15532e17532e03532e0b532e0d532e19532e05532e09532e1b532e13532e21532e1f532e1d532e23532e25532e29532e27532e2b532e31532e2f532e2d532e35532e37532e33532e39532e3b532e3f532e3d532e41532e43532e45532e47532e49532e4f532e51532e4b532e4d532e53532e57532e59532e55532e5b532e5d532e5f532e61532e65532e6d532e63532e6b532e67532e69532e6f532e71532e73532e7d532e75532e77532e79532e7b532e7f532e81532e87532e83532e85532e89532e8b532e8d532e8f532e93532e91532e95532e97532e99532e9b532e9d532ea1532e9f532ea3532ea5532ea7532ea9532eab532ead532e")\ + X( 129, 1, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00832e06832e10832e0e832e14832e16832e02832e0a832e0c832e18832e04832e08832e1a832e12832e20832e1e832e1c832e22832e24832e28832e26832e2a832e30832e2e832e2c832e34832e36832e32832e38832e3a832e3e832e3c832e40832e42832e44832e46832e48832e4e832e50832e4a832e4c832e52832e56832e58832e54832e5a832e5c832e5e832e60832e64832e6c832e62832e6a832e66832e68832e6e832e70832e72832e7c832e74832e76832e78832e7a832e7e832e80832e86832e82832e84832e88832e8a832e8c832e8e832e92832e90832e94832e96832e98832e9a832e9c832ea0832e9e832ea2832ea4832ea6832ea8832eaa832eac832e")\ X(130 , 1, KeyClear , "Clear" , "" , 0 , 1 , 'E', -1 , -1 , "")\ - X( 131, 1, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "008c0c288c0c088c0c268c0c128c0c0c8c0c1e8c0c1c8c0c068c0c248c0c048c0c0a8c0c108c0c168c0c208c0c188c0c0e8c0c2a8c0c1a8c0c228c0c148c0c7a8c0c2c8c0c2e8c0c028c0c308c0c328c0c348c0c3a8c0c3c8c0c388c0c368c0c9c8c0c408c0c3e8c0c4c8c0c428c0c4e8c0c4a8c0c468c0c548c0c448c0c5c8c0c5a8c0c688c0c628c0c668c0c488c0c728c0c6c8c0c508c0c9e8c0c768c0ca08c0c528c0c588c0c568c0c6e8c0c608c0c6a8c0c708c0c748c0c5e8c0c648c0ca28c0c788c0c8c8c0c8e8c0c828c0ca48c0c868c0c8a8c0c988c0c9a8c0c908c0c7e8c0c948c0c888c0c848c0c7c8c0c928c0c808c0c968c0caa8c0ca88c0ca68c0cae8c0cb08c0cac8c0cb48c0cb28c0cb68c0cb88c0cba8c0c")\ - X(132 , 1, KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0149212949210949212749211349210d49211f49211d49210749212549210549210b49211149211749212149211949210f49212b49211b49212349211549217b49212d49212f49210349213149213349213549213b49213d49213949213749219d49214149213f49214d49214349214f49214b49214749215549214549215d49215b49216949216349216749214949217349216d49215149219f4921774921a149215349215949215749216f49216149216b49217149217549215f4921654921a349217949218d49218f4921834921a549218749218b49219949219b49219149217f49219549218949218549217d4921934921814921974921ab4921a94921a74921af4921b14921ad4921b54921b34921b74921b94921bb4921")\ - X( 133, 1, NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0089212889210889212689211289210c89211e89211c89210689212489210489210a89211089211689212089211889210e89212a89211a89212289211489217a89212c89212e89210289213089213289213489213a89213c89213889213689219c89214089213e89214c89214289214e89214a89214689215489214489215c89215a89216889216289216689214889217289216c89215089219e8921768921a089215289215889215689216e89216089216a89217089217489215e8921648921a289217889218c89218e8921828921a489218689218a89219889219a89219089217e89219489218889218489217c8921928921808921968921aa8921a88921a68921ae8921b08921ac8921b48921b28921b68921b88921ba8921")\ - X(134 , 1, KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0151222951220951222751221351220d51221f51221d51220751222551220551220b51221151221751222151221951220f51222b51221b51222351221551227b51222d51222f51220351223151223351223551223b51223d51223951223751229d51224151223f51224d51224351224f51224b51224751225551224551225d51225b51226951226351226751224951227351226d51225151229f5122775122a151225351225951225751226f51226151226b51227151227551225f5122655122a351227951228d51228f5122835122a551228751228b51229951229b51229151227f51229551228951228551227d5122935122815122975122ab5122a95122a75122af5122b15122ad5122b55122b35122b75122b95122bb5122")\ - X( 135, 1, NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0081222881220881222681221281220c81221e81221c81220681222481220481220a81221081221681222081221881220e81222a81221a81222281221481227a81222c81222e81220281223081223281223481223a81223c81223881223681229c81224081223e81224c81224281224e81224a81224681225481224481225c81225a81226881226281226681224881227281226c81225081229e8122768122a081225281225881225681226e81226081226a81227081227481225e8122648122a281227881228c81228e8122828122a481228681228a81229881229a81229081227e81229481228881228481227c8122928122808122968122aa8122a88122a68122ae8122b08122ac8122b48122b28122b68122b88122ba8122")\ - X(136 , 1, KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0147242947240947242747241347240d47241f47241d47240747242547240547240b47241147241747242147241947240f47242b47241b47242347241547247b47242d47242f47240347243147243347243547243b47243d47243947243747249d47244147243f47244d47244347244f47244b47244747245547244547245d47245b47246947246347246747244947247347246d47245147249f4724774724a147245347245947245747246f47246147246b47247147247547245f4724654724a347247947248d47248f4724834724a547248747248b47249947249b47249147247f47249547248947248547247d4724934724814724974724ab4724a94724a74724af4724b14724ad4724b54724b34724b74724b94724bb4724")\ - X( 137, 1, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0087242887240887242687241287240c87241e87241c87240687242487240487240a87241087241687242087241887240e87242a87241a87242287241487247a87242c87242e87240287243087243287243487243a87243c87243887243687249c87244087243e87244c87244287244e87244a87244687245487244487245c87245a87246887246287246687244887247287246c87245087249e8724768724a087245287245887245687246e87246087246a87247087247487245e8724648724a287247887248c87248e8724828724a487248687248a87249887249a87249087247e87249487248887248487247c8724928724808724968724aa8724a88724a68724ae8724b08724ac8724b48724b28724b68724b88724ba8724")\ - X(138 , 1, KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "014f23294f23094f23274f23134f230d4f231f4f231d4f23074f23254f23054f230b4f23114f23174f23214f23194f230f4f232b4f231b4f23234f23154f237b4f232d4f232f4f23034f23314f23334f23354f233b4f233d4f23394f23374f239d4f23414f233f4f234d4f23434f234f4f234b4f23474f23554f23454f235d4f235b4f23694f23634f23674f23494f23734f236d4f23514f239f4f23774f23a14f23534f23594f23574f236f4f23614f236b4f23714f23754f235f4f23654f23a34f23794f238d4f238f4f23834f23a54f23874f238b4f23994f239b4f23914f237f4f23954f23894f23854f237d4f23934f23814f23974f23ab4f23a94f23a74f23af4f23b14f23ad4f23b54f23b34f23b74f23b94f23bb4f23")\ - X( 139, 1, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "008f23288f23088f23268f23128f230c8f231e8f231c8f23068f23248f23048f230a8f23108f23168f23208f23188f230e8f232a8f231a8f23228f23148f237a8f232c8f232e8f23028f23308f23328f23348f233a8f233c8f23388f23368f239c8f23408f233e8f234c8f23428f234e8f234a8f23468f23548f23448f235c8f235a8f23688f23628f23668f23488f23728f236c8f23508f239e8f23768f23a08f23528f23588f23568f236e8f23608f236a8f23708f23748f235e8f23648f23a28f23788f238c8f238e8f23828f23a48f23868f238a8f23988f239a8f23908f237e8f23948f23888f23848f237c8f23928f23808f23968f23aa8f23a88f23a68f23ae8f23b08f23ac8f23b48f23b28f23b68f23b88f23ba8f23")\ - X(140 , 1, KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "014b25294b25094b25274b25134b250d4b251f4b251d4b25074b25254b25054b250b4b25114b25174b25214b25194b250f4b252b4b251b4b25234b25154b257b4b252d4b252f4b25034b25314b25334b25354b253b4b253d4b25394b25374b259d4b25414b253f4b254d4b25434b254f4b254b4b25474b25554b25454b255d4b255b4b25694b25634b25674b25494b25734b256d4b25514b259f4b25774b25a14b25534b25594b25574b256f4b25614b256b4b25714b25754b255f4b25654b25a34b25794b258d4b258f4b25834b25a54b25874b258b4b25994b259b4b25914b257f4b25954b25894b25854b257d4b25934b25814b25974b25ab4b25a94b25a74b25af4b25b14b25ad4b25b54b25b34b25b74b25b94b25bb4b25")\ - X( 141, 1, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "008b25288b25088b25268b25128b250c8b251e8b251c8b25068b25248b25048b250a8b25108b25168b25208b25188b250e8b252a8b251a8b25228b25148b257a8b252c8b252e8b25028b25308b25328b25348b253a8b253c8b25388b25368b259c8b25408b253e8b254c8b25428b254e8b254a8b25468b25548b25448b255c8b255a8b25688b25628b25668b25488b25728b256c8b25508b259e8b25768b25a08b25528b25588b25568b256e8b25608b256a8b25708b25748b255e8b25648b25a28b25788b258c8b258e8b25828b25a48b25868b258a8b25988b259a8b25908b257e8b25948b25888b25848b257c8b25928b25808b25968b25aa8b25a88b25a68b25ae8b25b08b25ac8b25b48b25b28b25b68b25b88b25ba8b25")\ - X(142 , 1, KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "014d27294d27094d27274d27134d270d4d271f4d271d4d27074d27254d27054d270b4d27114d27174d27214d27194d270f4d272b4d271b4d27234d27154d277b4d272d4d272f4d27034d27314d27334d27354d273b4d273d4d27394d27374d279d4d27414d273f4d274d4d27434d274f4d274b4d27474d27554d27454d275d4d275b4d27694d27634d27674d27494d27734d276d4d27514d279f4d27774d27a14d27534d27594d27574d276f4d27614d276b4d27714d27754d275f4d27654d27a34d27794d278d4d278f4d27834d27a54d27874d278b4d27994d279b4d27914d277f4d27954d27894d27854d277d4d27934d27814d27974d27ab4d27a94d27a74d27af4d27b14d27ad4d27b54d27b34d27b74d27b94d27bb4d27")\ - X( 143, 1, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "008d27288d27088d27268d27128d270c8d271e8d271c8d27068d27248d27048d270a8d27108d27168d27208d27188d270e8d272a8d271a8d27228d27148d277a8d272c8d272e8d27028d27308d27328d27348d273a8d273c8d27388d27368d279c8d27408d273e8d274c8d27428d274e8d274a8d27468d27548d27448d275c8d275a8d27688d27628d27668d27488d27728d276c8d27508d279e8d27768d27a08d27528d27588d27568d276e8d27608d276a8d27708d27748d275e8d27648d27a28d27788d278c8d278e8d27828d27a48d27868d278a8d27988d279a8d27908d277e8d27948d27888d27848d277c8d27928d27808d27968d27aa8d27a88d27a68d27ae8d27b08d27ac8d27b48d27b28d27b68d27b88d27ba8d27")\ - X(144 , 1, KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0148262948260948262748261348260d48261f48261d48260748262548260548260b48261148261748262148261948260f48262b48261b48262348261548267b48262d48262f48260348263148263348263548263b48263d48263948263748269d48264148263f48264d48264348264f48264b48264748265548264548265d48265b48266948266348266748264948267348266d48265148269f4826774826a148265348265948265748266f48266148266b48267148267548265f4826654826a348267948268d48268f4826834826a548268748268b48269948269b48269148267f48269548268948268548267d4826934826814826974826ab4826a94826a74826af4826b14826ad4826b54826b34826b74826b94826bb4826")\ - X( 145, 1, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0088262888260888262688261288260c88261e88261c88260688262488260488260a88261088261688262088261888260e88262a88261a88262288261488267a88262c88262e88260288263088263288263488263a88263c88263888263688269c88264088263e88264c88264288264e88264a88264688265488264488265c88265a88266888266288266688264888267288266c88265088269e8826768826a088265288265888265688266e88266088266a88267088267488265e8826648826a288267888268c88268e8826828826a488268688268a88269888269a88269088267e88269488268888268488267c8826928826808826968826aa8826a88826a68826ae8826b08826ac8826b48826b28826b68826b88826ba8826")\ - X(146 , 1, KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0150282950280950282750281350280d50281f50281d50280750282550280550280b50281150281750282150281950280f50282b50281b50282350281550287b50282d50282f50280350283150283350283550283b50283d50283950283750289d50284150283f50284d50284350284f50284b50284750285550284550285d50285b50286950286350286750284950287350286d50285150289f5028775028a150285350285950285750286f50286150286b50287150287550285f5028655028a350287950288d50288f5028835028a550288750288b50289950289b50289150287f50289550288950288550287d5028935028815028975028ab5028a95028a75028af5028b15028ad5028b55028b35028b75028b95028bb5028")\ - X( 147, 1, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0080282880280880282680281280280c80281e80281c80280680282480280480280a80281080281680282080281880280e80282a80281a80282280281480287a80282c80282e80280280283080283280283480283a80283c80283880283680289c80284080283e80284c80284280284e80284a80284680285480284480285c80285a80286880286280286680284880287280286c80285080289e8028768028a080285280285880285680286e80286080286a80287080287480285e8028648028a280287880288c80288e8028828028a480288680288a80289880289a80289080287e80289480288880288480287c8028928028808028968028aa8028a88028a68028ae8028b08028ac8028b48028b28028b68028b88028ba8028")\ - X(148 , 1, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30280b30080b30260b30120b300c0b301e0b301c0b30060b30240b30040b300a0b30100b30160b30200b30180b300e0b302a0b301a0b30220b30140b307a0b302c0b302e0b30020b30300b30320b30340b303a0b303c0b30380b30360b309c0b30400b303e0b304c0b30420b304e0b304a0b30460b30540b30440b305c0b305a0b30680b30620b30660b30480b30720b306c0b30500b309e0b30760b30a00b30520b30580b30560b306e0b30600b306a0b30700b30740b305e0b30640b30a20b30780b308c0b308e0b30820b30a40b30860b308a0b30982930980bc09a0b30900b307e0b30940b30880b30840b307c0bc0920b30800b30960b30aa0b30a80b30a60b30ae0b30b00b30ac0b30b40b30b20b30b60b30b82d30ba3430")\ - X( 149, 1, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052602852600852602652601252600c52601e52601c52600652602452600452600a52601052601652602052601852600e52602a52601a52602252601452607a52602c52602e52600252603052603252603452603a52603c52603852603652609c52604052603e52604c52604252604e52604a52604652605452604452605c52605a52606852606252606652604852607252606c52605052609e5260765260a052605252605852605652606e52606052606a52607052607452605e5260645260a252607852608c52608e5260825260a452608652608a52609852609a52609052607e52609452608852608452607c5260925260805260965260aa5260a85260a65260ae5260b05260ac5260b45260b25260b65260b85260ba5260")\ - X(150 , 1, Key1 , "1" , "1" , 0x31 , 49 , 'u', '1' , '1' , "0002312802310802312602311202310c02311e02311c02310602312402310402310a02311002311602312002311802310e02312a02311a02312202311402317a02312c02312e02310202313002313202313402313a02313c02313802313602319c02314002313e02314c02314202314e02314a02314602315402314402315c02315a02316802316202316602314802317202316c02315002319e0231760231a002315202315802315602316e02316002316a02317002317402315e0231640231a202317802318c02318e0231820231a402318602318a02319802319a02319002317e02319402318802318402317c0231920231800231960231aa0231a80231a60231ae0231b00231ac0231b40231b20231b60231b80231ba0d31")\ - X( 151, 1, Numpad1 , "1" , "1" , 0x31 , 57400, 'u', '1' , '1' , "004f61284f61084f61264f61124f610c4f611e4f611c4f61064f61244f61044f610a4f61104f61164f61204f61184f610e4f612a4f611a4f61224f61144f617a4f612c4f612e4f61024f61304f61324f61344f613a4f613c4f61384f61364f619c4f61404f613e4f614c4f61424f614e4f614a4f61464f61544f61444f615c4f615a4f61684f61624f61664f61484f61724f616c4f61504f619e4f61764f61a04f61524f61584f61564f616e4f61604f616a4f61704f61744f615e4f61644f61a24f61784f618c4f618e4f61824f61a44f61864f618a4f61984f619a4f61904f617e4f61944f61884f61844f617c4f61924f61804f61964f61aa4f61a84f61a64f61ae4f61b04f61ac4f61b44f61b24f61b64f61b84f61ba4f61")\ - X(152 , 1, Key2 , "2" , "2" , 0x32 , 50 , 'u', '2' , '\0' , "0003322803320803322603321203320c03321e03321c03320603322403320403320a03321003321603322003321803320e03322a03321a03322203321403327a03322c03322e03320203323003323203323403323a03323c03323803323603329c03324003323e03324c03324203324e03324a03324603325403324403325c03325a03326803326203326603324803327203326c03325003329e0332760332a003325203325803325603326e03326003326a03327003327403325e0332640332a203327803328c03328e0332820332a403328603328a03329803329a03329003327e03329403328803328403327c0332920332800332960332aa0332a80332a60332ae0332b00332ac0332b40332b20332b60332b80332ba0c32")\ - X( 153, 1, Numpad2 , "2" , "2" , 0x32 , 57401, 'u', '2' , '\0' , "0050622850620850622650621250620c50621e50621c50620650622450620450620a50621050621650622050621850620e50622a50621a50622250621450627a50622c50622e50620250623050623250623450623a50623c50623850623650629c50624050623e50624c50624250624e50624a50624650625450624450625c50625a50626850626250626650624850627250626c50625050629e5062765062a050625250625850625650626e50626050626a50627050627450625e5062645062a250627850628c50628e5062825062a450628650628a50629850629a50629050627e50629450628850628450627c5062925062805062965062aa5062a85062a65062ae5062b05062ac5062b45062b25062b65062b85062ba5062")\ - X(154 , 1, Key3 , "3" , "3" , 0x33 , 51 , 'u', '3' , '\x1b', "0004332804330804332604331204330c04331e04331c04330604332404330404330a04331004331604332004331804330e04332a04331a04332204331404337a04332c04332e04330204333004333204333404333a04333c04333804333604339c04334004333e04334c04334204334e04334a04334604335404334404335c04335a04336804336204336604334804337204336c04335004339e0433760433a004335204335804335604336e04336004336a04337004337404335e0433640433a204337804338c04338e0433820433a404338604338a04339804339a04339004337e04339404338804338404337c0433920433800433960433aa0433a80433a60433ae0433b00433ac0433b40433b20433b60433b80433ba0b33")\ - X( 155, 1, Numpad3 , "3" , "3" , 0x33 , 57402, 'u', '3' , '\x1b', "0051632851630851632651631251630c51631e51631c51630651632451630451630a51631051631651632051631851630e51632a51631a51632251631451637a51632c51632e51630251633051633251633451633a51633c51633851633651639c51634051633e51634c51634251634e51634a51634651635451634451635c51635a51636851636251636651634851637251636c51635051639e5163765163a051635251635851635651636e51636051636a51637051637451635e5163645163a251637851638c51638e5163825163a451638651638a51639851639a51639051637e51639451638851638451637c5163925163805163965163aa5163a85163a65163ae5163b05163ac5163b45163b25163b65163b85163ba5163")\ - X(156 , 1, Key4 , "4" , "4" , 0x34 , 52 , 'u', '4' , '\x1c', "0005342805340805342605341205340c05341e05341c05340605342405340405340a05341005341605342005341805340e05342a05341a05342205341405347a05342c05342e05340205343005343205343405343a05343c05343805343605349c05344005343e05344c05344205344e05344a05344605345405344405345c05345a05346805346205346605344805347205346c05345005349e0534760534a005345205345805345605346e05346005346a05347005347405345e0534640534a205347805348c05348e0534820534a405348605348a05349805349a05349005347e05349405348805348405347c0534920534800534960534aa0534a80534a60534ae0534b00534ac0534b40534b20534b60534b80534ba0a34")\ - X( 157, 1, Numpad4 , "4" , "4" , 0x34 , 57403, 'u', '4' , '\x1c', "004b64284b64084b64264b64124b640c4b641e4b641c4b64064b64244b64044b640a4b64104b64164b64204b64184b640e4b642a4b641a4b64224b64144b647a4b642c4b642e4b64024b64304b64324b64344b643a4b643c4b64384b64364b649c4b64404b643e4b644c4b64424b644e4b644a4b64464b64544b64444b645c4b645a4b64684b64624b64664b64484b64724b646c4b64504b649e4b64764b64a04b64524b64584b64564b646e4b64604b646a4b64704b64744b645e4b64644b64a24b64784b648c4b648e4b64824b64a44b64864b648a4b64984b649a4b64904b647e4b64944b64884b64844b647c4b64924b64804b64964b64aa4b64a84b64a64b64ae4b64b04b64ac4b64b44b64b24b64b64b64b84b64ba4b64")\ - X(158 , 1, Key5 , "5" , "5" , 0x35 , 53 , 'u', '5' , '\x1d', "0006352806350806352606351206350c06351e06351c06350606352406350406350a06351006351606352006351806350e06352a06351a06352206351406357a06352c06352e06350206353006353206353406353a06353c06353806353606359c06354006353e06354c06354206354e06354a06354606355406354406355c06355a06356806356206356606354806357206356c06355006359e0635760635a006355206355806355606356e06356006356a06357006357406355e0635640635a206357806358c06358e0635820635a406358606358a06359806359a06359006357e06359406358806358406357c0635920635800635960635aa0635a80635a60635ae0635b00635ac0635b40635b20635b60635b81035ba1a35")\ - X( 159, 1, Numpad5 , "5" , "5" , 0x35 , 57404, 'u', '5' , '\x1d', "004c65284c65084c65264c65124c650c4c651e4c651c4c65064c65244c65044c650a4c65104c65164c65204c65184c650e4c652a4c651a4c65224c65144c657a4c652c4c652e4c65024c65304c65324c65344c653a4c653c4c65384c65364c659c4c65404c653e4c654c4c65424c654e4c654a4c65464c65544c65444c655c4c655a4c65684c65624c65664c65484c65724c656c4c65504c659e4c65764c65a04c65524c65584c65564c656e4c65604c656a4c65704c65744c655e4c65644c65a24c65784c658c4c658e4c65824c65a44c65864c658a4c65984c659a4c65904c657e4c65944c65884c65844c657c4c65924c65804c65964c65aa4c65a84c65a64c65ae4c65b04c65ac4c65b44c65b24c65b64c65b84c65ba4c65")\ - X(160 , 1, Key6 , "6" , "6" , 0x36 , 54 , 'u', '6' , '\x1e', "0007362807360807362607361207360c07361e07361c07360607362407360407360a07361007361607362007361807360e07362a07361a07362207361407367a07362c07362e07360207363007363207363407363a07363c07363807363607369c07364007363e07364c07364207364e07364a07364607365407364407365c07365a07366807366207366607364807367207366c07365007369e0736760736a007365207365807365607366e07366007366a07367007367407365e0736640736a207367807368c07368e0736820736a407368607368a07369807369a07369007367e07369407368807368407367c0736920736800736960736aa0736a80736a60736ae0736b00736ac0736b40736b20736b60736b81136ba1936")\ - X( 161, 1, Numpad6 , "6" , "6" , 0x36 , 57405, 'u', '6' , '\x1e', "004d66284d66084d66264d66124d660c4d661e4d661c4d66064d66244d66044d660a4d66104d66164d66204d66184d660e4d662a4d661a4d66224d66144d667a4d662c4d662e4d66024d66304d66324d66344d663a4d663c4d66384d66364d669c4d66404d663e4d664c4d66424d664e4d664a4d66464d66544d66444d665c4d665a4d66684d66624d66664d66484d66724d666c4d66504d669e4d66764d66a04d66524d66584d66564d666e4d66604d666a4d66704d66744d665e4d66644d66a24d66784d668c4d668e4d66824d66a44d66864d668a4d66984d669a4d66904d667e4d66944d66884d66844d667c4d66924d66804d66964d66aa4d66a84d66a64d66ae4d66b04d66ac4d66b44d66b24d66b64d66b84d66ba4d66")\ - X(162 , 1, Key7 , "7" , "7" , 0x37 , 55 , 'u', '7' , '\x1f', "0008372808370808372608371208370c08371e08371c08370608372408370408370a08371008371608372008371808370e08372a08371a08372208371408377a08372c08372e08370208373008373208373408373a08373c08373808373608379c08374008373e08374c08374208374e08374a08374608375408374408375c08375a08376808376208376608374808377208376c08375008379e0837760837a008375208375808375608376e08376008376a08377008377408375e0837640837a208377808378c08378e0837820837a408378608378a08379808379a08379008377e08379408378808378408377c0837920837800837960837aa0837a80837a60837ae0837b00837ac0837b40837b20837b60837b81e37ba2837")\ - X( 163, 1, Numpad7 , "7" , "7" , 0x37 , 57406, 'u', '7' , '\x1f', "0047672847670847672647671247670c47671e47671c47670647672447670447670a47671047671647672047671847670e47672a47671a47672247671447677a47672c47672e47670247673047673247673447673a47673c47673847673647679c47674047673e47674c47674247674e47674a47674647675447674447675c47675a47676847676247676647674847677247676c47675047679e4767764767a047675247675847675647676e47676047676a47677047677447675e4767644767a247677847678c47678e4767824767a447678647678a47679847679a47679047677e47679447678847678447677c4767924767804767964767aa4767a84767a64767ae4767b04767ac4767b44767b24767b64767b84767ba4767")\ - X(164 , 1, Key8 , "8" , "8" , 0x38 , 56 , 'u', '8' , '\x7f', "0009382809380809382609381209380c09381e09381c09380609382409380409380a09381009381609382009381809380e09382a09381a09382209381409387a09382c09382e09380209383009383209383409383a09383c09383809383609389c09384009383e09384c09384209384e09384a09384609385409384409385c09385a09386809386209386609384809387209386c09385009389e0938760938a009385209385809385609386e09386009386a09387009387409385e0938640938a209387809388c09388e0938820938a409388609388a09389809389a09389009387e09389409388809388409387c0938920938800938960938aa0938a80938a60938ae0938b00938ac0938b40938b20938b60938b81f38ba2738")\ - X( 165, 1, Numpad8 , "8" , "8" , 0x38 , 57407, 'u', '8' , '\x7f', "0048682848680848682648681248680c48681e48681c48680648682448680448680a48681048681648682048681848680e48682a48681a48682248681448687a48682c48682e48680248683048683248683448683a48683c48683848683648689c48684048683e48684c48684248684e48684a48684648685448684448685c48685a48686848686248686648684848687248686c48685048689e4868764868a048685248685848685648686e48686048686a48687048687448685e4868644868a248687848688c48688e4868824868a448688648688a48689848689a48689048687e48689448688848688448687c4868924868804868964868aa4868a84868a64868ae4868b04868ac4868b44868b24868b64868b84868ba4868")\ - X(166 , 1, Key9 , "9" , "9" , 0x39 , 57 , 'u', '9' , '9' , "000a39280a39080a39260a39120a390c0a391e0a391c0a39060a39240a39040a390a0a39100a39160a39200a39180a390e0a392a0a391a0a39220a39140a397a0a392c0a392e0a39020a39300a39320a39340a393a0a393c0a39380a39360a399c0a39400a393e0a394c0a39420a394e0a394a0a39460a39540a39440a395c0a395a0a39680a39620a39660a39480a39720a396c0a39500a399e0a39760a39a00a39520a39580a39560a396e0a39600a396a0a39700a39740a395e0a39640a39a20a39780a398c0a398e0a39820a39a40a39860a398a0a39980a399a0a39900a397e0a39940a39880a39840a397c0a39920a39800a39960a39aa0a39a80a39a60a39ae0a39b00a39ac0a39b40a39b20a39b60a39b82c39ba3539")\ - X( 167, 1, Numpad9 , "9" , "9" , 0x39 , 57408, 'u', '9' , '9' , "0049692849690849692649691249690c49691e49691c49690649692449690449690a49691049691649692049691849690e49692a49691a49692249691449697a49692c49692e49690249693049693249693449693a49693c49693849693649699c49694049693e49694c49694249694e49694a49694649695449694449695c49695a49696849696249696649694849697249696c49695049699e4969764969a049695249695849695649696e49696049696a49697049697449695e4969644969a249697849698c49698e4969824969a449698649698a49699849699a49699049697e49699449698849698449697c4969924969804969964969aa4969a84969a64969ae4969b04969ac4969b44969b24969b64969b84969ba4969")\ - X(168 , 1, KeyMultiply , "*" , "*" , 0x2A , 42 , 'u', '*' , '*' , "5e1bba9a0cdfaa2bdca82bdca62bdc")\ - X( 169, 1, NumpadMultiply , "*" , "*" , 0x2A , 57411, 'u', '*' , '*' , "00376a28376a08376a26376a12376a0c376a1e376a1c376a06376a24376a04376a0a376a10376a16376a20376a18376a0e376a2a376a1a376a22376a14376a7a376a2c376a2e376a02376a30376a32376a34376a3a376a3c376a38376a36376a9c376a40376a3e376a4c376a42376a4e376a4a376a46376a54376a44376a5c376a5a376a68376a62376a66376a48376a72376a6c376a50376a9e376a76376aa0376a52376a58376a56376a6e376a60376a6a376a70376a74376a5e376a64376aa2376a78376a8c376a8e376a82376aa4376a86376a8a376a98376a9a376a90376a7e376a94376a88376a84376a7c376a92376a80376a96376aaa376aa8376aa6376aae376ab0376aac376ab4376ab2376ab6376ab8376aba376a")\ - X(170 , 1, KeySlash , "/" , "/" , 0x2F , 47 , 'u', '/' , '\x1f', "0035bf2835bf0835bf2635bf1235bf0c35bf1e35bf1c35bf0635bf2435bf0435bf0a35bf1035bf1635bf2035bf1835bf0e35bf2a35bf1a35bf2235bf1435bf7a35bf2c35bf2e35bf0235bf3035bf3235bf3435bf3a35bf3c35bf3835bf3635bf9c35bf4035bf3e35bf4c35bf4e73c14a73c15435bf4429de5e0cdbb21abfb60cbbb80bbfba04bf")\ - X( 171, 1, NumpadDivide , "/" , "/" , 0x2F , 57410, 'u', '/' , '\x1f', "01356f29356f09356f27356f13356f0d356f1f356f1d356f07356f25356f05356f0b356f11356f17356f21356f19356f0f356f2b356f1b356f23356f15356f7b356f2d356f2f356f03356f31356f33356f35356f3b356f3d356f39356f37356f9d356f41356f3f356f4d356f43356f4f356f4b356f47356f55356f45356f5d356f5b356f69356f63356f67356f49356f73356f6d356f51356f9f356f77356fa1356f53356f59356f57356f6f356f61356f6b356f71356f75356f5f356f65356fa3356f79356f8d356f8f356f83356fa5356f87356f8b356f99356f9b356f91356f7f356f95356f89356f85356f7d356f93356f81356f97356fab356fa9356fa7356faf356fb1356fad356fb5356fb3356fb7356fb9356fbb356f")\ - X(172 , 1, KeyPlus , "Plus" , "+" , 0x2B , 43 , 'u', '+' , '+' , "5c0cbb5a0cbb680cbb621bbb660cbb480dbb721abb6c0cbb760cbd521abb581bbb561bbb6e1bbb600cbb6a1bbb700cbb740cbb5e27bb640cbb782bbf8c1bbb8e1bbb821bbb860dbb8a0cbb881bbb841bbb920dbb800dbb960cbdb629c0")\ - X( 173, 1, NumpadPlus , "Plus" , "+" , 0x2B , 57413, 'u', '+' , '+' , "004e6b284e6b084e6b264e6b124e6b0c4e6b1e4e6b1c4e6b064e6b244e6b044e6b0a4e6b104e6b164e6b204e6b184e6b0e4e6b2a4e6b1a4e6b224e6b144e6b7a4e6b2c4e6b2e4e6b024e6b304e6b324e6b344e6b3a4e6b3c4e6b384e6b364e6b9c4e6b404e6b3e4e6b4c4e6b424e6b4e4e6b4a4e6b464e6b544e6b444e6b5c4e6b5a4e6b684e6b624e6b664e6b484e6b724e6b6c4e6b504e6b9e4e6b764e6ba04e6b524e6b584e6b564e6b6e4e6b604e6b6a4e6b704e6b744e6b5e4e6b644e6ba24e6b784e6b8c4e6b8e4e6b824e6ba44e6b864e6b8a4e6b984e6b9a4e6b904e6b7e4e6b944e6b884e6b844e6b7c4e6b924e6b804e6b964e6baa4e6ba84e6ba64e6bae4e6bb04e6bac4e6bb44e6bb24e6bb64e6bb84e6bba4e6b")\ - X(174 , 1, KeyMinus , "Minus" , "-" , 0x2D , 45 , 'u', '-' , '-' , "000cbd280cbd080cbd260cbd120cbd0c0cbd1e0cbd1c0cbd060cbd240cbd040cbd0a0cbd100cbd160cbd200cbd180cbd0e0cbd2a0cbd1a0cbd220cbd140cbd7a0cbd2c0cbd2e0cbd020cbd300cbd320cbd340cbd3a0cbd3c0cbd380cbd360cbd9c0cbd400cbd3e0cbd4c0cbd420cbd4e0cbd4a0cbd460cbd540cbd440cbd5c35bd5a35bd6835bd6235bd6635bd4835bd7235bd6c35bd500cbd9e35bf7635dda035bf5235bd5835bd5635bd6e35bd6035bd6a35bd7035bd7435bd5e35bd6435bda235bd780ddb8c35bd8e35bd8235bda435bd8635bd8a35bd9835bd9a0dbd9035bd7e35bd9435bd8835bd8435bd7c35bf9235bd8035bd9635bfae0dbdb00dbdac0dbdb228bdb60dbdb828bdba1ebd")\ - X( 175, 1, NumpadMinus , "Minus" , "-" , 0x2D , 57412, 'u', '-' , '-' , "004a6d284a6d084a6d264a6d124a6d0c4a6d1e4a6d1c4a6d064a6d244a6d044a6d0a4a6d104a6d164a6d204a6d184a6d0e4a6d2a4a6d1a4a6d224a6d144a6d7a4a6d2c4a6d2e4a6d024a6d304a6d324a6d344a6d3a4a6d3c4a6d384a6d364a6d9c4a6d404a6d3e4a6d4c4a6d424a6d4e4a6d4a4a6d464a6d544a6d444a6d5c4a6d5a4a6d684a6d624a6d664a6d484a6d724a6d6c4a6d504a6d9e4a6d764a6da04a6d524a6d584a6d564a6d6e4a6d604a6d6a4a6d704a6d744a6d5e4a6d644a6da24a6d784a6d8c4a6d8e4a6d824a6da44a6d864a6d8a4a6d984a6d9a4a6d904a6d7e4a6d944a6d884a6d844a6d7c4a6d924a6d804a6d964a6daa4a6da84a6da64a6dae4a6db04a6dac4a6db44a6db24a6db64a6db84a6dba4a6d")\ - X(176 , 1, KeyEqual , "=" , "=" , 0x3D , 61 , 'u', '=' , '=' , "000dbb280dbb080dbb260dbb120dbb0c0dbb1e0dbb1c0dbb060dbb240dbb040dbb0a0dbb100dbb160dbb200dbb180dbb0e0dbb2a0dbb1a0dbb220dbb140dbb2c0dbb2e0dbb020dbb300dbb320dbb340dbb3a0dbb3c0dbb380dbb360dbb400dbb3e0dbb4c0dbb420dbb4e0dbb4a0dbb460dbb540dbb440dbb5035df9e0cbda00cbda20cbba40cbfaa0dbba80dbba60dbbae35bbb035bbac35bbb21bbbb81bbbba1bbb")\ + X( 131, 1, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "008c0c068c0c108c0c0e8c0c148c0c168c0c028c0c0a8c0c0c8c0c188c0c048c0c088c0c1a8c0c128c0c208c0c1e8c0c1c8c0c228c0c248c0c288c0c268c0c2a8c0c308c0c2e8c0c2c8c0c348c0c368c0c328c0c388c0c3a8c0c3e8c0c3c8c0c408c0c428c0c448c0c468c0c488c0c4e8c0c508c0c4a8c0c4c8c0c528c0c568c0c588c0c548c0c5a8c0c5c8c0c5e8c0c608c0c648c0c6c8c0c628c0c6a8c0c668c0c688c0c6e8c0c708c0c728c0c7c8c0c748c0c768c0c788c0c7a8c0c7e8c0c808c0c868c0c828c0c848c0c888c0c8a8c0c8c8c0c8e8c0c928c0c908c0c948c0c968c0c988c0c9a8c0c9c8c0ca08c0c9e8c0ca28c0ca48c0ca68c0ca88c0caa8c0cac8c0c")\ + X(132 , 1, KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0149210749211149210f49211549211749210349210b49210d49211949210549210949211b49211349212149211f49211d49212349212549212949212749212b49213149212f49212d49213549213749213349213949213b49213f49213d49214149214349214549214749214949214f49215149214b49214d49215349215749215949215549215b49215d49215f49216149216549216d49216349216b49216749216949216f49217149217349217d49217549217749217949217b49217f49218149218749218349218549218949218b49218d49218f49219349219149219549219749219949219b49219d4921a149219f4921a34921a54921a74921a94921ab4921ad4921")\ + X( 133, 1, NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0089210689211089210e89211489211689210289210a89210c89211889210489210889211a89211289212089211e89211c89212289212489212889212689212a89213089212e89212c89213489213689213289213889213a89213e89213c89214089214289214489214689214889214e89215089214a89214c89215289215689215889215489215a89215c89215e89216089216489216c89216289216a89216689216889216e89217089217289217c89217489217689217889217a89217e89218089218689218289218489218889218a89218c89218e89219289219089219489219689219889219a89219c8921a089219e8921a28921a48921a68921a88921aa8921ac8921")\ + X(134 , 1, KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0151220751221151220f51221551221751220351220b51220d51221951220551220951221b51221351222151221f51221d51222351222551222951222751222b51223151222f51222d51223551223751223351223951223b51223f51223d51224151224351224551224751224951224f51225151224b51224d51225351225751225951225551225b51225d51225f51226151226551226d51226351226b51226751226951226f51227151227351227d51227551227751227951227b51227f51228151228751228351228551228951228b51228d51228f51229351229151229551229751229951229b51229d5122a151229f5122a35122a55122a75122a95122ab5122ad5122")\ + X( 135, 1, NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0081220681221081220e81221481221681220281220a81220c81221881220481220881221a81221281222081221e81221c81222281222481222881222681222a81223081222e81222c81223481223681223281223881223a81223e81223c81224081224281224481224681224881224e81225081224a81224c81225281225681225881225481225a81225c81225e81226081226481226c81226281226a81226681226881226e81227081227281227c81227481227681227881227a81227e81228081228681228281228481228881228a81228c81228e81229281229081229481229681229881229a81229c8122a081229e8122a28122a48122a68122a88122aa8122ac8122")\ + X(136 , 1, KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0147240747241147240f47241547241747240347240b47240d47241947240547240947241b47241347242147241f47241d47242347242547242947242747242b47243147242f47242d47243547243747243347243947243b47243f47243d47244147244347244547244747244947244f47245147244b47244d47245347245747245947245547245b47245d47245f47246147246547246d47246347246b47246747246947246f47247147247347247d47247547247747247947247b47247f47248147248747248347248547248947248b47248d47248f47249347249147249547249747249947249b47249d4724a147249f4724a34724a54724a74724a94724ab4724ad4724")\ + X( 137, 1, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0087240687241087240e87241487241687240287240a87240c87241887240487240887241a87241287242087241e87241c87242287242487242887242687242a87243087242e87242c87243487243687243287243887243a87243e87243c87244087244287244487244687244887244e87245087244a87244c87245287245687245887245487245a87245c87245e87246087246487246c87246287246a87246687246887246e87247087247287247c87247487247687247887247a87247e87248087248687248287248487248887248a87248c87248e87249287249087249487249687249887249a87249c8724a087249e8724a28724a48724a68724a88724aa8724ac8724")\ + X(138 , 1, KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "014f23074f23114f230f4f23154f23174f23034f230b4f230d4f23194f23054f23094f231b4f23134f23214f231f4f231d4f23234f23254f23294f23274f232b4f23314f232f4f232d4f23354f23374f23334f23394f233b4f233f4f233d4f23414f23434f23454f23474f23494f234f4f23514f234b4f234d4f23534f23574f23594f23554f235b4f235d4f235f4f23614f23654f236d4f23634f236b4f23674f23694f236f4f23714f23734f237d4f23754f23774f23794f237b4f237f4f23814f23874f23834f23854f23894f238b4f238d4f238f4f23934f23914f23954f23974f23994f239b4f239d4f23a14f239f4f23a34f23a54f23a74f23a94f23ab4f23ad4f23")\ + X( 139, 1, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "008f23068f23108f230e8f23148f23168f23028f230a8f230c8f23188f23048f23088f231a8f23128f23208f231e8f231c8f23228f23248f23288f23268f232a8f23308f232e8f232c8f23348f23368f23328f23388f233a8f233e8f233c8f23408f23428f23448f23468f23488f234e8f23508f234a8f234c8f23528f23568f23588f23548f235a8f235c8f235e8f23608f23648f236c8f23628f236a8f23668f23688f236e8f23708f23728f237c8f23748f23768f23788f237a8f237e8f23808f23868f23828f23848f23888f238a8f238c8f238e8f23928f23908f23948f23968f23988f239a8f239c8f23a08f239e8f23a28f23a48f23a68f23a88f23aa8f23ac8f23")\ + X(140 , 1, KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "014b25074b25114b250f4b25154b25174b25034b250b4b250d4b25194b25054b25094b251b4b25134b25214b251f4b251d4b25234b25254b25294b25274b252b4b25314b252f4b252d4b25354b25374b25334b25394b253b4b253f4b253d4b25414b25434b25454b25474b25494b254f4b25514b254b4b254d4b25534b25574b25594b25554b255b4b255d4b255f4b25614b25654b256d4b25634b256b4b25674b25694b256f4b25714b25734b257d4b25754b25774b25794b257b4b257f4b25814b25874b25834b25854b25894b258b4b258d4b258f4b25934b25914b25954b25974b25994b259b4b259d4b25a14b259f4b25a34b25a54b25a74b25a94b25ab4b25ad4b25")\ + X( 141, 1, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "008b25068b25108b250e8b25148b25168b25028b250a8b250c8b25188b25048b25088b251a8b25128b25208b251e8b251c8b25228b25248b25288b25268b252a8b25308b252e8b252c8b25348b25368b25328b25388b253a8b253e8b253c8b25408b25428b25448b25468b25488b254e8b25508b254a8b254c8b25528b25568b25588b25548b255a8b255c8b255e8b25608b25648b256c8b25628b256a8b25668b25688b256e8b25708b25728b257c8b25748b25768b25788b257a8b257e8b25808b25868b25828b25848b25888b258a8b258c8b258e8b25928b25908b25948b25968b25988b259a8b259c8b25a08b259e8b25a28b25a48b25a68b25a88b25aa8b25ac8b25")\ + X(142 , 1, KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "014d27074d27114d270f4d27154d27174d27034d270b4d270d4d27194d27054d27094d271b4d27134d27214d271f4d271d4d27234d27254d27294d27274d272b4d27314d272f4d272d4d27354d27374d27334d27394d273b4d273f4d273d4d27414d27434d27454d27474d27494d274f4d27514d274b4d274d4d27534d27574d27594d27554d275b4d275d4d275f4d27614d27654d276d4d27634d276b4d27674d27694d276f4d27714d27734d277d4d27754d27774d27794d277b4d277f4d27814d27874d27834d27854d27894d278b4d278d4d278f4d27934d27914d27954d27974d27994d279b4d279d4d27a14d279f4d27a34d27a54d27a74d27a94d27ab4d27ad4d27")\ + X( 143, 1, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "008d27068d27108d270e8d27148d27168d27028d270a8d270c8d27188d27048d27088d271a8d27128d27208d271e8d271c8d27228d27248d27288d27268d272a8d27308d272e8d272c8d27348d27368d27328d27388d273a8d273e8d273c8d27408d27428d27448d27468d27488d274e8d27508d274a8d274c8d27528d27568d27588d27548d275a8d275c8d275e8d27608d27648d276c8d27628d276a8d27668d27688d276e8d27708d27728d277c8d27748d27768d27788d277a8d277e8d27808d27868d27828d27848d27888d278a8d278c8d278e8d27928d27908d27948d27968d27988d279a8d279c8d27a08d279e8d27a28d27a48d27a68d27a88d27aa8d27ac8d27")\ + X(144 , 1, KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0148260748261148260f48261548261748260348260b48260d48261948260548260948261b48261348262148261f48261d48262348262548262948262748262b48263148262f48262d48263548263748263348263948263b48263f48263d48264148264348264548264748264948264f48265148264b48264d48265348265748265948265548265b48265d48265f48266148266548266d48266348266b48266748266948266f48267148267348267d48267548267748267948267b48267f48268148268748268348268548268948268b48268d48268f48269348269148269548269748269948269b48269d4826a148269f4826a34826a54826a74826a94826ab4826ad4826")\ + X( 145, 1, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0088260688261088260e88261488261688260288260a88260c88261888260488260888261a88261288262088261e88261c88262288262488262888262688262a88263088262e88262c88263488263688263288263888263a88263e88263c88264088264288264488264688264888264e88265088264a88264c88265288265688265888265488265a88265c88265e88266088266488266c88266288266a88266688266888266e88267088267288267c88267488267688267888267a88267e88268088268688268288268488268888268a88268c88268e88269288269088269488269688269888269a88269c8826a088269e8826a28826a48826a68826a88826aa8826ac8826")\ + X(146 , 1, KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0150280750281150280f50281550281750280350280b50280d50281950280550280950281b50281350282150281f50281d50282350282550282950282750282b50283150282f50282d50283550283750283350283950283b50283f50283d50284150284350284550284750284950284f50285150284b50284d50285350285750285950285550285b50285d50285f50286150286550286d50286350286b50286750286950286f50287150287350287d50287550287750287950287b50287f50288150288750288350288550288950288b50288d50288f50289350289150289550289750289950289b50289d5028a150289f5028a35028a55028a75028a95028ab5028ad5028")\ + X( 147, 1, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0080280680281080280e80281480281680280280280a80280c80281880280480280880281a80281280282080281e80281c80282280282480282880282680282a80283080282e80282c80283480283680283280283880283a80283e80283c80284080284280284480284680284880284e80285080284a80284c80285280285680285880285480285a80285c80285e80286080286480286c80286280286a80286680286880286e80287080287280287c80287480287680287880287a80287e80288080288680288280288480288880288a80288c80288e80289280289080289480289680289880289a80289c8028a080289e8028a28028a48028a68028a88028aa8028ac8028")\ + X(148 , 1, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30060b30100b300e0b30140b30160b30020b300a0b300c0b30180b30040b30080b301a0b30120b30200b301e0b301c0b30220b30240b30280b30260b302a0b30300b302e0b302c0b30340b30360b30320b30380b303a0b303e0b303c0b30400b30420b30440b30460b30480b304e0b30500b304a0b304c0b30520b30560b30580b30540b305a0b305c0b305e0b30600b30640b306c0b30620b306a0b30660b30680b306e0b30700b30720b307c0b30740b30760b30780b307a0b307e29307e0bc0800b30860b30820b30840b30880b308a0b308c0b308e0bc0920b30900b30940b30960b30980b309a0b309c0b30a00b309e0b30a20b30a40b30a60b30a82d30aa3430ac0b30")\ + X( 149, 1, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052600652601052600e52601452601652600252600a52600c52601852600452600852601a52601252602052601e52601c52602252602452602852602652602a52603052602e52602c52603452603652603252603852603a52603e52603c52604052604252604452604652604852604e52605052604a52604c52605252605652605852605452605a52605c52605e52606052606452606c52606252606a52606652606852606e52607052607252607c52607452607652607852607a52607e52608052608652608252608452608852608a52608c52608e52609252609052609452609652609852609a52609c5260a052609e5260a25260a45260a65260a85260aa5260ac5260")\ + X(150 , 1, Key1 , "1" , "1" , 0x31 , 49 , 'u', '1' , '1' , "0002310602311002310e02311402311602310202310a02310c02311802310402310802311a02311202312002311e02311c02312202312402312802312602312a02313002312e02312c02313402313602313202313802313a02313e02313c02314002314202314402314602314802314e02315002314a02314c02315202315602315802315402315a02315c02315e02316002316402316c02316202316a02316602316802316e02317002317202317c02317402317602317802317a02317e02318002318602318202318402318802318a02318c02318e02319202319002319402319602319802319a02319c0231a002319e0231a20231a40231a60231a80231aa0d31ac0231")\ + X( 151, 1, Numpad1 , "1" , "1" , 0x31 , 57400, 'u', '1' , '1' , "004f61064f61104f610e4f61144f61164f61024f610a4f610c4f61184f61044f61084f611a4f61124f61204f611e4f611c4f61224f61244f61284f61264f612a4f61304f612e4f612c4f61344f61364f61324f61384f613a4f613e4f613c4f61404f61424f61444f61464f61484f614e4f61504f614a4f614c4f61524f61564f61584f61544f615a4f615c4f615e4f61604f61644f616c4f61624f616a4f61664f61684f616e4f61704f61724f617c4f61744f61764f61784f617a4f617e4f61804f61864f61824f61844f61884f618a4f618c4f618e4f61924f61904f61944f61964f61984f619a4f619c4f61a04f619e4f61a24f61a44f61a64f61a84f61aa4f61ac4f61")\ + X(152 , 1, Key2 , "2" , "2" , 0x32 , 50 , 'u', '2' , '\0' , "0003320603321003320e03321403321603320203320a03320c03321803320403320803321a03321203322003321e03321c03322203322403322803322603322a03323003322e03322c03323403323603323203323803323a03323e03323c03324003324203324403324603324803324e03325003324a03324c03325203325603325803325403325a03325c03325e03326003326403326c03326203326a03326603326803326e03327003327203327c03327403327603327803327a03327e03328003328603328203328403328803328a03328c03328e03329203329003329403329603329803329a03329c0332a003329e0332a20332a40332a60332a80332aa0c32ac0332")\ + X( 153, 1, Numpad2 , "2" , "2" , 0x32 , 57401, 'u', '2' , '\0' , "0050620650621050620e50621450621650620250620a50620c50621850620450620850621a50621250622050621e50621c50622250622450622850622650622a50623050622e50622c50623450623650623250623850623a50623e50623c50624050624250624450624650624850624e50625050624a50624c50625250625650625850625450625a50625c50625e50626050626450626c50626250626a50626650626850626e50627050627250627c50627450627650627850627a50627e50628050628650628250628450628850628a50628c50628e50629250629050629450629650629850629a50629c5062a050629e5062a25062a45062a65062a85062aa5062ac5062")\ + X(154 , 1, Key3 , "3" , "3" , 0x33 , 51 , 'u', '3' , '\x1b', "0004330604331004330e04331404331604330204330a04330c04331804330404330804331a04331204332004331e04331c04332204332404332804332604332a04333004332e04332c04333404333604333204333804333a04333e04333c04334004334204334404334604334804334e04335004334a04334c04335204335604335804335404335a04335c04335e04336004336404336c04336204336a04336604336804336e04337004337204337c04337404337604337804337a04337e04338004338604338204338404338804338a04338c04338e04339204339004339404339604339804339a04339c0433a004339e0433a20433a40433a60433a80433aa0b33ac0433")\ + X( 155, 1, Numpad3 , "3" , "3" , 0x33 , 57402, 'u', '3' , '\x1b', "0051630651631051630e51631451631651630251630a51630c51631851630451630851631a51631251632051631e51631c51632251632451632851632651632a51633051632e51632c51633451633651633251633851633a51633e51633c51634051634251634451634651634851634e51635051634a51634c51635251635651635851635451635a51635c51635e51636051636451636c51636251636a51636651636851636e51637051637251637c51637451637651637851637a51637e51638051638651638251638451638851638a51638c51638e51639251639051639451639651639851639a51639c5163a051639e5163a25163a45163a65163a85163aa5163ac5163")\ + X(156 , 1, Key4 , "4" , "4" , 0x34 , 52 , 'u', '4' , '\x1c', "0005340605341005340e05341405341605340205340a05340c05341805340405340805341a05341205342005341e05341c05342205342405342805342605342a05343005342e05342c05343405343605343205343805343a05343e05343c05344005344205344405344605344805344e05345005344a05344c05345205345605345805345405345a05345c05345e05346005346405346c05346205346a05346605346805346e05347005347205347c05347405347605347805347a05347e05348005348605348205348405348805348a05348c05348e05349205349005349405349605349805349a05349c0534a005349e0534a20534a40534a60534a80534aa0a34ac0534")\ + X( 157, 1, Numpad4 , "4" , "4" , 0x34 , 57403, 'u', '4' , '\x1c', "004b64064b64104b640e4b64144b64164b64024b640a4b640c4b64184b64044b64084b641a4b64124b64204b641e4b641c4b64224b64244b64284b64264b642a4b64304b642e4b642c4b64344b64364b64324b64384b643a4b643e4b643c4b64404b64424b64444b64464b64484b644e4b64504b644a4b644c4b64524b64564b64584b64544b645a4b645c4b645e4b64604b64644b646c4b64624b646a4b64664b64684b646e4b64704b64724b647c4b64744b64764b64784b647a4b647e4b64804b64864b64824b64844b64884b648a4b648c4b648e4b64924b64904b64944b64964b64984b649a4b649c4b64a04b649e4b64a24b64a44b64a64b64a84b64aa4b64ac4b64")\ + X(158 , 1, Key5 , "5" , "5" , 0x35 , 53 , 'u', '5' , '\x1d', "0006350606351006350e06351406351606350206350a06350c06351806350406350806351a06351206352006351e06351c06352206352406352806352606352a06353006352e06352c06353406353606353206353806353a06353e06353c06354006354206354406354606354806354e06355006354a06354c06355206355606355806355406355a06355c06355e06356006356406356c06356206356a06356606356806356e06357006357206357c06357406357606357806357a06357e06358006358606358206358406358806358a06358c06358e06359206359006359406359606359806359a06359c0635a006359e0635a20635a40635a60635a81035aa1a35ac0635")\ + X( 159, 1, Numpad5 , "5" , "5" , 0x35 , 57404, 'u', '5' , '\x1d', "004c65064c65104c650e4c65144c65164c65024c650a4c650c4c65184c65044c65084c651a4c65124c65204c651e4c651c4c65224c65244c65284c65264c652a4c65304c652e4c652c4c65344c65364c65324c65384c653a4c653e4c653c4c65404c65424c65444c65464c65484c654e4c65504c654a4c654c4c65524c65564c65584c65544c655a4c655c4c655e4c65604c65644c656c4c65624c656a4c65664c65684c656e4c65704c65724c657c4c65744c65764c65784c657a4c657e4c65804c65864c65824c65844c65884c658a4c658c4c658e4c65924c65904c65944c65964c65984c659a4c659c4c65a04c659e4c65a24c65a44c65a64c65a84c65aa4c65ac4c65")\ + X(160 , 1, Key6 , "6" , "6" , 0x36 , 54 , 'u', '6' , '\x1e', "0007360607361007360e07361407361607360207360a07360c07361807360407360807361a07361207362007361e07361c07362207362407362807362607362a07363007362e07362c07363407363607363207363807363a07363e07363c07364007364207364407364607364807364e07365007364a07364c07365207365607365807365407365a07365c07365e07366007366407366c07366207366a07366607366807366e07367007367207367c07367407367607367807367a07367e07368007368607368207368407368807368a07368c07368e07369207369007369407369607369807369a07369c0736a007369e0736a20736a40736a60736a81136aa1936ac0736")\ + X( 161, 1, Numpad6 , "6" , "6" , 0x36 , 57405, 'u', '6' , '\x1e', "004d66064d66104d660e4d66144d66164d66024d660a4d660c4d66184d66044d66084d661a4d66124d66204d661e4d661c4d66224d66244d66284d66264d662a4d66304d662e4d662c4d66344d66364d66324d66384d663a4d663e4d663c4d66404d66424d66444d66464d66484d664e4d66504d664a4d664c4d66524d66564d66584d66544d665a4d665c4d665e4d66604d66644d666c4d66624d666a4d66664d66684d666e4d66704d66724d667c4d66744d66764d66784d667a4d667e4d66804d66864d66824d66844d66884d668a4d668c4d668e4d66924d66904d66944d66964d66984d669a4d669c4d66a04d669e4d66a24d66a44d66a64d66a84d66aa4d66ac4d66")\ + X(162 , 1, Key7 , "7" , "7" , 0x37 , 55 , 'u', '7' , '\x1f', "0008370608371008370e08371408371608370208370a08370c08371808370408370808371a08371208372008371e08371c08372208372408372808372608372a08373008372e08372c08373408373608373208373808373a08373e08373c08374008374208374408374608374808374e08375008374a08374c08375208375608375808375408375a08375c08375e08376008376408376c08376208376a08376608376808376e08377008377208377c08377408377608377808377a08377e08378008378608378208378408378808378a08378c08378e08379208379008379408379608379808379a08379c0837a008379e0837a20837a40837a60837a81e37aa2837ac0837")\ + X( 163, 1, Numpad7 , "7" , "7" , 0x37 , 57406, 'u', '7' , '\x1f', "0047670647671047670e47671447671647670247670a47670c47671847670447670847671a47671247672047671e47671c47672247672447672847672647672a47673047672e47672c47673447673647673247673847673a47673e47673c47674047674247674447674647674847674e47675047674a47674c47675247675647675847675447675a47675c47675e47676047676447676c47676247676a47676647676847676e47677047677247677c47677447677647677847677a47677e47678047678647678247678447678847678a47678c47678e47679247679047679447679647679847679a47679c4767a047679e4767a24767a44767a64767a84767aa4767ac4767")\ + X(164 , 1, Key8 , "8" , "8" , 0x38 , 56 , 'u', '8' , '\x7f', "0009380609381009380e09381409381609380209380a09380c09381809380409380809381a09381209382009381e09381c09382209382409382809382609382a09383009382e09382c09383409383609383209383809383a09383e09383c09384009384209384409384609384809384e09385009384a09384c09385209385609385809385409385a09385c09385e09386009386409386c09386209386a09386609386809386e09387009387209387c09387409387609387809387a09387e09388009388609388209388409388809388a09388c09388e09389209389009389409389609389809389a09389c0938a009389e0938a20938a40938a60938a81f38aa2738ac0938")\ + X( 165, 1, Numpad8 , "8" , "8" , 0x38 , 57407, 'u', '8' , '\x7f', "0048680648681048680e48681448681648680248680a48680c48681848680448680848681a48681248682048681e48681c48682248682448682848682648682a48683048682e48682c48683448683648683248683848683a48683e48683c48684048684248684448684648684848684e48685048684a48684c48685248685648685848685448685a48685c48685e48686048686448686c48686248686a48686648686848686e48687048687248687c48687448687648687848687a48687e48688048688648688248688448688848688a48688c48688e48689248689048689448689648689848689a48689c4868a048689e4868a24868a44868a64868a84868aa4868ac4868")\ + X(166 , 1, Key9 , "9" , "9" , 0x39 , 57 , 'u', '9' , '9' , "000a39060a39100a390e0a39140a39160a39020a390a0a390c0a39180a39040a39080a391a0a39120a39200a391e0a391c0a39220a39240a39280a39260a392a0a39300a392e0a392c0a39340a39360a39320a39380a393a0a393e0a393c0a39400a39420a39440a39460a39480a394e0a39500a394a0a394c0a39520a39560a39580a39540a395a0a395c0a395e0a39600a39640a396c0a39620a396a0a39660a39680a396e0a39700a39720a397c0a39740a39760a39780a397a0a397e0a39800a39860a39820a39840a39880a398a0a398c0a398e0a39920a39900a39940a39960a39980a399a0a399c0a39a00a399e0a39a20a39a40a39a60a39a82c39aa3539ac0a39")\ + X( 167, 1, Numpad9 , "9" , "9" , 0x39 , 57408, 'u', '9' , '9' , "0049690649691049690e49691449691649690249690a49690c49691849690449690849691a49691249692049691e49691c49692249692449692849692649692a49693049692e49692c49693449693649693249693849693a49693e49693c49694049694249694449694649694849694e49695049694a49694c49695249695649695849695449695a49695c49695e49696049696449696c49696249696a49696649696849696e49697049697249697c49697449697649697849697a49697e49698049698649698249698449698849698a49698c49698e49699249699049699449699649699849699a49699c4969a049699e4969a24969a44969a64969a84969aa4969ac4969")\ + X(168 , 1, KeyMultiply , "*" , "*" , 0x2A , 42 , 'u', '*' , '*' , "641bba8c0cdf962bdc982bdc9a2bdc9c2bdc")\ + X( 169, 1, NumpadMultiply , "*" , "*" , 0x2A , 57411, 'u', '*' , '*' , "00376a06376a10376a0e376a14376a16376a02376a0a376a0c376a18376a04376a08376a1a376a12376a20376a1e376a1c376a22376a24376a28376a26376a2a376a30376a2e376a2c376a34376a36376a32376a38376a3a376a3e376a3c376a40376a42376a44376a46376a48376a4e376a50376a4a376a4c376a52376a56376a58376a54376a5a376a5c376a5e376a60376a64376a6c376a62376a6a376a66376a68376a6e376a70376a72376a7c376a74376a76376a78376a7a376a7e376a80376a86376a82376a84376a88376a8a376a8c376a8e376a92376a90376a94376a96376a98376a9a376a9c376aa0376a9e376aa2376aa4376aa6376aa8376aaa376aac376a")\ + X(170 , 1, KeySlash , "/" , "/" , 0x2F , 47 , 'u', '/' , '\x1f', "0035bf0635bf1035bf0e35bf1435bf1635bf0235bf0a35bf0c35bf1835bf0435bf0835bf1a35bf1235bf2035bf1e35bf1c35bf2235bf2435bf2835bf2635bf2a35bf3035bf2e35bf2c35bf3435bf3635bf3235bf3835bf3c73c14035bf4229de640cdb9235bf9a28dba41abfa60cbba80bbfaa04bf")\ + X( 171, 1, NumpadDivide , "/" , "/" , 0x2F , 57410, 'u', '/' , '\x1f', "01356f07356f11356f0f356f15356f17356f03356f0b356f0d356f19356f05356f09356f1b356f13356f21356f1f356f1d356f23356f25356f29356f27356f2b356f31356f2f356f2d356f35356f37356f33356f39356f3b356f3f356f3d356f41356f43356f45356f47356f49356f4f356f51356f4b356f4d356f53356f57356f59356f55356f5b356f5d356f5f356f61356f65356f6d356f63356f6b356f67356f69356f6f356f71356f73356f7d356f75356f77356f79356f7b356f7f356f81356f87356f83356f85356f89356f8b356f8d356f8f356f93356f91356f95356f97356f99356f9b356f9d356fa1356f9f356fa3356fa5356fa7356fa9356fab356fad356f")\ + X(172 , 1, KeyPlus , "Plus" , "+" , 0x2B , 43 , 'u', '+' , '+' , "440cbb461abb480dbb4e0cbb501bbb4a0cbb4c0cbb560cbd5a1bbb5c1bbb5e1abb600cbb6427bb6c0cbb620cbb6a1bbb660cbb681bbb702bbf720cbb7c0dbb761bbb781bbb7a1bbb801bbb861bbb821bbb841bbb900dbb940cbd9a1bbba629c0")\ + X( 173, 1, NumpadPlus , "Plus" , "+" , 0x2B , 57413, 'u', '+' , '+' , "004e6b064e6b104e6b0e4e6b144e6b164e6b024e6b0a4e6b0c4e6b184e6b044e6b084e6b1a4e6b124e6b204e6b1e4e6b1c4e6b224e6b244e6b284e6b264e6b2a4e6b304e6b2e4e6b2c4e6b344e6b364e6b324e6b384e6b3a4e6b3e4e6b3c4e6b404e6b424e6b444e6b464e6b484e6b4e4e6b504e6b4a4e6b4c4e6b524e6b564e6b584e6b544e6b5a4e6b5c4e6b5e4e6b604e6b644e6b6c4e6b624e6b6a4e6b664e6b684e6b6e4e6b704e6b724e6b7c4e6b744e6b764e6b784e6b7a4e6b7e4e6b804e6b864e6b824e6b844e6b884e6b8a4e6b8c4e6b8e4e6b924e6b904e6b944e6b964e6b984e6b9a4e6b9c4e6ba04e6b9e4e6ba24e6ba44e6ba64e6ba84e6baa4e6bac4e6b")\ + X(174 , 1, KeyMinus , "Minus" , "-" , 0x2D , 45 , 'u', '-' , '-' , "000cbd060cbd100cbd0e0cbd140cbd160cbd020cbd0a0cbd0c0cbd180cbd040cbd080cbd1a0cbd120cbd200cbd1e0cbd1c0cbd220cbd240cbd280cbd260cbd2a0cbd300cbd2e0cbd2c0cbd340cbd360cbd320cbd380cbd3a0cbd3e0cbd3c0cbd400cbd420cbd4435bd4635bd4835bd4e35bd5035bd4a35bd4c35bd5235bf5635dd5835bf540cbd5a35bd5c35bd5e35bd6035bd6435bd6c35bd6235bd6a35bd6635bd6835bd6e35bd700ddb7235bd7c35bd7435bd7635bd7835bd7a35bd7e35bd8035bd8635bd8235bd8435bd8835bd8a35bd8c0dbd8e35bf9256e2920cbd9035bd9435bf9a1abda00dbd9e0dbda428bda60dbda828bdaa1ebd")\ + X( 175, 1, NumpadMinus , "Minus" , "-" , 0x2D , 57412, 'u', '-' , '-' , "004a6d064a6d104a6d0e4a6d144a6d164a6d024a6d0a4a6d0c4a6d184a6d044a6d084a6d1a4a6d124a6d204a6d1e4a6d1c4a6d224a6d244a6d284a6d264a6d2a4a6d304a6d2e4a6d2c4a6d344a6d364a6d324a6d384a6d3a4a6d3e4a6d3c4a6d404a6d424a6d444a6d464a6d484a6d4e4a6d504a6d4a4a6d4c4a6d524a6d564a6d584a6d544a6d5a4a6d5c4a6d5e4a6d604a6d644a6d6c4a6d624a6d6a4a6d664a6d684a6d6e4a6d704a6d724a6d7c4a6d744a6d764a6d784a6d7a4a6d7e4a6d804a6d864a6d824a6d844a6d884a6d8a4a6d8c4a6d8e4a6d924a6d904a6d944a6d964a6d984a6d9a4a6d9c4a6da04a6d9e4a6da24a6da44a6da64a6da84a6daa4a6dac4a6d")\ + X(176 , 1, KeyEqual , "=" , "=" , 0x3D , 61 , 'u', '=' , '=' , "000dbb060dbb100dbb0e0dbb140dbb160dbb020dbb0a0dbb0c0dbb180dbb040dbb080dbb1a0dbb120dbb200dbb1c0dbb220dbb240dbb280dbb260dbb2a0dbb300dbb2e0dbb2c0dbb340dbb360dbb380dbb3a0dbb3e0dbb3c0dbb400dbb420dbb520cbd580cbd5435df6e0cbb740cbf920dbb960dbb980dbb9c0dbba035bb9e35bba41bbba81bbbaa1bbbac0cbd")\ X( 177, 1, NumpadEqual , "=" , "=" , 0x3D , 57415, 'u', '=' , '=' , "")\ - X(178 , 1, KeyPeriod , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be2834be0834be2634be1234be0c34be1e34be1c34be0634be2434be0434be0a34be1034be1634be2034be1834be0e34be2a34be1a34be2234be1434be7a34be2c34be2e34be0234be3034be3234be3434be3a34be3c34be3834be3634be9c34be4034be3e34be4c34be4234be4e34be4a34be4634be5434be4434be5c34be5a34be6834be6234be6634be4834be7234be6c34be5034be9e34be7634bea034be5234be5834be5634be6e34be6034be6a34be7034be7434be5e34be6434bea234be7834be8c34be8e34be8234bea434be8634be8a34be9834be9a35be9034be7e34be9434be8834be8434be7c34be9234be8034be9634beb212beb634beb813beba18be")\ - X( 179, 1, NumpadDecimal , "." , "." , 0x2E , 57409, 'u', '.' , '.' , "00536e28536e08536e26536e12536e0c536e1e536e1c536e06536e24536e04536e0a536e10536e16536e20536e18536e0e536e2a536e1a536e22536e14536e7a536e2c536e2e536e02536e30536e32536e34536e3a536e3c536e38536e36536e9c536e40536e3e536e4c536e42536e4e536e4a536e46536e54536e44536e5c536e5a536e68536e62536e66536e48536e72536e6c536e50536e9e536e76536ea0536e52536e58536e56536e6e536e60536e6a536e70536e74536e5e536e64536ea2536e78536e8c536e8e536e82536ea4536e86536e8a536e98536e9a536e90536e7e536e94536e88536e84536e7c536e92536e80536e96536eaa536ea8536ea6536eae536eb0536eac536eb4536eb2536eb6536eb8536eba536e")\ - X(180 , 1, KeyComma , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "0033bc2833bc0833bc2633bc1233bc0c33bc1e33bc1c33bc0633bc2433bc0433bc0a33bc1033bc1633bc2033bc1833bc0e33bc2a33bc1a33bc2233bc1433bc7a33bc2c33bc2e33bc0233bc3033bc3233bc3433bc3a33bc3c33bc3833bc3633bc9c33bc4033bc3e33bc4c33bc4233bc4e33bc4a33bc4633bc5433bc4433bc5c33bc5a33bc6833bc6233bc6633bc4833bc7233bc6c33bc5033bc9e33bc7633bca033bc5233bc5833bc5633bc6e33bc6033bc6a33bc7033bc7433bc5e33bc6433bca233bc7833bc8c33bc8e33bc8233bca433bc8633bc8a33bc9833bc9a2bbc9033bc7e33bc9433bc8833bc8433bc7c33bc9233bc8033bc9633bcaa32bca832bca632bcae32bcb032bcac32bcb211bcb635bcb82fbcba33bc")\ - X( 181, 1, NumpadPoint , "," , "," , 0x2C , 57416, 'u', ',' , ',' , "007ec2287ec2087ec2267ec2127ec20c7ec21e7ec21c7ec2067ec2247ec2047ec20a7ec2107ec2167ec2207ec2187ec20e7ec22a7ec21a7ec2227ec2147ec27a7ec22c7ec22e7ec2027ec2307ec2327ec2347ec23a7ec23c7ec2387ec2367ec29c7ec2407ec23e7ec24c7ec2427ec24e7ec24a7ec2467ec2547ec2447ec25c7ec25a7ec2687ec2627ec2667ec2487ec2727ec26c7ec2507ec29e7ec2767ec2a07ec2527ec2587ec2567ec26e7ec2607ec26a7ec2707ec2747ec25e7ec2647ec2a27ec2787ec28c7ec28e7ec2827ec2a47ec2867ec28a7ec2987ec29a7ec2907ec27e7ec2947ec2887ec2847ec27c7ec2927ec2807ec2967ec2aa7ec2a87ec2a67ec2ae7ec2b07ec2ac7ec2b47ec2b27ec2b67ec2b87ec2ba7ec2")\ - X(182 , 1, Colon , ":" , ":" , 0x3A , 58 , 'u', ':' , ':' , "aa34bfa834bfa634bfae34bfb034bfac34bf")\ - X(184 , 1, Semicolon , ";" , ";" , 0x3B , 59 , 'u', ';' , ';' , "0027ba2827ba0827ba2627ba1227ba0c27ba1e27ba1c27ba0627ba2427ba0427ba0a27ba1027ba1627ba2027ba1827ba0e27ba2a27ba1a27ba2227ba1427ba7a27ba2c27ba2e27ba0227ba3027ba3227ba3427ba3a27ba3c27ba3827ba3627ba9c27ba4027ba3e27ba4227ba4e35bf4a35bf4627ba4427ba9e29c0a029c0a229c0a429c0aa33bea833bea633beae33beb033beac33beb22cbab81ababa10ba")\ - X(186 , 1, TurnedComma , "ʻ" , "ʻ" , 0x02BB, 699 , 'u', -1 , -1 , "2e28de")\ - X(188 , 1, OpenSquareBracket , "[" , "[" , 0x5B , 91 , 'u', '[' , '\x1b', "001adb281adb081adb261adb121adb0c1adb1e1adb1c1adb061adb241adb041adb0a1adb101adb161adb201adb181adb0e1adb2a1adb1a1adb221adb141adb7a1adb2c1adb2e1adb021adb301adb321adb341adb3a1adb3c1adb381adb361adb4e1bdd4a1bdd5428de481adbb20cdbb80cdbba02db")\ - X(190 , 1, CloseSquareBracket , "]" , "]" , 0x5D , 93 , 'u', ']' , '\x1d', "001bdd281bdd081bdd261bdd121bdd0c1bdd1e1bdd1c1bdd061bdd241bdd041bdd0a1bdd101bdd161bdd201bdd181bdd0e1bdd2a1bdd1a1bdd221bdd141bdd7a1bdd2c1bdd2e1bdd021bdd301bdd321bdd341bdd3a1bdd3c1bdd381bdd361bdd4e2bdc4a2bdc542bdc481bdd720ddb5e56e29629c0b20dddb80dddba03dd")\ - X(192 , 1, OpenCurlyBracket , "{" , "{" , 0x7B , 123 , 'u', '{' , 27 , "6228de6a28de")\ - X(194 , 1, CloseCurlyBracket , "}" , "}" , 0x7D , 125 , 'u', '}' , 29 , "622bbf721bdd6a2bbf")\ - X(196 , 1, CloseRoundBracket , ")" , ")" , 0x29 , 41 , 'u', ')' , ')' , "a01bdda21bddaa0cdba80cdba60cdbae0cdbb00cdbac0cdb")\ - X(198 , 1, LessThan , "<" , "<" , 0x3C , 60 , 'u', '<' , '<' , "3029c0422bdc5456e25c56e25a56e26856e26256e26656e24856e27256e26c56e25056e27656e25256e25856e25656e26e56e26056e26a56e27056e27456e25e2bdc6456e27856e28c56e28e56e28256e28656e28a56e29a56e29056e27e56e29456e28856e28456e29256e28056e29656e2aa56e2a856e2a656e2ae56e2b056e2ac56e2b456e2b656e2")\ - X(200 , 1, BackSlash , "\\" , "\\" , 0x5C , 92 , 'u', '\\' , '\x1c', "002bdc0056e22856e2282bdc0856e2082bdc262bdc2656e21256e2122bdc0c2bdc0c56e21e2bdc1e56e21c2bdc1c56e2062bdc0656e2242bdc2456e20456e2042bdc0a56e20a2bdc102bdc1056e2162bdc1656e22056e2202bdc182bdc1856e20e2bdc0e56e22a56e22a2bdc1a2bdc1a56e22256e2222bdc1456e2142bdc7a56e27a2bdc2c56e22e2bdc2e56e2022bdc0256e23056e2322bde3256dc342bde3456dc3a56dc3c56dc3856dc3656dc9c56e29c2bdc4c56e24e56e24a56e25429c0680ddb4829c07229c0a056e25229dc5829dc5629dc600ddba256e2b256e2b22bdcb82bdcb856e2ba2bdcba56e2")\ - X(202 , 1, Underscore , "_" , "_" , 0x5F , 95 , 'u', '_' , '\x1f', "0673e2")\ - X(204 , 1, VerticalBar , "|" , "|" , 0x7C , 124 , 'u', '|' , 28 , "6829dc6229dc6029dc6a29dc")\ - X(206 , 1, DivisionSign , "÷" , "÷" , 0xF7 , 247 , 'u', -1 , -1 , "501add")\ - X(208 , 1, OneHalf , "½" , "½" , 0xBD , 189 , 'u', -1 , -1 , "6629dc7429dc6429dc")\ - X(210 , 1, SuperscriptTwo , "²" , "²" , 0xB2 , 178 , 'u', -1 , -1 , "a829dea629deae29deb029deac29de")\ - X(212 , 1, DegreeSign , "°" , "°" , 0xB0 , 176 , 'u', -1 , -1 , "2c2bdc4629de5e0dbf7829dc")\ - X(214 , 1, NumeroSign , "º" , "º" , 0xBA , 186 , 'u', -1 , -1 , "5228de6e29dc")\ - X(216 , 1, Acute , "´" , "´" , 0xB4 , 180 , 'u', -1 , -1 , "4e1adb4a1adb5c0ddb5a0ddb621aba660ddb4827ba6c0ddb502bbf9e0dbb760dbba00dbb521bba6e28de6a1aba700ddb740ddb5e28c0640ddba20dbf7828de8c0ddd8e0ddd820ddda40ddf880ddd840ddd")\ - X(218 , 1, Caron , "ˇ" , "ˇ" , 0x02C7, 780 , 'u', -1 , -1 , "7629de")\ - X(220 , 1, Cedilla , "¸" , "¸" , 0xB8 , 184 , 'u', -1 , -1 , "421bdd9229c08029c0")\ - X(222 , 1, Circumflex , "^" , "^" , 0x5E , 94 , 'u', '^' , 30 , "421adb461adb441adb4828de8c29dc8e29dc8229dc900ddd7e0ddd940ddd8829dc8429dcaa1adda81adda61addae1addb01addac1add")\ - X(224 , 1, Ogonek , "˛" , "˛" , 0x02DB, 731 , 'u', -1 , -1 , "8a29c0")\ - X(226 , 1, Tilde , "~" , "~" , 0x7E , 771 , 'u', '~' , 30 , "4e28de4a28de522bbf")\ - X(228 , 1, Tonos , "΄" , "΄" , 0x0384, 900 , 'u', -1 , -1 , "7227ba")\ - X(230 , 1, Umlaut , "¨" , "¨" , 0xA8 , 168 , 'u', -1 , -1 , "5c1bba5a1bba681bba661bba7228de6c1bba500ddba02bdc601bba701bba5e1add641bbaa22bdc901bc07e1bc0941bc0")\ - X(232 , 1, BackQuote , "`" , "`" , 0x60 , 96 , 'u', '`' , '`' , "0029c02829c00829c02629c01229c00c29c01e29c01c29c00629c02429c00429c00a29c01029c01629c02029c01829c00e29c02a29c01a29c02229c01429c07a29c02c29c02e29c00229c0302bdc3229df3429df3a29df3c29df3829df3629df9c29c04228c0482bdc501bba6e1abab429dcb229c0b829c0ba29c0")\ - X(234 , 1, SingleQuote , "'" , "'" , 0x27 , 39 , 'u', '\'' , '\'' , "0028de2828de0828de2628de1228de0c28de1e28de1c28de0628de2428de0428de0a28de1028de1628de2028de1828de0e28de2a28de1a28de2228de1428de7a28de2c28de0228de3028de3228c03428c03a28c03c28c03828c03628c09c28de4028de3e28de4e29c04a29c05c2bbf5a2bbf682bbf620cdb662bbf480cbf720cbf6c2bbf5029dc762bdc520cdb580cdb560cdb6e0cdb602bbf6a0cdb702bbf742bbf642bbf781bba860cbf8a0dbf900cdb7e0cdb940cdb920cbf800cbf960dbbb210deb835deba2cde")\ - X(236 , 1, DoubleQuote , "\"" , "\"" , 0x22 , 34 , 'u', '"' , '"' , "9a29c0")\ - X(238 , 1, SingleLowQuote , "‚" , "‚" , 0x201A, 8218 , 'u', -1 , -1 , "8629c0")\ - X(240 , 1, DoubleLowQuote , "„" , "„" , 0x201E, 8222 , 'u', -1 , -1 , "4c29c0")\ - X(242 , 1, LeftGuillemet , "«" , "«" , 0xAB , 171 , 'u', -1 , -1 , "4256e2520ddd")\ - X(244 , 1, Hash , "#" , "#" , 0x23 , 35 , 'u', '#' , '#' , "3a2bde3c2bde382bde362bde402bdc4229de722bdc8e2bbf882bbf842bbf")\ - X(246 , 1, AtSign , "@" , "@" , 0x40 , 64 , 'u', '@' , '\0' , "541bdd5e29de")\ - X(248 , 1, Exclamation , "!" , "!" , 0x21 , 33 , 'u', '!' , '!' , "aa35dfa835dfa635df")\ - X(250 , 1, InvertedExclamation, "¡" , "¡" , 0xA1 , 161 , 'u', -1 , -1 , "6e0ddd")\ - X(252 , 1, QuestionMark , "?" , "?" , 0x3F , 63 , 'u', '?' , 127 , "b40cbb")\ - X(254 , 1, InvertedQuestion , "¿" , "¿" , 0xBF , 191 , 'u', -1 , -1 , "620ddd6a0ddd")\ - X(256 , 1, Paragraph , "§" , "§" , 0xA7 , 167 , 'u', -1 , -1 , "5c29dc5a29dc6c29dc9e28dea028de7029dca228dea428de9029bf7e29bf9429bf")\ - X(258 , 1, Ampersand , "&" , "&" , 0x26 , 38 , 'u', '&' , '&' , "9e56e2a456e2")\ - X(260 , 1, Dollar , "$" , "$" , 0x24 , 36 , 'u', '$' , '$' , "902bdf7e2bdf942bdfa81bbaa61bbaae1bbab01bbaac1bba")\ - X(262 , 1, Dong , "₫" , "₫" , 0x20AB, 8363 , 'u', -1 , -1 , "9c0dbb")\ - X(264 , 1, Yen , "¥" , "¥" , 0xA5 , 165 , 'u', -1 , -1 , "067ddc027ddc")\ - X(266 , 1, DotlessI , "ı" , "ı" , 0x0131, 305 , 'u', -1 , -1 , "9a1749b61349")\ - X(268 , 1, MicroSign , "µ" , "µ" , 0xB5 , 181 , 'u', -1 , -1 , "ae2bdcb02bdcac2bdc")\ - X(270 , 1, Eth , "ð" , "ð" , 0xF0 , 240 , 'u', -1 , -1 , "741bba781add")\ - X(272 , 1, Thorn , "þ" , "þ" , 0xFE , 254 , 'u', -1 , -1 , "7835bd")\ - X(274 , 1, Eszett , "ẞ" , "ß" , 0xDF , 223 , 'u', -1 , -1 , "8c0cdb8e0cdb820cdb880cdb840cdb")\ - X(276 , 1, KeyA , "A" , "a" , 0x61 , 97 , 'u', 'a' , '\x01', "001e41281e41081e41261e41121e410c1e411e1e411c1e41061e41241e41041e410a1e41101e41161e41201e41181e410e1e412a1e411a1e41221e41141e417a1e412c1e412e1e41021e41301e41321e41341e413a1e413c1e41381e41361e419c1e41401e413e1e414c1e41421e414e1e414a1e41461e41541e41441e415c1e415a1e41681e41621e41661e41481e41721e416c1e41501e419e1e41761e41a01e41521e41581e41561e416e1e41601e416a1e41701e41741e415e1e41641e41a21e41781e418c1e418e1e41821e41a41e41861e418a1e41981e419a1e41901e417e1e41941e41881e41841e417c1e41921e41801e41961e41aa1041a81041a61041ae1041b01041ac1041b41e41b21e41b62141b82141ba2541")\ - X(278 , 1, KeyB , "B" , "b" , 0x62 , 98 , 'u', 'b' , '\x02', "0030422830420830422630421230420c30421e30421c30420630422430420430420a30421030421630422030421830420e30422a30421a30422230421430427a30422c30422e30420230423030423230423430423a30423c30423830423630429c30424030423e30424c30424230424e30424a30424630425430424430425c30425a30426830426230426630424830427230426c30425030429e3042763042a030425230425830425630426e30426030426a30427030427430425e3042643042a230427830428c30428e3042823042a430428630428a30429830429a30429030427e30429430428830428430427c3042923042803042963042aa3042a83042a63042ae3042b03042ac3042b43042b23142b63342b81942ba1242")\ - X(280 , 1, KeyC , "C" , "c" , 0x63 , 99 , 'u', 'c' , '\x03', "002e43282e43082e43262e43122e430c2e431e2e431c2e43062e43242e43042e430a2e43102e43162e43202e43182e430e2e432a2e431a2e43222e43142e437a2e432c2e432e2e43022e43302e43322e43342e433a2e433c2e43382e43362e439c2e43402e433e2e434c2e43422e434e2e434a2e43462e43542e43442e435c2e435a2e43682e43622e43662e43482e43722e436c2e43502e439e2e43762e43a02e43522e43582e43562e436e2e43602e436a2e43702e43742e435e2e43642e43a22e43782e438c2e438e2e43822e43a42e43862e438a2e43982e439a2e43902e437e2e43942e43882e43842e437c2e43922e43802e43962e43aa2e43a82e43a62e43ae2e43b02e43ac2e43b42e43b21743b62f43b82643ba2043")\ - X(282 , 1, KeyD , "D" , "d" , 0x64 , 100 , 'u', 'd' , '\x04', "0020442820440820442620441220440c20441e20441c20440620442420440420440a20441020441620442020441820440e20442a20441a20442220441420447a20442c20442e20440220443020443220443420443a20443c20443820443620449c20444020443e20444c20444220444e20444a20444620445420444420445c20445a20446820446220446620444820447220446c20445020449e2044762044a020445220445820445620446e20446020446a20447020447420445e2044642044a220447820448c20448e2044822044a420448620448a20449820449a20449020447e20449420448820448420447c2044922044802044962044aa2044a82044a62044ae2044b02044ac2044b42044b22344b61544b82544ba2144")\ - X(284 , 1, KeyE , "E" , "e" , 0x65 , 101 , 'u', 'e' , '\x05', "0012452812450812452612451212450c12451e12451c12450612452412450412450a12451012451612452012451812450e12452a12451a12452212451412457a12452c12452e12450212453012453212453412453a12453c12453812453612459c12454012453e12454c12454212454e12454a12454612455412454412455c12455a12456812456212456612454812457212456c12455012459e1245761245a012455212455812455612456e12456012456a12457012457412455e1245641245a212457812458c12458e1245821245a412458612458a12459812459a12459012457e12459412458812458412457c1245921245801245961245aa1245a81245a61245ae1245b01245ac1245b41245b22045b62045b82245ba2445")\ - X(286 , 1, KeyF , "F" , "f" , 0x66 , 102 , 'u', 'f' , '\x06', "0021462821460821462621461221460c21461e21461c21460621462421460421460a21461021461621462021461821460e21462a21461a21462221461421467a21462c21462e21460221463021463221463421463a21463c21463821463621469c21464021463e21464c21464221464e21464a21464621465421464421465c21465a21466821466221466621464821467221466c21465021469e2146762146a021465221465821465621466e21466021466a21467021467421465e2146642146a221467821468c21468e2146822146a421468621468a21469821469a21469021467e21469421468821468421467c2146922146802146962146aa2146a82146a62146ae2146b02146ac2146b434beb21546b61046b80946ba0646")\ - X(288 , 1, KeyG , "G" , "g" , 0x67 , 103 , 'u', 'g' , '\x07', "0022472822470822472622471222470c22471e22471c22470622472422470422470a22471022471622472022471822470e22472a22471a22472222471422477a22472c22472e22470222473022473222473422473a22473c22473822473622479c22474022473e22474c22474222474e22474a22474622475422474422475c22475a22476822476222476622474822477222476c22475022479e2247762247a022475222475822475622476e22476022476a22477022477422475e2247642247a222477822478c22478e2247822247a422478622478a22479822479a22479022477e22479422478822478422477c2247922247802247962247aa2247a82247a62247ae2247b02247ac2247b42247b21647b61147b83447ba2e47")\ - X(290 , 1, KeyH , "H" , "h" , 0x68 , 104 , 'u', 'h' , '\x08', "0023482823480823482623481223480c23481e23481c23480623482423480423480a23481023481623482023481823480e23482a23481a23482223481423487a23482c23482e23480223483023483223483423483a23483c23483823483623489c23484023483e23484c23484223484e23484a23484623485423484423485c23485a23486823486223486623484823487223486c23485023489e2348762348a023485223485823485623486e23486023486a23487023487423485e2348642348a223487823488c23488e2348822348a423488623488a23489823489a23489023487e23489423488823488423487c2348922348802348962348aa2348a82348a62348ae2348b02348ac2348b42348b22448b61848b82348ba2348")\ - X(292 , 1, KeyI , "I" , "i" , 0x69 , 105 , 'u', 'i' , '\x09', "0017492817490817492617491217490c17491e17491c17490617492417490417490a17491017491617492017491817490e17492a17491a17492217491417497a17492c17492e17490217493017493217493417493a17493c17493817493617499c17494017493e17494c17494217494e17494a17494617495417494417495c17495a17496817496217496617494817497217496c17495017499e1749761749a017495217495817495617496e17496017496a17497017497417495e1749641749a217497817498c17498e1749821749a417498617498a17499817499a28de9017497e17499417498817498417497c1749921749801749961749aa1749a81749a61749ae1749b01749ac1749b41749b22249b61fdbb83049ba3249")\ - X(294 , 1, KeyJ , "J" , "j" , 0x6A , 106 , 'u', 'j' , '\x0a', "00244a28244a08244a26244a12244a0c244a1e244a1c244a06244a24244a04244a0a244a10244a16244a20244a18244a0e244a2a244a1a244a22244a14244a7a244a2c244a2e244a02244a30244a32244a34244a3a244a3c244a38244a36244a9c244a40244a3e244a4c244a42244a4e244a4a244a46244a54244a44244a5c244a5a244a68244a62244a66244a48244a72244a6c244a50244a9e244a76244aa0244a52244a58244a56244a6e244a60244a6a244a70244a74244a5e244a64244aa2244a78244a8c244a8e244a82244aa4244a86244a8a244a98244a9a244a90244a7e244a94244a88244a84244a7c244a92244a80244a96244aaa244aa8244aa6244aae244ab0244aac244ab4244ab22e4ab62c4ab8064aba094a")\ - X(296 , 1, KeyK , "K" , "k" , 0x6B , 107 , 'u', 'k' , '\x0b', "00254b28254b08254b26254b12254b0c254b1e254b1c254b06254b24254b04254b0a254b10254b16254b20254b18254b0e254b2a254b1a254b22254b14254b7a254b2c254b2e254b02254b30254b32254b34254b3a254b3c254b38254b36254b9c254b40254b3e254b4c254b42254b4e254b4a254b46254b54254b44254b5c254b5a254b68254b62254b66254b48254b72254b6c254b50254b9e254b76254ba0254b52254b58254b56254b6e254b60254b6a254b70254b74254b5e254b64254ba2254b78254b8c254b8e254b82254ba4254b86254b8a254b98254b9a254b90254b7e254b94254b88254b84254b7c254b92254b80254b96254baa254ba8254ba6254bae254bb0254bac254bb4254bb22f4bb6244bb8274bba1f4b")\ - X(298 , 1, KeyL , "L" , "l" , 0x6C , 108 , 'u', 'l' , '\x0c', "00264c28264c08264c26264c12264c0c264c1e264c1c264c06264c24264c04264c0a264c10264c16264c20264c18264c0e264c2a264c1a264c22264c14264c7a264c2c264c2e264c02264c30264c32264c34264c3a264c3c264c38264c36264c9c264c40264c3e264c4c264c42264c4e264c4a264c46264c54264c44264c5c264c5a264c68264c62264c66264c48264c72264c6c264c50264c9e264c76264ca0264c52264c58264c56264c6e264c60264c6a264c70264c74264c5e264c64264ca2264c78264c8c264c8e264c82264ca4264c86264c8a264c98264c9a264c90264c7e264c94264c88264c84264c7c264c92264c80264c96264caa264ca8264ca6264cae264cb0264cac264cb4264cb2194cb6264cb8074cba084c")\ - X(300 , 1, KeyM , "M" , "m" , 0x6D , 109 , 'u', 'm' , '\x0d', "00324d28324d08324d26324d12324d0c324d1e324d1c324d06324d24324d04324d0a324d10324d16324d20324d18324d0e324d2a324d1a324d22324d14324d7a324d2c324d2e324d02324d30324d32324d34324d3a324d3c324d38324d36324d9c324d40324d3e324d4c324d42324d4e324d4a324d46324d54324d44324d5c324d5a324d68324d62324d66324d48324d72324d6c324d50324d9e324d76324da0324d52324d58324d56324d6e324d60324d6a324d70324d74324d5e324d64324da2324d78324d8c324d8e324d82324da4324d86324d8a324d98324d9a324d90324d7e324d94324d88324d84324d7c324d92324d80324d96324daa274da8274da6274dae274db0274dac274db4324db2324db6254db8084dba074d")\ - X(302 , 1, KeyN , "N" , "n" , 0x6E , 110 , 'u', 'n' , '\x0e', "00314e28314e08314e26314e12314e0c314e1e314e1c314e06314e24314e04314e0a314e10314e16314e20314e18314e0e314e2a314e1a314e22314e14314e7a314e2c314e2e314e02314e30314e32314e34314e3a314e3c314e38314e36314e9c314e40314e3e314e4c314e42314e4e314e4a314e46314e54314e44314e5c314e5a314e68314e62314e66314e48314e72314e6c314e50314e9e314e76314ea0314e52314e58314e56314e6e314e60314e6a314e70314e74314e5e314e64314ea2314e78314e8c314e8e314e82314ea4314e86314e8a314e98314e9a314e90314e7e314e94314e88314e84314e7c314e92314e80314e96314eaa314ea8314ea6314eae314eb0314eac314eb4314eb2264eb6174eb8314eba314e")\ - X(304 , 1, KeyO , "O" , "o" , 0x6F , 111 , 'u', 'o' , '\x0f', "00184f28184f08184f26184f12184f0c184f1e184f1c184f06184f24184f04184f0a184f10184f16184f20184f18184f0e184f2a184f1a184f22184f14184f7a184f2c184f2e184f02184f30184f32184f34184f3a184f3c184f38184f36184f9c184f40184f3e184f4c184f42184f4e184f4a184f46184f54184f44184f5c184f5a184f68184f62184f66184f48184f72184f6c184f50184f9e184f76184fa0184f52184f58184f56184f6e184f60184f6a184f70184f74184f5e184f64184fa2184f78184f8c184f8e184f82184fa4184f86184f8a184f98184f9a184f90184f7e184f94184f88184f84184f7c184f92184f80184f96184faa184fa8184fa6184fae184fb0184fac184fb4184fb21f4fb6144fb8144fba174f")\ - X(306 , 1, KeyP , "P" , "p" , 0x70 , 112 , 'u', 'p' , '\x10', "0019502819500819502619501219500c19501e19501c19500619502419500419500a19501019501619502019501819500e19502a19501a19502219501419507a19502c19502e19500219503019503219503419503a19503c19503819503619509c19504019503e19504c19504219504e19504a19504619505419504419505c19505a19506819506219506619504819507219506c19505019509e1950761950a019505219505819505619506e19506019506a19507019507419505e1950641950a219507819508c19508e1950821950a419508619508a19509819509a19509019507e19509419508819508419507c1950921950801950961950aa1950a81950a61950ae1950b01950ac1950b41950b21350b61950b80a50ba0550")\ - X(308 , 1, KeyQ , "Q" , "q" , 0x71 , 113 , 'u', 'q' , '\x11', "0010512810510810512610511210510c10511e10511c10510610512410510410510a10511010511610512010511810510e10512a10511a10512210511410517a10512c10512e10510210513010513210513410513a10513c10513810513610519c10514010513e10514c10514210514e10514a10514610515410514410515c10515a10516810516210516610514810517210516c10515010519e1051761051a010515210515810515610516e10516010516a10517010517410515e1051641051a210517810518c10518e1051821051a410518610518a10519810519a10519010517e10519410518810518410517c1051921051801051961051aa1e51a81e51a61e51ae1e51b01e51ac1e51b42bbfb22d51b61a51b81251ba1151")\ - X(310 , 1, KeyR , "R" , "r" , 0x72 , 114 , 'u', 'r' , '\x12', "0013522813520813522613521213520c13521e13521c13520613522413520413520a13521013521613522013521813520e13522a13521a13522213521413527a13522c13522e13520213523013523213523413523a13523c13523813523613529c13524013523e13524c13524213524e13524a13524613525413524413525c13525a13526813526213526613524813527213526c13525013529e1352761352a013525213525813525613526e13526013526a13527013527413525e1352641352a213527813528c13528e1352821352a413528613528a13529813529a13529013527e13529413528813528413527c1352921352801352961352aa1352a81352a61352ae1352b01352ac1352b41352b21852b61652b81552ba1552")\ - X(312 , 1, KeyS , "S" , "s" , 0x73 , 115 , 'u', 's' , '\x13', "001f53281f53081f53261f53121f530c1f531e1f531c1f53061f53241f53041f530a1f53101f53161f53201f53181f530e1f532a1f531a1f53221f53141f537a1f532c1f532e1f53021f53301f53321f53341f533a1f533c1f53381f53361f539c1f53401f533e1f534c1f53421f534e1f534a1f53461f53541f53441f535c1f535a1f53681f53621f53661f53481f53721f536c1f53501f539e1f53761f53a01f53521f53581f53561f536e1f53601f536a1f53701f53741f535e1f53641f53a21f53781f538c1f538e1f53821f53a41f53861f538a1f53981f539a1f53901f537e1f53941f53881f53841f537c1f53921f53801f53961f53aa1f53a81f53a61f53ae1f53b01f53ac1f53b41f53b22753b63253b81653ba1653")\ - X(314 , 1, KeyT , "T" , "t" , 0x74 , 116 , 'u', 't' , '\x14', "0014542814540814542614541214540c14541e14541c14540614542414540414540a14541014541614542014541814540e14542a14541a14542214541414547a14542c14542e14540214543014543214543414543a14543c14543814543614549c14544014543e14544c14544214544e14544a14544614545414544414545c14545a14546814546214546614544814547214546c14545014549e1454761454a014545214545814545614546e14546014546a14547014547414545e1454641454a214547814548c14548e1454821454a414548614548a14549814549a14549014547e14549414548814548414547c1454921454801454961454aa1454a81454a61454ae1454b01454ac1454b41454b22554b62354b82454ba2254")\ - X(316 , 1, KeyU , "U" , "u" , 0x75 , 117 , 'u', 'u' , '\x15', "0016552816550816552616551216550c16551e16551c16550616552416550416550a16551016551616552016551816550e16552a16551a16552216551416557a16552c16552e16550216553016553216553416553a16553c16553816553616559c16554016553e16554c16554216554e16554a16554616555416554416555c16555a16556816556216556616554816557216556c16555016559e1655761655a016555216555816555616556e16556016556a16557016557416555e1655641655a216557816558c16558e1655821655a416558616558a16559816559a16559016557e16559416558816558416557c1655921655801655961655aa1655a81655a61655ae1655b01655ac1655b41655b22155b61e55b81755ba1455")\ - X(318 , 1, KeyV , "V" , "v" , 0x76 , 118 , 'u', 'v' , '\x16', "002f56282f56082f56262f56122f560c2f561e2f561c2f56062f56242f56042f560a2f56102f56162f56202f56182f560e2f562a2f561a2f56222f56142f567a2f562c2f562e2f56022f56302f56322f56342f563a2f563c2f56382f56362f569c2f56402f563e2f564c2f56422f564e2f564a2f56462f56542f56442f565c2f565a2f56682f56622f56662f56482f56722f566c2f56502f569e2f56762f56a02f56522f56582f56562f566e2f56602f566a2f56702f56742f565e2f56642f56a22f56782f568c2f568e2f56822f56a42f56862f568a2f56982f569a2f56902f567e2f56942f56882f56842f567c2f56922f56802f56962f56aa2f56a82f56a62f56ae2f56b02f56ac2f56b42f56b23456b62e56b83356ba2f56")\ - X(320 , 1, KeyW , "W" , "w" , 0x77 , 119 , 'u', 'w' , '\x17', "0011572811570811572611571211570c11571e11571c11570611572411570411570a11571011571611572011571811570e11572a11571a11572211571411577a11572c11572e11570211573011573211573411573a11573c11573811573611579c11574011573e11574c11574211574e11574a11574611575411574411575c11575a11576811576211576611574811577211576c11575011579e1157761157a011575211575811575611576e11576011576a11577011577411575e1157641157a211577811578c11578e1157821157a411578611578a11579811579a11579011577e11579411578811578411577c1157921157801157961157aa2c57a82c57a62c57ae2c57b02c57ac2c57b41bbab23357b61b57b83257ba3057")\ - X(322 , 1, KeyX , "X" , "x" , 0x78 , 120 , 'u', 'x' , '\x18', "002d58282d58082d58262d58122d580c2d581e2d581c2d58062d58242d58042d580a2d58102d58162d58202d58182d580e2d582a2d581a2d58222d58142d587a2d582c2d582e2d58022d58302d58322d58342d583a2d583c2d58382d58362d589c2d58402d583e2d584c2d58422d584e2d584a2d58462d58542d58442d585c2d585a2d58682d58622d58662d58482d58722d586c2d58502d589e2d58762d58a02d58522d58582d58562d586e2d58602d586a2d58702d58742d585e2d58642d58a22d58782d588c2d588e2d58822d58a42d58862d588a2d58982d589a2d58902d587e2d58942d58882d58842d587c2d58922d58802d58962d58aa2d58a82d58a62d58ae2d58b02d58ac2d58b40ddbb23058b62b58b82e58ba2d58")\ - X(324 , 1, KeyY , "Y" , "y" , 0x79 , 121 , 'u', 'y' , '\x19', "0015592815590815592615591215590c15591e15591c15590615592415590415590a15591015591615592015591815590e15592a15591a15592215591415597a15592c15592e15590215593015593215593415593a15593c15593815593615599c15594015593e15594c15594215594e15594a1559461559542c594415595c15595a15596815596215596615594815597215596c15595015599e1559761559a015595215595815595615596e15596015596a15597015597415595e1559641559a22c597815598c2c598e2c59822c59a42c59862c598a2c59982c599a1559902c597e2c59942c59882c59842c597c1559922c59802c59962c59aa1559a81559a61559ae1559b01559ac1559b41559b21459b62759b81859ba1359")\ - X(326 , 1, KeyZ , "Z" , "z" , 0x7A , 122 , 'u', 'z' , '\x1a', "002c5a282c5a082c5a262c5a122c5a0c2c5a1e2c5a1c2c5a062c5a242c5a042c5a0a2c5a102c5a162c5a202c5a182c5a0e2c5a2a2c5a1a2c5a222c5a142c5a7a2c5a2c2c5a2e2c5a022c5a302c5a322c5a342c5a3a2c5a3c2c5a382c5a362c5a9c2c5a402c5a3e2c5a4c2c5a422c5a4e2c5a4a2c5a462c5a54155a442c5a5c2c5a5a2c5a682c5a622c5a662c5a482c5a722c5a6c2c5a502c5a9e2c5a762c5aa02c5a522c5a582c5a562c5a6e2c5a602c5a6a2c5a702c5a742c5a5e2c5a642c5aa2155a782c5a8c155a8e155a82155aa4155a86155a8a155a98155a9a2c5a90155a7e155a94155a88155a84155a7c2c5a92155a80155a96155aaa115aa8115aa6115aae115ab0115aac115ab42c5ab2355ab6315ab8205aba265a")\ - X(328 , 1, AeLigature , "Æ" , "æ" , 0xE6 , 230 , 'u', -1 , -1 , "6828de6627c06028de7427c06427c07827c0")\ - X(330 , 1, AcuteA , "Á" , "á" , 0xE1 , 225 , 'u', -1 , -1 , "9828de7c28de")\ - X(332 , 1, BreveA , "Ă" , "ă" , 0x0103, 259 , 'u', -1 , -1 , "4c1adb961adb")\ - X(334 , 1, CircumflexA , "Â" , "â" , 0xE2 , 226 , 'u', -1 , -1 , "4c2bdc962bdc")\ - X(336 , 1, GraveA , "À" , "à" , 0xE0 , 224 , 'u', -1 , -1 , "462bdc442bdc5828de5628de7e28dc9428dc")\ - X(338 , 1, OgonekA , "Ą" , "ą" , 0x0105, 261 , 'u', -1 , -1 , "8a28deb41051")\ - X(340 , 1, RingA , "Å" , "å" , 0xE5 , 229 , 'u', -1 , -1 , "5c1add5a1add681add661add6c1add601add701add741add641add")\ - X(342 , 1, TildeA , "Ã" , "ã" , 0xE3 , 227 , 'u', -1 , -1 , "aa29de")\ - X(344 , 1, UmlautA , "Ä" , "ä" , 0xE4 , 228 , 'u', -1 , -1 , "5c28de5a28de6c28de9e1bdd7628bf7028de8c28de8e28de8228dea41bdd9028dc8828de8428de")\ - X(346 , 1, AcuteC , "Ć" , "ć" , 0x0107, 263 , 'u', -1 , -1 , "8628de9228de8028de")\ - X(348 , 1, CaronC , "Č" , "č" , 0x010D, 269 , 'u', -1 , -1 , "8627ba9227ba8027bab433bc")\ - X(350 , 1, CedillaC , "Ç" , "ç" , 0xE7 , 231 , 'u', -1 , -1 , "4e27ba4a27ba461bdd541adb441bdd5028de5227c06e2bbf9a34dcb630bf")\ - X(352 , 1, DotAboveC , "Ċ" , "ċ" , 0x010B, 267 , 'u', -1 , -1 , "4029c03e29c0")\ - X(354 , 1, AcuteE , "É" , "é" , 0xE9 , 233 , 'u', -1 , -1 , "4235bf4635bf4435bf9827ba7e27de9427de7c27ba")\ - X(356 , 1, GraveE , "È" , "è" , 0xE8 , 232 , 'u', -1 , -1 , "4628c04428c0581aba561aba7e1aba941aba")\ - X(358 , 1, DotAboveE , "Ė" , "ė" , 0x0117, 279 , 'u', -1 , -1 , "b428de")\ - X(360 , 1, OgonekE , "Ę" , "ę" , 0x0119, 281 , 'u', -1 , -1 , "b435bd")\ - X(362 , 1, UmlautE , "Ë" , "ë" , 0xEB , 235 , 'u', -1 , -1 , "5427ba")\ - X(364 , 1, CrossedD , "Đ" , "đ" , 0x0111, 273 , 'u', -1 , -1 , "861bdd921bdd801bdd")\ - X(366 , 1, BreveG , "Ğ" , "ğ" , 0x011F, 287 , 'u', -1 , -1 , "9a1adbb612ba")\ - X(368 , 1, DotAboveG , "Ġ" , "ġ" , 0x0121, 289 , 'u', -1 , -1 , "401adb3e1adb")\ - X(370 , 1, CrossedH , "Ħ" , "ħ" , 0x0127, 295 , 'u', -1 , -1 , "401bdd3e1bdd")\ - X(372 , 1, AcuteI , "Í" , "í" , 0xED , 237 , 'u', -1 , -1 , "9856e27c29307c56e2")\ - X(374 , 1, CircumflexI , "Î" , "î" , 0xEE , 238 , 'u', -1 , -1 , "4c1bdd961bdd")\ - X(376 , 1, GraveI , "Ì" , "ì" , 0xEC , 236 , 'u', -1 , -1 , "580ddd560ddd")\ - X(378 , 1, OgonekI , "Į" , "į" , 0x012F, 303 , 'u', -1 , -1 , "b41add")\ - X(380 , 1, CrossedL , "Ł" , "ł" , 0x0142, 322 , 'u', -1 , -1 , "8c2bbf822bbf8a27ba")\ - X(382 , 1, CaronN , "Ň" , "ň" , 0x0148, 328 , 'u', -1 , -1 , "9e2bdca42bdc")\ - X(384 , 1, TildeN , "Ñ" , "ñ" , 0xF1 , 241 , 'u', -1 , -1 , "6227c05027c06e27c06a27c0")\ - X(386 , 1, AcuteO , "Ó" , "ó" , 0xF3 , 243 , 'u', -1 , -1 , "8a2bdc980dbb7c0dbbaa1bba")\ - X(388 , 1, CircumflexO , "Ô" , "ô" , 0xF4 , 244 , 'u', -1 , -1 , "9e27baa427ba")\ - X(390 , 1, DoubleAcuteO , "Ő" , "ő" , 0x0151, 337 , 'u', -1 , -1 , "981adb7c1adb")\ - X(392 , 1, GraveO , "Ò" , "ò" , 0xF2 , 242 , 'u', -1 , -1 , "5827c05627c0")\ - X(394 , 1, HornO , "Ơ" , "ơ" , 0x01A1, 417 , 'u', -1 , -1 , "9c1bdd")\ - X(396 , 1, SlashedO , "Ø" , "ø" , 0xF8 , 248 , 'u', -1 , -1 , "6827c06628de6027c07428de6428de")\ - X(398 , 1, TildeO , "Õ" , "õ" , 0xF5 , 245 , 'u', -1 , -1 , "761bdb")\ - X(400 , 1, UmlautO , "Ö" , "ö" , 0xF6 , 246 , 'u', -1 , -1 , "5c27c05a27c06c27c07627ba7027c0780cbb8c27c08e27c08227c09a33bf9027de8827c08427c0b62ddc")\ - X(402 , 1, AcuteS , "Ś" , "ś" , 0x015B, 347 , 'u', -1 , -1 , "8a1bdd")\ - X(404 , 1, CaronS , "Š" , "š" , 0x0161, 353 , 'u', -1 , -1 , "861adb921adb801adbb42146")\ - X(406 , 1, CedillaS , "Ş" , "ş" , 0x015F, 351 , 'u', -1 , -1 , "9a27ba9627bab628de")\ - X(408 , 1, CommaS , "Ș" , "ș" , 0x0219, 537 , 'u', -1 , -1 , "4c27ba")\ - X(410 , 1, CedillaT , "Ţ" , "ţ" , 0x0163, 355 , 'u', -1 , -1 , "9628de")\ - X(412 , 1, CommaT , "Ț" , "ț" , 0x021B, 539 , 'u', -1 , -1 , "4c28de")\ - X(414 , 1, AcuteU , "Ú" , "ú" , 0xFA , 250 , 'u', -1 , -1 , "9e1adba01adba21adba41adb981bdd7c1bdd")\ - X(416 , 1, DoubleAcuteU , "Ű" , "ű" , 0x0171, 369 , 'u', -1 , -1 , "982bdc7c2bdc")\ - X(418 , 1, GraveU , "Ù" , "ù" , 0xF9 , 249 , 'u', -1 , -1 , "4656e24456e2582bbf562bbfaa28c0a828c0a628c0ae28c0b028c0ac28c0")\ - X(420 , 1, HornU , "Ư" , "ư" , 0x01B0, 432 , 'u', -1 , -1 , "9c1adb")\ - X(422 , 1, MacronU , "Ū" , "ū" , 0x016B, 363 , 'u', -1 , -1 , "b42d58")\ - X(424 , 1, OgonekU , "Ų" , "ų" , 0x0173, 371 , 'u', -1 , -1 , "b427c0")\ - X(426 , 1, RingU , "Ů" , "ů" , 0x016F, 367 , 'u', -1 , -1 , "a027baa227ba")\ - X(428 , 1, UmlautU , "Ü" , "ü" , 0xFC , 252 , 'u', -1 , -1 , "761ac08c1aba8e1aba821aba980cbf9a1bdd901aba881aba841aba7c0cbdb622dd")\ - X(430 , 1, CaronZ , "Ž" , "ž" , 0x017E, 382 , 'u', -1 , -1 , "7a0dbb862bdc922bdc802bdcb41157")\ - X(432 , 1, DotAboveZ , "Ż" , "ż" , 0x017C, 380 , 'u', -1 , -1 , "4056e23e2bdc8a1adb")\ - X(434 , 0, Sleep , "Sleep" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(436 , 0, AppStart1 , "AppStart1" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(438 , 0, AppStart2 , "AppStart2" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(440 , 0, AppNewWindow , "AppNewWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(442 , 0, AppOpenWindow , "AppOpenWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(444 , 0, AppHelp , "AppHelp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(446 , 0, AppSave , "AppSave" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(448 , 0, AppFind , "AppFind" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(450 , 0, AppPrint , "AppPrint" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(452 , 0, AppClose , "AppClose" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(454 , 1, AppCut , "AppCut" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(456 , 0, AppCopy , "AppCopy" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(458 , 1, AppPaste , "AppPaste" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(460 , 1, AppUndo , "AppUndo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(462 , 1, AppRedo , "AppRedo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(464 , 0, AppSpeechMode , "AppSpeechMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(466 , 0, AppSpeechCorrection, "AppSpeechCorrect" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(468 , 0, AppSpellCheck , "AppSpellCheck" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(470 , 0, Calculator , "Calculator" , "" , 0 , 0 , 'u', -1 , -1 , "0121b72921b70921b72721b71321b70d21b71f21b71d21b70721b72521b70521b70b21b71121b71721b72121b71921b70f21b72b21b71b21b72321b71521b77b21b72d21b72f21b70321b73121b73321b73521b73b21b73d21b73921b73721b79d21b74121b73f21b74d21b74321b74f21b74b21b74721b75521b74521b75d21b75b21b76921b76321b76721b74921b77321b76d21b75121b79f21b77721b7a121b75321b75921b75721b76f21b76121b76b21b77121b77521b75f21b76521b7a321b77921b78d21b78f21b78321b7a521b78721b78b21b79921b79b21b79121b77f21b79521b78921b78521b77d21b79321b78121b79721b7ab21b7a921b7a721b7af21b7b121b7ad21b7b521b7b321b7b721b7b921b7bb21b7")\ - X(472 , 0, Mail , "Mail" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(474 , 0, MailSend , "MailSend" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(476 , 0, MailForward , "MailForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(478 , 0, MailReply , "MailReply" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(480 , 0, MediaBassBoost , "MediaBassBoost" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(482 , 0, MediaBassDown , "MediaBassDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(484 , 0, MediaBassUp , "MediaBassUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(486 , 0, MediaChanDown , "MediaChanDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(488 , 0, MediaChanUp , "MediaChanUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(490 , 0, MediaTrebleDown , "MediaTrebleDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(492 , 0, MediaTrebleUp , "MediaTrebleUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(494 , 0, MediaVolMute , "MediaVolMute" , "" , 0 , 57440, 'u', -1 , -1 , "0120ad2920ad0920ad2720ad1320ad0d20ad1f20ad1d20ad0720ad2520ad0520ad0b20ad1120ad1720ad2120ad1920ad0f20ad2b20ad1b20ad2320ad1520ad7b20ad2d20ad2f20ad0320ad3120ad3320ad3520ad3b20ad3d20ad3920ad3720ad9d20ad4120ad3f20ad4d20ad4320ad4f20ad4b20ad4720ad5520ad4520ad5d20ad5b20ad6920ad6320ad6720ad4920ad7320ad6d20ad5120ad9f20ad7720ada120ad5320ad5920ad5720ad6f20ad6120ad6b20ad7120ad7520ad5f20ad6520ada320ad7920ad8d20ad8f20ad8320ada520ad8720ad8b20ad9920ad9b20ad9120ad7f20ad9520ad8920ad8520ad7d20ad9320ad8120ad9720adab20ada920ada720adaf20adb120adad20adb520adb320adb720adb920adbb20ad")\ - X(496 , 0, MediaVolDown , "MediaVolDown" , "" , 0 , 57438, 'u', -1 , -1 , "012eae292eae092eae272eae132eae0d2eae1f2eae1d2eae072eae252eae052eae0b2eae112eae172eae212eae192eae0f2eae2b2eae1b2eae232eae152eae7b2eae2d2eae2f2eae032eae312eae332eae352eae3b2eae3d2eae392eae372eae9d2eae412eae3f2eae4d2eae432eae4f2eae4b2eae472eae552eae452eae5d2eae5b2eae692eae632eae672eae492eae732eae6d2eae512eae9f2eae772eaea12eae532eae592eae572eae6f2eae612eae6b2eae712eae752eae5f2eae652eaea32eae792eae8d2eae8f2eae832eaea52eae872eae8b2eae992eae9b2eae912eae7f2eae952eae892eae852eae7d2eae932eae812eae972eaeab2eaea92eaea72eaeaf2eaeb12eaead2eaeb52eaeb32eaeb72eaeb92eaebb2eae")\ - X(498 , 0, MediaVolUp , "MediaVolUp" , "" , 0 , 57439, 'u', -1 , -1 , "0130af2930af0930af2730af1330af0d30af1f30af1d30af0730af2530af0530af0b30af1130af1730af2130af1930af0f30af2b30af1b30af2330af1530af7b30af2d30af2f30af0330af3130af3330af3530af3b30af3d30af3930af3730af9d30af4130af3f30af4d30af4330af4f30af4b30af4730af5530af4530af5d30af5b30af6930af6330af6730af4930af7330af6d30af5130af9f30af7730afa130af5330af5930af5730af6f30af6130af6b30af7130af7530af5f30af6530afa330af7930af8d30af8f30af8330afa530af8730af8b30af9930af9b30af9130af7f30af9530af8930af8530af7d30af9330af8130af9730afab30afa930afa730afaf30afb130afad30afb530afb330afb730afb930afbb30af")\ - X(500 , 0, MediaNext , "MediaNext" , "" , 0 , 57435, 'u', -1 , -1 , "0119b02919b00919b02719b01319b00d19b01f19b01d19b00719b02519b00519b00b19b01119b01719b02119b01919b00f19b02b19b01b19b02319b01519b07b19b02d19b02f19b00319b03119b03319b03519b03b19b03d19b03919b03719b09d19b04119b03f19b04d19b04319b04f19b04b19b04719b05519b04519b05d19b05b19b06919b06319b06719b04919b07319b06d19b05119b09f19b07719b0a119b05319b05919b05719b06f19b06119b06b19b07119b07519b05f19b06519b0a319b07919b08d19b08f19b08319b0a519b08719b08b19b09919b09b19b09119b07f19b09519b08919b08519b07d19b09319b08119b09719b0ab19b0a919b0a719b0af19b0b119b0ad19b0b519b0b319b0b719b0b919b0bb19b0")\ - X(502 , 0, MediaPrev , "MediaPrev" , "" , 0 , 57436, 'u', -1 , -1 , "0110b12910b10910b12710b11310b10d10b11f10b11d10b10710b12510b10510b10b10b11110b11710b12110b11910b10f10b12b10b11b10b12310b11510b17b10b12d10b12f10b10310b13110b13310b13510b13b10b13d10b13910b13710b19d10b14110b13f10b14d10b14310b14f10b14b10b14710b15510b14510b15d10b15b10b16910b16310b16710b14910b17310b16d10b15110b19f10b17710b1a110b15310b15910b15710b16f10b16110b16b10b17110b17510b15f10b16510b1a310b17910b18d10b18f10b18310b1a510b18710b18b10b19910b19b10b19110b17f10b19510b18910b18510b17d10b19310b18110b19710b1ab10b1a910b1a710b1af10b1b110b1ad10b1b510b1b310b1b710b1b910b1bb10b1")\ - X(504 , 0, MediaStop , "MediaStop" , "" , 0 , 57432, 'u', -1 , -1 , "0124b22924b20924b22724b21324b20d24b21f24b21d24b20724b22524b20524b20b24b21124b21724b22124b21924b20f24b22b24b21b24b22324b21524b27b24b22d24b22f24b20324b23124b23324b23524b23b24b23d24b23924b23724b29d24b24124b23f24b24d24b24324b24f24b24b24b24724b25524b24524b25d24b25b24b26924b26324b26724b24924b27324b26d24b25124b29f24b27724b2a124b25324b25924b25724b26f24b26124b26b24b27124b27524b25f24b26524b2a324b27924b28d24b28f24b28324b2a524b28724b28b24b29924b29b24b29124b27f24b29524b28924b28524b27d24b29324b28124b29724b2ab24b2a924b2a724b2af24b2b124b2ad24b2b524b2b324b2b724b2b924b2bb24b2")\ - X(506 , 0, MediaPause , "MediaPause" , "" , 0 , 57429, 'u', -1 , -1 , "")\ - X(508 , 0, MediaPlayPause , "MediaPlayPause" , "" , 0 , 57430, 'u', -1 , -1 , "0122b32922b30922b32722b31322b30d22b31f22b31d22b30722b32522b30522b30b22b31122b31722b32122b31922b30f22b32b22b31b22b32322b31522b37b22b32d22b32f22b30322b33122b33322b33522b33b22b33d22b33922b33722b39d22b34122b33f22b34d22b34322b34f22b34b22b34722b35522b34522b35d22b35b22b36922b36322b36722b34922b37322b36d22b35122b39f22b37722b3a122b35322b35922b35722b36f22b36122b36b22b37122b37522b35f22b36522b3a322b37922b38d22b38f22b38322b3a522b38722b38b22b39922b39b22b39122b37f22b39522b38922b38522b37d22b39322b38122b39722b3ab22b3a922b3a722b3af22b3b122b3ad22b3b522b3b322b3b722b3b922b3bb22b3")\ - X(510 , 0, MediaPlay , "MediaPlay" , "" , 0 , 57428, 'u', -1 , -1 , "")\ - X(512 , 0, MediaSelectMode , "MediaSelectMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(514 , 0, MediaReverse , "MediaReverse" , "" , 0 , 57431, 'u', -1 , -1 , "")\ - X(516 , 0, MediaRecord , "MediaRecord" , "" , 0 , 57437, 'u', -1 , -1 , "")\ - X(518 , 0, MediaFastForward , "MediaFastForward" , "" , 0 , 57433, 'u', -1 , -1 , "")\ - X(520 , 0, MediaRewind , "MediaRewind" , "" , 0 , 57434, 'u', -1 , -1 , "")\ - X(522 , 0, MicAirToggle , "MicAirToggle" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(524 , 0, MicMute , "MicMute" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(526 , 0, MicVolUp , "MicVolUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(528 , 0, MicVolDown , "MicVolDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(530 , 0, BrowserBackward , "BrowserBackward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(532 , 0, BrowserForward , "BrowserForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(534 , 0, BrowserRefresh , "BrowserRefresh" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(536 , 0, BrowserStop , "BrowserStop" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(538 , 0, BrowserSearch , "BrowserSearch" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(540 , 0, BrowserFavorites , "BrowserFavorites" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(542 , 0, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0132ac2932ac0932ac2732ac1332ac0d32ac1f32ac1d32ac0732ac2532ac0532ac0b32ac1132ac1732ac2132ac1932ac0f32ac2b32ac1b32ac2332ac1532ac7b32ac2d32ac2f32ac0332ac3132ac3332ac3532ac3b32ac3d32ac3932ac3732ac9d32ac4132ac3f32ac4d32ac4332ac4f32ac4b32ac4732ac5532ac4532ac5d32ac5b32ac6932ac6332ac6732ac4932ac7332ac6d32ac5132ac9f32ac7732aca132ac5332ac5932ac5732ac6f32ac6132ac6b32ac7132ac7532ac5f32ac6532aca332ac7932ac8d32ac8f32ac8332aca532ac8732ac8b32ac9932ac9b32ac9132ac7f32ac9532ac8932ac8532ac7d32ac9332ac8132ac9732acab32aca932aca732acaf32acb132acad32acb532acb332acb732acb932acbb32ac")\ - X(544 , 0, lastKey , "lastKey" , "" , 0 , 0 , 0 , -1 , -1 , "") + X(178 , 1, KeyPeriod , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be0634be1034be0e34be1434be1634be0234be0a34be0c34be1834be0434be0834be1a34be1234be2034be1e34be1c34be2234be2434be2834be2634be2a34be3034be2e34be2c34be3434be3634be3234be3834be3a34be3e34be3c34be4034be4234be4434be4634be4834be4e34be5034be4a34be4c34be5234be5634be5834be5434be5a34be5c34be5e34be6034be6434be6c34be6234be6a34be6634be6834be6e34be7034be7234be7c34be7434be7634be7834be7a34be7e34be8034be8634be8234be8434be8834be8a34be8c35be8e34be9234be9034be9434be9a32bea412bea634bea813beaa18beac2fbe")\ + X( 179, 1, NumpadDecimal , "." , "." , 0x2E , 57409, 'u', '.' , '.' , "00536e06536e10536e0e536e14536e16536e02536e0a536e0c536e18536e04536e08536e1a536e12536e20536e1e536e1c536e22536e24536e28536e26536e2a536e30536e2e536e2c536e34536e36536e32536e38536e3a536e3e536e3c536e40536e42536e44536e46536e48536e4e536e50536e4a536e4c536e52536e56536e58536e54536e5a536e5c536e5e536e60536e64536e6c536e62536e6a536e66536e68536e6e536e70536e72536e7c536e74536e76536e78536e7a536e7e536e80536e86536e82536e84536e88536e8a536e8c536e8e536e92536e90536e94536e96536e98536e9a536e9c536ea0536e9e536ea2536ea4536ea6536ea8536eaa536eac536e")\ + X(180 , 1, KeyComma , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "0033bc0633bc1033bc0e33bc1433bc1633bc0233bc0a33bc0c33bc1833bc0433bc0833bc1a33bc1233bc2033bc1e33bc1c33bc2233bc2433bc2833bc2633bc2a33bc3033bc2e33bc2c33bc3433bc3633bc3233bc3833bc3a33bc3e33bc3c33bc4033bc4233bc4433bc4633bc4833bc4e33bc5033bc4a33bc4c33bc5233bc5633bc5833bc5433bc5a33bc5c33bc5e33bc6033bc6433bc6c33bc6233bc6a33bc6633bc6833bc6e33bc7033bc7233bc7c33bc7433bc7633bc7833bc7a33bc7e33bc8033bc8633bc8233bc8433bc8833bc8a33bc8c2bbc8e33bc9233bc9033bc9433bc9632bc9832bc9a33bc9c32bca032bc9e32bca411bca635bca82fbcaa33bcac22bc")\ + X( 181, 1, NumpadPoint , "," , "," , 0x2C , 57416, 'u', ',' , ',' , "007ec2067ec2107ec20e7ec2147ec2167ec2027ec20a7ec20c7ec2187ec2047ec2087ec21a7ec2127ec2207ec21e7ec21c7ec2227ec2247ec2287ec2267ec22a7ec2307ec22e7ec22c7ec2347ec2367ec2327ec2387ec23a7ec23e7ec23c7ec2407ec2427ec2447ec2467ec2487ec24e7ec2507ec24a7ec24c7ec2527ec2567ec2587ec2547ec25a7ec25c7ec25e7ec2607ec2647ec26c7ec2627ec26a7ec2667ec2687ec26e7ec2707ec2727ec27c7ec2747ec2767ec2787ec27a7ec27e7ec2807ec2867ec2827ec2847ec2887ec28a7ec28c7ec28e7ec2927ec2907ec2947ec2967ec2987ec29a7ec29c7ec2a07ec29e7ec2a27ec2a47ec2a67ec2a87ec2aa7ec2ac7ec2")\ + X(182 , 1, Colon , ":" , ":" , 0x3A , 58 , 'u', ':' , ':' , "9634bf9834bf9a34bf9c34bfa034bf9e34bf")\ + X(184 , 1, Semicolon , ";" , ";" , 0x3B , 59 , 'u', ';' , ';' , "0027ba0627ba1027ba0e27ba1427ba1627ba0227ba0a27ba0c27ba1827ba0427ba0827ba1a27ba1227ba2027ba1e27ba1c27ba2227ba2427ba2827ba2627ba2a27ba3027ba2e27ba2c27ba3427ba3627ba3227ba3a27ba3e27ba3c35bf4227ba5229c05829c06e29c07429c09219ba9633be9833be9a35ba9c33bea033be9e33bea42cbaa81abaaa10ba")\ + X(186 , 1, TurnedComma , "ʻ" , "ʻ" , 0x02BB, 699 , 'u', -1 , -1 , "2028de")\ + X(188 , 1, OpenSquareBracket , "[" , "[" , 0x5B , 91 , 'u', '[' , '\x1b', "001adb061adb101adb0e1adb141adb161adb021adb0a1adb0c1adb181adb041adb081adb1a1adb121adb201adb1e1adb1c1adb221adb241adb281adb261adb2a1adb301adb2e1adb2c1adb3c1bdd4028de481adb921adba40cdba80cdbaa02db")\ + X(190 , 1, CloseSquareBracket , "]" , "]" , 0x5D , 93 , 'u', ']' , '\x1d', "001bdd061bdd101bdd0e1bdd141bdd161bdd021bdd0a1bdd0c1bdd181bdd041bdd081bdd1a1bdd121bdd201bdd1e1bdd1c1bdd221bdd241bdd281bdd261bdd2a1bdd301bdd2e1bdd2c1bdd3c2bdc402bdc460ddb481bdd6456e2921bdd9429c0a40ddda80dddaa03dd")\ + X(192 , 1, OpenCurlyBracket , "{" , "{" , 0x7B , 123 , 'u', '{' , 27 , "5028de6a28de")\ + X(194 , 1, CloseCurlyBracket , "}" , "}" , 0x7D , 125 , 'u', '}' , 29 , "461bdd502bbf6a2bbf")\ + X(196 , 1, CloseRoundBracket , ")" , ")" , 0x29 , 41 , 'u', ')' , ')' , "521bdd6e1bdd960cdb980cdb9c0cdba00cdb9e0cdb")\ + X(198 , 1, LessThan , "<" , "<" , 0x3C , 60 , 'u', '<' , '<' , "2429c03a2bdc4056e24456e24656e24856e24e56e25056e24a56e24c56e25656e25456e25a56e25c56e25e56e26056e2642bdc6c56e26256e26a56e26656e26856e27056e27256e27c56e27656e27856e27a56e28056e28656e28256e28856e28a56e28c56e29056e29456e29656e29856e29a56e29c56e2a056e29e56e2a256e2a656e2")\ + X(200 , 1, BackSlash , "\\" , "\\" , 0x5C , 92 , 'u', '\\' , '\x1c', "002bdc0056e2062bdc0656e2102bdc1056e20e56e20e2bdc1456e2142bdc162bdc1656e2022bdc0256e20a2bdc0a56e20c2bdc0c56e21856e2182bdc042bdc0456e20856e2082bdc1a2bdc1a56e2122bdc1256e2202bdc2056e21e56e21e2bdc1c2bdc1c56e2222bdc2256e22456e2282bde2856dc262bde2656dc2a56dc3056dc2e56dc2c56dc3256e2322bdc3856e23c56e24029c04629c04829c04a0ddb5256e25a29dc5c29dc5e29dc660ddb6e56e2922bdca42bdca456e2a82bdca856e2aa56e2aa2bdc")\ + X(202 , 1, Underscore , "_" , "_" , 0x5F , 95 , 'u', '_' , '\x1f', "0273e2")\ + X(204 , 1, VerticalBar , "|" , "|" , 0x7C , 124 , 'u', '|' , 28 , "5029dc4a29dc6a29dc6629dc")\ + X(206 , 1, DivisionSign , "÷" , "÷" , 0xF7 , 247 , 'u', -1 , -1 , "541add")\ + X(208 , 1, OneHalf , "½" , "½" , 0xBD , 189 , 'u', -1 , -1 , "4e29dc6029dc6c29dc")\ + X(210 , 1, SuperscriptTwo , "²" , "²" , 0xB2 , 178 , 'u', -1 , -1 , "9629de9c29dea029de9e29de")\ + X(212 , 1, DegreeSign , "°" , "°" , 0xB0 , 176 , 'u', -1 , -1 , "3e29de640dbf7029dc")\ + X(214 , 1, NumeroSign , "º" , "º" , 0xBA , 186 , 'u', -1 , -1 , "5e28de6829dc")\ + X(216 , 1, Acute , "´" , "´" , 0xB4 , 180 , 'u', -1 , -1 , "3c1adb440ddb4827ba4e0ddb501aba4c0ddb520dbb560dbb580dbb542bbf5e1bba600ddb6428c06c0ddb620ddb6a1aba6828de6e0dbf7028de740ddf760ddd780ddd7a0ddd800ddd860ddd820ddd840ddd")\ + X(218 , 1, Caron , "ˇ" , "ˇ" , 0x02C7, 780 , 'u', -1 , -1 , "5629de")\ + X(220 , 1, Cedilla , "¸" , "¸" , 0xB8 , 184 , 'u', -1 , -1 , "3a1bdd9029c0")\ + X(222 , 1, Circumflex , "^" , "^" , 0x5E , 94 , 'u', '^' , 30 , "3a1adb3e1adb421adb4828de7629dc7829dc7a29dc8029dc8629dc8229dc8429dc880ddd8a0ddd961add981add9a0ddd9c1adda01add9e1addac15db")\ + X(224 , 1, Ogonek , "˛" , "˛" , 0x02DB, 731 , 'u', -1 , -1 , "7229c0")\ + X(226 , 1, Cross , "˟" , "˟" , 0x02DF, 735 , 'u', -1 , -1 , "8456e2")\ + X(228 , 1, Tilde , "~" , "~" , 0x7E , 771 , 'u', '~' , 30 , "3c28de5e2bbf")\ + X(230 , 1, Tonos , "΄" , "΄" , 0x0384, 900 , 'u', -1 , -1 , "4627ba")\ + X(232 , 1, Umlaut , "¨" , "¨" , 0xA8 , 168 , 'u', -1 , -1 , "441bba4628de4e1bba4a1bba4c1bba522bdc540ddb601bba641add621bba661bba6e2bdc881bc08a1bc0")\ + X(234 , 1, BackQuote , "`" , "`" , 0x60 , 96 , 'u', '`' , '`' , "0029c00629c01029c00e29c01429c01629c00229c00a29c00c29c01829c00429c00829c01a29c01229c02029c01e29c01c29c02229c0242bdc2829df2629df2a29df3029df2e29df2c29df3229c03a28c0482bdc541bba681aba9229c0a229dca429c0a829c0aa29c0")\ + X(236 , 1, SingleQuote , "'" , "'" , 0x27 , 39 , 'u', '\'' , '\'' , "0028de0628de1028de0e28de1428de1628de0228de0a28de0c28de1828de0428de0828de1a28de1228de1e28de1c28de2228de2428de2828c02628c02a28c03028c02e28c02c28c03428de3628de3228de3c29c0442bbf460cbf480cbf4e2bbf500cdb4a2bbf4c2bbf562bdc5429dc5a0cdb5c0cdb5e0cdb602bbf6c2bbf622bbf6a0cdb662bbf680cdb701bba720dbf7c0cbf880cdb8a0cdb9228de900cbf940dbb9a0cdea410dea835deaa2cde")\ + X(238 , 1, DoubleQuote , "\"" , "\"" , 0x22 , 34 , 'u', '"' , '"' , "8c29c0")\ + X(240 , 1, SingleRightQuote , "’" , "’" , 0x2019, 8217 , 'u', -1 , -1 , "ac31c0")\ + X(242 , 1, SingleLowQuote , "‚" , "‚" , 0x201A, 8218 , 'u', -1 , -1 , "7c29c0")\ + X(244 , 1, DoubleLowQuote , "„" , "„" , 0x201E, 8222 , 'u', -1 , -1 , "3829c0")\ + X(246 , 1, LeftGuillemet , "«" , "«" , 0xAB , 171 , 'u', -1 , -1 , "3a56e25e0ddd")\ + X(248 , 1, Hash , "#" , "#" , 0x23 , 35 , 'u', '#' , '#' , "2a2bde302bde2e2bde2c2bde362bdc3a29de462bdc782bbf802bbf862bbf822bbf842bbf")\ + X(250 , 1, AtSign , "@" , "@" , 0x40 , 64 , 'u', '@' , '\0' , "401bdd6429de9a29c0")\ + X(252 , 1, Exclamation , "!" , "!" , 0x21 , 33 , 'u', '!' , '!' , "9635df9835df9c35df")\ + X(254 , 1, InvertedExclamation, "¡" , "¡" , 0xA1 , 161 , 'u', -1 , -1 , "680ddd")\ + X(256 , 1, QuestionMark , "?" , "?" , 0x3F , 63 , 'u', '?' , 127 , "a20cbb")\ + X(258 , 1, InvertedQuestion , "¿" , "¿" , 0xBF , 191 , 'u', -1 , -1 , "500ddd6a0ddd")\ + X(260 , 1, Paragraph , "§" , "§" , 0xA7 , 167 , 'u', -1 , -1 , "4429dc4c29dc5228de5828de6229dc6e28de7428de8829bf8a29bf")\ + X(262 , 1, Ampersand , "&" , "&" , 0x26 , 38 , 'u', '&' , '&' , "5856e27456e2")\ + X(264 , 1, Dollar , "$" , "$" , 0x24 , 36 , 'u', '$' , '$' , "882bdf8a2bdf961bba9c1bbaa01bba9e1bbaac29de")\ + X(266 , 1, Percent , "%" , "%" , 0x25 , 37 , 'u', '%' , '%' , "ac0dbb")\ + X(268 , 1, Dong , "₫" , "₫" , 0x20AB, 8363 , 'u', -1 , -1 , "320dbb")\ + X(270 , 1, Yen , "¥" , "¥" , 0xA5 , 165 , 'u', -1 , -1 , "027ddc227ddc")\ + X(272 , 1, DotlessI , "ı" , "ı" , 0x0131, 305 , 'u', -1 , -1 , "8c1749a61349")\ + X(274 , 1, MicroSign , "µ" , "µ" , 0xB5 , 181 , 'u', -1 , -1 , "a02bdc9e2bdc")\ + X(276 , 1, Eth , "ð" , "ð" , 0xF0 , 240 , 'u', -1 , -1 , "6c1bba701add")\ + X(278 , 1, Thorn , "þ" , "þ" , 0xFE , 254 , 'u', -1 , -1 , "7035bd")\ + X(280 , 1, Eszett , "ẞ" , "ß" , 0xDF , 223 , 'u', -1 , -1 , "760cdb780cdb7a0cdb800cdb860cdb820cdb840cdb")\ + X(282 , 1, KeyA , "A" , "a" , 0x61 , 97 , 'u', 'a' , '\x01', "001e41061e41101e410e1e41141e41161e41021e410a1e410c1e41181e41041e41081e411a1e41121e41201e411e1e411c1e41221e41241e41281e41261e412a1e41301e412e1e412c1e41341e41361e41321e41381e413a1e413e1e413c1e41401e41421e41441e41461e41481e414e1e41501e414a1e414c1e41521e41561e41581e41541e415a1e415c1e415e1e41601e41641e416c1e41621e416a1e41661e41681e416e1e41701e41721e417c1e41741e41761e41781e417a1e417e1e41801e41861e41821e41841e41881e418a1e418c1e418e1e41921e41901e41941e419610419810419a10419c1041a010419e1041a21e41a41e41a62141a82141aa2541ac1e41")\ + X(284 , 1, KeyB , "B" , "b" , 0x62 , 98 , 'u', 'b' , '\x02', "0030420630421030420e30421430421630420230420a30420c30421830420430420830421a30421230422030421e30421c30422230422430422830422630422a30423030422e30422c30423430423630423230423830423a30423e30423c30424030424230424430424630424830424e30425030424a30424c30425230425630425830425430425a30425c30425e30426030426430426c30426230426a30426630426830426e30427030427230427c30427430427630427830427a30427e30428030428630428230428430428830428a30428c30428e30429230429030429430429630429830429a30429c3042a030429e3042a23042a43142a63342a81942aa1242ac1042")\ + X(286 , 1, KeyC , "C" , "c" , 0x63 , 99 , 'u', 'c' , '\x03', "002e43062e43102e430e2e43142e43162e43022e430a2e430c2e43182e43042e43082e431a2e43122e43202e431e2e431c2e43222e43242e43282e43262e432a2e43302e432e2e432c2e43342e43362e43322e43382e433a2e433e2e433c2e43402e43422e43442e43462e43482e434e2e43502e434a2e434c2e43522e43562e43582e43542e435a2e435c2e435e2e43602e43642e436c2e43622e436a2e43662e43682e436e2e43702e43722e437c2e43742e43762e43782e437a2e437e2e43802e43862e43822e43842e43882e438a2e438c2e438e2e43922e43902e43942e43962e43982e439a2e439c2e43a02e439e2e43a22e43a41743a62f43a82643aa2043ac2343")\ + X(288 , 1, KeyD , "D" , "d" , 0x64 , 100 , 'u', 'd' , '\x04', "0020440620441020440e20441420441620440220440a20440c20441820440420440820441a20441220442020441e20441c20442220442420442820442620442a20443020442e20442c20443420443620443220443820443a20443e20443c20444020444220444420444620444820444e20445020444a20444c20445220445620445820445420445a20445c20445e20446020446420446c20446220446a20446620446820446e20447020447220447c20447420447620447820447a20447e20448020448620448220448420448820448a20448c20448e20449222449020449420449620449820449a20449c2044a020449e2044a22044a42344a61544a82544aa2144ac1744")\ + X(290 , 1, KeyE , "E" , "e" , 0x65 , 101 , 'u', 'e' , '\x05', "0012450612451012450e12451412451612450212450a12450c12451812450412450812451a12451212452012451e12451c12452212452412452812452612452a12453012452e12452c12453412453612453212453812453a12453e12453c12454012454212454412454612454812454e12455012454a12454c12455212455612455812455412455a12455c12455e12456012456412456c12456212456a12456612456812456e12457012457212457c12457412457612457812457a12457e12458012458612458212458412458812458a12458c12458e12459225459012459412459612459812459a12459c1245a012459e1245a21245a42045a62045a82245aa2445ac2145")\ + X(292 , 1, KeyF , "F" , "f" , 0x66 , 102 , 'u', 'f' , '\x06', "0021460621461021460e21461421461621460221460a21460c21461821460421460821461a21461221462021461e21461c21462221462421462821462621462a21463021462e21462c21463421463621463221463821463a21463e21463c21464021464221464421464621464821464e21465021464a21464c21465221465621465821465421465a21465c21465e21466021466421466c21466221466a21466621466821466e21467021467221467c21467421467621467821467a21467e21468021468621468221468421468821468a21468c21468e21469212469021469421469621469821469a21469c2146a021469e2146a234bea41546a61046a80946aa0646ac3546")\ + X(294 , 1, KeyG , "G" , "g" , 0x67 , 103 , 'u', 'g' , '\x07', "0022470622471022470e22471422471622470222470a22470c22471822470422470822471a22471222472022471e22471c22472222472422472822472622472a22473022472e22472c22473422473622473222473822473a22473e22473c22474022474222474422474622474822474e22475022474a22474c22475222475622475822475422475a22475c22475e22476022476422476c22476222476a22476622476822476e22477022477222477c22477422477622477822477a22477e22478022478622478222478422478822478a22478c22478e22479214479022479422479622479822479a22479c2247a022479e2247a22247a41647a61147a83447aa2e47ac3347")\ + X(296 , 1, KeyH , "H" , "h" , 0x68 , 104 , 'u', 'h' , '\x08', "0023480623481023480e23481423481623480223480a23480c23481823480423480823481a23481223482023481e23481c23482223482423482823482623482a23483023482e23482c23483423483623483223483823483a23483e23483c23484023484223484423484623484823484e23485023484a23484c23485223485623485823485423485a23485c23485e23486023486423486c23486223486a23486623486823486e23487023487223487c23487423487623487823487a23487e23488023488623488223488423488823488a23488c23488e23489223489023489423489623489823489a23489c2348a023489e2348a22348a42448a61848a82348aa2348ac3448")\ + X(298 , 1, KeyI , "I" , "i" , 0x69 , 105 , 'u', 'i' , '\x09', "0017490617491017490e17491417491617490217490a17490c17491817490417490817491a17491217492017491e17491c17492217492417492817492617492a17493017492e17492c17493417493617493217493817493a17493e17493c17494017494217494417494617494817494e17495017494a17494c17495217495617495817495417495a17495c17495e17496017496417496c17496217496a17496617496817496e17497017497217497c17497417497617497817497a17497e17498017498617498217498417498817498a17498c28de8e17499226499017499417499617499817499a17499c1749a017499e1749a21749a42249a61fdba83049aa3249ac2049")\ + X(300 , 1, KeyJ , "J" , "j" , 0x6A , 106 , 'u', 'j' , '\x0a', "00244a06244a10244a0e244a14244a16244a02244a0a244a0c244a18244a04244a08244a1a244a12244a20244a1e244a1c244a22244a24244a28244a26244a2a244a30244a2e244a2c244a34244a36244a32244a38244a3a244a3e244a3c244a40244a42244a44244a46244a48244a4e244a50244a4a244a4c244a52244a56244a58244a54244a5a244a5c244a5e244a60244a64244a6c244a62244a6a244a66244a68244a6e244a70244a72244a7c244a74244a76244a78244a7a244a7e244a80244a86244a82244a84244a88244a8a244a8c244a8e244a92154a90244a94244a96244a98244a9a244a9c244aa0244a9e244aa2244aa42e4aa62c4aa8064aaa094aac194a")\ + X(302 , 1, KeyK , "K" , "k" , 0x6B , 107 , 'u', 'k' , '\x0b', "00254b06254b10254b0e254b14254b16254b02254b0a254b0c254b18254b04254b08254b1a254b12254b20254b1e254b1c254b22254b24254b28254b26254b2a254b30254b2e254b2c254b34254b36254b32254b38254b3a254b3e254b3c254b40254b42254b44254b46254b48254b4e254b50254b4a254b4c254b52254b56254b58254b54254b5a254b5c254b5e254b60254b64254b6c254b62254b6a254b66254b68254b6e254b70254b72254b7c254b74254b76254b78254b7a254b7e254b80254b86254b82254b84254b88254b8a254b8c254b8e254b92314b90254b94254b96254b98254b9a254b9c254ba0254b9e254ba2254ba42f4ba6244ba8274baa1f4bac304b")\ + X(304 , 1, KeyL , "L" , "l" , 0x6C , 108 , 'u', 'l' , '\x0c', "00264c06264c10264c0e264c14264c16264c02264c0a264c0c264c18264c04264c08264c1a264c12264c20264c1e264c1c264c22264c24264c28264c26264c2a264c30264c2e264c2c264c34264c36264c32264c38264c3a264c3e264c3c264c40264c42264c44264c46264c48264c4e264c50264c4a264c4c264c52264c56264c58264c54264c5a264c5c264c5e264c60264c64264c6c264c62264c6a264c66264c68264c6e264c70264c72264c7c264c74264c76264c78264c7a264c7e264c80264c86264c82264c84264c88264c8a264c8c264c8e264c92164c90264c94264c96264c98264c9a264c9c264ca0264c9e264ca2264ca4194ca6264ca8074caa084cac184c")\ + X(306 , 1, KeyM , "M" , "m" , 0x6D , 109 , 'u', 'm' , '\x0d', "00324d06324d10324d0e324d14324d16324d02324d0a324d0c324d18324d04324d08324d1a324d12324d20324d1e324d1c324d22324d24324d28324d26324d2a324d30324d2e324d2c324d34324d36324d32324d38324d3a324d3e324d3c324d40324d42324d44324d46324d48324d4e324d50324d4a324d4c324d52324d56324d58324d54324d5a324d5c324d5e324d60324d64324d6c324d62324d6a324d66324d68324d6e324d70324d72324d7c324d74324d76324d78324d7a324d7e324d80324d86324d82324d84324d88324d8a324d8c324d8e324d92324d90324d94324d96274d98274d9a274d9c274da0274d9e274da2324da4324da6254da8084daa074dac284d")\ + X(308 , 1, KeyN , "N" , "n" , 0x6E , 110 , 'u', 'n' , '\x0e', "00314e06314e10314e0e314e14314e16314e02314e0a314e0c314e18314e04314e08314e1a314e12314e20314e1e314e1c314e22314e24314e28314e26314e2a314e30314e2e314e2c314e34314e36314e32314e38314e3a314e3e314e3c314e40314e42314e44314e46314e48314e4e314e50314e4a314e4c314e52314e56314e58314e54314e5a314e5c314e5e314e60314e64314e6c314e62314e6a314e66314e68314e6e314e70314e72314e7c314e74314e76314e78314e7a314e7e314e80314e86314e82314e84314e88314e8a314e8c314e8e314e92244e90314e94314e96314e98314e9a314e9c314ea0314e9e314ea2314ea4264ea6174ea8314eaa314eac274e")\ + X(310 , 1, KeyO , "O" , "o" , 0x6F , 111 , 'u', 'o' , '\x0f', "00184f06184f10184f0e184f14184f16184f02184f0a184f0c184f18184f04184f08184f1a184f12184f20184f1e184f1c184f22184f24184f28184f26184f2a184f30184f2e184f2c184f34184f36184f32184f38184f3a184f3e184f3c184f40184f42184f44184f46184f48184f4e184f50184f4a184f4c184f52184f56184f58184f54184f5a184f5c184f5e184f60184f64184f6c184f62184f6a184f66184f68184f6e184f70184f72184f7c184f74184f76184f78184f7a184f7e184f80184f86184f82184f84184f88184f8a184f8c184f8e184f92274f90184f94184f96184f98184f9a184f9c184fa0184f9e184fa2184fa41f4fa6144fa8144faa174fac134f")\ + X(312 , 1, KeyP , "P" , "p" , 0x70 , 112 , 'u', 'p' , '\x10', "0019500619501019500e19501419501619500219500a19500c19501819500419500819501a19501219502019501e19501c19502219502419502819502619502a19503019502e19502c19503419503619503219503819503a19503e19503c19504019504219504419504619504819504e19505019504a19504c19505219505619505819505419505a19505c19505e19506019506419506c19506219506a19506619506819506e19507019507219507c19507419507619507819507a19507e19508019508619508219508419508819508a19508c19508e19509213509019509419509619509819509a19509c1950a019509e1950a21950a41350a61950a80a50aa0550ac1250")\ + X(314 , 1, KeyQ , "Q" , "q" , 0x71 , 113 , 'u', 'q' , '\x11', "0010510610511010510e10511410511610510210510a10510c10511810510410510810511a10511210512010511e10511c10512210512410512810512610512a10513010512e10512c10513410513610513210513810513a10513e10513c10514010514210514410514610514810514e10515010514a10514c10515210515610515810515410515a10515c10515e10516010516410516c10516210516a10516610516810516e10517010517210517c10517410517610517810517a10517e10518010518610518210518410518810518a10518c10518e1051921051901051941051961e51981e519a1e519c1e51a01e519e1e51a22bbfa42d51a61a51a81251aa1151ac3251")\ + X(316 , 1, KeyR , "R" , "r" , 0x72 , 114 , 'u', 'r' , '\x12', "0013520613521013520e13521413521613520213520a13520c13521813520413520813521a13521213522013521e13521c13522213522413522813522613522a13523013522e13522c13523413523613523213523813523a13523e13523c13524013524213524413524613524813524e13525013524a13524c13525213525613525813525413525a13525c13525e13526013526413526c13526213526a13526613526813526e13527013527213527c13527413527613527813527a13527e13528013528613528213528413528813528a13528c13528e1352921f529013529413529613529813529a13529c1352a013529e1352a21352a41852a61652a81552aa1552ac2652")\ + X(318 , 1, KeyS , "S" , "s" , 0x73 , 115 , 'u', 's' , '\x13', "001f53061f53101f530e1f53141f53161f53021f530a1f530c1f53181f53041f53081f531a1f53121f53201f531e1f531c1f53221f53241f53281f53261f532a1f53301f532e1f532c1f53341f53361f53321f53381f533a1f533e1f533c1f53401f53421f53441f53461f53481f534e1f53501f534a1f534c1f53521f53561f53581f53541f535a1f535c1f535e1f53601f53641f536c1f53621f536a1f53661f53681f536e1f53701f53721f537c1f53741f53761f53781f537a1f537e1f53801f53861f53821f53841f53881f538a1f538c1f538e1f53922053901f53941f53961f53981f539a1f539c1f53a01f539e1f53a21f53a42753a63253a81653aa1653ac2553")\ + X(320 , 1, KeyT , "T" , "t" , 0x74 , 116 , 'u', 't' , '\x14', "0014540614541014540e14541414541614540214540a14540c14541814540414540814541a14541214542014541e14541c14542214542414542814542614542a14543014542e14542c14543414543614543214543814543a14543e14543c14544014544214544414544614544814544e14545014544a14544c14545214545614545814545414545a14545c14545e14546014546414546c14546214546a14546614546814546e14547014547214547c14547414547614547814547a14547e14548014548614548214548414548814548a14548c14548e14549221549014549414549614549814549a14549c1454a014549e1454a21454a42554a62354a82454aa2254ac2454")\ + X(322 , 1, KeyU , "U" , "u" , 0x75 , 117 , 'u', 'u' , '\x15', "0016550616551016550e16551416551616550216550a16550c16551816550416550816551a16551216552016551e16551c16552216552416552816552616552a16553016552e16552c16553416553616553216553816553a16553e16553c16554016554216554416554616554816554e16555016554a16554c16555216555616555816555416555a16555c16555e16556016556416556c16556216556a16556616556816556e16557016557216557c16557416557616557816557a16557e16558016558616558216558416558816558a16558c16558e16559217559016559416559616559816559a16559c1655a016559e1655a21655a42155a61e55a81755aa1455ac1f55")\ + X(324 , 1, KeyV , "V" , "v" , 0x76 , 118 , 'u', 'v' , '\x16', "002f56062f56102f560e2f56142f56162f56022f560a2f560c2f56182f56042f56082f561a2f56122f56202f561e2f561c2f56222f56242f56282f56262f562a2f56302f562e2f562c2f56342f56362f56322f56382f563a2f563e2f563c2f56402f56422f56442f56462f56482f564e2f56502f564a2f564c2f56522f56562f56582f56542f565a2f565c2f565e2f56602f56642f566c2f56622f566a2f56662f56682f566e2f56702f56722f567c2f56742f56762f56782f567a2f567e2f56802f56862f56822f56842f56882f568a2f568c2f568e2f56922f56902f56942f56962f56982f569a2f569c2f56a02f569e2f56a22f56a43456a62e56a83356aa2f56ac1656")\ + X(326 , 1, KeyW , "W" , "w" , 0x77 , 119 , 'u', 'w' , '\x17', "0011570611571011570e11571411571611570211570a11570c11571811570411570811571a11571211572011571e11571c11572211572411572811572611572a11573011572e11572c11573411573611573211573811573a11573e11573c11574011574211574411574611574811574e11575011574a11574c11575211575611575811575411575a11575c11575e11576011576411576c11576211576a11576611576811576e11577011577211577c11577411577611577811577a11577e11578011578611578211578411578811578a11578c11578e1157921157901157941157962c57982c579a2c579c2c57a02c579e2c57a21bbaa43357a61b57a83257aa3057ac1b57")\ + X(328 , 1, KeyX , "X" , "x" , 0x78 , 120 , 'u', 'x' , '\x18', "002d58062d58102d580e2d58142d58162d58022d580a2d580c2d58182d58042d58082d581a2d58122d58202d581e2d581c2d58222d58242d58282d58262d582a2d58302d582e2d582c2d58342d58362d58322d58382d583a2d583e2d583c2d58402d58422d58442d58462d58482d584e2d58502d584a2d584c2d58522d58562d58582d58542d585a2d585c2d585e2d58602d58642d586c2d58622d586a2d58662d58682d586e2d58702d58722d587c2d58742d58762d58782d587a2d587e2d58802d58862d58822d58842d58882d588a2d588c2d588e2d58922d58902d58942d58962d58982d589a2d589c2d58a02d589e2d58a20ddba43058a62b58a82e58aa2d58ac2e58")\ + X(330 , 1, KeyY , "Y" , "y" , 0x79 , 121 , 'u', 'y' , '\x19', "0015590615591015590e15591415591615590215590a15590c15591815590415590815591a15591215592015591e15591c15592215592415592815592615592a15593015592e15592c15593415593615593215593815593a15593e15593c1559402c594215594415594615594815594e15595015594a15594c15595215595615595815595415595a15595c15595e15596015596415596c15596215596a15596615596815596e2c59701559722c597c2c59742c59762c59782c597a2c597e2c59802c59862c59822c59842c59882c598a2c598c15598e1559921859902c59942c599615599815599a15599c1559a015599e1559a21559a41459a62759a81859aa1359ac2d59")\ + X(332 , 1, KeyZ , "Z" , "z" , 0x7A , 122 , 'u', 'z' , '\x1a', "002c5a062c5a102c5a0e2c5a142c5a162c5a022c5a0a2c5a0c2c5a182c5a042c5a082c5a1a2c5a122c5a202c5a1e2c5a1c2c5a222c5a242c5a282c5a262c5a2a2c5a302c5a2e2c5a2c2c5a342c5a362c5a322c5a382c5a3a2c5a3e2c5a3c2c5a40155a422c5a442c5a462c5a482c5a4e2c5a502c5a4a2c5a4c2c5a522c5a562c5a582c5a542c5a5a2c5a5c2c5a5e2c5a602c5a642c5a6c2c5a622c5a6a2c5a662c5a682c5a6e155a702c5a72155a7c155a74155a76155a78155a7a155a7e155a80155a86155a82155a84155a88155a8a155a8c2c5a8e2c5a922c5a90155a94155a96115a98115a9a115a9c115aa0115a9e115aa22c5aa4355aa6315aa8205aaa265aac1a5a")\ + X(334 , 1, AeLigature , "Æ" , "æ" , 0xE6 , 230 , 'u', -1 , -1 , "4e27c04a28de6027c06c27c06628de7027c0")\ + X(336 , 1, AcuteA , "Á" , "á" , 0xE1 , 225 , 'u', -1 , -1 , "7e28de8e28de")\ + X(338 , 1, BreveA , "Ă" , "ă" , 0x0103, 259 , 'u', -1 , -1 , "381adb941adb")\ + X(340 , 1, CircumflexA , "Â" , "â" , 0xE2 , 226 , 'u', -1 , -1 , "382bdc942bdc")\ + X(342 , 1, GraveA , "À" , "à" , 0xE0 , 224 , 'u', -1 , -1 , "3e2bdc422bdc5a28de5c28de8828dcac2cdd")\ + X(344 , 1, OgonekA , "Ą" , "ą" , 0x0105, 261 , 'u', -1 , -1 , "7228dea21051")\ + X(346 , 1, RingA , "Å" , "å" , 0xE5 , 229 , 'u', -1 , -1 , "441add4e1add4a1add4c1add601add6c1add621add661add")\ + X(348 , 1, TildeA , "Ã" , "ã" , 0xE3 , 227 , 'u', -1 , -1 , "9829de")\ + X(350 , 1, UmlautA , "Ä" , "ä" , 0xE4 , 228 , 'u', -1 , -1 , "4428de4c28de5628bf581bdd6228de741bdd7628de7828de7a28de8028de8628de8228de8428de8a28dc")\ + X(352 , 1, AcuteC , "Ć" , "ć" , 0x0107, 263 , 'u', -1 , -1 , "7c28de9028de")\ + X(354 , 1, CaronC , "Č" , "č" , 0x010D, 269 , 'u', -1 , -1 , "7c27ba9027baa233bc")\ + X(356 , 1, CedillaC , "Ç" , "ç" , 0xE7 , 231 , 'u', -1 , -1 , "3e1bdd3c27ba401adb421bdd5428de5e27c0682bbf8c34dca630bfac2bdc")\ + X(358 , 1, DotAboveC , "Ċ" , "ċ" , 0x010B, 267 , 'u', -1 , -1 , "3429c03629c0")\ + X(360 , 1, AcuteE , "É" , "é" , 0xE9 , 233 , 'u', -1 , -1 , "3a35bf3e35bf4235bf7e27ba8827de8e27baac11ba")\ + X(362 , 1, CircumflexE , "Ê" , "ê" , 0xEA , 234 , 'u', -1 , -1 , "ac56e2")\ + X(364 , 1, GraveE , "È" , "è" , 0xE8 , 232 , 'u', -1 , -1 , "3e28c04228c05a1aba5c1aba881abaac14bf")\ + X(366 , 1, DotAboveE , "Ė" , "ė" , 0x0117, 279 , 'u', -1 , -1 , "a228de")\ + X(368 , 1, OgonekE , "Ę" , "ę" , 0x0119, 281 , 'u', -1 , -1 , "a235bd")\ + X(370 , 1, UmlautE , "Ë" , "ë" , 0xEB , 235 , 'u', -1 , -1 , "4027ba")\ + X(372 , 1, CrossedD , "Đ" , "đ" , 0x0111, 273 , 'u', -1 , -1 , "7c1bdd901bdd")\ + X(374 , 1, BreveG , "Ğ" , "ğ" , 0x011F, 287 , 'u', -1 , -1 , "8c1adba612ba")\ + X(376 , 1, DotAboveG , "Ġ" , "ġ" , 0x0121, 289 , 'u', -1 , -1 , "341adb361adb")\ + X(378 , 1, CrossedH , "Ħ" , "ħ" , 0x0127, 295 , 'u', -1 , -1 , "341bdd361bdd")\ + X(380 , 1, AcuteI , "Í" , "í" , 0xED , 237 , 'u', -1 , -1 , "7e56e28e29308e56e2")\ + X(382 , 1, CircumflexI , "Î" , "î" , 0xEE , 238 , 'u', -1 , -1 , "381bdd941bdd")\ + X(384 , 1, GraveI , "Ì" , "ì" , 0xEC , 236 , 'u', -1 , -1 , "5a0ddd5c0ddd")\ + X(386 , 1, OgonekI , "Į" , "į" , 0x012F, 303 , 'u', -1 , -1 , "a21add")\ + X(388 , 1, CrossedL , "Ł" , "ł" , 0x0142, 322 , 'u', -1 , -1 , "7227ba762bbf7a2bbf")\ + X(390 , 1, CaronN , "Ň" , "ň" , 0x0148, 328 , 'u', -1 , -1 , "582bdc742bdc")\ + X(392 , 1, TildeN , "Ñ" , "ñ" , 0xF1 , 241 , 'u', -1 , -1 , "5027c05427c06a27c06827c0")\ + X(394 , 1, AcuteO , "Ó" , "ó" , 0xF3 , 243 , 'u', -1 , -1 , "722bdc7e0dbb8e0dbb981bba")\ + X(396 , 1, CircumflexO , "Ô" , "ô" , 0xF4 , 244 , 'u', -1 , -1 , "5827ba7427ba")\ + X(398 , 1, DoubleAcuteO , "Ő" , "ő" , 0x0151, 337 , 'u', -1 , -1 , "7e1adb8e1adb")\ + X(400 , 1, GraveO , "Ò" , "ò" , 0xF2 , 242 , 'u', -1 , -1 , "5a27c05c27c0")\ + X(402 , 1, HornO , "Ơ" , "ơ" , 0x01A1, 417 , 'u', -1 , -1 , "321bdd")\ + X(404 , 1, SlashedO , "Ø" , "ø" , 0xF8 , 248 , 'u', -1 , -1 , "4e28de4a27c06028de6c28de6627c0")\ + X(406 , 1, TildeO , "Õ" , "õ" , 0xF5 , 245 , 'u', -1 , -1 , "561bdb")\ + X(408 , 1, UmlautO , "Ö" , "ö" , 0xF6 , 246 , 'u', -1 , -1 , "4427c04c27c05627ba6227c0700cbb7627c07827c07a27c08027c08627c08227c08427c08a27de8c33bfa62ddc")\ + X(410 , 1, AcuteS , "Ś" , "ś" , 0x015B, 347 , 'u', -1 , -1 , "721bdd")\ + X(412 , 1, CaronS , "Š" , "š" , 0x0161, 353 , 'u', -1 , -1 , "7c1adb901adba22146")\ + X(414 , 1, CedillaS , "Ş" , "ş" , 0x015F, 351 , 'u', -1 , -1 , "8c27ba9427baa628de")\ + X(416 , 1, CommaS , "Ș" , "ș" , 0x0219, 537 , 'u', -1 , -1 , "3827ba")\ + X(418 , 1, CedillaT , "Ţ" , "ţ" , 0x0163, 355 , 'u', -1 , -1 , "9428de")\ + X(420 , 1, CommaT , "Ț" , "ț" , 0x021B, 539 , 'u', -1 , -1 , "3828de")\ + X(422 , 1, AcuteU , "Ú" , "ú" , 0xFA , 250 , 'u', -1 , -1 , "521adb581adb6e1adb741adb7e1bdd8e1bdd")\ + X(424 , 1, DoubleAcuteU , "Ű" , "ű" , 0x0171, 369 , 'u', -1 , -1 , "7e2bdc8e2bdc")\ + X(426 , 1, GraveU , "Ù" , "ù" , 0xF9 , 249 , 'u', -1 , -1 , "3e56e24256e25a2bbf5c2bbf9628c09828c09c28c0a028c09e28c0")\ + X(428 , 1, HornU , "Ư" , "ư" , 0x01B0, 432 , 'u', -1 , -1 , "321adb")\ + X(430 , 1, MacronU , "Ū" , "ū" , 0x016B, 363 , 'u', -1 , -1 , "a22d58")\ + X(432 , 1, OgonekU , "Ų" , "ų" , 0x0173, 371 , 'u', -1 , -1 , "a227c0")\ + X(434 , 1, RingU , "Ů" , "ů" , 0x016F, 367 , 'u', -1 , -1 , "5227ba6e27ba")\ + X(436 , 1, UmlautU , "Ü" , "ü" , 0xFC , 252 , 'u', -1 , -1 , "561ac0761aba781aba7a1aba7e0cbf801aba861aba821aba841aba8a1aba8c1bdd8e0cbda622dd")\ + X(438 , 1, CaronZ , "Ž" , "ž" , 0x017E, 382 , 'u', -1 , -1 , "1e0dbb7c2bdc902bdca21157")\ + X(440 , 1, DotAboveZ , "Ż" , "ż" , 0x017C, 380 , 'u', -1 , -1 , "342bdc3656e2721adb")\ + X(442 , 0, Sleep , "Sleep" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(444 , 0, AppStart1 , "AppStart1" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(446 , 0, AppStart2 , "AppStart2" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(448 , 0, AppNewWindow , "AppNewWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(450 , 0, AppOpenWindow , "AppOpenWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(452 , 0, AppHelp , "AppHelp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(454 , 0, AppSave , "AppSave" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(456 , 0, AppFind , "AppFind" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(458 , 0, AppPrint , "AppPrint" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(460 , 0, AppClose , "AppClose" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(462 , 1, AppCut , "AppCut" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(464 , 0, AppCopy , "AppCopy" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(466 , 1, AppPaste , "AppPaste" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(468 , 1, AppUndo , "AppUndo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(470 , 1, AppRedo , "AppRedo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(472 , 0, AppSpeechMode , "AppSpeechMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(474 , 0, AppSpeechCorrection, "AppSpeechCorrect" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(476 , 0, AppSpellCheck , "AppSpellCheck" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(478 , 0, Calculator , "Calculator" , "" , 0 , 0 , 'u', -1 , -1 , "0121b70721b71121b70f21b71521b71721b70321b70b21b70d21b71921b70521b70921b71b21b71321b72121b71f21b71d21b72321b72521b72921b72721b72b21b73121b72f21b72d21b73521b73721b73321b73921b73b21b73f21b73d21b74121b74321b74521b74721b74921b74f21b75121b74b21b74d21b75321b75721b75921b75521b75b21b75d21b75f21b76121b76521b76d21b76321b76b21b76721b76921b76f21b77121b77321b77d21b77521b77721b77921b77b21b77f21b78121b78721b78321b78521b78921b78b21b78d21b78f21b79321b79121b79521b79721b79921b79b21b79d21b7a121b79f21b7a321b7a521b7a721b7a921b7ab21b7ad21b7")\ + X(480 , 0, Mail , "Mail" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(482 , 0, MailSend , "MailSend" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(484 , 0, MailForward , "MailForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(486 , 0, MailReply , "MailReply" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(488 , 0, MediaBassBoost , "MediaBassBoost" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(490 , 0, MediaBassDown , "MediaBassDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(492 , 0, MediaBassUp , "MediaBassUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(494 , 0, MediaChanDown , "MediaChanDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(496 , 0, MediaChanUp , "MediaChanUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(498 , 0, MediaTrebleDown , "MediaTrebleDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(500 , 0, MediaTrebleUp , "MediaTrebleUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(502 , 0, MediaVolMute , "MediaVolMute" , "" , 0 , 57440, 'u', -1 , -1 , "0120ad0720ad1120ad0f20ad1520ad1720ad0320ad0b20ad0d20ad1920ad0520ad0920ad1b20ad1320ad2120ad1f20ad1d20ad2320ad2520ad2920ad2720ad2b20ad3120ad2f20ad2d20ad3520ad3720ad3320ad3920ad3b20ad3f20ad3d20ad4120ad4320ad4520ad4720ad4920ad4f20ad5120ad4b20ad4d20ad5320ad5720ad5920ad5520ad5b20ad5d20ad5f20ad6120ad6520ad6d20ad6320ad6b20ad6720ad6920ad6f20ad7120ad7320ad7d20ad7520ad7720ad7920ad7b20ad7f20ad8120ad8720ad8320ad8520ad8920ad8b20ad8d20ad8f20ad9320ad9120ad9520ad9720ad9920ad9b20ad9d20ada120ad9f20ada320ada520ada720ada920adab20adad20ad")\ + X(504 , 0, MediaVolDown , "MediaVolDown" , "" , 0 , 57438, 'u', -1 , -1 , "012eae072eae112eae0f2eae152eae172eae032eae0b2eae0d2eae192eae052eae092eae1b2eae132eae212eae1f2eae1d2eae232eae252eae292eae272eae2b2eae312eae2f2eae2d2eae352eae372eae332eae392eae3b2eae3f2eae3d2eae412eae432eae452eae472eae492eae4f2eae512eae4b2eae4d2eae532eae572eae592eae552eae5b2eae5d2eae5f2eae612eae652eae6d2eae632eae6b2eae672eae692eae6f2eae712eae732eae7d2eae752eae772eae792eae7b2eae7f2eae812eae872eae832eae852eae892eae8b2eae8d2eae8f2eae932eae912eae952eae972eae992eae9b2eae9d2eaea12eae9f2eaea32eaea52eaea72eaea92eaeab2eaead2eae")\ + X(506 , 0, MediaVolUp , "MediaVolUp" , "" , 0 , 57439, 'u', -1 , -1 , "0130af0730af1130af0f30af1530af1730af0330af0b30af0d30af1930af0530af0930af1b30af1330af2130af1f30af1d30af2330af2530af2930af2730af2b30af3130af2f30af2d30af3530af3730af3330af3930af3b30af3f30af3d30af4130af4330af4530af4730af4930af4f30af5130af4b30af4d30af5330af5730af5930af5530af5b30af5d30af5f30af6130af6530af6d30af6330af6b30af6730af6930af6f30af7130af7330af7d30af7530af7730af7930af7b30af7f30af8130af8730af8330af8530af8930af8b30af8d30af8f30af9330af9130af9530af9730af9930af9b30af9d30afa130af9f30afa330afa530afa730afa930afab30afad30af")\ + X(508 , 0, MediaNext , "MediaNext" , "" , 0 , 57435, 'u', -1 , -1 , "0119b00719b01119b00f19b01519b01719b00319b00b19b00d19b01919b00519b00919b01b19b01319b02119b01f19b01d19b02319b02519b02919b02719b02b19b03119b02f19b02d19b03519b03719b03319b03919b03b19b03f19b03d19b04119b04319b04519b04719b04919b04f19b05119b04b19b04d19b05319b05719b05919b05519b05b19b05d19b05f19b06119b06519b06d19b06319b06b19b06719b06919b06f19b07119b07319b07d19b07519b07719b07919b07b19b07f19b08119b08719b08319b08519b08919b08b19b08d19b08f19b09319b09119b09519b09719b09919b09b19b09d19b0a119b09f19b0a319b0a519b0a719b0a919b0ab19b0ad19b0")\ + X(510 , 0, MediaPrev , "MediaPrev" , "" , 0 , 57436, 'u', -1 , -1 , "0110b10710b11110b10f10b11510b11710b10310b10b10b10d10b11910b10510b10910b11b10b11310b12110b11f10b11d10b12310b12510b12910b12710b12b10b13110b12f10b12d10b13510b13710b13310b13910b13b10b13f10b13d10b14110b14310b14510b14710b14910b14f10b15110b14b10b14d10b15310b15710b15910b15510b15b10b15d10b15f10b16110b16510b16d10b16310b16b10b16710b16910b16f10b17110b17310b17d10b17510b17710b17910b17b10b17f10b18110b18710b18310b18510b18910b18b10b18d10b18f10b19310b19110b19510b19710b19910b19b10b19d10b1a110b19f10b1a310b1a510b1a710b1a910b1ab10b1ad10b1")\ + X(512 , 0, MediaStop , "MediaStop" , "" , 0 , 57432, 'u', -1 , -1 , "0124b20724b21124b20f24b21524b21724b20324b20b24b20d24b21924b20524b20924b21b24b21324b22124b21f24b21d24b22324b22524b22924b22724b22b24b23124b22f24b22d24b23524b23724b23324b23924b23b24b23f24b23d24b24124b24324b24524b24724b24924b24f24b25124b24b24b24d24b25324b25724b25924b25524b25b24b25d24b25f24b26124b26524b26d24b26324b26b24b26724b26924b26f24b27124b27324b27d24b27524b27724b27924b27b24b27f24b28124b28724b28324b28524b28924b28b24b28d24b28f24b29324b29124b29524b29724b29924b29b24b29d24b2a124b29f24b2a324b2a524b2a724b2a924b2ab24b2ad24b2")\ + X(514 , 0, MediaPause , "MediaPause" , "" , 0 , 57429, 'u', -1 , -1 , "")\ + X(516 , 0, MediaPlayPause , "MediaPlayPause" , "" , 0 , 57430, 'u', -1 , -1 , "0122b30722b31122b30f22b31522b31722b30322b30b22b30d22b31922b30522b30922b31b22b31322b32122b31f22b31d22b32322b32522b32922b32722b32b22b33122b32f22b32d22b33522b33722b33322b33922b33b22b33f22b33d22b34122b34322b34522b34722b34922b34f22b35122b34b22b34d22b35322b35722b35922b35522b35b22b35d22b35f22b36122b36522b36d22b36322b36b22b36722b36922b36f22b37122b37322b37d22b37522b37722b37922b37b22b37f22b38122b38722b38322b38522b38922b38b22b38d22b38f22b39322b39122b39522b39722b39922b39b22b39d22b3a122b39f22b3a322b3a522b3a722b3a922b3ab22b3ad22b3")\ + X(518 , 0, MediaPlay , "MediaPlay" , "" , 0 , 57428, 'u', -1 , -1 , "")\ + X(520 , 0, MediaSelectMode , "MediaSelectMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(522 , 0, MediaReverse , "MediaReverse" , "" , 0 , 57431, 'u', -1 , -1 , "")\ + X(524 , 0, MediaRecord , "MediaRecord" , "" , 0 , 57437, 'u', -1 , -1 , "")\ + X(526 , 0, MediaFastForward , "MediaFastForward" , "" , 0 , 57433, 'u', -1 , -1 , "")\ + X(528 , 0, MediaRewind , "MediaRewind" , "" , 0 , 57434, 'u', -1 , -1 , "")\ + X(530 , 0, MicAirToggle , "MicAirToggle" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(532 , 0, MicMute , "MicMute" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(534 , 0, MicVolUp , "MicVolUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(536 , 0, MicVolDown , "MicVolDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(538 , 0, BrowserBackward , "BrowserBackward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(540 , 0, BrowserForward , "BrowserForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(542 , 0, BrowserRefresh , "BrowserRefresh" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(544 , 0, BrowserStop , "BrowserStop" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(546 , 0, BrowserSearch , "BrowserSearch" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(548 , 0, BrowserFavorites , "BrowserFavorites" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(550 , 0, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0132ac0732ac1132ac0f32ac1532ac1732ac0332ac0b32ac0d32ac1932ac0532ac0932ac1b32ac1332ac2132ac1f32ac1d32ac2332ac2532ac2932ac2732ac2b32ac3132ac2f32ac2d32ac3532ac3732ac3332ac3932ac3b32ac3f32ac3d32ac4132ac4332ac4532ac4732ac4932ac4f32ac5132ac4b32ac4d32ac5332ac5732ac5932ac5532ac5b32ac5d32ac5f32ac6132ac6532ac6d32ac6332ac6b32ac6732ac6932ac6f32ac7132ac7332ac7d32ac7532ac7732ac7932ac7b32ac7f32ac8132ac8732ac8332ac8532ac8932ac8b32ac8d32ac8f32ac9332ac9132ac9532ac9732ac9932ac9b32ac9d32aca132ac9f32aca332aca532aca732aca932acab32acad32ac")\ + X(552 , 0, lastKey , "lastKey" , "" , 0 , 0 , 0 , -1 , -1 , "") // Max 12 bits for KeyId. static constexpr auto idbits = 12; From 682d284556ea7902965fca1da07cf356ed87faac Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Mon, 22 Jun 2026 00:48:48 +0500 Subject: [PATCH 43/71] #943 WIP: Fix left/right mods detection --- src/netxs/desktopio/input.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index ed9123da49..9e6aa4fa88 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -339,12 +339,12 @@ namespace netxs::input /* ID Input Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */\ X(0 , 1, undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(1 , 0, invalid , "invalid" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(2 , 0, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001da2061da2101da20e1da2141da2161da2021da20a1da20c1da2181da2041da2081da21a1da2121da2201da21e1da21c1da2221da2241da2281da2261da22a1da2301da22e1da22c1da2341da2361da2321da2381da23a1da23e1da23c1da2401da2421da2441da2461da2481da24e1da2501da24a1da24c1da2521da2561da2581da2541da25a1da25c1da25e1da2601da2641da26c1da2621da26a1da2661da2681da26e1da2701da2721da27c1da2741da2761da2781da27a1da27e1da2801da2861da2821da2841da2881da28a1da28c1da28e1da2921da2901da2941da2961da2981da29a1da29c1da2a01da29e1da2a21da2a41da2a61da2a81da2aa1da2ac1da2")\ - X( 3 , 0, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011da3071da3111da30f1da3151da3171da3031da30b1da30d1da3191da3051da3091da31b1da3131da3211da31f1da31d1da3231d19251da3291da3271da32b1da3311da32f1da32d1da3351da3371da3331da3391da33b1da33f1da33d1da3411da3431ddf451da3471da3491da34f1da3511da34b1da34d1da3531da3571da3591da3551da35b1da35d1da35f1da3611da3651da36d1da3631da36b1da3671da3691da36f1da3711da3731da37d1da3751da3771da3791da37b1da37f1da3811da3871da3831da3851da3891da38b1da38d1da38f1da3931da3911da3951da3971da3991da39b1da39d1da3a11da39f1da3a31da3a51da3a71da3a91da3ab1da3ad1da3")\ - X(4 , 0, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038a40638a41038a40e38a41438a41638a40238a40a38a40c38a41838a40438a40838a41a38a41238a42038a41e38a41c38a42238a42438a42838a42638a42a38a43038a42e38a42c38a43438a43638a43238a43838a43a38a43e38a43c38a44038a44238a44438a44638a44838a44e38a45038a44a38a44c38a45238a45638a45838a45438a45a38a45c38a45e38a46038a46438a46c38a46238a46a38a46638a46838a46e38a47038a47238a47c38a47438a47638a47838a47a38a47e38a48038a48638a48238a48438a48838a48a38a48c38a48e38a49238a49038a49438a49638a49838a49a38a49c38a4a038a49e38a4a238a4a438a4a638a4a838a4aa38a4ac38a4")\ - X( 5 , 0, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138a50738a51138a50f38a51538a51738a50338a50b38a50d38a51938a50538a50938a51b38a51338a52138a51f38a51d38a52338152538a52938a52738a52b38a53138a52f38a52d38a53538a53738a53338a53938a53b38a53f38a53d38a54138a54338a54538a54738a54938a54f38a55138a54b38a54d38a55338a55738a55938a55538a55b38a55d38a55f38a56138a56538a56d38a56338a56b38a56738a56938a56f38a57138a57338a57d38a57538a57738a57938a57b38a57f38a58138a58738a58338a58538a58938a58b38a58d38a58f38a59338a59138a59538a59738a59938a59b38a59d38a5a138a59f38a5a338a5a538a5a738a5a938a5ab38a5ad38a5")\ - X(6 , 0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002aa0062aa0102aa00e2aa0142aa0162aa0022aa00a2aa00c2aa0182aa0042aa0082aa01a2aa0122aa0202aa01e2aa01c2aa0222aa0242aa0282aa0262aa02a2aa0302aa02e2aa02c2aa0342aa0362aa0322aa0382aa03a2aa03e2aa03c2aa0402aa0422aa0442aa0462aa0482aa04e2aa0502aa04a2aa04c2aa0522aa0562aa0582aa0542aa05a2aa05c2aa05e2aa0602aa0642aa06c2aa0622aa06a2aa0662aa0682aa06e2aa0702aa0722aa07c2aa0742aa0762aa0782aa07a2aa07e2aa0802aa0862aa0822aa0842aa0882aa08a2aa08c2aa08e2aa0922aa0902aa0942aa0962aa0982aa09a2aa09c2aa0a02aa09e2aa0a22aa0a42aa0a62aa0a82aa0aa2aa0ac2aa0")\ - X( 7 , 0, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036a10636a11036a10e36a11436a11636a10236a10a36a10c36a11836a10436a10836a11a36a11236a12036a11e36a11c36a12236a12436a12836a12636a12a36a13036a12e36a12c36a13436a13636a13236a13836a13a36a13e36a13c36a14036a14236a14436a14636a14836a14e36a15036a14a36a14c36a15236a15636a15836a15436a15a36a15c36a15e36a16036a16436a16c36a16236a16a36a16636a16836a16e36a17036a17236a17c36a17436a17636a17836a17a36a17e36a18036a18636a18236a18436a18836a18a36a18c36a18e36a19236a19036a19436a19636a19836a19a36a19c36a1a036a19e36a1a236a1a436a1a636a1a836a1aa36a1ac36a1")\ + X(2 , 0, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001d11061d11101d110e1d11141d11161d11021d110a1d110c1d11181d11041d11081d111a1d11121d11201d111e1d111c1d11221d11241d11281d11261d112a1d11301d112e1d112c1d11341d11361d11321d11381d113a1d113e1d113c1d11401d11421d11441d11461d11481d114e1d11501d114a1d114c1d11521d11561d11581d11541d115a1d115c1d115e1d11601d11641d116c1d11621d116a1d11661d11681d116e1d11701d11721d117c1d11741d11761d11781d117a1d117e1d11801d11861d11821d11841d11881d118a1d118c1d118e1d11921d11901d11941d11961d11981d119a1d119c1d11a01d119e1d11a21d11a41d11a61d11a81d11aa1d11ac1d11")\ + X( 3 , 0, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011d11071d11111d110f1d11151d11171d11031d110b1d110d1d11191d11051d11091d111b1d11131d11211d111f1d111d1d11231d19251d11291d11271d112b1d11311d112f1d112d1d11351d11371d11331d11391d113b1d113f1d113d1d11411d11431ddf451d11471d11491d114f1d11511d114b1d114d1d11531d11571d11591d11551d115b1d115d1d115f1d11611d11651d116d1d11631d116b1d11671d11691d116f1d11711d11731d117d1d11751d11771d11791d117b1d117f1d11811d11871d11831d11851d11891d118b1d118d1d118f1d11931d11911d11951d11971d11991d119b1d119d1d11a11d119f1d11a31d11a51d11a71d11a91d11ab1d11ad1d11")\ + X(4 , 0, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038120638121038120e38121438121638120238120a38120c38121838120438120838121a38121238122038121e38121c38122238122438122838122638122a38123038122e38122c38123438123638123238123838123a38123e38123c38124038124238124438124638124838124e38125038124a38124c38125238125638125838125438125a38125c38125e38126038126438126c38126238126a38126638126838126e38127038127238127c38127438127638127838127a38127e38128038128638128238128438128838128a38128c38128e38129238129038129438129638129838129a38129c3812a038129e3812a23812a43812a63812a83812aa3812ac3812")\ + X( 5 , 0, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138120738121138120f38121538121738120338120b38120d38121938120538120938121b38121338122138121f38121d38122338152538122938122738122b38123138122f38122d38123538123738123338123938123b38123f38123d38124138124338124538124738124938124f38125138124b38124d38125338125738125938125538125b38125d38125f38126138126538126d38126338126b38126738126938126f38127138127338127d38127538127738127938127b38127f38128138128738128338128538128938128b38128d38128f38129338129138129538129738129938129b38129d3812a138129f3812a33812a53812a73812a93812ab3812ad3812")\ + X(6 , 0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002a10062a10102a100e2a10142a10162a10022a100a2a100c2a10182a10042a10082a101a2a10122a10202a101e2a101c2a10222a10242a10282a10262a102a2a10302a102e2a102c2a10342a10362a10322a10382a103a2a103e2a103c2a10402a10422a10442a10462a10482a104e2a10502a104a2a104c2a10522a10562a10582a10542a105a2a105c2a105e2a10602a10642a106c2a10622a106a2a10662a10682a106e2a10702a10722a107c2a10742a10762a10782a107a2a107e2a10802a10862a10822a10842a10882a108a2a108c2a108e2a10922a10902a10942a10962a10982a109a2a109c2a10a02a109e2a10a22a10a42a10a62a10a82a10aa2a10ac2a10")\ + X( 7 , 0, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036100636101036100e36101436101636100236100a36100c36101836100436100836101a36101236102036101e36101c36102236102436102836102636102a36103036102e36102c36103436103636103236103836103a36103e36103c36104036104236104436104636104836104e36105036104a36104c36105236105636105836105436105a36105c36105e36106036106436106c36106236106a36106636106836106e36107036107236107c36107436107636107836107a36107e36108036108636108236108436108836108a36108c36108e36109236109036109436109636109836109a36109c3610a036109e3610a23610a43610a63610a83610aa3610ac3610")\ X(8 , 0, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "015b5b075b5b115b5b0f5b5b155b5b175b5b035b5b0b5b5b0d5b5b195b5b055b5b095b5b1b5b5b135b5b215b5b1f5b5b1d5b5b235b5b255b5b295b5b275b5b2b5b5b315b5b2f5b5b2d5b5b355b5b375b5b335b5b395b5b3b5b5b3f5b5b3d5b5b415b5b435b5b455b5b475b5b4f5b5b515b5b4b5b5b4d5b5b535b5b575b5b595b5b555b5b5b5b5b5d5b5b5f5b5b615b5b655b5b6d5b5b635b5b6b5b5b675b5b695b5b6f5b5b715b5b735b5b7d5b5b755b5b775b5b795b5b7b5b5b7f5b5b815b5b875b5b835b5b855b5b895b5b8b5b5b8d5b5b935b5b975b5b995b5b9b5b5b9d5b5ba15b5b9f5b5ba35b5ba55b5ba75b5ba95b5bab5b5bad5b5b")\ X( 9 , 0, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "015c5c075c5c115c5c0f5c5c155c5c175c5c035c5c0b5c5c0d5c5c195c5c055c5c095c5c1b5c5c135c5c215c5c1f5c5c1d5c5c235c5c255c5c295c5c275c5c2b5c5c315c5c2f5c5c2d5c5c355c5c375c5c335c5c395c5c3b5c5c3f5c5c3d5c5c415c5c435c5c455c5c475c5c495c5c4f5c5c515c5c4b5c5c4d5c5c535c5c575c5c595c5c555c5c5b5c5c5d5c5c5f5c5c615c5c655c5c6d5c5c635c5c6b5c5c675c5c695c5c6f5c5c715c5c735c5c7d5c5c755c5c775c5c795c5c7b5c5c7f5c5c815c5c875c5c835c5c855c5c895c5c8b5c5c8d5c5c8f5c5c935c5c915c5c955c5c975c5c995c5c9b5c5c9d5c5ca15c5c9f5c5ca35c5ca55c5ca75c5ca95c5cab5c5cad5c5c")\ X(10 , 0, LeftHyper , "Hyper" , "" , 0 , 57445, 'u', -1 , -1 , "")\ From 9bf7d2ca590df19edbaa9e2e971fea142b8ec7a4 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:56:43 +0500 Subject: [PATCH 44/71] #943 WIP: Switch to 'xlat_direct()' --- src/netxs/desktopio/gui.hpp | 2 +- src/netxs/desktopio/input.hpp | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 739bfcabc7..1b04cd9312 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -4670,7 +4670,7 @@ namespace netxs::gui gear.virtcod = virtcod; gear.scancod = scancod; keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); - auto keycode = input::key::xlat(virtcod, scancod, extflag, keymod, xlayout, klid_fallback); + auto keycode = input::key::xlat_direct(virtcod, scancod, extflag, keymod, xlayout, klid_fallback); if ((gear.keystat == input::key::released || keycode != gear.keycode) && keystat == input::key::repeated) keystat = input::key::pressed; // LeftMod+RightMod press is treated by the OS as a repeated LeftMod. gear.keystat = keystat; gear.keycode = keycode; diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 9e6aa4fa88..039b509612 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -3070,10 +3070,20 @@ namespace netxs::input } return keyid; } - auto xlat(si32 vk, si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 layout_fallback) + auto xlat_direct(si32 vk, si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 layout_fallback) { - auto unused_hint = 0; - return xlat(vk, sc, extflag, keymod, xlayout, layout_fallback, unused_hint); + auto keyid = key::undef; + auto numlock = keymod & input::hids::NumLock; + if (xlayout) + { + auto klid = input::key::is_layout_supported(xlayout) ? xlayout + : layout_fallback ? layout_fallback + : input::key::latin_klids[0]; + fix_numpad(sc, numlock, extflag); + auto hash = input::key::key_hash(klid, sc, extflag); + keyid = (si32)input::key::key_map[hash]; + } + return keyid; } } From 5add7f66f832f86e996264894a95b5809224b72f Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Mon, 22 Jun 2026 21:51:45 +0500 Subject: [PATCH 45/71] #943 WIP: Improve functional key lookup --- src/netxs/desktopio/gui.hpp | 34 +- src/netxs/desktopio/input.hpp | 842 +++++++++++++++++----------------- 2 files changed, 451 insertions(+), 425 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 1b04cd9312..3d1506cc98 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3526,7 +3526,7 @@ namespace netxs::gui stream_keybd(gear); gear.payload = input::keybd::type::keypress; } - virtual void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) = 0; + virtual si32 keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) = 0; virtual void keybd_read_vkstat() = 0; virtual void keybd_wipe_vkstat() = 0; virtual bool keybd_read_input() = 0; @@ -3570,8 +3570,8 @@ namespace netxs::gui } auto ctrl_pressed() { - return mfocus.focused() ? keybd_test_pressed(vkey::control) - : keybd_read_pressed(vkey::control); + return mfocus.focused() ? keybd_test_pressed(vkey::ctrl) + : keybd_read_pressed(vkey::ctrl); } auto lbutton_pressed() { @@ -4553,7 +4553,7 @@ namespace netxs::gui if (!is_ralt) // If something else comes instead of RAlt, it means that the LCtrl key was actually pressed. { fake_ctrl = faux; - keybd_send_state(vkey::control, input::key::pressed, input::key::map::data(input::key::LeftCtrl).scan/*0x1d*/); // Send LCtrl actually pressed. + keybd_send_state(vkey::ctrl, input::key::pressed, input::key::map::data(input::key::LeftCtrl).scan/*0x1d*/); // Send LCtrl actually pressed. } } if (fake_ctrl) state |= input::hids::AltGr; // Keep AltGr flag even if RightAlt released. @@ -4570,7 +4570,7 @@ namespace netxs::gui if (keybd_test_pressed(vkey::ralt )) state |= input::hids::RAlt; if (keybd_test_pressed(vkey::lsuper )) state |= input::hids::LSuper; if (keybd_test_pressed(vkey::rsuper )) state |= input::hids::RSuper; - if (keybd_test_pressed(vkey::control )) mouse_capture(by::keybd); // Capture mouse if Ctrl modifier is pressed (to catch Ctrl+AnyClick outside the window). + if (keybd_test_pressed(vkey::ctrl )) mouse_capture(by::keybd); // Capture mouse if Ctrl modifier is pressed (to catch Ctrl+AnyClick outside the window). else mouse_release(by::keybd); auto old_ls = keymod & input::hids::LShift; auto old_rs = keymod & input::hids::RShift; @@ -4669,15 +4669,16 @@ namespace netxs::gui gear.extflag = extflag; gear.virtcod = virtcod; gear.scancod = scancod; - keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); - auto keycode = input::key::xlat_direct(virtcod, scancod, extflag, keymod, xlayout, klid_fallback); + auto virt_ex = keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); + //log("vk=%% vk_ex=%%", utf::to_hex((byte)virtcod), utf::to_hex((byte)virt_ex)); + auto keycode = input::key::xlat_direct(virt_ex, scancod, extflag, keymod, xlayout, klid_fallback); if ((gear.keystat == input::key::released || keycode != gear.keycode) && keystat == input::key::repeated) keystat = input::key::pressed; // LeftMod+RightMod press is treated by the OS as a repeated LeftMod. gear.keystat = keystat; gear.keycode = keycode; gear.xlayout = xlayout; gear.cluster = cluster; if constexpr (debugmode) log("shifted='%%' unshift='%%'", gear.shifted, gear.unshift); - auto repeat_ctrl = keystat == input::key::repeated && (virtcod == vkey::shift || virtcod == vkey::control || virtcod == vkey::alt + auto repeat_ctrl = keystat == input::key::repeated && (virtcod == vkey::shift || virtcod == vkey::ctrl || virtcod == vkey::alt || virtcod == vkey::capslock || virtcod == vkey::numlock || virtcod == vkey::scrllock || virtcod == vkey::lsuper || virtcod == vkey::rsuper); //print_vkstat("keybd_send_state"); @@ -5536,22 +5537,23 @@ namespace netxs::gui auto sc = input::key::map::data(input::key::Space).scan; ::ToUnicodeEx(vk, sc, ks.data(), &uc, 1, 0, 0); } - void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) + si32 keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) { + auto virtcod_ex = virtcod; shifted.clear(); unshift.clear(); auto is_printable = scancod && ((virtcod >= 0x30 && virtcod <= 0x5A) || (virtcod >= 0x60 && virtcod <= 0x6F) || (virtcod >= 0xB8 && virtcod <= 0xE6)); + auto hkl = ::GetKeyboardLayout(0); if (is_printable && virtcod != last_deadkey_vkey) // Alphanumeric + punctuation (excluding deadkeys). { auto buf = wide(8, 0); - auto current_layout = ::GetKeyboardLayout(0); auto flags = extflag ? 1u : 0u; flags |= 2; // ToUnicodeEx will translate scancodes marked as key break events in addition to its usual treatment of key make events. auto vk_un = std::array{}; vk_un[vkey::capslock] = vkstat[vkey::capslock]; - auto rc = ::ToUnicodeEx(virtcod, scancod, vk_un.data(), buf.data(), 8, flags, current_layout); + auto rc = ::ToUnicodeEx(virtcod, scancod, vk_un.data(), buf.data(), 8, flags, hkl); if (rc > 0) { utf::to_utf(buf.data(), rc, unshift); @@ -5560,12 +5562,18 @@ namespace netxs::gui vk_sh[vkey::capslock] = vkstat[vkey::capslock]; vk_sh[vkey::shift ] = 0x80; vk_sh[vkey::lshift ] = 0x80; - rc = ::ToUnicodeEx(virtcod, scancod, vk_sh.data(), buf.data(), 8, flags, current_layout); + rc = ::ToUnicodeEx(virtcod, scancod, vk_sh.data(), buf.data(), 8, flags, hkl); if (rc > 0) { utf::to_utf(buf.data(), rc, shifted); } } + else if (!is_printable && virtcod == vkey::ctrl || virtcod == vkey::alt || virtcod == vkey::shift) + { + if (extflag) scancod |= 0xE000; + virtcod_ex = ::MapVirtualKeyExW(scancod, MAPVK_VSC_TO_VK_EX, hkl); + } + return virtcod_ex; } void layer_present(layer& s) { @@ -6228,7 +6236,7 @@ namespace netxs::gui void keybd_read_vkstat() {} void keybd_send_block(view /*block*/) {} void keybd_sync_layout() {} - void keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, bool /*extflag*/, text& /*shifted*/, text& /*unshift*/) {} + si32 keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, bool /*extflag*/, text& /*shifted*/, text& /*unshift*/) {} void keybd_sync_state(si32 /*virtcod*/) {} void keybd_reset_deadkey() {} bool layer_create(layer& /*s*/, winbase* /*host_ptr*/ = nullptr, twod /*win_coord*/ = {}, twod /*grid_size*/ = {}, dent /*border_dent*/ = {}, twod /*cell_size*/ = {}) { return true; } diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 039b509612..d2ac82e28b 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -70,7 +70,7 @@ namespace netxs::input static constexpr auto xbutton2 = 0x06; // VK_XBUTTON2 static constexpr auto shift = 0x10; // VK_SHIFT - static constexpr auto control = 0x11; // VK_CONTROL + static constexpr auto ctrl = 0x11; // VK_CONTROL static constexpr auto alt = 0x12; // VK_MENU static constexpr auto lshift = 0xA0; // VK_LSHIFT static constexpr auto rshift = 0xA1; // VK_RSHIFT @@ -199,93 +199,93 @@ namespace netxs::input static constexpr auto latin_klids = std::to_array( { - /*500*/ 0x00000409, // US - /*360*/ 0x00000411, // Japanese - /*360*/ 0x00000415, // Polish (Programmers) - /*360*/ 0x00020405, // Czech Programmers - /*360*/ 0x00020418, // Romanian (Programmers) - /*360*/ 0x00010426, // Latvian (QWERTY) - /*360*/ 0x00020426, // Latvian (Standard) - /*360*/ 0x00050408, // Greek Latin - /*360*/ 0x00004009, // English (India) - /*360*/ 0x0000046a, // Yoruba - /*360*/ 0x00000468, // Hausa - /*360*/ 0x00000470, // Igbo - /*360*/ 0x00000481, // Maori - /*360*/ 0x0000046c, // Sesotho sa Leboa - /*353*/ 0x00020409, // United States-International - /*353*/ 0x00010427, // Lithuanian - /*353*/ 0x00000475, // Hawaiian - /*348*/ 0x00000412, // Korean - /*346*/ 0x00050409, // US English Table for IBM Arabic 238_L - /*344*/ 0x0001045d, // Inuktitut - Naqittaut - /*344*/ 0x0000085d, // Inuktitut - Latin - /*343*/ 0x00000452, // United Kingdom Extended - /*336*/ 0x00000809, // United Kingdom - /*336*/ 0x00011809, // Scottish Gaelic - /*336*/ 0x00001809, // Irish - /*332*/ 0x0000042a, // Vietnamese - /*332*/ 0x0000043a, // Maltese 47-Key - /*332*/ 0x0001043a, // Maltese 48-Key - /*318*/ 0x00010418, // Romanian (Standard) - /*313*/ 0x00001009, // Canadian French - /*311*/ 0x00000416, // Portuguese (Brazil ABNT) - /*311*/ 0x00000c0c, // Canadian French (Legacy) - /*308*/ 0x0000041c, // Albanian - /*305*/ 0x00011009, // Canadian Multilingual Standard - /*299*/ 0x0001083b, // Finnish with Sami - /*299*/ 0x00030408, // Greek (220) Latin - /*299*/ 0x00040408, // Greek (319) Latin - /*299*/ 0x0000043b, // Norwegian with Sami - /*299*/ 0x0000041d, // Swedish - /*299*/ 0x0000046f, // Greenlandic - /*299*/ 0x00000474, // Guarani - /*297*/ 0x00010405, // Czech (QWERTY) - /*297*/ 0x0001040a, // Spanish Variation - /*297*/ 0x00000425, // Estonian - /*297*/ 0x0001041b, // Slovak (QWERTY) - /*294*/ 0x00000410, // Italian - /*294*/ 0x00010410, // Italian (142) - /*294*/ 0x00000816, // Portuguese - /*292*/ 0x00000406, // Danish - /*292*/ 0x0000040b, // Finnish - /*292*/ 0x00000413, // Dutch - /*292*/ 0x00000414, // Norwegian - /*292*/ 0x0000040a, // Spanish - /*292*/ 0x0000080a, // Latin American - /*292*/ 0x00000438, // Faeroese - /*291*/ 0x00000405, // Czech - /*290*/ 0x0000040f, // Icelandic - /*289*/ 0x00010415, // Polish (214) - /*289*/ 0x0000041b, // Slovak - /*289*/ 0x0001042e, // Sorbian Extended - /*289*/ 0x0002042e, // Sorbian Standard - /*289*/ 0x0000042e, // Sorbian Standard (Legacy) - /*289*/ 0x0000081a, // Serbian (Latin) - /*285*/ 0x0000040e, // Hungarian - /*282*/ 0x00000407, // German - /*282*/ 0x00020407, // German Extended (E1) - /*282*/ 0x00030407, // German Extended (E2) - /*282*/ 0x00010407, // German (IBM) - /*282*/ 0x0000046e, // Luxembourgish - /*282*/ 0x00000807, // Swiss German - /*282*/ 0x0000041f, // Turkish Q - /*277*/ 0x0001040e, // Hungarian 101-key - /*275*/ 0x00000424, // Slovenian - /*275*/ 0x00060409, // Colemak - /*273*/ 0x00000418, // Romanian (Legacy) - /*267*/ 0x0000085f, // Central Atlas Tamazight - /*267*/ 0x00000488, // Wolof - /*266*/ 0x0001040c, // French (Standard, AZERTY) - /*260*/ 0x0000040c, // French (Legacy, AZERTY) - /*257*/ 0x00000813, // Belgian (Period) - /*257*/ 0x0001080c, // Belgian (Comma) - /*256*/ 0x00020427, // Lithuanian Standard - /*188*/ 0x00010409, // United States-Dvorak - /*172*/ 0x0001041f, // Turkish F - /*165*/ 0x00040409, // United States-Dvorak for right hand - /*160*/ 0x00030409, // United States-Dvorak for left hand - /*155*/ 0x0002040c, // French (Standard, BÉPO) + /*00 500*/ 0x00000409, // US + /*01 360*/ 0x00000411, // Japanese + /*02 360*/ 0x00000415, // Polish (Programmers) + /*03 360*/ 0x00020405, // Czech Programmers + /*04 360*/ 0x00020418, // Romanian (Programmers) + /*05 360*/ 0x00010426, // Latvian (QWERTY) + /*06 360*/ 0x00020426, // Latvian (Standard) + /*07 360*/ 0x00050408, // Greek Latin + /*08 360*/ 0x00004009, // English (India) + /*09 360*/ 0x0000046a, // Yoruba + /*0A 360*/ 0x00000468, // Hausa + /*0B 360*/ 0x00000470, // Igbo + /*0C 360*/ 0x00000481, // Maori + /*0D 360*/ 0x0000046c, // Sesotho sa Leboa + /*0E 353*/ 0x00020409, // United States-International + /*0F 353*/ 0x00010427, // Lithuanian + /*10 353*/ 0x00000475, // Hawaiian + /*11 348*/ 0x00000412, // Korean + /*12 346*/ 0x00050409, // US English Table for IBM Arabic 238_L + /*13 344*/ 0x0001045d, // Inuktitut - Naqittaut + /*14 344*/ 0x0000085d, // Inuktitut - Latin + /*15 343*/ 0x00000452, // United Kingdom Extended + /*16 336*/ 0x00000809, // United Kingdom + /*17 336*/ 0x00011809, // Scottish Gaelic + /*18 336*/ 0x00001809, // Irish + /*19 332*/ 0x0000042a, // Vietnamese + /*1A 332*/ 0x0000043a, // Maltese 47-Key + /*1B 332*/ 0x0001043a, // Maltese 48-Key + /*1C 318*/ 0x00010418, // Romanian (Standard) + /*1D 313*/ 0x00001009, // Canadian French + /*1E 311*/ 0x00000416, // Portuguese (Brazil ABNT) + /*1F 311*/ 0x00000c0c, // Canadian French (Legacy) + /*20 308*/ 0x0000041c, // Albanian + /*21 305*/ 0x00011009, // Canadian Multilingual Standard + /*22 299*/ 0x0001083b, // Finnish with Sami + /*23 299*/ 0x00030408, // Greek (220) Latin + /*24 299*/ 0x00040408, // Greek (319) Latin + /*25 299*/ 0x0000043b, // Norwegian with Sami + /*26 299*/ 0x0000041d, // Swedish + /*27 299*/ 0x0000046f, // Greenlandic + /*28 299*/ 0x00000474, // Guarani + /*29 297*/ 0x00010405, // Czech (QWERTY) + /*2A 297*/ 0x0001040a, // Spanish Variation + /*2B 297*/ 0x00000425, // Estonian + /*2C 297*/ 0x0001041b, // Slovak (QWERTY) + /*2D 294*/ 0x00000410, // Italian + /*2E 294*/ 0x00010410, // Italian (142) + /*2F 294*/ 0x00000816, // Portuguese + /*30 292*/ 0x00000406, // Danish + /*31 292*/ 0x0000040b, // Finnish + /*32 292*/ 0x00000413, // Dutch + /*33 292*/ 0x00000414, // Norwegian + /*34 292*/ 0x0000040a, // Spanish + /*35 292*/ 0x0000080a, // Latin American + /*36 292*/ 0x00000438, // Faeroese + /*37 291*/ 0x00000405, // Czech + /*38 290*/ 0x0000040f, // Icelandic + /*39 289*/ 0x00010415, // Polish (214) + /*3A 289*/ 0x0000041b, // Slovak + /*3B 289*/ 0x0001042e, // Sorbian Extended + /*3C 289*/ 0x0002042e, // Sorbian Standard + /*3D 289*/ 0x0000042e, // Sorbian Standard (Legacy) + /*3E 289*/ 0x0000081a, // Serbian (Latin) + /*3F 285*/ 0x0000040e, // Hungarian + /*40 282*/ 0x00000407, // German + /*41 282*/ 0x00020407, // German Extended (E1) + /*42 282*/ 0x00030407, // German Extended (E2) + /*43 282*/ 0x00010407, // German (IBM) + /*44 282*/ 0x0000046e, // Luxembourgish + /*45 282*/ 0x00000807, // Swiss German + /*46 282*/ 0x0000041f, // Turkish Q + /*47 277*/ 0x0001040e, // Hungarian 101-key + /*48 275*/ 0x00000424, // Slovenian + /*49 275*/ 0x00060409, // Colemak + /*4A 273*/ 0x00000418, // Romanian (Legacy) + /*4B 267*/ 0x0000085f, // Central Atlas Tamazight + /*4C 267*/ 0x00000488, // Wolof + /*4D 266*/ 0x0001040c, // French (Standard, AZERTY) + /*4E 260*/ 0x0000040c, // French (Legacy, AZERTY) + /*4F 257*/ 0x00000813, // Belgian (Period) + /*50 257*/ 0x0001080c, // Belgian (Comma) + /*51 256*/ 0x00020427, // Lithuanian Standard + /*52 188*/ 0x00010409, // United States-Dvorak + /*53 172*/ 0x0001041f, // Turkish F + /*54 165*/ 0x00040409, // United States-Dvorak for right hand + /*55 160*/ 0x00030409, // United States-Dvorak for left hand + /*56 155*/ 0x0002040c, // French (Standard, BÉPO) }); static constexpr auto klid_hash(si32 klid) { @@ -336,328 +336,342 @@ namespace netxs::input // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. #define key_list \ - /* ID Input Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */\ - X(0 , 1, undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(1 , 0, invalid , "invalid" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(2 , 0, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001d11061d11101d110e1d11141d11161d11021d110a1d110c1d11181d11041d11081d111a1d11121d11201d111e1d111c1d11221d11241d11281d11261d112a1d11301d112e1d112c1d11341d11361d11321d11381d113a1d113e1d113c1d11401d11421d11441d11461d11481d114e1d11501d114a1d114c1d11521d11561d11581d11541d115a1d115c1d115e1d11601d11641d116c1d11621d116a1d11661d11681d116e1d11701d11721d117c1d11741d11761d11781d117a1d117e1d11801d11861d11821d11841d11881d118a1d118c1d118e1d11921d11901d11941d11961d11981d119a1d119c1d11a01d119e1d11a21d11a41d11a61d11a81d11aa1d11ac1d11")\ - X( 3 , 0, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011d11071d11111d110f1d11151d11171d11031d110b1d110d1d11191d11051d11091d111b1d11131d11211d111f1d111d1d11231d19251d11291d11271d112b1d11311d112f1d112d1d11351d11371d11331d11391d113b1d113f1d113d1d11411d11431ddf451d11471d11491d114f1d11511d114b1d114d1d11531d11571d11591d11551d115b1d115d1d115f1d11611d11651d116d1d11631d116b1d11671d11691d116f1d11711d11731d117d1d11751d11771d11791d117b1d117f1d11811d11871d11831d11851d11891d118b1d118d1d118f1d11931d11911d11951d11971d11991d119b1d119d1d11a11d119f1d11a31d11a51d11a71d11a91d11ab1d11ad1d11")\ - X(4 , 0, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038120638121038120e38121438121638120238120a38120c38121838120438120838121a38121238122038121e38121c38122238122438122838122638122a38123038122e38122c38123438123638123238123838123a38123e38123c38124038124238124438124638124838124e38125038124a38124c38125238125638125838125438125a38125c38125e38126038126438126c38126238126a38126638126838126e38127038127238127c38127438127638127838127a38127e38128038128638128238128438128838128a38128c38128e38129238129038129438129638129838129a38129c3812a038129e3812a23812a43812a63812a83812aa3812ac3812")\ - X( 5 , 0, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138120738121138120f38121538121738120338120b38120d38121938120538120938121b38121338122138121f38121d38122338152538122938122738122b38123138122f38122d38123538123738123338123938123b38123f38123d38124138124338124538124738124938124f38125138124b38124d38125338125738125938125538125b38125d38125f38126138126538126d38126338126b38126738126938126f38127138127338127d38127538127738127938127b38127f38128138128738128338128538128938128b38128d38128f38129338129138129538129738129938129b38129d3812a138129f3812a33812a53812a73812a93812ab3812ad3812")\ - X(6 , 0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002a10062a10102a100e2a10142a10162a10022a100a2a100c2a10182a10042a10082a101a2a10122a10202a101e2a101c2a10222a10242a10282a10262a102a2a10302a102e2a102c2a10342a10362a10322a10382a103a2a103e2a103c2a10402a10422a10442a10462a10482a104e2a10502a104a2a104c2a10522a10562a10582a10542a105a2a105c2a105e2a10602a10642a106c2a10622a106a2a10662a10682a106e2a10702a10722a107c2a10742a10762a10782a107a2a107e2a10802a10862a10822a10842a10882a108a2a108c2a108e2a10922a10902a10942a10962a10982a109a2a109c2a10a02a109e2a10a22a10a42a10a62a10a82a10aa2a10ac2a10")\ - X( 7 , 0, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036100636101036100e36101436101636100236100a36100c36101836100436100836101a36101236102036101e36101c36102236102436102836102636102a36103036102e36102c36103436103636103236103836103a36103e36103c36104036104236104436104636104836104e36105036104a36104c36105236105636105836105436105a36105c36105e36106036106436106c36106236106a36106636106836106e36107036107236107c36107436107636107836107a36107e36108036108636108236108436108836108a36108c36108e36109236109036109436109636109836109a36109c3610a036109e3610a23610a43610a63610a83610aa3610ac3610")\ - X(8 , 0, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "015b5b075b5b115b5b0f5b5b155b5b175b5b035b5b0b5b5b0d5b5b195b5b055b5b095b5b1b5b5b135b5b215b5b1f5b5b1d5b5b235b5b255b5b295b5b275b5b2b5b5b315b5b2f5b5b2d5b5b355b5b375b5b335b5b395b5b3b5b5b3f5b5b3d5b5b415b5b435b5b455b5b475b5b4f5b5b515b5b4b5b5b4d5b5b535b5b575b5b595b5b555b5b5b5b5b5d5b5b5f5b5b615b5b655b5b6d5b5b635b5b6b5b5b675b5b695b5b6f5b5b715b5b735b5b7d5b5b755b5b775b5b795b5b7b5b5b7f5b5b815b5b875b5b835b5b855b5b895b5b8b5b5b8d5b5b935b5b975b5b995b5b9b5b5b9d5b5ba15b5b9f5b5ba35b5ba55b5ba75b5ba95b5bab5b5bad5b5b")\ - X( 9 , 0, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "015c5c075c5c115c5c0f5c5c155c5c175c5c035c5c0b5c5c0d5c5c195c5c055c5c095c5c1b5c5c135c5c215c5c1f5c5c1d5c5c235c5c255c5c295c5c275c5c2b5c5c315c5c2f5c5c2d5c5c355c5c375c5c335c5c395c5c3b5c5c3f5c5c3d5c5c415c5c435c5c455c5c475c5c495c5c4f5c5c515c5c4b5c5c4d5c5c535c5c575c5c595c5c555c5c5b5c5c5d5c5c5f5c5c615c5c655c5c6d5c5c635c5c6b5c5c675c5c695c5c6f5c5c715c5c735c5c7d5c5c755c5c775c5c795c5c7b5c5c7f5c5c815c5c875c5c835c5c855c5c895c5c8b5c5c8d5c5c8f5c5c935c5c915c5c955c5c975c5c995c5c9b5c5c9d5c5ca15c5c9f5c5ca35c5ca55c5ca75c5ca95c5cab5c5cad5c5c")\ - X(10 , 0, LeftHyper , "Hyper" , "" , 0 , 57445, 'u', -1 , -1 , "")\ - X( 11 , 0, RightHyper , "Hyper" , "" , 0 , 57451, 'u', -1 , -1 , "")\ - X(12 , 0, AltGR , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ - X(14 , 0, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0145900745901145900f45901545901745900345900b45900d45901945900545900945901b45901345902145901f45901d45902345902545902945902745902b45903145902f45902d45903545903745903345903945903b45903f45903d45904145904345904545904745904945904f45905145904b45904d45905345905745905945905545905b45905d45905f45906145906545906d45906345906b45906745906945906f45907145907345907d45907545907745907945907b45907f45908145908745908345908545908945908b45908d45908f45909345909145909545909745909945909b45909d4590a145909f4590a34590a54590a74590a94590ab4590ad4590")\ - X(16 , 0, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14063a14103a140e3a14143a14163a14023a140a3a140c3a14183a14043a14083a141a3a14123a14203a141e3a141c3a14223a14243a14283a14263a142a3a14303a142e3a142c3a14343a14363a14323a14383a143a3a143e3a143c3a14403a14423a14443a14463a14483a144e3a14503a144a3a144c3a14523a14563a14583a14543a145a3a145c3a145e3a14603a14643a146c3a14623a146a3a14663a14683a146e3a14703a14723a147c3a14743a14763a14783a147a3a147e3a14803a14863a14823a14843a14883a148a3a148c3a148e3a14923a14903a14943a14963a14983a149a3a149c3a14a03a149e3a14a23a14a43a14a63a14a83a14aa3a14ac3a14")\ - X(18 , 0, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046910646911046910e46911446911646910246910a46910c46911846910446910846911a46911246912046911e46911c46912246912446912846912646912a46913046912e46912c46913446913646913246913846913a46913e46913c46914046914246914446914646914846914e46915046914a46914c46915246915646915846915446915a46915c46915e46916046916446916c46916246916a46916646916846916e46917046917246917c46917446917646917846917a46917e46918046918646918246918446918846918a46918c46918e46919246919046919446919646919846919a46919c4691a046919e4691a24691a44691a64691a84691aa4691ac4691")\ - X(20 , 0, Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0270f2")\ - X(22 , 0, Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "02791c")\ - X(24 , 0, Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "027b1d")\ - X(26 , 0, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "22f119")\ - X(28 , 0, Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "22f215")\ - X(30 , 0, IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "")\ - X(32 , 0, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "015d5d075d5d115d5d0f5d5d155d5d175d5d035d5d0b5d5d0d5d5d195d5d055d5d095d5d1b5d5d135d5d215d5d1f5d5d1d5d5d235d5d255d5d295d5d275d5d2b5d5d315d5d2f5d5d2d5d5d355d5d375d5d335d5d395d5d3b5d5d3f5d5d3d5d5d415d5d435d5d455d5d475d5d4f5d5d515d5d4b5d5d4d5d5d535d5d575d5d595d5d555d5d5b5d5d5d5d5d5f5d5d615d5d655d5d6d5d5d635d5d6b5d5d675d5d695d5d6f5d5d715d5d735d5d7d5d5d755d5d775d5d795d5d7b5d5d7f5d5d815d5d875d5d835d5d855d5d895d5d8b5d5d8d5d5d935d5d975d5d995d5d9b5d5d9d5d5da15d5d9f5d5da35d5da55d5da75d5da95d5dab5d5dad5d5d")\ - X(34 , 0, Select , "Select" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(36 , 0, Fn , "Fn" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(38 , 0, F1 , "F1" , "" , 0 , 11 , '~', -1 , -1 , "003b70063b70103b700e3b70143b70163b70023b700a3b700c3b70183b70043b70083b701a3b70123b70203b701e3b701c3b70223b70243b70283b70263b702a3b70303b702e3b702c3b70343b70363b70323b70383b703a3b703e3b703c3b70403b70423b70443b70463b70483b704e3b70503b704a3b704c3b70523b70563b70583b70543b705a3b705c3b705e3b70603b70643b706c3b70623b706a3b70663b70683b706e3b70703b70723b707c3b70743b70763b70783b707a3b707e3b70803b70863b70823b70843b70883b708a3b708c3b708e3b70923b70903b70943b70963b70983b709a3b709c3b70a03b709e3b70a23b70a43b70a63b70a83b70aa3b70ac3b70")\ - X(40 , 0, F2 , "F2" , "" , 0 , 12 , '~', -1 , -1 , "003c71063c71103c710e3c71143c71163c71023c710a3c710c3c71183c71043c71083c711a3c71123c71203c711e3c711c3c71223c71243c71283c71263c712a3c71303c712e3c712c3c71343c71363c71323c71383c713a3c713e3c713c3c71403c71423c71443c71463c71483c714e3c71503c714a3c714c3c71523c71563c71583c71543c715a3c715c3c715e3c71603c71643c716c3c71623c716a3c71663c71683c716e3c71703c71723c717c3c71743c71763c71783c717a3c717e3c71803c71863c71823c71843c71883c718a3c718c3c718e3c71923c71903c71943c71963c71983c719a3c719c3c71a03c719e3c71a23c71a43c71a63c71a83c71aa3c71ac3c71")\ - X(42 , 0, F3 , "F3" , "" , 0 , 13 , '~', -1 , -1 , "003d72063d72103d720e3d72143d72163d72023d720a3d720c3d72183d72043d72083d721a3d72123d72203d721e3d721c3d72223d72243d72283d72263d722a3d72303d722e3d722c3d72343d72363d72323d72383d723a3d723e3d723c3d72403d72423d72443d72463d72483d724e3d72503d724a3d724c3d72523d72563d72583d72543d725a3d725c3d725e3d72603d72643d726c3d72623d726a3d72663d72683d726e3d72703d72723d727c3d72743d72763d72783d727a3d727e3d72803d72863d72823d72843d72883d728a3d728c3d728e3d72923d72903d72943d72963d72983d729a3d729c3d72a03d729e3d72a23d72a43d72a63d72a83d72aa3d72ac3d72")\ - X(44 , 0, F4 , "F4" , "" , 0 , 14 , '~', -1 , -1 , "003e73063e73103e730e3e73143e73163e73023e730a3e730c3e73183e73043e73083e731a3e73123e73203e731e3e731c3e73223e73243e73283e73263e732a3e73303e732e3e732c3e73343e73363e73323e73383e733a3e733e3e733c3e73403e73423e73443e73463e73483e734e3e73503e734a3e734c3e73523e73563e73583e73543e735a3e735c3e735e3e73603e73643e736c3e73623e736a3e73663e73683e736e3e73703e73723e737c3e73743e73763e73783e737a3e737e3e73803e73863e73823e73843e73883e738a3e738c3e738e3e73923e73903e73943e73963e73983e739a3e739c3e73a03e739e3e73a23e73a43e73a63e73a83e73aa3e73ac3e73")\ - X(46 , 0, F5 , "F5" , "" , 0 , 15 , '~', -1 , -1 , "003f74063f74103f740e3f74143f74163f74023f740a3f740c3f74183f74043f74083f741a3f74123f74203f741e3f741c3f74223f74243f74283f74263f742a3f74303f742e3f742c3f74343f74363f74323f74383f743a3f743e3f743c3f74403f74423f74443f74463f74483f744e3f74503f744a3f744c3f74523f74563f74583f74543f745a3f745c3f745e3f74603f74643f746c3f74623f746a3f74663f74683f746e3f74703f74723f747c3f74743f74763f74783f747a3f747e3f74803f74863f74823f74843f74883f748a3f748c3f748e3f74923f74903f74943f74963f74983f749a3f749c3f74a03f749e3f74a23f74a43f74a63f74a83f74aa3f74ac3f74")\ - X(48 , 0, F6 , "F6" , "" , 0 , 17 , '~', -1 , -1 , "0040750640751040750e40751440751640750240750a40750c40751840750440750840751a40751240752040751e40751c40752240752440752840752640752a40753040752e40752c40753440753640753240753840753a40753e40753c40754040754240754440754640754840754e40755040754a40754c40755240755640755840755440755a40755c40755e40756040756440756c40756240756a40756640756840756e40757040757240757c40757440757640757840757a40757e40758040758640758240758440758840758a40758c40758e40759240759040759440759640759840759a40759c4075a040759e4075a24075a44075a64075a84075aa4075ac4075")\ - X(50 , 0, F7 , "F7" , "" , 0 , 18 , '~', -1 , -1 , "0041760641761041760e41761441761641760241760a41760c41761841760441760841761a41761241762041761e41761c41762241762441762841762641762a41763041762e41762c41763441763641763241763841763a41763e41763c41764041764241764441764641764841764e41765041764a41764c41765241765641765841765441765a41765c41765e41766041766441766c41766241766a41766641766841766e41767041767241767c41767441767641767841767a41767e41768041768641768241768441768841768a41768c41768e41769241769041769441769641769841769a41769c4176a041769e4176a24176a44176a64176a84176aa4176ac4176")\ - X(52 , 0, F8 , "F8" , "" , 0 , 19 , '~', -1 , -1 , "0042770642771042770e42771442771642770242770a42770c42771842770442770842771a42771242772042771e42771c42772242772442772842772642772a42773042772e42772c42773442773642773242773842773a42773e42773c42774042774242774442774642774842774e42775042774a42774c42775242775642775842775442775a42775c42775e42776042776442776c42776242776a42776642776842776e42777042777242777c42777442777642777842777a42777e42778042778642778242778442778842778a42778c42778e42779242779042779442779642779842779a42779c4277a042779e4277a24277a44277a64277a84277aa4277ac4277")\ - X(54 , 0, F9 , "F9" , "" , 0 , 20 , '~', -1 , -1 , "0043780643781043780e43781443781643780243780a43780c43781843780443780843781a43781243782043781e43781c43782243782443782843782643782a43783043782e43782c43783443783643783243783843783a43783e43783c43784043784243784443784643784843784e43785043784a43784c43785243785643785843785443785a43785c43785e43786043786443786c43786243786a43786643786843786e43787043787243787c43787443787643787843787a43787e43788043788643788243788443788843788a43788c43788e43789243789043789443789643789843789a43789c4378a043789e4378a24378a44378a64378a84378aa4378ac4378")\ - X(56 , 0, F10 , "F10" , "" , 0 , 21 , '~', -1 , -1 , "0044790644791044790e44791444791644790244790a44790c44791844790444790844791a44791244792044791e44791c44792244792444792844792644792a44793044792e44792c44793444793644793244793844793a44793e44793c44794044794244794444794644794844794e44795044794a44794c44795244795644795844795444795a44795c44795e44796044796444796c44796244796a44796644796844796e44797044797244797c44797444797644797844797a44797e44798044798644798244798444798844798a44798c44798e44799244799044799444799644799844799a44799c4479a044799e4479a24479a44479a64479a84479aa4479ac4479")\ - X(58 , 0, F11 , "F11" , "" , 0 , 23 , '~', -1 , -1 , "00577a06577a10577a0e577a14577a16577a02577a0a577a0c577a18577a04577a08577a1a577a12577a20577a1e577a1c577a22577a24577a28577a26577a2a577a30577a2e577a2c577a34577a36577a32577a38577a3a577a3e577a3c577a40577a42577a44577a46577a48577a4e577a50577a4a577a4c577a52577a56577a58577a54577a5a577a5c577a5e577a60577a64577a6c577a62577a6a577a66577a68577a6e577a70577a72577a7c577a74577a76577a78577a7a577a7e577a80577a86577a82577a84577a88577a8a577a8c577a8e577a92577a90577a94577a96577a98577a9a577a9c577aa0577a9e577aa2577aa4577aa6577aa8577aaa577aac577a")\ - X(60 , 0, F12 , "F12" , "" , 0 , 24 , '~', -1 , -1 , "00587b06587b10587b0e587b14587b16587b02587b0a587b0c587b18587b04587b08587b1a587b12587b20587b1e587b1c587b22587b24587b28587b26587b2a587b30587b2e587b2c587b34587b36587b32587b38587b3a587b3e587b3c587b40587b42587b44587b46587b48587b4e587b50587b4a587b4c587b52587b56587b58587b54587b5a587b5c587b5e587b60587b64587b6c587b62587b6a587b66587b68587b6e587b70587b72587b7c587b74587b76587b78587b7a587b7e587b80587b86587b82587b84587b88587b8a587b8c587b8e587b92587b90587b94587b96587b98587b9a587b9c587ba0587b9e587ba2587ba4587ba6587ba8587baa587bac587b")\ - X(62 , 0, F13 , "F13" , "" , 0 , 57376, 'u', -1 , -1 , "00647c06647c10647c0e647c14647c16647c02647c0a647c0c647c18647c04647c08647c1a647c12647c20647c1e647c1c647c22647c24647c28647c26647c2a647c30647c2e647c2c647c34647c36647c32647c38647c3a647c3e647c3c647c40647c42647c44647c46647c48647c4e647c50647c4a647c4c647c52647c56647c58647c54647c5a647c5c647c5e647c60647c64647c6c647c62647c6a647c66647c68647c6e647c70647c72647c7c647c74647c76647c78647c7a647c7e647c80647c86647c82647c84647c88647c8a647c8c647c8e647c92647c90647c94647c96647c98647c9a647c9c647ca0647c9e647ca2647ca4647ca6647ca8647caa647cac647c")\ - X(64 , 0, F14 , "F14" , "" , 0 , 57377, 'u', -1 , -1 , "00657d06657d10657d0e657d14657d16657d02657d0a657d0c657d18657d04657d08657d1a657d12657d20657d1e657d1c657d22657d24657d28657d26657d2a657d30657d2e657d2c657d34657d36657d32657d38657d3a657d3e657d3c657d40657d42657d44657d46657d48657d4e657d50657d4a657d4c657d52657d56657d58657d54657d5a657d5c657d5e657d60657d64657d6c657d62657d6a657d66657d68657d6e657d70657d72657d7c657d74657d76657d78657d7a657d7e657d80657d86657d82657d84657d88657d8a657d8c657d8e657d92657d90657d94657d96657d98657d9a657d9c657da0657d9e657da2657da4657da6657da8657daa657dac657d")\ - X(66 , 0, F15 , "F15" , "" , 0 , 57378, 'u', -1 , -1 , "00667e06667e10667e0e667e14667e16667e02667e0a667e0c667e18667e04667e08667e1a667e12667e20667e1e667e1c667e22667e24667e28667e26667e2a667e30667e2e667e2c667e34667e36667e32667e38667e3a667e3e667e3c667e40667e42667e44667e46667e48667e4e667e50667e4a667e4c667e52667e56667e58667e54667e5a667e5c667e5e667e60667e64667e6c667e62667e6a667e66667e68667e6e667e70667e72667e7c667e74667e76667e78667e7a667e7e667e80667e86667e82667e84667e88667e8a667e8c667e8e667e92667e90667e94667e96667e98667e9a667e9c667ea0667e9e667ea2667ea4667ea6667ea8667eaa667eac667e")\ - X(68 , 0, F16 , "F16" , "" , 0 , 57379, 'u', -1 , -1 , "00677f06677f10677f0e677f14677f16677f02677f0a677f0c677f18677f04677f08677f1a677f12677f20677f1e677f1c677f22677f24677f28677f26677f2a677f30677f2e677f2c677f34677f36677f32677f38677f3a677f3e677f3c677f40677f42677f44677f46677f48677f4e677f50677f4a677f4c677f52677f56677f58677f54677f5a677f5c677f5e677f60677f64677f6c677f62677f6a677f66677f68677f6e677f70677f72677f7c677f74677f76677f78677f7a677f7e677f80677f86677f82677f84677f88677f8a677f8c677f8e677f92677f90677f94677f96677f98677f9a677f9c677fa0677f9e677fa2677fa4677fa6677fa8677faa677fac677f")\ - X(70 , 0, F17 , "F17" , "" , 0 , 57380, 'u', -1 , -1 , "0068800668801068800e68801468801668800268800a68800c68801868800468800868801a68801268802068801e68801c68802268802468802868802668802a68803068802e68802c68803468803668803268803868803a68803e68803c68804068804268804468804668804868804e68805068804a68804c68805268805668805868805468805a68805c68805e68806068806468806c68806268806a68806668806868806e68807068807268807c68807468807668807868807a68807e68808068808668808268808468808868808a68808c68808e68809268809068809468809668809868809a68809c6880a068809e6880a26880a46880a66880a86880aa6880ac6880")\ - X(72 , 0, F18 , "F18" , "" , 0 , 57381, 'u', -1 , -1 , "0069810669811069810e69811469811669810269810a69810c69811869810469810869811a69811269812069811e69811c69812269812469812869812669812a69813069812e69812c69813469813669813269813869813a69813e69813c69814069814269814469814669814869814e69815069814a69814c69815269815669815869815469815a69815c69815e69816069816469816c69816269816a69816669816869816e69817069817269817c69817469817669817869817a69817e69818069818669818269818469818869818a69818c69818e69819269819069819469819669819869819a69819c6981a069819e6981a26981a46981a66981a86981aa6981ac6981")\ - X(74 , 0, F19 , "F19" , "" , 0 , 57382, 'u', -1 , -1 , "006a82066a82106a820e6a82146a82166a82026a820a6a820c6a82186a82046a82086a821a6a82126a82206a821e6a821c6a82226a82246a82286a82266a822a6a82306a822e6a822c6a82346a82366a82326a82386a823a6a823e6a823c6a82406a82426a82446a82466a82486a824e6a82506a824a6a824c6a82526a82566a82586a82546a825a6a825c6a825e6a82606a82646a826c6a82626a826a6a82666a82686a826e6a82706a82726a827c6a82746a82766a82786a827a6a827e6a82806a82866a82826a82846a82886a828a6a828c6a828e6a82926a82906a82946a82966a82986a829a6a829c6a82a06a829e6a82a26a82a46a82a66a82a86a82aa6a82ac6a82")\ - X(76 , 0, F20 , "F20" , "" , 0 , 57383, 'u', -1 , -1 , "006b83066b83106b830e6b83146b83166b83026b830a6b830c6b83186b83046b83086b831a6b83126b83206b831e6b831c6b83226b83246b83286b83266b832a6b83306b832e6b832c6b83346b83366b83326b83386b833a6b833e6b833c6b83406b83426b83446b83466b83486b834e6b83506b834a6b834c6b83526b83566b83586b83546b835a6b835c6b835e6b83606b83646b836c6b83626b836a6b83666b83686b836e6b83706b83726b837c6b83746b83766b83786b837a6b837e6b83806b83866b83826b83846b83886b838a6b838c6b838e6b83926b83906b83946b83966b83986b839a6b839c6b83a06b839e6b83a26b83a46b83a66b83a86b83aa6b83ac6b83")\ - X(78 , 0, F21 , "F21" , "" , 0 , 57384, 'u', -1 , -1 , "006c84066c84106c840e6c84146c84166c84026c840a6c840c6c84186c84046c84086c841a6c84126c84206c841e6c841c6c84226c84246c84286c84266c842a6c84306c842e6c842c6c84346c84366c84326c84386c843a6c843e6c843c6c84406c84426c84446c84466c84486c844e6c84506c844a6c844c6c84526c84566c84586c84546c845a6c845c6c845e6c84606c84646c846c6c84626c846a6c84666c84686c846e6c84706c84726c847c6c84746c84766c84786c847a6c847e6c84806c84866c84826c84846c84886c848a6c848c6c848e6c84926c84906c84946c84966c84986c849a6c849c6c84a06c849e6c84a26c84a46c84a66c84a86c84aa6c84ac6c84")\ - X(80 , 0, F22 , "F22" , "" , 0 , 57385, 'u', -1 , -1 , "006d85066d85106d850e6d85146d85166d85026d850a6d850c6d85186d85046d85086d851a6d85126d85206d851e6d851c6d85226d85246d85286d85266d852a6d85306d852e6d852c6d85346d85366d85326d85386d853a6d853e6d853c6d85406d85426d85446d85466d85486d854e6d85506d854a6d854c6d85526d85566d85586d85546d855a6d855c6d855e6d85606d85646d856c6d85626d856a6d85666d85686d856e6d85706d85726d857c6d85746d85766d85786d857a6d857e6d85806d85866d85826d85846d85886d858a6d858c6d858e6d85926d85906d85946d85966d85986d859a6d859c6d85a06d859e6d85a26d85a46d85a66d85a86d85aa6d85ac6d85")\ - X(82 , 0, F23 , "F23" , "" , 0 , 57386, 'u', -1 , -1 , "006e86066e86106e860e6e86146e86166e86026e860a6e860c6e86186e86046e86086e861a6e86126e86206e861e6e861c6e86226e86246e86286e86266e862a6e86306e862e6e862c6e86346e86366e86326e86386e863a6e863e6e863c6e86406e86426e86446e86466e86486e864e6e86506e864a6e864c6e86526e86566e86586e86546e865a6e865c6e865e6e86606e86646e866c6e86626e866a6e86666e86686e866e6e86706e86726e867c6e86746e86766e86786e867a6e867e6e86806e86866e86826e86846e86886e868a6e868c6e868e6e86926e86906e86946e86966e86986e869a6e869c6e86a06e869e6e86a26e86a46e86a66e86a86e86aa6e86ac6e86")\ - X(84 , 0, F24 , "F24" , "" , 0 , 57387, 'u', -1 , -1 , "006f87066f87106f870e6f87146f87166f87026f870a6f870c6f87186f87046f87086f871a6f87126f87206f871e6f871c6f87226f87246f87286f87266f872a6f87306f872e6f872c6f87346f87366f87326f87386f873a6f873e6f873c6f87406f87426f87446f87466f87486f874e6f87506f874a6f874c6f87526f87566f87586f87546f875a6f875c6f875e6f87606f87646f876c6f87626f876a6f87666f87686f876e6f87706f87726f877c6f87746f87766f87786f877a6f877e6f87806f87866f87826f87846f87886f878a6f878c6f878e6f87926f87906f87946f87966f87986f879a6f879c6f87a06f879e6f87a26f87a46f87a66f87a86f87aa6f87ac6f87")\ - X(86 , 0, F25 , "F25" , "" , 0 , 57388, 'u', -1 , -1 , "")\ - X(88 , 0, F26 , "F26" , "" , 0 , 57389, 'u', -1 , -1 , "")\ - X(90 , 0, F27 , "F27" , "" , 0 , 57390, 'u', -1 , -1 , "")\ - X(92 , 0, F28 , "F28" , "" , 0 , 57391, 'u', -1 , -1 , "")\ - X(94 , 0, F29 , "F29" , "" , 0 , 57392, 'u', -1 , -1 , "")\ - X(96 , 0, F30 , "F30" , "" , 0 , 57393, 'u', -1 , -1 , "")\ - X(98 , 0, F31 , "F31" , "" , 0 , 57394, 'u', -1 , -1 , "")\ - X(100 , 0, F32 , "F32" , "" , 0 , 57395, 'u', -1 , -1 , "")\ - X(102 , 0, F33 , "F33" , "" , 0 , 57396, 'u', -1 , -1 , "")\ - X(104 , 0, F34 , "F34" , "" , 0 , 57397, 'u', -1 , -1 , "")\ - X(106 , 0, F35 , "F35" , "" , 0 , 57398, 'u', -1 , -1 , "")\ - X(108 , 0, PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "01372c07372c11372c0f372c15372c17372c03372c0b372c0d372c19372c05372c09372c1b372c13372c21372c1f372c1d372c23372c25372c29372c27372c2b372c31372c2f372c2d372c35372c37372c33372c39372c3b372c3f372c3d372c41372c43372c45372c47372c49372c4f372c51372c4b372c4d372c53372c57372c59372c55372c5b372c5d372c5f372c61372c65372c6d372c63372c6b372c67372c69372c6f372c71372c73372c7d372c75372c77372c79372c7b372c7f372c81372c87372c83372c85372c89372c8b372c8d372c8f372c93372c91372c95372c97372c99372c9b372c9d372ca1372c9f372ca3372ca5372ca7372ca9372cab372cad372c")\ - X(110 , 0, Pause , "Pause" , "" , 0 , 57362, 'u', '\x1a', '\x03', "0045900645901045900e45901445901645900245900a45900c45901845900445900845901a45901245902045901e45901c45902245902445902845902645902a45903045902e45902c45903445903645903245903845903a45903e45903c45904045904245904445904645904845904e45905045904a45904c45905245905645905845905445905a45905c45905e45906045906445906c45906245906a45906645906845906e45907045907245907c45907445907645907845907a45907e45908045908645908245908445908845908a45908c45908e45909245909045909445909645909845909a45909c4590a045909e4590a24590a44590a64590a84590aa4590ac4590")\ - X(112 , 1, Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0146030746031146030f46031546031746030346030b46030d46031946030546030946031b46031346032146031f46031d46032346032546032946032746032b46033146032f46032d46033546033746033346033946033b46033f46033d46034146034346034546034746034946034f46035146034b46034d46035346035746035946035546035b46035d46035f46036146036546036d46036346036b46036746036946036f46037146037346037d46037546037746037946037b46037f46038146038746038346038546038946038b46038d46038f46039346039146039546039746039946039b46039d4603a146039f4603a34603a54603a74603a94603ab4603ad4603")\ - X(114 , 1, SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c06542c10542c0e542c14542c16542c02542c0a542c0c542c18542c04542c08542c1a542c12542c20542c1e542c22542c24542c28542c26542c2a542c34542c36542c38542c3c542c40542c44542c46542c48542c4e542c50542c4a542c4c542c52542c56542c58542c6e542c72542c7c542c74542c76542c78542c7a542c7e542c8c542c8e542c92542c90542c94542c96542c98542ca2542ca6542ca8542caa542c")\ - X(116 , 1, Esc , "Esc" , "\x1B", 0x1b , 27 , 'u', '\x1b', '\x1b', "00011b06011b10011b0e011b14011b16011b02011b0a011b0c011b18011b04011b08011b1a011b12011b20011b1e011b1c011b22011b24011b28011b26011b2a011b30011b2e011b2c011b34011b36011b32011b38011b3a011b3e011b3c011b40011b42011b44011b46011b48011b4e011b50011b4a011b4c011b52011b56011b58011b54011b5a011b5c011b5e011b60011b64011b6c011b62011b6a011b66011b68011b6e011b70011b72011b7c011b74011b76011b78011b7a011b7e011b80011b86011b82011b84011b88011b8a011b8c011b8e011b92011b90011b94011b96011b98011b9a011b9c011ba0011b9e011ba2011ba4011ba6011ba8011baa011bac011b")\ - X(118 , 1, Tab , "Tab" , "\x09", 0x09 , 9 , 'u', '\x09', '\x09', "000f09060f09100f090e0f09140f09160f09020f090a0f090c0f09180f09040f09080f091a0f09120f09200f091e0f091c0f09220f09240f09280f09260f092a0f09300f092e0f092c0f09340f09360f09320f09380f093a0f093e0f093c0f09400f09420f09440f09460f09480f094e0f09500f094a0f094c0f09520f09560f09580f09540f095a0f095c0f095e0f09600f09640f096c0f09620f096a0f09660f09680f096e0f09700f09720f097c0f09740f09760f09780f097a0f097e0f09800f09860f09820f09840f09880f098a0f098c0f098e0f09920f09900f09940f09960f09980f099a0f099c0f09a00f099e0f09a20f09a40f09a60f09a80f09aa0f09ac0f09")\ - X(120 , 1, Backspace , "Backspace" , "\x08", 0x08 , 127 , 'u', '\x7f', '\x08', "000e08060e08100e080e0e08140e08160e08020e080a0e080c0e08180e08040e08080e081a0e08120e08200e081e0e081c0e08220e08240e08280e08260e082a0e08300e082e0e082c0e08340e08360e08320e08380e083a0e083e0e083c0e08400e08420e08440e08460e08480e084e0e08500e084a0e084c0e08520e08560e08580e08540e085a0e085c0e085e0e08600e08640e086c0e08620e086a0e08660e08680e086e0e08700e08720e087c0e08740e08760e08780e087a0e087e0e08800e08860e08820e08840e08880e088a0e088c0e088e0e08920e08900e08940e08960e08980e089a0e089c0e08a00e089e0e08a20e08a40e08a60e08a80e08aa0e08ac0e08")\ - X(122 , 1, Space , "Space" , "\x20", 0x20 , 32 , 'u', '\x20', '\0' , "0039200639201039200e39201439201639200239200a39200c39201839200439200839201a39201239202039201e39201c39202239202439202839202639202a39203039202e39202c39203439203639203239203839203a39203e39203c39204039204239204439204639204839204e39205039204a39204c39205239205639205839205439205a39205c39205e39206039206439206c39206239206a39206639206839206e39207039207239207c39207439207639207839207a39207e39208039208639208239208439208839208a39208c39208e39209239209039209439209639209839209a39209c3920a039209e3920a23920a43920a63920a83920aa3920ac3920")\ - X(124 , 1, KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d061c0d101c0d0e1c0d141c0d161c0d021c0d0a1c0d0c1c0d181c0d041c0d081c0d1a1c0d121c0d201c0d1e1c0d1c1c0d221c0d241c0d281c0d261c0d2a1c0d301c0d2e1c0d2c1c0d341c0d361c0d321c0d381c0d3a1c0d3e1c0d3c1c0d401c0d421c0d441c0d461c0d481c0d4e1c0d501c0d4a1c0d4c1c0d521c0d561c0d581c0d541c0d5a1c0d5c1c0d5e1c0d601c0d641c0d6c1c0d621c0d6a1c0d661c0d681c0d6e1c0d701c0d721c0d7c1c0d741c0d761c0d781c0d7a1c0d7e1c0d801c0d861c0d821c0d841c0d881c0d8a1c0d8c1c0d8e1c0d921c0d901c0d941c0d961c0d981c0d9a1c0d9c1c0da01c0d9e1c0da21c0da41c0da61c0da81c0daa1c0dac1c0d")\ - X( 125, 1, NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "011c0d071c0d111c0d0f1c0d151c0d171c0d031c0d0b1c0d0d1c0d191c0d051c0d091c0d1b1c0d131c0d211c0d1f1c0d1d1c0d231c0d251c0d291c0d271c0d2b1c0d311c0d2f1c0d2d1c0d351c0d371c0d331c0d391c0d3b1c0d3f1c0d3d1c0d411c0d431c0d451c0d471c0d491c0d4f1c0d511c0d4b1c0d4d1c0d531c0d571c0d591c0d551c0d5b1c0d5d1c0d5f1c0d611c0d651c0d6d1c0d631c0d6b1c0d671c0d691c0d6f1c0d711c0d731c0d7d1c0d751c0d771c0d791c0d7b1c0d7f1c0d811c0d871c0d831c0d851c0d891c0d8b1c0d8d1c0d8f1c0d931c0d911c0d951c0d971c0d991c0d9b1c0d9d1c0da11c0d9f1c0da31c0da51c0da71c0da91c0dab1c0dad1c0d")\ - X(126 , 1, KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "01522d07522d11522d0f522d15522d17522d03522d0b522d0d522d19522d05522d09522d1b522d13522d21522d1f522d1d522d23522d25522d29522d27522d2b522d31522d2f522d2d522d35522d37522d33522d39522d3b522d3f522d3d522d41522d43522d45522d47522d49522d4f522d51522d4b522d4d522d53522d57522d59522d55522d5b522d5d522d5f522d61522d65522d6d522d63522d6b522d67522d69522d6f522d71522d73522d7d522d75522d77522d79522d7b522d7f522d81522d87522d83522d85522d89522d8b522d8d522d8f522d93522d91522d95522d97522d99522d9b522d9d522da1522d9f522da3522da5522da7522da9522dab522dad522d")\ - X( 127, 1, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00822d06822d10822d0e822d14822d16822d02822d0a822d0c822d18822d04822d08822d1a822d12822d20822d1e822d1c822d22822d24822d28822d26822d2a822d30822d2e822d2c822d34822d36822d32822d38822d3a822d3e822d3c822d40822d42822d44822d46822d48822d4e822d50822d4a822d4c822d52822d56822d58822d54822d5a822d5c822d5e822d60822d64822d6c822d62822d6a822d66822d68822d6e822d70822d72822d7c822d74822d76822d78822d7a822d7e822d80822d86822d82822d84822d88822d8a822d8c822d8e822d92822d90822d94822d96822d98822d9a822d9c822da0822d9e822da2822da4822da6822da8822daa822dac822d")\ - X(128 , 1, KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "01532e07532e11532e0f532e15532e17532e03532e0b532e0d532e19532e05532e09532e1b532e13532e21532e1f532e1d532e23532e25532e29532e27532e2b532e31532e2f532e2d532e35532e37532e33532e39532e3b532e3f532e3d532e41532e43532e45532e47532e49532e4f532e51532e4b532e4d532e53532e57532e59532e55532e5b532e5d532e5f532e61532e65532e6d532e63532e6b532e67532e69532e6f532e71532e73532e7d532e75532e77532e79532e7b532e7f532e81532e87532e83532e85532e89532e8b532e8d532e8f532e93532e91532e95532e97532e99532e9b532e9d532ea1532e9f532ea3532ea5532ea7532ea9532eab532ead532e")\ - X( 129, 1, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00832e06832e10832e0e832e14832e16832e02832e0a832e0c832e18832e04832e08832e1a832e12832e20832e1e832e1c832e22832e24832e28832e26832e2a832e30832e2e832e2c832e34832e36832e32832e38832e3a832e3e832e3c832e40832e42832e44832e46832e48832e4e832e50832e4a832e4c832e52832e56832e58832e54832e5a832e5c832e5e832e60832e64832e6c832e62832e6a832e66832e68832e6e832e70832e72832e7c832e74832e76832e78832e7a832e7e832e80832e86832e82832e84832e88832e8a832e8c832e8e832e92832e90832e94832e96832e98832e9a832e9c832ea0832e9e832ea2832ea4832ea6832ea8832eaa832eac832e")\ - X(130 , 1, KeyClear , "Clear" , "" , 0 , 1 , 'E', -1 , -1 , "")\ - X( 131, 1, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "008c0c068c0c108c0c0e8c0c148c0c168c0c028c0c0a8c0c0c8c0c188c0c048c0c088c0c1a8c0c128c0c208c0c1e8c0c1c8c0c228c0c248c0c288c0c268c0c2a8c0c308c0c2e8c0c2c8c0c348c0c368c0c328c0c388c0c3a8c0c3e8c0c3c8c0c408c0c428c0c448c0c468c0c488c0c4e8c0c508c0c4a8c0c4c8c0c528c0c568c0c588c0c548c0c5a8c0c5c8c0c5e8c0c608c0c648c0c6c8c0c628c0c6a8c0c668c0c688c0c6e8c0c708c0c728c0c7c8c0c748c0c768c0c788c0c7a8c0c7e8c0c808c0c868c0c828c0c848c0c888c0c8a8c0c8c8c0c8e8c0c928c0c908c0c948c0c968c0c988c0c9a8c0c9c8c0ca08c0c9e8c0ca28c0ca48c0ca68c0ca88c0caa8c0cac8c0c")\ - X(132 , 1, KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0149210749211149210f49211549211749210349210b49210d49211949210549210949211b49211349212149211f49211d49212349212549212949212749212b49213149212f49212d49213549213749213349213949213b49213f49213d49214149214349214549214749214949214f49215149214b49214d49215349215749215949215549215b49215d49215f49216149216549216d49216349216b49216749216949216f49217149217349217d49217549217749217949217b49217f49218149218749218349218549218949218b49218d49218f49219349219149219549219749219949219b49219d4921a149219f4921a34921a54921a74921a94921ab4921ad4921")\ - X( 133, 1, NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0089210689211089210e89211489211689210289210a89210c89211889210489210889211a89211289212089211e89211c89212289212489212889212689212a89213089212e89212c89213489213689213289213889213a89213e89213c89214089214289214489214689214889214e89215089214a89214c89215289215689215889215489215a89215c89215e89216089216489216c89216289216a89216689216889216e89217089217289217c89217489217689217889217a89217e89218089218689218289218489218889218a89218c89218e89219289219089219489219689219889219a89219c8921a089219e8921a28921a48921a68921a88921aa8921ac8921")\ - X(134 , 1, KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0151220751221151220f51221551221751220351220b51220d51221951220551220951221b51221351222151221f51221d51222351222551222951222751222b51223151222f51222d51223551223751223351223951223b51223f51223d51224151224351224551224751224951224f51225151224b51224d51225351225751225951225551225b51225d51225f51226151226551226d51226351226b51226751226951226f51227151227351227d51227551227751227951227b51227f51228151228751228351228551228951228b51228d51228f51229351229151229551229751229951229b51229d5122a151229f5122a35122a55122a75122a95122ab5122ad5122")\ - X( 135, 1, NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0081220681221081220e81221481221681220281220a81220c81221881220481220881221a81221281222081221e81221c81222281222481222881222681222a81223081222e81222c81223481223681223281223881223a81223e81223c81224081224281224481224681224881224e81225081224a81224c81225281225681225881225481225a81225c81225e81226081226481226c81226281226a81226681226881226e81227081227281227c81227481227681227881227a81227e81228081228681228281228481228881228a81228c81228e81229281229081229481229681229881229a81229c8122a081229e8122a28122a48122a68122a88122aa8122ac8122")\ - X(136 , 1, KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0147240747241147240f47241547241747240347240b47240d47241947240547240947241b47241347242147241f47241d47242347242547242947242747242b47243147242f47242d47243547243747243347243947243b47243f47243d47244147244347244547244747244947244f47245147244b47244d47245347245747245947245547245b47245d47245f47246147246547246d47246347246b47246747246947246f47247147247347247d47247547247747247947247b47247f47248147248747248347248547248947248b47248d47248f47249347249147249547249747249947249b47249d4724a147249f4724a34724a54724a74724a94724ab4724ad4724")\ - X( 137, 1, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0087240687241087240e87241487241687240287240a87240c87241887240487240887241a87241287242087241e87241c87242287242487242887242687242a87243087242e87242c87243487243687243287243887243a87243e87243c87244087244287244487244687244887244e87245087244a87244c87245287245687245887245487245a87245c87245e87246087246487246c87246287246a87246687246887246e87247087247287247c87247487247687247887247a87247e87248087248687248287248487248887248a87248c87248e87249287249087249487249687249887249a87249c8724a087249e8724a28724a48724a68724a88724aa8724ac8724")\ - X(138 , 1, KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "014f23074f23114f230f4f23154f23174f23034f230b4f230d4f23194f23054f23094f231b4f23134f23214f231f4f231d4f23234f23254f23294f23274f232b4f23314f232f4f232d4f23354f23374f23334f23394f233b4f233f4f233d4f23414f23434f23454f23474f23494f234f4f23514f234b4f234d4f23534f23574f23594f23554f235b4f235d4f235f4f23614f23654f236d4f23634f236b4f23674f23694f236f4f23714f23734f237d4f23754f23774f23794f237b4f237f4f23814f23874f23834f23854f23894f238b4f238d4f238f4f23934f23914f23954f23974f23994f239b4f239d4f23a14f239f4f23a34f23a54f23a74f23a94f23ab4f23ad4f23")\ - X( 139, 1, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "008f23068f23108f230e8f23148f23168f23028f230a8f230c8f23188f23048f23088f231a8f23128f23208f231e8f231c8f23228f23248f23288f23268f232a8f23308f232e8f232c8f23348f23368f23328f23388f233a8f233e8f233c8f23408f23428f23448f23468f23488f234e8f23508f234a8f234c8f23528f23568f23588f23548f235a8f235c8f235e8f23608f23648f236c8f23628f236a8f23668f23688f236e8f23708f23728f237c8f23748f23768f23788f237a8f237e8f23808f23868f23828f23848f23888f238a8f238c8f238e8f23928f23908f23948f23968f23988f239a8f239c8f23a08f239e8f23a28f23a48f23a68f23a88f23aa8f23ac8f23")\ - X(140 , 1, KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "014b25074b25114b250f4b25154b25174b25034b250b4b250d4b25194b25054b25094b251b4b25134b25214b251f4b251d4b25234b25254b25294b25274b252b4b25314b252f4b252d4b25354b25374b25334b25394b253b4b253f4b253d4b25414b25434b25454b25474b25494b254f4b25514b254b4b254d4b25534b25574b25594b25554b255b4b255d4b255f4b25614b25654b256d4b25634b256b4b25674b25694b256f4b25714b25734b257d4b25754b25774b25794b257b4b257f4b25814b25874b25834b25854b25894b258b4b258d4b258f4b25934b25914b25954b25974b25994b259b4b259d4b25a14b259f4b25a34b25a54b25a74b25a94b25ab4b25ad4b25")\ - X( 141, 1, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "008b25068b25108b250e8b25148b25168b25028b250a8b250c8b25188b25048b25088b251a8b25128b25208b251e8b251c8b25228b25248b25288b25268b252a8b25308b252e8b252c8b25348b25368b25328b25388b253a8b253e8b253c8b25408b25428b25448b25468b25488b254e8b25508b254a8b254c8b25528b25568b25588b25548b255a8b255c8b255e8b25608b25648b256c8b25628b256a8b25668b25688b256e8b25708b25728b257c8b25748b25768b25788b257a8b257e8b25808b25868b25828b25848b25888b258a8b258c8b258e8b25928b25908b25948b25968b25988b259a8b259c8b25a08b259e8b25a28b25a48b25a68b25a88b25aa8b25ac8b25")\ - X(142 , 1, KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "014d27074d27114d270f4d27154d27174d27034d270b4d270d4d27194d27054d27094d271b4d27134d27214d271f4d271d4d27234d27254d27294d27274d272b4d27314d272f4d272d4d27354d27374d27334d27394d273b4d273f4d273d4d27414d27434d27454d27474d27494d274f4d27514d274b4d274d4d27534d27574d27594d27554d275b4d275d4d275f4d27614d27654d276d4d27634d276b4d27674d27694d276f4d27714d27734d277d4d27754d27774d27794d277b4d277f4d27814d27874d27834d27854d27894d278b4d278d4d278f4d27934d27914d27954d27974d27994d279b4d279d4d27a14d279f4d27a34d27a54d27a74d27a94d27ab4d27ad4d27")\ - X( 143, 1, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "008d27068d27108d270e8d27148d27168d27028d270a8d270c8d27188d27048d27088d271a8d27128d27208d271e8d271c8d27228d27248d27288d27268d272a8d27308d272e8d272c8d27348d27368d27328d27388d273a8d273e8d273c8d27408d27428d27448d27468d27488d274e8d27508d274a8d274c8d27528d27568d27588d27548d275a8d275c8d275e8d27608d27648d276c8d27628d276a8d27668d27688d276e8d27708d27728d277c8d27748d27768d27788d277a8d277e8d27808d27868d27828d27848d27888d278a8d278c8d278e8d27928d27908d27948d27968d27988d279a8d279c8d27a08d279e8d27a28d27a48d27a68d27a88d27aa8d27ac8d27")\ - X(144 , 1, KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0148260748261148260f48261548261748260348260b48260d48261948260548260948261b48261348262148261f48261d48262348262548262948262748262b48263148262f48262d48263548263748263348263948263b48263f48263d48264148264348264548264748264948264f48265148264b48264d48265348265748265948265548265b48265d48265f48266148266548266d48266348266b48266748266948266f48267148267348267d48267548267748267948267b48267f48268148268748268348268548268948268b48268d48268f48269348269148269548269748269948269b48269d4826a148269f4826a34826a54826a74826a94826ab4826ad4826")\ - X( 145, 1, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0088260688261088260e88261488261688260288260a88260c88261888260488260888261a88261288262088261e88261c88262288262488262888262688262a88263088262e88262c88263488263688263288263888263a88263e88263c88264088264288264488264688264888264e88265088264a88264c88265288265688265888265488265a88265c88265e88266088266488266c88266288266a88266688266888266e88267088267288267c88267488267688267888267a88267e88268088268688268288268488268888268a88268c88268e88269288269088269488269688269888269a88269c8826a088269e8826a28826a48826a68826a88826aa8826ac8826")\ - X(146 , 1, KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0150280750281150280f50281550281750280350280b50280d50281950280550280950281b50281350282150281f50281d50282350282550282950282750282b50283150282f50282d50283550283750283350283950283b50283f50283d50284150284350284550284750284950284f50285150284b50284d50285350285750285950285550285b50285d50285f50286150286550286d50286350286b50286750286950286f50287150287350287d50287550287750287950287b50287f50288150288750288350288550288950288b50288d50288f50289350289150289550289750289950289b50289d5028a150289f5028a35028a55028a75028a95028ab5028ad5028")\ - X( 147, 1, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0080280680281080280e80281480281680280280280a80280c80281880280480280880281a80281280282080281e80281c80282280282480282880282680282a80283080282e80282c80283480283680283280283880283a80283e80283c80284080284280284480284680284880284e80285080284a80284c80285280285680285880285480285a80285c80285e80286080286480286c80286280286a80286680286880286e80287080287280287c80287480287680287880287a80287e80288080288680288280288480288880288a80288c80288e80289280289080289480289680289880289a80289c8028a080289e8028a28028a48028a68028a88028aa8028ac8028")\ - X(148 , 1, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30060b30100b300e0b30140b30160b30020b300a0b300c0b30180b30040b30080b301a0b30120b30200b301e0b301c0b30220b30240b30280b30260b302a0b30300b302e0b302c0b30340b30360b30320b30380b303a0b303e0b303c0b30400b30420b30440b30460b30480b304e0b30500b304a0b304c0b30520b30560b30580b30540b305a0b305c0b305e0b30600b30640b306c0b30620b306a0b30660b30680b306e0b30700b30720b307c0b30740b30760b30780b307a0b307e29307e0bc0800b30860b30820b30840b30880b308a0b308c0b308e0bc0920b30900b30940b30960b30980b309a0b309c0b30a00b309e0b30a20b30a40b30a60b30a82d30aa3430ac0b30")\ - X( 149, 1, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052600652601052600e52601452601652600252600a52600c52601852600452600852601a52601252602052601e52601c52602252602452602852602652602a52603052602e52602c52603452603652603252603852603a52603e52603c52604052604252604452604652604852604e52605052604a52604c52605252605652605852605452605a52605c52605e52606052606452606c52606252606a52606652606852606e52607052607252607c52607452607652607852607a52607e52608052608652608252608452608852608a52608c52608e52609252609052609452609652609852609a52609c5260a052609e5260a25260a45260a65260a85260aa5260ac5260")\ - X(150 , 1, Key1 , "1" , "1" , 0x31 , 49 , 'u', '1' , '1' , "0002310602311002310e02311402311602310202310a02310c02311802310402310802311a02311202312002311e02311c02312202312402312802312602312a02313002312e02312c02313402313602313202313802313a02313e02313c02314002314202314402314602314802314e02315002314a02314c02315202315602315802315402315a02315c02315e02316002316402316c02316202316a02316602316802316e02317002317202317c02317402317602317802317a02317e02318002318602318202318402318802318a02318c02318e02319202319002319402319602319802319a02319c0231a002319e0231a20231a40231a60231a80231aa0d31ac0231")\ - X( 151, 1, Numpad1 , "1" , "1" , 0x31 , 57400, 'u', '1' , '1' , "004f61064f61104f610e4f61144f61164f61024f610a4f610c4f61184f61044f61084f611a4f61124f61204f611e4f611c4f61224f61244f61284f61264f612a4f61304f612e4f612c4f61344f61364f61324f61384f613a4f613e4f613c4f61404f61424f61444f61464f61484f614e4f61504f614a4f614c4f61524f61564f61584f61544f615a4f615c4f615e4f61604f61644f616c4f61624f616a4f61664f61684f616e4f61704f61724f617c4f61744f61764f61784f617a4f617e4f61804f61864f61824f61844f61884f618a4f618c4f618e4f61924f61904f61944f61964f61984f619a4f619c4f61a04f619e4f61a24f61a44f61a64f61a84f61aa4f61ac4f61")\ - X(152 , 1, Key2 , "2" , "2" , 0x32 , 50 , 'u', '2' , '\0' , "0003320603321003320e03321403321603320203320a03320c03321803320403320803321a03321203322003321e03321c03322203322403322803322603322a03323003322e03322c03323403323603323203323803323a03323e03323c03324003324203324403324603324803324e03325003324a03324c03325203325603325803325403325a03325c03325e03326003326403326c03326203326a03326603326803326e03327003327203327c03327403327603327803327a03327e03328003328603328203328403328803328a03328c03328e03329203329003329403329603329803329a03329c0332a003329e0332a20332a40332a60332a80332aa0c32ac0332")\ - X( 153, 1, Numpad2 , "2" , "2" , 0x32 , 57401, 'u', '2' , '\0' , "0050620650621050620e50621450621650620250620a50620c50621850620450620850621a50621250622050621e50621c50622250622450622850622650622a50623050622e50622c50623450623650623250623850623a50623e50623c50624050624250624450624650624850624e50625050624a50624c50625250625650625850625450625a50625c50625e50626050626450626c50626250626a50626650626850626e50627050627250627c50627450627650627850627a50627e50628050628650628250628450628850628a50628c50628e50629250629050629450629650629850629a50629c5062a050629e5062a25062a45062a65062a85062aa5062ac5062")\ - X(154 , 1, Key3 , "3" , "3" , 0x33 , 51 , 'u', '3' , '\x1b', "0004330604331004330e04331404331604330204330a04330c04331804330404330804331a04331204332004331e04331c04332204332404332804332604332a04333004332e04332c04333404333604333204333804333a04333e04333c04334004334204334404334604334804334e04335004334a04334c04335204335604335804335404335a04335c04335e04336004336404336c04336204336a04336604336804336e04337004337204337c04337404337604337804337a04337e04338004338604338204338404338804338a04338c04338e04339204339004339404339604339804339a04339c0433a004339e0433a20433a40433a60433a80433aa0b33ac0433")\ - X( 155, 1, Numpad3 , "3" , "3" , 0x33 , 57402, 'u', '3' , '\x1b', "0051630651631051630e51631451631651630251630a51630c51631851630451630851631a51631251632051631e51631c51632251632451632851632651632a51633051632e51632c51633451633651633251633851633a51633e51633c51634051634251634451634651634851634e51635051634a51634c51635251635651635851635451635a51635c51635e51636051636451636c51636251636a51636651636851636e51637051637251637c51637451637651637851637a51637e51638051638651638251638451638851638a51638c51638e51639251639051639451639651639851639a51639c5163a051639e5163a25163a45163a65163a85163aa5163ac5163")\ - X(156 , 1, Key4 , "4" , "4" , 0x34 , 52 , 'u', '4' , '\x1c', "0005340605341005340e05341405341605340205340a05340c05341805340405340805341a05341205342005341e05341c05342205342405342805342605342a05343005342e05342c05343405343605343205343805343a05343e05343c05344005344205344405344605344805344e05345005344a05344c05345205345605345805345405345a05345c05345e05346005346405346c05346205346a05346605346805346e05347005347205347c05347405347605347805347a05347e05348005348605348205348405348805348a05348c05348e05349205349005349405349605349805349a05349c0534a005349e0534a20534a40534a60534a80534aa0a34ac0534")\ - X( 157, 1, Numpad4 , "4" , "4" , 0x34 , 57403, 'u', '4' , '\x1c', "004b64064b64104b640e4b64144b64164b64024b640a4b640c4b64184b64044b64084b641a4b64124b64204b641e4b641c4b64224b64244b64284b64264b642a4b64304b642e4b642c4b64344b64364b64324b64384b643a4b643e4b643c4b64404b64424b64444b64464b64484b644e4b64504b644a4b644c4b64524b64564b64584b64544b645a4b645c4b645e4b64604b64644b646c4b64624b646a4b64664b64684b646e4b64704b64724b647c4b64744b64764b64784b647a4b647e4b64804b64864b64824b64844b64884b648a4b648c4b648e4b64924b64904b64944b64964b64984b649a4b649c4b64a04b649e4b64a24b64a44b64a64b64a84b64aa4b64ac4b64")\ - X(158 , 1, Key5 , "5" , "5" , 0x35 , 53 , 'u', '5' , '\x1d', "0006350606351006350e06351406351606350206350a06350c06351806350406350806351a06351206352006351e06351c06352206352406352806352606352a06353006352e06352c06353406353606353206353806353a06353e06353c06354006354206354406354606354806354e06355006354a06354c06355206355606355806355406355a06355c06355e06356006356406356c06356206356a06356606356806356e06357006357206357c06357406357606357806357a06357e06358006358606358206358406358806358a06358c06358e06359206359006359406359606359806359a06359c0635a006359e0635a20635a40635a60635a81035aa1a35ac0635")\ - X( 159, 1, Numpad5 , "5" , "5" , 0x35 , 57404, 'u', '5' , '\x1d', "004c65064c65104c650e4c65144c65164c65024c650a4c650c4c65184c65044c65084c651a4c65124c65204c651e4c651c4c65224c65244c65284c65264c652a4c65304c652e4c652c4c65344c65364c65324c65384c653a4c653e4c653c4c65404c65424c65444c65464c65484c654e4c65504c654a4c654c4c65524c65564c65584c65544c655a4c655c4c655e4c65604c65644c656c4c65624c656a4c65664c65684c656e4c65704c65724c657c4c65744c65764c65784c657a4c657e4c65804c65864c65824c65844c65884c658a4c658c4c658e4c65924c65904c65944c65964c65984c659a4c659c4c65a04c659e4c65a24c65a44c65a64c65a84c65aa4c65ac4c65")\ - X(160 , 1, Key6 , "6" , "6" , 0x36 , 54 , 'u', '6' , '\x1e', "0007360607361007360e07361407361607360207360a07360c07361807360407360807361a07361207362007361e07361c07362207362407362807362607362a07363007362e07362c07363407363607363207363807363a07363e07363c07364007364207364407364607364807364e07365007364a07364c07365207365607365807365407365a07365c07365e07366007366407366c07366207366a07366607366807366e07367007367207367c07367407367607367807367a07367e07368007368607368207368407368807368a07368c07368e07369207369007369407369607369807369a07369c0736a007369e0736a20736a40736a60736a81136aa1936ac0736")\ - X( 161, 1, Numpad6 , "6" , "6" , 0x36 , 57405, 'u', '6' , '\x1e', "004d66064d66104d660e4d66144d66164d66024d660a4d660c4d66184d66044d66084d661a4d66124d66204d661e4d661c4d66224d66244d66284d66264d662a4d66304d662e4d662c4d66344d66364d66324d66384d663a4d663e4d663c4d66404d66424d66444d66464d66484d664e4d66504d664a4d664c4d66524d66564d66584d66544d665a4d665c4d665e4d66604d66644d666c4d66624d666a4d66664d66684d666e4d66704d66724d667c4d66744d66764d66784d667a4d667e4d66804d66864d66824d66844d66884d668a4d668c4d668e4d66924d66904d66944d66964d66984d669a4d669c4d66a04d669e4d66a24d66a44d66a64d66a84d66aa4d66ac4d66")\ - X(162 , 1, Key7 , "7" , "7" , 0x37 , 55 , 'u', '7' , '\x1f', "0008370608371008370e08371408371608370208370a08370c08371808370408370808371a08371208372008371e08371c08372208372408372808372608372a08373008372e08372c08373408373608373208373808373a08373e08373c08374008374208374408374608374808374e08375008374a08374c08375208375608375808375408375a08375c08375e08376008376408376c08376208376a08376608376808376e08377008377208377c08377408377608377808377a08377e08378008378608378208378408378808378a08378c08378e08379208379008379408379608379808379a08379c0837a008379e0837a20837a40837a60837a81e37aa2837ac0837")\ - X( 163, 1, Numpad7 , "7" , "7" , 0x37 , 57406, 'u', '7' , '\x1f', "0047670647671047670e47671447671647670247670a47670c47671847670447670847671a47671247672047671e47671c47672247672447672847672647672a47673047672e47672c47673447673647673247673847673a47673e47673c47674047674247674447674647674847674e47675047674a47674c47675247675647675847675447675a47675c47675e47676047676447676c47676247676a47676647676847676e47677047677247677c47677447677647677847677a47677e47678047678647678247678447678847678a47678c47678e47679247679047679447679647679847679a47679c4767a047679e4767a24767a44767a64767a84767aa4767ac4767")\ - X(164 , 1, Key8 , "8" , "8" , 0x38 , 56 , 'u', '8' , '\x7f', "0009380609381009380e09381409381609380209380a09380c09381809380409380809381a09381209382009381e09381c09382209382409382809382609382a09383009382e09382c09383409383609383209383809383a09383e09383c09384009384209384409384609384809384e09385009384a09384c09385209385609385809385409385a09385c09385e09386009386409386c09386209386a09386609386809386e09387009387209387c09387409387609387809387a09387e09388009388609388209388409388809388a09388c09388e09389209389009389409389609389809389a09389c0938a009389e0938a20938a40938a60938a81f38aa2738ac0938")\ - X( 165, 1, Numpad8 , "8" , "8" , 0x38 , 57407, 'u', '8' , '\x7f', "0048680648681048680e48681448681648680248680a48680c48681848680448680848681a48681248682048681e48681c48682248682448682848682648682a48683048682e48682c48683448683648683248683848683a48683e48683c48684048684248684448684648684848684e48685048684a48684c48685248685648685848685448685a48685c48685e48686048686448686c48686248686a48686648686848686e48687048687248687c48687448687648687848687a48687e48688048688648688248688448688848688a48688c48688e48689248689048689448689648689848689a48689c4868a048689e4868a24868a44868a64868a84868aa4868ac4868")\ - X(166 , 1, Key9 , "9" , "9" , 0x39 , 57 , 'u', '9' , '9' , "000a39060a39100a390e0a39140a39160a39020a390a0a390c0a39180a39040a39080a391a0a39120a39200a391e0a391c0a39220a39240a39280a39260a392a0a39300a392e0a392c0a39340a39360a39320a39380a393a0a393e0a393c0a39400a39420a39440a39460a39480a394e0a39500a394a0a394c0a39520a39560a39580a39540a395a0a395c0a395e0a39600a39640a396c0a39620a396a0a39660a39680a396e0a39700a39720a397c0a39740a39760a39780a397a0a397e0a39800a39860a39820a39840a39880a398a0a398c0a398e0a39920a39900a39940a39960a39980a399a0a399c0a39a00a399e0a39a20a39a40a39a60a39a82c39aa3539ac0a39")\ - X( 167, 1, Numpad9 , "9" , "9" , 0x39 , 57408, 'u', '9' , '9' , "0049690649691049690e49691449691649690249690a49690c49691849690449690849691a49691249692049691e49691c49692249692449692849692649692a49693049692e49692c49693449693649693249693849693a49693e49693c49694049694249694449694649694849694e49695049694a49694c49695249695649695849695449695a49695c49695e49696049696449696c49696249696a49696649696849696e49697049697249697c49697449697649697849697a49697e49698049698649698249698449698849698a49698c49698e49699249699049699449699649699849699a49699c4969a049699e4969a24969a44969a64969a84969aa4969ac4969")\ - X(168 , 1, KeyMultiply , "*" , "*" , 0x2A , 42 , 'u', '*' , '*' , "641bba8c0cdf962bdc982bdc9a2bdc9c2bdc")\ - X( 169, 1, NumpadMultiply , "*" , "*" , 0x2A , 57411, 'u', '*' , '*' , "00376a06376a10376a0e376a14376a16376a02376a0a376a0c376a18376a04376a08376a1a376a12376a20376a1e376a1c376a22376a24376a28376a26376a2a376a30376a2e376a2c376a34376a36376a32376a38376a3a376a3e376a3c376a40376a42376a44376a46376a48376a4e376a50376a4a376a4c376a52376a56376a58376a54376a5a376a5c376a5e376a60376a64376a6c376a62376a6a376a66376a68376a6e376a70376a72376a7c376a74376a76376a78376a7a376a7e376a80376a86376a82376a84376a88376a8a376a8c376a8e376a92376a90376a94376a96376a98376a9a376a9c376aa0376a9e376aa2376aa4376aa6376aa8376aaa376aac376a")\ - X(170 , 1, KeySlash , "/" , "/" , 0x2F , 47 , 'u', '/' , '\x1f', "0035bf0635bf1035bf0e35bf1435bf1635bf0235bf0a35bf0c35bf1835bf0435bf0835bf1a35bf1235bf2035bf1e35bf1c35bf2235bf2435bf2835bf2635bf2a35bf3035bf2e35bf2c35bf3435bf3635bf3235bf3835bf3c73c14035bf4229de640cdb9235bf9a28dba41abfa60cbba80bbfaa04bf")\ - X( 171, 1, NumpadDivide , "/" , "/" , 0x2F , 57410, 'u', '/' , '\x1f', "01356f07356f11356f0f356f15356f17356f03356f0b356f0d356f19356f05356f09356f1b356f13356f21356f1f356f1d356f23356f25356f29356f27356f2b356f31356f2f356f2d356f35356f37356f33356f39356f3b356f3f356f3d356f41356f43356f45356f47356f49356f4f356f51356f4b356f4d356f53356f57356f59356f55356f5b356f5d356f5f356f61356f65356f6d356f63356f6b356f67356f69356f6f356f71356f73356f7d356f75356f77356f79356f7b356f7f356f81356f87356f83356f85356f89356f8b356f8d356f8f356f93356f91356f95356f97356f99356f9b356f9d356fa1356f9f356fa3356fa5356fa7356fa9356fab356fad356f")\ - X(172 , 1, KeyPlus , "Plus" , "+" , 0x2B , 43 , 'u', '+' , '+' , "440cbb461abb480dbb4e0cbb501bbb4a0cbb4c0cbb560cbd5a1bbb5c1bbb5e1abb600cbb6427bb6c0cbb620cbb6a1bbb660cbb681bbb702bbf720cbb7c0dbb761bbb781bbb7a1bbb801bbb861bbb821bbb841bbb900dbb940cbd9a1bbba629c0")\ - X( 173, 1, NumpadPlus , "Plus" , "+" , 0x2B , 57413, 'u', '+' , '+' , "004e6b064e6b104e6b0e4e6b144e6b164e6b024e6b0a4e6b0c4e6b184e6b044e6b084e6b1a4e6b124e6b204e6b1e4e6b1c4e6b224e6b244e6b284e6b264e6b2a4e6b304e6b2e4e6b2c4e6b344e6b364e6b324e6b384e6b3a4e6b3e4e6b3c4e6b404e6b424e6b444e6b464e6b484e6b4e4e6b504e6b4a4e6b4c4e6b524e6b564e6b584e6b544e6b5a4e6b5c4e6b5e4e6b604e6b644e6b6c4e6b624e6b6a4e6b664e6b684e6b6e4e6b704e6b724e6b7c4e6b744e6b764e6b784e6b7a4e6b7e4e6b804e6b864e6b824e6b844e6b884e6b8a4e6b8c4e6b8e4e6b924e6b904e6b944e6b964e6b984e6b9a4e6b9c4e6ba04e6b9e4e6ba24e6ba44e6ba64e6ba84e6baa4e6bac4e6b")\ - X(174 , 1, KeyMinus , "Minus" , "-" , 0x2D , 45 , 'u', '-' , '-' , "000cbd060cbd100cbd0e0cbd140cbd160cbd020cbd0a0cbd0c0cbd180cbd040cbd080cbd1a0cbd120cbd200cbd1e0cbd1c0cbd220cbd240cbd280cbd260cbd2a0cbd300cbd2e0cbd2c0cbd340cbd360cbd320cbd380cbd3a0cbd3e0cbd3c0cbd400cbd420cbd4435bd4635bd4835bd4e35bd5035bd4a35bd4c35bd5235bf5635dd5835bf540cbd5a35bd5c35bd5e35bd6035bd6435bd6c35bd6235bd6a35bd6635bd6835bd6e35bd700ddb7235bd7c35bd7435bd7635bd7835bd7a35bd7e35bd8035bd8635bd8235bd8435bd8835bd8a35bd8c0dbd8e35bf9256e2920cbd9035bd9435bf9a1abda00dbd9e0dbda428bda60dbda828bdaa1ebd")\ - X( 175, 1, NumpadMinus , "Minus" , "-" , 0x2D , 57412, 'u', '-' , '-' , "004a6d064a6d104a6d0e4a6d144a6d164a6d024a6d0a4a6d0c4a6d184a6d044a6d084a6d1a4a6d124a6d204a6d1e4a6d1c4a6d224a6d244a6d284a6d264a6d2a4a6d304a6d2e4a6d2c4a6d344a6d364a6d324a6d384a6d3a4a6d3e4a6d3c4a6d404a6d424a6d444a6d464a6d484a6d4e4a6d504a6d4a4a6d4c4a6d524a6d564a6d584a6d544a6d5a4a6d5c4a6d5e4a6d604a6d644a6d6c4a6d624a6d6a4a6d664a6d684a6d6e4a6d704a6d724a6d7c4a6d744a6d764a6d784a6d7a4a6d7e4a6d804a6d864a6d824a6d844a6d884a6d8a4a6d8c4a6d8e4a6d924a6d904a6d944a6d964a6d984a6d9a4a6d9c4a6da04a6d9e4a6da24a6da44a6da64a6da84a6daa4a6dac4a6d")\ - X(176 , 1, KeyEqual , "=" , "=" , 0x3D , 61 , 'u', '=' , '=' , "000dbb060dbb100dbb0e0dbb140dbb160dbb020dbb0a0dbb0c0dbb180dbb040dbb080dbb1a0dbb120dbb200dbb1c0dbb220dbb240dbb280dbb260dbb2a0dbb300dbb2e0dbb2c0dbb340dbb360dbb380dbb3a0dbb3e0dbb3c0dbb400dbb420dbb520cbd580cbd5435df6e0cbb740cbf920dbb960dbb980dbb9c0dbba035bb9e35bba41bbba81bbbaa1bbbac0cbd")\ - X( 177, 1, NumpadEqual , "=" , "=" , 0x3D , 57415, 'u', '=' , '=' , "")\ - X(178 , 1, KeyPeriod , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be0634be1034be0e34be1434be1634be0234be0a34be0c34be1834be0434be0834be1a34be1234be2034be1e34be1c34be2234be2434be2834be2634be2a34be3034be2e34be2c34be3434be3634be3234be3834be3a34be3e34be3c34be4034be4234be4434be4634be4834be4e34be5034be4a34be4c34be5234be5634be5834be5434be5a34be5c34be5e34be6034be6434be6c34be6234be6a34be6634be6834be6e34be7034be7234be7c34be7434be7634be7834be7a34be7e34be8034be8634be8234be8434be8834be8a34be8c35be8e34be9234be9034be9434be9a32bea412bea634bea813beaa18beac2fbe")\ - X( 179, 1, NumpadDecimal , "." , "." , 0x2E , 57409, 'u', '.' , '.' , "00536e06536e10536e0e536e14536e16536e02536e0a536e0c536e18536e04536e08536e1a536e12536e20536e1e536e1c536e22536e24536e28536e26536e2a536e30536e2e536e2c536e34536e36536e32536e38536e3a536e3e536e3c536e40536e42536e44536e46536e48536e4e536e50536e4a536e4c536e52536e56536e58536e54536e5a536e5c536e5e536e60536e64536e6c536e62536e6a536e66536e68536e6e536e70536e72536e7c536e74536e76536e78536e7a536e7e536e80536e86536e82536e84536e88536e8a536e8c536e8e536e92536e90536e94536e96536e98536e9a536e9c536ea0536e9e536ea2536ea4536ea6536ea8536eaa536eac536e")\ - X(180 , 1, KeyComma , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "0033bc0633bc1033bc0e33bc1433bc1633bc0233bc0a33bc0c33bc1833bc0433bc0833bc1a33bc1233bc2033bc1e33bc1c33bc2233bc2433bc2833bc2633bc2a33bc3033bc2e33bc2c33bc3433bc3633bc3233bc3833bc3a33bc3e33bc3c33bc4033bc4233bc4433bc4633bc4833bc4e33bc5033bc4a33bc4c33bc5233bc5633bc5833bc5433bc5a33bc5c33bc5e33bc6033bc6433bc6c33bc6233bc6a33bc6633bc6833bc6e33bc7033bc7233bc7c33bc7433bc7633bc7833bc7a33bc7e33bc8033bc8633bc8233bc8433bc8833bc8a33bc8c2bbc8e33bc9233bc9033bc9433bc9632bc9832bc9a33bc9c32bca032bc9e32bca411bca635bca82fbcaa33bcac22bc")\ - X( 181, 1, NumpadPoint , "," , "," , 0x2C , 57416, 'u', ',' , ',' , "007ec2067ec2107ec20e7ec2147ec2167ec2027ec20a7ec20c7ec2187ec2047ec2087ec21a7ec2127ec2207ec21e7ec21c7ec2227ec2247ec2287ec2267ec22a7ec2307ec22e7ec22c7ec2347ec2367ec2327ec2387ec23a7ec23e7ec23c7ec2407ec2427ec2447ec2467ec2487ec24e7ec2507ec24a7ec24c7ec2527ec2567ec2587ec2547ec25a7ec25c7ec25e7ec2607ec2647ec26c7ec2627ec26a7ec2667ec2687ec26e7ec2707ec2727ec27c7ec2747ec2767ec2787ec27a7ec27e7ec2807ec2867ec2827ec2847ec2887ec28a7ec28c7ec28e7ec2927ec2907ec2947ec2967ec2987ec29a7ec29c7ec2a07ec29e7ec2a27ec2a47ec2a67ec2a87ec2aa7ec2ac7ec2")\ - X(182 , 1, Colon , ":" , ":" , 0x3A , 58 , 'u', ':' , ':' , "9634bf9834bf9a34bf9c34bfa034bf9e34bf")\ - X(184 , 1, Semicolon , ";" , ";" , 0x3B , 59 , 'u', ';' , ';' , "0027ba0627ba1027ba0e27ba1427ba1627ba0227ba0a27ba0c27ba1827ba0427ba0827ba1a27ba1227ba2027ba1e27ba1c27ba2227ba2427ba2827ba2627ba2a27ba3027ba2e27ba2c27ba3427ba3627ba3227ba3a27ba3e27ba3c35bf4227ba5229c05829c06e29c07429c09219ba9633be9833be9a35ba9c33bea033be9e33bea42cbaa81abaaa10ba")\ - X(186 , 1, TurnedComma , "ʻ" , "ʻ" , 0x02BB, 699 , 'u', -1 , -1 , "2028de")\ - X(188 , 1, OpenSquareBracket , "[" , "[" , 0x5B , 91 , 'u', '[' , '\x1b', "001adb061adb101adb0e1adb141adb161adb021adb0a1adb0c1adb181adb041adb081adb1a1adb121adb201adb1e1adb1c1adb221adb241adb281adb261adb2a1adb301adb2e1adb2c1adb3c1bdd4028de481adb921adba40cdba80cdbaa02db")\ - X(190 , 1, CloseSquareBracket , "]" , "]" , 0x5D , 93 , 'u', ']' , '\x1d', "001bdd061bdd101bdd0e1bdd141bdd161bdd021bdd0a1bdd0c1bdd181bdd041bdd081bdd1a1bdd121bdd201bdd1e1bdd1c1bdd221bdd241bdd281bdd261bdd2a1bdd301bdd2e1bdd2c1bdd3c2bdc402bdc460ddb481bdd6456e2921bdd9429c0a40ddda80dddaa03dd")\ - X(192 , 1, OpenCurlyBracket , "{" , "{" , 0x7B , 123 , 'u', '{' , 27 , "5028de6a28de")\ - X(194 , 1, CloseCurlyBracket , "}" , "}" , 0x7D , 125 , 'u', '}' , 29 , "461bdd502bbf6a2bbf")\ - X(196 , 1, CloseRoundBracket , ")" , ")" , 0x29 , 41 , 'u', ')' , ')' , "521bdd6e1bdd960cdb980cdb9c0cdba00cdb9e0cdb")\ - X(198 , 1, LessThan , "<" , "<" , 0x3C , 60 , 'u', '<' , '<' , "2429c03a2bdc4056e24456e24656e24856e24e56e25056e24a56e24c56e25656e25456e25a56e25c56e25e56e26056e2642bdc6c56e26256e26a56e26656e26856e27056e27256e27c56e27656e27856e27a56e28056e28656e28256e28856e28a56e28c56e29056e29456e29656e29856e29a56e29c56e2a056e29e56e2a256e2a656e2")\ - X(200 , 1, BackSlash , "\\" , "\\" , 0x5C , 92 , 'u', '\\' , '\x1c', "002bdc0056e2062bdc0656e2102bdc1056e20e56e20e2bdc1456e2142bdc162bdc1656e2022bdc0256e20a2bdc0a56e20c2bdc0c56e21856e2182bdc042bdc0456e20856e2082bdc1a2bdc1a56e2122bdc1256e2202bdc2056e21e56e21e2bdc1c2bdc1c56e2222bdc2256e22456e2282bde2856dc262bde2656dc2a56dc3056dc2e56dc2c56dc3256e2322bdc3856e23c56e24029c04629c04829c04a0ddb5256e25a29dc5c29dc5e29dc660ddb6e56e2922bdca42bdca456e2a82bdca856e2aa56e2aa2bdc")\ - X(202 , 1, Underscore , "_" , "_" , 0x5F , 95 , 'u', '_' , '\x1f', "0273e2")\ - X(204 , 1, VerticalBar , "|" , "|" , 0x7C , 124 , 'u', '|' , 28 , "5029dc4a29dc6a29dc6629dc")\ - X(206 , 1, DivisionSign , "÷" , "÷" , 0xF7 , 247 , 'u', -1 , -1 , "541add")\ - X(208 , 1, OneHalf , "½" , "½" , 0xBD , 189 , 'u', -1 , -1 , "4e29dc6029dc6c29dc")\ - X(210 , 1, SuperscriptTwo , "²" , "²" , 0xB2 , 178 , 'u', -1 , -1 , "9629de9c29dea029de9e29de")\ - X(212 , 1, DegreeSign , "°" , "°" , 0xB0 , 176 , 'u', -1 , -1 , "3e29de640dbf7029dc")\ - X(214 , 1, NumeroSign , "º" , "º" , 0xBA , 186 , 'u', -1 , -1 , "5e28de6829dc")\ - X(216 , 1, Acute , "´" , "´" , 0xB4 , 180 , 'u', -1 , -1 , "3c1adb440ddb4827ba4e0ddb501aba4c0ddb520dbb560dbb580dbb542bbf5e1bba600ddb6428c06c0ddb620ddb6a1aba6828de6e0dbf7028de740ddf760ddd780ddd7a0ddd800ddd860ddd820ddd840ddd")\ - X(218 , 1, Caron , "ˇ" , "ˇ" , 0x02C7, 780 , 'u', -1 , -1 , "5629de")\ - X(220 , 1, Cedilla , "¸" , "¸" , 0xB8 , 184 , 'u', -1 , -1 , "3a1bdd9029c0")\ - X(222 , 1, Circumflex , "^" , "^" , 0x5E , 94 , 'u', '^' , 30 , "3a1adb3e1adb421adb4828de7629dc7829dc7a29dc8029dc8629dc8229dc8429dc880ddd8a0ddd961add981add9a0ddd9c1adda01add9e1addac15db")\ - X(224 , 1, Ogonek , "˛" , "˛" , 0x02DB, 731 , 'u', -1 , -1 , "7229c0")\ - X(226 , 1, Cross , "˟" , "˟" , 0x02DF, 735 , 'u', -1 , -1 , "8456e2")\ - X(228 , 1, Tilde , "~" , "~" , 0x7E , 771 , 'u', '~' , 30 , "3c28de5e2bbf")\ - X(230 , 1, Tonos , "΄" , "΄" , 0x0384, 900 , 'u', -1 , -1 , "4627ba")\ - X(232 , 1, Umlaut , "¨" , "¨" , 0xA8 , 168 , 'u', -1 , -1 , "441bba4628de4e1bba4a1bba4c1bba522bdc540ddb601bba641add621bba661bba6e2bdc881bc08a1bc0")\ - X(234 , 1, BackQuote , "`" , "`" , 0x60 , 96 , 'u', '`' , '`' , "0029c00629c01029c00e29c01429c01629c00229c00a29c00c29c01829c00429c00829c01a29c01229c02029c01e29c01c29c02229c0242bdc2829df2629df2a29df3029df2e29df2c29df3229c03a28c0482bdc541bba681aba9229c0a229dca429c0a829c0aa29c0")\ - X(236 , 1, SingleQuote , "'" , "'" , 0x27 , 39 , 'u', '\'' , '\'' , "0028de0628de1028de0e28de1428de1628de0228de0a28de0c28de1828de0428de0828de1a28de1228de1e28de1c28de2228de2428de2828c02628c02a28c03028c02e28c02c28c03428de3628de3228de3c29c0442bbf460cbf480cbf4e2bbf500cdb4a2bbf4c2bbf562bdc5429dc5a0cdb5c0cdb5e0cdb602bbf6c2bbf622bbf6a0cdb662bbf680cdb701bba720dbf7c0cbf880cdb8a0cdb9228de900cbf940dbb9a0cdea410dea835deaa2cde")\ - X(238 , 1, DoubleQuote , "\"" , "\"" , 0x22 , 34 , 'u', '"' , '"' , "8c29c0")\ - X(240 , 1, SingleRightQuote , "’" , "’" , 0x2019, 8217 , 'u', -1 , -1 , "ac31c0")\ - X(242 , 1, SingleLowQuote , "‚" , "‚" , 0x201A, 8218 , 'u', -1 , -1 , "7c29c0")\ - X(244 , 1, DoubleLowQuote , "„" , "„" , 0x201E, 8222 , 'u', -1 , -1 , "3829c0")\ - X(246 , 1, LeftGuillemet , "«" , "«" , 0xAB , 171 , 'u', -1 , -1 , "3a56e25e0ddd")\ - X(248 , 1, Hash , "#" , "#" , 0x23 , 35 , 'u', '#' , '#' , "2a2bde302bde2e2bde2c2bde362bdc3a29de462bdc782bbf802bbf862bbf822bbf842bbf")\ - X(250 , 1, AtSign , "@" , "@" , 0x40 , 64 , 'u', '@' , '\0' , "401bdd6429de9a29c0")\ - X(252 , 1, Exclamation , "!" , "!" , 0x21 , 33 , 'u', '!' , '!' , "9635df9835df9c35df")\ - X(254 , 1, InvertedExclamation, "¡" , "¡" , 0xA1 , 161 , 'u', -1 , -1 , "680ddd")\ - X(256 , 1, QuestionMark , "?" , "?" , 0x3F , 63 , 'u', '?' , 127 , "a20cbb")\ - X(258 , 1, InvertedQuestion , "¿" , "¿" , 0xBF , 191 , 'u', -1 , -1 , "500ddd6a0ddd")\ - X(260 , 1, Paragraph , "§" , "§" , 0xA7 , 167 , 'u', -1 , -1 , "4429dc4c29dc5228de5828de6229dc6e28de7428de8829bf8a29bf")\ - X(262 , 1, Ampersand , "&" , "&" , 0x26 , 38 , 'u', '&' , '&' , "5856e27456e2")\ - X(264 , 1, Dollar , "$" , "$" , 0x24 , 36 , 'u', '$' , '$' , "882bdf8a2bdf961bba9c1bbaa01bba9e1bbaac29de")\ - X(266 , 1, Percent , "%" , "%" , 0x25 , 37 , 'u', '%' , '%' , "ac0dbb")\ - X(268 , 1, Dong , "₫" , "₫" , 0x20AB, 8363 , 'u', -1 , -1 , "320dbb")\ - X(270 , 1, Yen , "¥" , "¥" , 0xA5 , 165 , 'u', -1 , -1 , "027ddc227ddc")\ - X(272 , 1, DotlessI , "ı" , "ı" , 0x0131, 305 , 'u', -1 , -1 , "8c1749a61349")\ - X(274 , 1, MicroSign , "µ" , "µ" , 0xB5 , 181 , 'u', -1 , -1 , "a02bdc9e2bdc")\ - X(276 , 1, Eth , "ð" , "ð" , 0xF0 , 240 , 'u', -1 , -1 , "6c1bba701add")\ - X(278 , 1, Thorn , "þ" , "þ" , 0xFE , 254 , 'u', -1 , -1 , "7035bd")\ - X(280 , 1, Eszett , "ẞ" , "ß" , 0xDF , 223 , 'u', -1 , -1 , "760cdb780cdb7a0cdb800cdb860cdb820cdb840cdb")\ - X(282 , 1, KeyA , "A" , "a" , 0x61 , 97 , 'u', 'a' , '\x01', "001e41061e41101e410e1e41141e41161e41021e410a1e410c1e41181e41041e41081e411a1e41121e41201e411e1e411c1e41221e41241e41281e41261e412a1e41301e412e1e412c1e41341e41361e41321e41381e413a1e413e1e413c1e41401e41421e41441e41461e41481e414e1e41501e414a1e414c1e41521e41561e41581e41541e415a1e415c1e415e1e41601e41641e416c1e41621e416a1e41661e41681e416e1e41701e41721e417c1e41741e41761e41781e417a1e417e1e41801e41861e41821e41841e41881e418a1e418c1e418e1e41921e41901e41941e419610419810419a10419c1041a010419e1041a21e41a41e41a62141a82141aa2541ac1e41")\ - X(284 , 1, KeyB , "B" , "b" , 0x62 , 98 , 'u', 'b' , '\x02', "0030420630421030420e30421430421630420230420a30420c30421830420430420830421a30421230422030421e30421c30422230422430422830422630422a30423030422e30422c30423430423630423230423830423a30423e30423c30424030424230424430424630424830424e30425030424a30424c30425230425630425830425430425a30425c30425e30426030426430426c30426230426a30426630426830426e30427030427230427c30427430427630427830427a30427e30428030428630428230428430428830428a30428c30428e30429230429030429430429630429830429a30429c3042a030429e3042a23042a43142a63342a81942aa1242ac1042")\ - X(286 , 1, KeyC , "C" , "c" , 0x63 , 99 , 'u', 'c' , '\x03', "002e43062e43102e430e2e43142e43162e43022e430a2e430c2e43182e43042e43082e431a2e43122e43202e431e2e431c2e43222e43242e43282e43262e432a2e43302e432e2e432c2e43342e43362e43322e43382e433a2e433e2e433c2e43402e43422e43442e43462e43482e434e2e43502e434a2e434c2e43522e43562e43582e43542e435a2e435c2e435e2e43602e43642e436c2e43622e436a2e43662e43682e436e2e43702e43722e437c2e43742e43762e43782e437a2e437e2e43802e43862e43822e43842e43882e438a2e438c2e438e2e43922e43902e43942e43962e43982e439a2e439c2e43a02e439e2e43a22e43a41743a62f43a82643aa2043ac2343")\ - X(288 , 1, KeyD , "D" , "d" , 0x64 , 100 , 'u', 'd' , '\x04', "0020440620441020440e20441420441620440220440a20440c20441820440420440820441a20441220442020441e20441c20442220442420442820442620442a20443020442e20442c20443420443620443220443820443a20443e20443c20444020444220444420444620444820444e20445020444a20444c20445220445620445820445420445a20445c20445e20446020446420446c20446220446a20446620446820446e20447020447220447c20447420447620447820447a20447e20448020448620448220448420448820448a20448c20448e20449222449020449420449620449820449a20449c2044a020449e2044a22044a42344a61544a82544aa2144ac1744")\ - X(290 , 1, KeyE , "E" , "e" , 0x65 , 101 , 'u', 'e' , '\x05', "0012450612451012450e12451412451612450212450a12450c12451812450412450812451a12451212452012451e12451c12452212452412452812452612452a12453012452e12452c12453412453612453212453812453a12453e12453c12454012454212454412454612454812454e12455012454a12454c12455212455612455812455412455a12455c12455e12456012456412456c12456212456a12456612456812456e12457012457212457c12457412457612457812457a12457e12458012458612458212458412458812458a12458c12458e12459225459012459412459612459812459a12459c1245a012459e1245a21245a42045a62045a82245aa2445ac2145")\ - X(292 , 1, KeyF , "F" , "f" , 0x66 , 102 , 'u', 'f' , '\x06', "0021460621461021460e21461421461621460221460a21460c21461821460421460821461a21461221462021461e21461c21462221462421462821462621462a21463021462e21462c21463421463621463221463821463a21463e21463c21464021464221464421464621464821464e21465021464a21464c21465221465621465821465421465a21465c21465e21466021466421466c21466221466a21466621466821466e21467021467221467c21467421467621467821467a21467e21468021468621468221468421468821468a21468c21468e21469212469021469421469621469821469a21469c2146a021469e2146a234bea41546a61046a80946aa0646ac3546")\ - X(294 , 1, KeyG , "G" , "g" , 0x67 , 103 , 'u', 'g' , '\x07', "0022470622471022470e22471422471622470222470a22470c22471822470422470822471a22471222472022471e22471c22472222472422472822472622472a22473022472e22472c22473422473622473222473822473a22473e22473c22474022474222474422474622474822474e22475022474a22474c22475222475622475822475422475a22475c22475e22476022476422476c22476222476a22476622476822476e22477022477222477c22477422477622477822477a22477e22478022478622478222478422478822478a22478c22478e22479214479022479422479622479822479a22479c2247a022479e2247a22247a41647a61147a83447aa2e47ac3347")\ - X(296 , 1, KeyH , "H" , "h" , 0x68 , 104 , 'u', 'h' , '\x08', "0023480623481023480e23481423481623480223480a23480c23481823480423480823481a23481223482023481e23481c23482223482423482823482623482a23483023482e23482c23483423483623483223483823483a23483e23483c23484023484223484423484623484823484e23485023484a23484c23485223485623485823485423485a23485c23485e23486023486423486c23486223486a23486623486823486e23487023487223487c23487423487623487823487a23487e23488023488623488223488423488823488a23488c23488e23489223489023489423489623489823489a23489c2348a023489e2348a22348a42448a61848a82348aa2348ac3448")\ - X(298 , 1, KeyI , "I" , "i" , 0x69 , 105 , 'u', 'i' , '\x09', "0017490617491017490e17491417491617490217490a17490c17491817490417490817491a17491217492017491e17491c17492217492417492817492617492a17493017492e17492c17493417493617493217493817493a17493e17493c17494017494217494417494617494817494e17495017494a17494c17495217495617495817495417495a17495c17495e17496017496417496c17496217496a17496617496817496e17497017497217497c17497417497617497817497a17497e17498017498617498217498417498817498a17498c28de8e17499226499017499417499617499817499a17499c1749a017499e1749a21749a42249a61fdba83049aa3249ac2049")\ - X(300 , 1, KeyJ , "J" , "j" , 0x6A , 106 , 'u', 'j' , '\x0a', "00244a06244a10244a0e244a14244a16244a02244a0a244a0c244a18244a04244a08244a1a244a12244a20244a1e244a1c244a22244a24244a28244a26244a2a244a30244a2e244a2c244a34244a36244a32244a38244a3a244a3e244a3c244a40244a42244a44244a46244a48244a4e244a50244a4a244a4c244a52244a56244a58244a54244a5a244a5c244a5e244a60244a64244a6c244a62244a6a244a66244a68244a6e244a70244a72244a7c244a74244a76244a78244a7a244a7e244a80244a86244a82244a84244a88244a8a244a8c244a8e244a92154a90244a94244a96244a98244a9a244a9c244aa0244a9e244aa2244aa42e4aa62c4aa8064aaa094aac194a")\ - X(302 , 1, KeyK , "K" , "k" , 0x6B , 107 , 'u', 'k' , '\x0b', "00254b06254b10254b0e254b14254b16254b02254b0a254b0c254b18254b04254b08254b1a254b12254b20254b1e254b1c254b22254b24254b28254b26254b2a254b30254b2e254b2c254b34254b36254b32254b38254b3a254b3e254b3c254b40254b42254b44254b46254b48254b4e254b50254b4a254b4c254b52254b56254b58254b54254b5a254b5c254b5e254b60254b64254b6c254b62254b6a254b66254b68254b6e254b70254b72254b7c254b74254b76254b78254b7a254b7e254b80254b86254b82254b84254b88254b8a254b8c254b8e254b92314b90254b94254b96254b98254b9a254b9c254ba0254b9e254ba2254ba42f4ba6244ba8274baa1f4bac304b")\ - X(304 , 1, KeyL , "L" , "l" , 0x6C , 108 , 'u', 'l' , '\x0c', "00264c06264c10264c0e264c14264c16264c02264c0a264c0c264c18264c04264c08264c1a264c12264c20264c1e264c1c264c22264c24264c28264c26264c2a264c30264c2e264c2c264c34264c36264c32264c38264c3a264c3e264c3c264c40264c42264c44264c46264c48264c4e264c50264c4a264c4c264c52264c56264c58264c54264c5a264c5c264c5e264c60264c64264c6c264c62264c6a264c66264c68264c6e264c70264c72264c7c264c74264c76264c78264c7a264c7e264c80264c86264c82264c84264c88264c8a264c8c264c8e264c92164c90264c94264c96264c98264c9a264c9c264ca0264c9e264ca2264ca4194ca6264ca8074caa084cac184c")\ - X(306 , 1, KeyM , "M" , "m" , 0x6D , 109 , 'u', 'm' , '\x0d', "00324d06324d10324d0e324d14324d16324d02324d0a324d0c324d18324d04324d08324d1a324d12324d20324d1e324d1c324d22324d24324d28324d26324d2a324d30324d2e324d2c324d34324d36324d32324d38324d3a324d3e324d3c324d40324d42324d44324d46324d48324d4e324d50324d4a324d4c324d52324d56324d58324d54324d5a324d5c324d5e324d60324d64324d6c324d62324d6a324d66324d68324d6e324d70324d72324d7c324d74324d76324d78324d7a324d7e324d80324d86324d82324d84324d88324d8a324d8c324d8e324d92324d90324d94324d96274d98274d9a274d9c274da0274d9e274da2324da4324da6254da8084daa074dac284d")\ - X(308 , 1, KeyN , "N" , "n" , 0x6E , 110 , 'u', 'n' , '\x0e', "00314e06314e10314e0e314e14314e16314e02314e0a314e0c314e18314e04314e08314e1a314e12314e20314e1e314e1c314e22314e24314e28314e26314e2a314e30314e2e314e2c314e34314e36314e32314e38314e3a314e3e314e3c314e40314e42314e44314e46314e48314e4e314e50314e4a314e4c314e52314e56314e58314e54314e5a314e5c314e5e314e60314e64314e6c314e62314e6a314e66314e68314e6e314e70314e72314e7c314e74314e76314e78314e7a314e7e314e80314e86314e82314e84314e88314e8a314e8c314e8e314e92244e90314e94314e96314e98314e9a314e9c314ea0314e9e314ea2314ea4264ea6174ea8314eaa314eac274e")\ - X(310 , 1, KeyO , "O" , "o" , 0x6F , 111 , 'u', 'o' , '\x0f', "00184f06184f10184f0e184f14184f16184f02184f0a184f0c184f18184f04184f08184f1a184f12184f20184f1e184f1c184f22184f24184f28184f26184f2a184f30184f2e184f2c184f34184f36184f32184f38184f3a184f3e184f3c184f40184f42184f44184f46184f48184f4e184f50184f4a184f4c184f52184f56184f58184f54184f5a184f5c184f5e184f60184f64184f6c184f62184f6a184f66184f68184f6e184f70184f72184f7c184f74184f76184f78184f7a184f7e184f80184f86184f82184f84184f88184f8a184f8c184f8e184f92274f90184f94184f96184f98184f9a184f9c184fa0184f9e184fa2184fa41f4fa6144fa8144faa174fac134f")\ - X(312 , 1, KeyP , "P" , "p" , 0x70 , 112 , 'u', 'p' , '\x10', "0019500619501019500e19501419501619500219500a19500c19501819500419500819501a19501219502019501e19501c19502219502419502819502619502a19503019502e19502c19503419503619503219503819503a19503e19503c19504019504219504419504619504819504e19505019504a19504c19505219505619505819505419505a19505c19505e19506019506419506c19506219506a19506619506819506e19507019507219507c19507419507619507819507a19507e19508019508619508219508419508819508a19508c19508e19509213509019509419509619509819509a19509c1950a019509e1950a21950a41350a61950a80a50aa0550ac1250")\ - X(314 , 1, KeyQ , "Q" , "q" , 0x71 , 113 , 'u', 'q' , '\x11', "0010510610511010510e10511410511610510210510a10510c10511810510410510810511a10511210512010511e10511c10512210512410512810512610512a10513010512e10512c10513410513610513210513810513a10513e10513c10514010514210514410514610514810514e10515010514a10514c10515210515610515810515410515a10515c10515e10516010516410516c10516210516a10516610516810516e10517010517210517c10517410517610517810517a10517e10518010518610518210518410518810518a10518c10518e1051921051901051941051961e51981e519a1e519c1e51a01e519e1e51a22bbfa42d51a61a51a81251aa1151ac3251")\ - X(316 , 1, KeyR , "R" , "r" , 0x72 , 114 , 'u', 'r' , '\x12', "0013520613521013520e13521413521613520213520a13520c13521813520413520813521a13521213522013521e13521c13522213522413522813522613522a13523013522e13522c13523413523613523213523813523a13523e13523c13524013524213524413524613524813524e13525013524a13524c13525213525613525813525413525a13525c13525e13526013526413526c13526213526a13526613526813526e13527013527213527c13527413527613527813527a13527e13528013528613528213528413528813528a13528c13528e1352921f529013529413529613529813529a13529c1352a013529e1352a21352a41852a61652a81552aa1552ac2652")\ - X(318 , 1, KeyS , "S" , "s" , 0x73 , 115 , 'u', 's' , '\x13', "001f53061f53101f530e1f53141f53161f53021f530a1f530c1f53181f53041f53081f531a1f53121f53201f531e1f531c1f53221f53241f53281f53261f532a1f53301f532e1f532c1f53341f53361f53321f53381f533a1f533e1f533c1f53401f53421f53441f53461f53481f534e1f53501f534a1f534c1f53521f53561f53581f53541f535a1f535c1f535e1f53601f53641f536c1f53621f536a1f53661f53681f536e1f53701f53721f537c1f53741f53761f53781f537a1f537e1f53801f53861f53821f53841f53881f538a1f538c1f538e1f53922053901f53941f53961f53981f539a1f539c1f53a01f539e1f53a21f53a42753a63253a81653aa1653ac2553")\ - X(320 , 1, KeyT , "T" , "t" , 0x74 , 116 , 'u', 't' , '\x14', "0014540614541014540e14541414541614540214540a14540c14541814540414540814541a14541214542014541e14541c14542214542414542814542614542a14543014542e14542c14543414543614543214543814543a14543e14543c14544014544214544414544614544814544e14545014544a14544c14545214545614545814545414545a14545c14545e14546014546414546c14546214546a14546614546814546e14547014547214547c14547414547614547814547a14547e14548014548614548214548414548814548a14548c14548e14549221549014549414549614549814549a14549c1454a014549e1454a21454a42554a62354a82454aa2254ac2454")\ - X(322 , 1, KeyU , "U" , "u" , 0x75 , 117 , 'u', 'u' , '\x15', "0016550616551016550e16551416551616550216550a16550c16551816550416550816551a16551216552016551e16551c16552216552416552816552616552a16553016552e16552c16553416553616553216553816553a16553e16553c16554016554216554416554616554816554e16555016554a16554c16555216555616555816555416555a16555c16555e16556016556416556c16556216556a16556616556816556e16557016557216557c16557416557616557816557a16557e16558016558616558216558416558816558a16558c16558e16559217559016559416559616559816559a16559c1655a016559e1655a21655a42155a61e55a81755aa1455ac1f55")\ - X(324 , 1, KeyV , "V" , "v" , 0x76 , 118 , 'u', 'v' , '\x16', "002f56062f56102f560e2f56142f56162f56022f560a2f560c2f56182f56042f56082f561a2f56122f56202f561e2f561c2f56222f56242f56282f56262f562a2f56302f562e2f562c2f56342f56362f56322f56382f563a2f563e2f563c2f56402f56422f56442f56462f56482f564e2f56502f564a2f564c2f56522f56562f56582f56542f565a2f565c2f565e2f56602f56642f566c2f56622f566a2f56662f56682f566e2f56702f56722f567c2f56742f56762f56782f567a2f567e2f56802f56862f56822f56842f56882f568a2f568c2f568e2f56922f56902f56942f56962f56982f569a2f569c2f56a02f569e2f56a22f56a43456a62e56a83356aa2f56ac1656")\ - X(326 , 1, KeyW , "W" , "w" , 0x77 , 119 , 'u', 'w' , '\x17', "0011570611571011570e11571411571611570211570a11570c11571811570411570811571a11571211572011571e11571c11572211572411572811572611572a11573011572e11572c11573411573611573211573811573a11573e11573c11574011574211574411574611574811574e11575011574a11574c11575211575611575811575411575a11575c11575e11576011576411576c11576211576a11576611576811576e11577011577211577c11577411577611577811577a11577e11578011578611578211578411578811578a11578c11578e1157921157901157941157962c57982c579a2c579c2c57a02c579e2c57a21bbaa43357a61b57a83257aa3057ac1b57")\ - X(328 , 1, KeyX , "X" , "x" , 0x78 , 120 , 'u', 'x' , '\x18', "002d58062d58102d580e2d58142d58162d58022d580a2d580c2d58182d58042d58082d581a2d58122d58202d581e2d581c2d58222d58242d58282d58262d582a2d58302d582e2d582c2d58342d58362d58322d58382d583a2d583e2d583c2d58402d58422d58442d58462d58482d584e2d58502d584a2d584c2d58522d58562d58582d58542d585a2d585c2d585e2d58602d58642d586c2d58622d586a2d58662d58682d586e2d58702d58722d587c2d58742d58762d58782d587a2d587e2d58802d58862d58822d58842d58882d588a2d588c2d588e2d58922d58902d58942d58962d58982d589a2d589c2d58a02d589e2d58a20ddba43058a62b58a82e58aa2d58ac2e58")\ - X(330 , 1, KeyY , "Y" , "y" , 0x79 , 121 , 'u', 'y' , '\x19', "0015590615591015590e15591415591615590215590a15590c15591815590415590815591a15591215592015591e15591c15592215592415592815592615592a15593015592e15592c15593415593615593215593815593a15593e15593c1559402c594215594415594615594815594e15595015594a15594c15595215595615595815595415595a15595c15595e15596015596415596c15596215596a15596615596815596e2c59701559722c597c2c59742c59762c59782c597a2c597e2c59802c59862c59822c59842c59882c598a2c598c15598e1559921859902c59942c599615599815599a15599c1559a015599e1559a21559a41459a62759a81859aa1359ac2d59")\ - X(332 , 1, KeyZ , "Z" , "z" , 0x7A , 122 , 'u', 'z' , '\x1a', "002c5a062c5a102c5a0e2c5a142c5a162c5a022c5a0a2c5a0c2c5a182c5a042c5a082c5a1a2c5a122c5a202c5a1e2c5a1c2c5a222c5a242c5a282c5a262c5a2a2c5a302c5a2e2c5a2c2c5a342c5a362c5a322c5a382c5a3a2c5a3e2c5a3c2c5a40155a422c5a442c5a462c5a482c5a4e2c5a502c5a4a2c5a4c2c5a522c5a562c5a582c5a542c5a5a2c5a5c2c5a5e2c5a602c5a642c5a6c2c5a622c5a6a2c5a662c5a682c5a6e155a702c5a72155a7c155a74155a76155a78155a7a155a7e155a80155a86155a82155a84155a88155a8a155a8c2c5a8e2c5a922c5a90155a94155a96115a98115a9a115a9c115aa0115a9e115aa22c5aa4355aa6315aa8205aaa265aac1a5a")\ - X(334 , 1, AeLigature , "Æ" , "æ" , 0xE6 , 230 , 'u', -1 , -1 , "4e27c04a28de6027c06c27c06628de7027c0")\ - X(336 , 1, AcuteA , "Á" , "á" , 0xE1 , 225 , 'u', -1 , -1 , "7e28de8e28de")\ - X(338 , 1, BreveA , "Ă" , "ă" , 0x0103, 259 , 'u', -1 , -1 , "381adb941adb")\ - X(340 , 1, CircumflexA , "Â" , "â" , 0xE2 , 226 , 'u', -1 , -1 , "382bdc942bdc")\ - X(342 , 1, GraveA , "À" , "à" , 0xE0 , 224 , 'u', -1 , -1 , "3e2bdc422bdc5a28de5c28de8828dcac2cdd")\ - X(344 , 1, OgonekA , "Ą" , "ą" , 0x0105, 261 , 'u', -1 , -1 , "7228dea21051")\ - X(346 , 1, RingA , "Å" , "å" , 0xE5 , 229 , 'u', -1 , -1 , "441add4e1add4a1add4c1add601add6c1add621add661add")\ - X(348 , 1, TildeA , "Ã" , "ã" , 0xE3 , 227 , 'u', -1 , -1 , "9829de")\ - X(350 , 1, UmlautA , "Ä" , "ä" , 0xE4 , 228 , 'u', -1 , -1 , "4428de4c28de5628bf581bdd6228de741bdd7628de7828de7a28de8028de8628de8228de8428de8a28dc")\ - X(352 , 1, AcuteC , "Ć" , "ć" , 0x0107, 263 , 'u', -1 , -1 , "7c28de9028de")\ - X(354 , 1, CaronC , "Č" , "č" , 0x010D, 269 , 'u', -1 , -1 , "7c27ba9027baa233bc")\ - X(356 , 1, CedillaC , "Ç" , "ç" , 0xE7 , 231 , 'u', -1 , -1 , "3e1bdd3c27ba401adb421bdd5428de5e27c0682bbf8c34dca630bfac2bdc")\ - X(358 , 1, DotAboveC , "Ċ" , "ċ" , 0x010B, 267 , 'u', -1 , -1 , "3429c03629c0")\ - X(360 , 1, AcuteE , "É" , "é" , 0xE9 , 233 , 'u', -1 , -1 , "3a35bf3e35bf4235bf7e27ba8827de8e27baac11ba")\ - X(362 , 1, CircumflexE , "Ê" , "ê" , 0xEA , 234 , 'u', -1 , -1 , "ac56e2")\ - X(364 , 1, GraveE , "È" , "è" , 0xE8 , 232 , 'u', -1 , -1 , "3e28c04228c05a1aba5c1aba881abaac14bf")\ - X(366 , 1, DotAboveE , "Ė" , "ė" , 0x0117, 279 , 'u', -1 , -1 , "a228de")\ - X(368 , 1, OgonekE , "Ę" , "ę" , 0x0119, 281 , 'u', -1 , -1 , "a235bd")\ - X(370 , 1, UmlautE , "Ë" , "ë" , 0xEB , 235 , 'u', -1 , -1 , "4027ba")\ - X(372 , 1, CrossedD , "Đ" , "đ" , 0x0111, 273 , 'u', -1 , -1 , "7c1bdd901bdd")\ - X(374 , 1, BreveG , "Ğ" , "ğ" , 0x011F, 287 , 'u', -1 , -1 , "8c1adba612ba")\ - X(376 , 1, DotAboveG , "Ġ" , "ġ" , 0x0121, 289 , 'u', -1 , -1 , "341adb361adb")\ - X(378 , 1, CrossedH , "Ħ" , "ħ" , 0x0127, 295 , 'u', -1 , -1 , "341bdd361bdd")\ - X(380 , 1, AcuteI , "Í" , "í" , 0xED , 237 , 'u', -1 , -1 , "7e56e28e29308e56e2")\ - X(382 , 1, CircumflexI , "Î" , "î" , 0xEE , 238 , 'u', -1 , -1 , "381bdd941bdd")\ - X(384 , 1, GraveI , "Ì" , "ì" , 0xEC , 236 , 'u', -1 , -1 , "5a0ddd5c0ddd")\ - X(386 , 1, OgonekI , "Į" , "į" , 0x012F, 303 , 'u', -1 , -1 , "a21add")\ - X(388 , 1, CrossedL , "Ł" , "ł" , 0x0142, 322 , 'u', -1 , -1 , "7227ba762bbf7a2bbf")\ - X(390 , 1, CaronN , "Ň" , "ň" , 0x0148, 328 , 'u', -1 , -1 , "582bdc742bdc")\ - X(392 , 1, TildeN , "Ñ" , "ñ" , 0xF1 , 241 , 'u', -1 , -1 , "5027c05427c06a27c06827c0")\ - X(394 , 1, AcuteO , "Ó" , "ó" , 0xF3 , 243 , 'u', -1 , -1 , "722bdc7e0dbb8e0dbb981bba")\ - X(396 , 1, CircumflexO , "Ô" , "ô" , 0xF4 , 244 , 'u', -1 , -1 , "5827ba7427ba")\ - X(398 , 1, DoubleAcuteO , "Ő" , "ő" , 0x0151, 337 , 'u', -1 , -1 , "7e1adb8e1adb")\ - X(400 , 1, GraveO , "Ò" , "ò" , 0xF2 , 242 , 'u', -1 , -1 , "5a27c05c27c0")\ - X(402 , 1, HornO , "Ơ" , "ơ" , 0x01A1, 417 , 'u', -1 , -1 , "321bdd")\ - X(404 , 1, SlashedO , "Ø" , "ø" , 0xF8 , 248 , 'u', -1 , -1 , "4e28de4a27c06028de6c28de6627c0")\ - X(406 , 1, TildeO , "Õ" , "õ" , 0xF5 , 245 , 'u', -1 , -1 , "561bdb")\ - X(408 , 1, UmlautO , "Ö" , "ö" , 0xF6 , 246 , 'u', -1 , -1 , "4427c04c27c05627ba6227c0700cbb7627c07827c07a27c08027c08627c08227c08427c08a27de8c33bfa62ddc")\ - X(410 , 1, AcuteS , "Ś" , "ś" , 0x015B, 347 , 'u', -1 , -1 , "721bdd")\ - X(412 , 1, CaronS , "Š" , "š" , 0x0161, 353 , 'u', -1 , -1 , "7c1adb901adba22146")\ - X(414 , 1, CedillaS , "Ş" , "ş" , 0x015F, 351 , 'u', -1 , -1 , "8c27ba9427baa628de")\ - X(416 , 1, CommaS , "Ș" , "ș" , 0x0219, 537 , 'u', -1 , -1 , "3827ba")\ - X(418 , 1, CedillaT , "Ţ" , "ţ" , 0x0163, 355 , 'u', -1 , -1 , "9428de")\ - X(420 , 1, CommaT , "Ț" , "ț" , 0x021B, 539 , 'u', -1 , -1 , "3828de")\ - X(422 , 1, AcuteU , "Ú" , "ú" , 0xFA , 250 , 'u', -1 , -1 , "521adb581adb6e1adb741adb7e1bdd8e1bdd")\ - X(424 , 1, DoubleAcuteU , "Ű" , "ű" , 0x0171, 369 , 'u', -1 , -1 , "7e2bdc8e2bdc")\ - X(426 , 1, GraveU , "Ù" , "ù" , 0xF9 , 249 , 'u', -1 , -1 , "3e56e24256e25a2bbf5c2bbf9628c09828c09c28c0a028c09e28c0")\ - X(428 , 1, HornU , "Ư" , "ư" , 0x01B0, 432 , 'u', -1 , -1 , "321adb")\ - X(430 , 1, MacronU , "Ū" , "ū" , 0x016B, 363 , 'u', -1 , -1 , "a22d58")\ - X(432 , 1, OgonekU , "Ų" , "ų" , 0x0173, 371 , 'u', -1 , -1 , "a227c0")\ - X(434 , 1, RingU , "Ů" , "ů" , 0x016F, 367 , 'u', -1 , -1 , "5227ba6e27ba")\ - X(436 , 1, UmlautU , "Ü" , "ü" , 0xFC , 252 , 'u', -1 , -1 , "561ac0761aba781aba7a1aba7e0cbf801aba861aba821aba841aba8a1aba8c1bdd8e0cbda622dd")\ - X(438 , 1, CaronZ , "Ž" , "ž" , 0x017E, 382 , 'u', -1 , -1 , "1e0dbb7c2bdc902bdca21157")\ - X(440 , 1, DotAboveZ , "Ż" , "ż" , 0x017C, 380 , 'u', -1 , -1 , "342bdc3656e2721adb")\ - X(442 , 0, Sleep , "Sleep" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(444 , 0, AppStart1 , "AppStart1" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(446 , 0, AppStart2 , "AppStart2" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(448 , 0, AppNewWindow , "AppNewWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(450 , 0, AppOpenWindow , "AppOpenWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(452 , 0, AppHelp , "AppHelp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(454 , 0, AppSave , "AppSave" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(456 , 0, AppFind , "AppFind" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(458 , 0, AppPrint , "AppPrint" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(460 , 0, AppClose , "AppClose" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(462 , 1, AppCut , "AppCut" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(464 , 0, AppCopy , "AppCopy" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(466 , 1, AppPaste , "AppPaste" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(468 , 1, AppUndo , "AppUndo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(470 , 1, AppRedo , "AppRedo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(472 , 0, AppSpeechMode , "AppSpeechMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(474 , 0, AppSpeechCorrection, "AppSpeechCorrect" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(476 , 0, AppSpellCheck , "AppSpellCheck" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(478 , 0, Calculator , "Calculator" , "" , 0 , 0 , 'u', -1 , -1 , "0121b70721b71121b70f21b71521b71721b70321b70b21b70d21b71921b70521b70921b71b21b71321b72121b71f21b71d21b72321b72521b72921b72721b72b21b73121b72f21b72d21b73521b73721b73321b73921b73b21b73f21b73d21b74121b74321b74521b74721b74921b74f21b75121b74b21b74d21b75321b75721b75921b75521b75b21b75d21b75f21b76121b76521b76d21b76321b76b21b76721b76921b76f21b77121b77321b77d21b77521b77721b77921b77b21b77f21b78121b78721b78321b78521b78921b78b21b78d21b78f21b79321b79121b79521b79721b79921b79b21b79d21b7a121b79f21b7a321b7a521b7a721b7a921b7ab21b7ad21b7")\ - X(480 , 0, Mail , "Mail" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(482 , 0, MailSend , "MailSend" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(484 , 0, MailForward , "MailForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(486 , 0, MailReply , "MailReply" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(488 , 0, MediaBassBoost , "MediaBassBoost" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(490 , 0, MediaBassDown , "MediaBassDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(492 , 0, MediaBassUp , "MediaBassUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(494 , 0, MediaChanDown , "MediaChanDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(496 , 0, MediaChanUp , "MediaChanUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(498 , 0, MediaTrebleDown , "MediaTrebleDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(500 , 0, MediaTrebleUp , "MediaTrebleUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(502 , 0, MediaVolMute , "MediaVolMute" , "" , 0 , 57440, 'u', -1 , -1 , "0120ad0720ad1120ad0f20ad1520ad1720ad0320ad0b20ad0d20ad1920ad0520ad0920ad1b20ad1320ad2120ad1f20ad1d20ad2320ad2520ad2920ad2720ad2b20ad3120ad2f20ad2d20ad3520ad3720ad3320ad3920ad3b20ad3f20ad3d20ad4120ad4320ad4520ad4720ad4920ad4f20ad5120ad4b20ad4d20ad5320ad5720ad5920ad5520ad5b20ad5d20ad5f20ad6120ad6520ad6d20ad6320ad6b20ad6720ad6920ad6f20ad7120ad7320ad7d20ad7520ad7720ad7920ad7b20ad7f20ad8120ad8720ad8320ad8520ad8920ad8b20ad8d20ad8f20ad9320ad9120ad9520ad9720ad9920ad9b20ad9d20ada120ad9f20ada320ada520ada720ada920adab20adad20ad")\ - X(504 , 0, MediaVolDown , "MediaVolDown" , "" , 0 , 57438, 'u', -1 , -1 , "012eae072eae112eae0f2eae152eae172eae032eae0b2eae0d2eae192eae052eae092eae1b2eae132eae212eae1f2eae1d2eae232eae252eae292eae272eae2b2eae312eae2f2eae2d2eae352eae372eae332eae392eae3b2eae3f2eae3d2eae412eae432eae452eae472eae492eae4f2eae512eae4b2eae4d2eae532eae572eae592eae552eae5b2eae5d2eae5f2eae612eae652eae6d2eae632eae6b2eae672eae692eae6f2eae712eae732eae7d2eae752eae772eae792eae7b2eae7f2eae812eae872eae832eae852eae892eae8b2eae8d2eae8f2eae932eae912eae952eae972eae992eae9b2eae9d2eaea12eae9f2eaea32eaea52eaea72eaea92eaeab2eaead2eae")\ - X(506 , 0, MediaVolUp , "MediaVolUp" , "" , 0 , 57439, 'u', -1 , -1 , "0130af0730af1130af0f30af1530af1730af0330af0b30af0d30af1930af0530af0930af1b30af1330af2130af1f30af1d30af2330af2530af2930af2730af2b30af3130af2f30af2d30af3530af3730af3330af3930af3b30af3f30af3d30af4130af4330af4530af4730af4930af4f30af5130af4b30af4d30af5330af5730af5930af5530af5b30af5d30af5f30af6130af6530af6d30af6330af6b30af6730af6930af6f30af7130af7330af7d30af7530af7730af7930af7b30af7f30af8130af8730af8330af8530af8930af8b30af8d30af8f30af9330af9130af9530af9730af9930af9b30af9d30afa130af9f30afa330afa530afa730afa930afab30afad30af")\ - X(508 , 0, MediaNext , "MediaNext" , "" , 0 , 57435, 'u', -1 , -1 , "0119b00719b01119b00f19b01519b01719b00319b00b19b00d19b01919b00519b00919b01b19b01319b02119b01f19b01d19b02319b02519b02919b02719b02b19b03119b02f19b02d19b03519b03719b03319b03919b03b19b03f19b03d19b04119b04319b04519b04719b04919b04f19b05119b04b19b04d19b05319b05719b05919b05519b05b19b05d19b05f19b06119b06519b06d19b06319b06b19b06719b06919b06f19b07119b07319b07d19b07519b07719b07919b07b19b07f19b08119b08719b08319b08519b08919b08b19b08d19b08f19b09319b09119b09519b09719b09919b09b19b09d19b0a119b09f19b0a319b0a519b0a719b0a919b0ab19b0ad19b0")\ - X(510 , 0, MediaPrev , "MediaPrev" , "" , 0 , 57436, 'u', -1 , -1 , "0110b10710b11110b10f10b11510b11710b10310b10b10b10d10b11910b10510b10910b11b10b11310b12110b11f10b11d10b12310b12510b12910b12710b12b10b13110b12f10b12d10b13510b13710b13310b13910b13b10b13f10b13d10b14110b14310b14510b14710b14910b14f10b15110b14b10b14d10b15310b15710b15910b15510b15b10b15d10b15f10b16110b16510b16d10b16310b16b10b16710b16910b16f10b17110b17310b17d10b17510b17710b17910b17b10b17f10b18110b18710b18310b18510b18910b18b10b18d10b18f10b19310b19110b19510b19710b19910b19b10b19d10b1a110b19f10b1a310b1a510b1a710b1a910b1ab10b1ad10b1")\ - X(512 , 0, MediaStop , "MediaStop" , "" , 0 , 57432, 'u', -1 , -1 , "0124b20724b21124b20f24b21524b21724b20324b20b24b20d24b21924b20524b20924b21b24b21324b22124b21f24b21d24b22324b22524b22924b22724b22b24b23124b22f24b22d24b23524b23724b23324b23924b23b24b23f24b23d24b24124b24324b24524b24724b24924b24f24b25124b24b24b24d24b25324b25724b25924b25524b25b24b25d24b25f24b26124b26524b26d24b26324b26b24b26724b26924b26f24b27124b27324b27d24b27524b27724b27924b27b24b27f24b28124b28724b28324b28524b28924b28b24b28d24b28f24b29324b29124b29524b29724b29924b29b24b29d24b2a124b29f24b2a324b2a524b2a724b2a924b2ab24b2ad24b2")\ - X(514 , 0, MediaPause , "MediaPause" , "" , 0 , 57429, 'u', -1 , -1 , "")\ - X(516 , 0, MediaPlayPause , "MediaPlayPause" , "" , 0 , 57430, 'u', -1 , -1 , "0122b30722b31122b30f22b31522b31722b30322b30b22b30d22b31922b30522b30922b31b22b31322b32122b31f22b31d22b32322b32522b32922b32722b32b22b33122b32f22b32d22b33522b33722b33322b33922b33b22b33f22b33d22b34122b34322b34522b34722b34922b34f22b35122b34b22b34d22b35322b35722b35922b35522b35b22b35d22b35f22b36122b36522b36d22b36322b36b22b36722b36922b36f22b37122b37322b37d22b37522b37722b37922b37b22b37f22b38122b38722b38322b38522b38922b38b22b38d22b38f22b39322b39122b39522b39722b39922b39b22b39d22b3a122b39f22b3a322b3a522b3a722b3a922b3ab22b3ad22b3")\ - X(518 , 0, MediaPlay , "MediaPlay" , "" , 0 , 57428, 'u', -1 , -1 , "")\ - X(520 , 0, MediaSelectMode , "MediaSelectMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(522 , 0, MediaReverse , "MediaReverse" , "" , 0 , 57431, 'u', -1 , -1 , "")\ - X(524 , 0, MediaRecord , "MediaRecord" , "" , 0 , 57437, 'u', -1 , -1 , "")\ - X(526 , 0, MediaFastForward , "MediaFastForward" , "" , 0 , 57433, 'u', -1 , -1 , "")\ - X(528 , 0, MediaRewind , "MediaRewind" , "" , 0 , 57434, 'u', -1 , -1 , "")\ - X(530 , 0, MicAirToggle , "MicAirToggle" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(532 , 0, MicMute , "MicMute" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(534 , 0, MicVolUp , "MicVolUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(536 , 0, MicVolDown , "MicVolDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(538 , 0, BrowserBackward , "BrowserBackward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(540 , 0, BrowserForward , "BrowserForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(542 , 0, BrowserRefresh , "BrowserRefresh" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(544 , 0, BrowserStop , "BrowserStop" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(546 , 0, BrowserSearch , "BrowserSearch" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(548 , 0, BrowserFavorites , "BrowserFavorites" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(550 , 0, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0132ac0732ac1132ac0f32ac1532ac1732ac0332ac0b32ac0d32ac1932ac0532ac0932ac1b32ac1332ac2132ac1f32ac1d32ac2332ac2532ac2932ac2732ac2b32ac3132ac2f32ac2d32ac3532ac3732ac3332ac3932ac3b32ac3f32ac3d32ac4132ac4332ac4532ac4732ac4932ac4f32ac5132ac4b32ac4d32ac5332ac5732ac5932ac5532ac5b32ac5d32ac5f32ac6132ac6532ac6d32ac6332ac6b32ac6732ac6932ac6f32ac7132ac7332ac7d32ac7532ac7732ac7932ac7b32ac7f32ac8132ac8732ac8332ac8532ac8932ac8b32ac8d32ac8f32ac9332ac9132ac9532ac9732ac9932ac9b32ac9d32aca132ac9f32aca332aca532aca732aca932acab32acad32ac")\ - X(552 , 0, lastKey , "lastKey" , "" , 0 , 0 , 0 , -1 , -1 , "") + /* ID Input vk Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */\ + X(0 , 1, 0 , undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(1 , 0, 0 , invalid , "invalid" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(2 , 0, 0xA2, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001d11061d11101d110e1d11141d11161d11021d110a1d110c1d11181d11041d11081d111a1d11121d11201d111e1d111c1d11221d11241d11281d11261d112a1d11301d112e1d112c1d11341d11361d11321d11381d113a1d113e1d113c1d11401d11421d11441d11461d11481d114e1d11501d114a1d114c1d11521d11561d11581d11541d115a1d115c1d115e1d11601d11641d116c1d11621d116a1d11661d11681d116e1d11701d11721d117c1d11741d11761d11781d117a1d117e1d11801d11861d11821d11841d11881d118a1d118c1d118e1d11921d11901d11941d11961d11981d119a1d119c1d11a01d119e1d11a21d11a41d11a61d11a81d11aa1d11ac1d11")\ + X( 3 , 0, 0xA3, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011d11071d11111d110f1d11151d11171d11031d110b1d110d1d11191d11051d11091d111b1d11131d11211d111f1d111d1d11231d19251d11291d11271d112b1d11311d112f1d112d1d11351d11371d11331d11391d113b1d113f1d113d1d11411d11431ddf451d11471d11491d114f1d11511d114b1d114d1d11531d11571d11591d11551d115b1d115d1d115f1d11611d11651d116d1d11631d116b1d11671d11691d116f1d11711d11731d117d1d11751d11771d11791d117b1d117f1d11811d11871d11831d11851d11891d118b1d118d1d118f1d11931d11911d11951d11971d11991d119b1d119d1d11a11d119f1d11a31d11a51d11a71d11a91d11ab1d11ad1d11")\ + X(4 , 0, 0xA4, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038120638121038120e38121438121638120238120a38120c38121838120438120838121a38121238122038121e38121c38122238122438122838122638122a38123038122e38122c38123438123638123238123838123a38123e38123c38124038124238124438124638124838124e38125038124a38124c38125238125638125838125438125a38125c38125e38126038126438126c38126238126a38126638126838126e38127038127238127c38127438127638127838127a38127e38128038128638128238128438128838128a38128c38128e38129238129038129438129638129838129a38129c3812a038129e3812a23812a43812a63812a83812aa3812ac3812")\ + X( 5 , 0, 0xA5, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138120738121138120f38121538121738120338120b38120d38121938120538120938121b38121338122138121f38121d38122338152538122938122738122b38123138122f38122d38123538123738123338123938123b38123f38123d38124138124338124538124738124938124f38125138124b38124d38125338125738125938125538125b38125d38125f38126138126538126d38126338126b38126738126938126f38127138127338127d38127538127738127938127b38127f38128138128738128338128538128938128b38128d38128f38129338129138129538129738129938129b38129d3812a138129f3812a33812a53812a73812a93812ab3812ad3812")\ + X(6 , 0, 0xA0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002a10062a10102a100e2a10142a10162a10022a100a2a100c2a10182a10042a10082a101a2a10122a10202a101e2a101c2a10222a10242a10282a10262a102a2a10302a102e2a102c2a10342a10362a10322a10382a103a2a103e2a103c2a10402a10422a10442a10462a10482a104e2a10502a104a2a104c2a10522a10562a10582a10542a105a2a105c2a105e2a10602a10642a106c2a10622a106a2a10662a10682a106e2a10702a10722a107c2a10742a10762a10782a107a2a107e2a10802a10862a10822a10842a10882a108a2a108c2a108e2a10922a10902a10942a10962a10982a109a2a109c2a10a02a109e2a10a22a10a42a10a62a10a82a10aa2a10ac2a10")\ + X( 7 , 0, 0xA1, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036100636101036100e36101436101636100236100a36100c36101836100436100836101a36101236102036101e36101c36102236102436102836102636102a36103036102e36102c36103436103636103236103836103a36103e36103c36104036104236104436104636104836104e36105036104a36104c36105236105636105836105436105a36105c36105e36106036106436106c36106236106a36106636106836106e36107036107236107c36107436107636107836107a36107e36108036108636108236108436108836108a36108c36108e36109236109036109436109636109836109a36109c3610a036109e3610a23610a43610a63610a83610aa3610ac3610")\ + X(8 , 0, 0x5B, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "015b5b075b5b115b5b0f5b5b155b5b175b5b035b5b0b5b5b0d5b5b195b5b055b5b095b5b1b5b5b135b5b215b5b1f5b5b1d5b5b235b5b255b5b295b5b275b5b2b5b5b315b5b2f5b5b2d5b5b355b5b375b5b335b5b395b5b3b5b5b3f5b5b3d5b5b415b5b435b5b455b5b475b5b4f5b5b515b5b4b5b5b4d5b5b535b5b575b5b595b5b555b5b5b5b5b5d5b5b5f5b5b615b5b655b5b6d5b5b635b5b6b5b5b675b5b695b5b6f5b5b715b5b735b5b7d5b5b755b5b775b5b795b5b7b5b5b7f5b5b815b5b875b5b835b5b855b5b895b5b8b5b5b8d5b5b935b5b975b5b995b5b9b5b5b9d5b5ba15b5b9f5b5ba35b5ba55b5ba75b5ba95b5bab5b5bad5b5b")\ + X( 9 , 0, 0x5C, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "015c5c075c5c115c5c0f5c5c155c5c175c5c035c5c0b5c5c0d5c5c195c5c055c5c095c5c1b5c5c135c5c215c5c1f5c5c1d5c5c235c5c255c5c295c5c275c5c2b5c5c315c5c2f5c5c2d5c5c355c5c375c5c335c5c395c5c3b5c5c3f5c5c3d5c5c415c5c435c5c455c5c475c5c495c5c4f5c5c515c5c4b5c5c4d5c5c535c5c575c5c595c5c555c5c5b5c5c5d5c5c5f5c5c615c5c655c5c6d5c5c635c5c6b5c5c675c5c695c5c6f5c5c715c5c735c5c7d5c5c755c5c775c5c795c5c7b5c5c7f5c5c815c5c875c5c835c5c855c5c895c5c8b5c5c8d5c5c8f5c5c935c5c915c5c955c5c975c5c995c5c9b5c5c9d5c5ca15c5c9f5c5ca35c5ca55c5ca75c5ca95c5cab5c5cad5c5c")\ + X(10 , 0, 0 , LeftHyper , "Hyper" , "" , 0 , 57445, 'u', -1 , -1 , "")\ + X( 11 , 0, 0 , RightHyper , "Hyper" , "" , 0 , 57451, 'u', -1 , -1 , "")\ + X(12 , 0, 0 , AltGR , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ + X(14 , 0, 0x90, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0145900745901145900f45901545901745900345900b45900d45901945900545900945901b45901345902145901f45901d45902345902545902945902745902b45903145902f45902d45903545903745903345903945903b45903f45903d45904145904345904545904745904945904f45905145904b45904d45905345905745905945905545905b45905d45905f45906145906545906d45906345906b45906745906945906f45907145907345907d45907545907745907945907b45907f45908145908745908345908545908945908b45908d45908f45909345909145909545909745909945909b45909d4590a145909f4590a34590a54590a74590a94590ab4590ad4590")\ + X(16 , 0, 0x14, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14063a14103a140e3a14143a14163a14023a140a3a140c3a14183a14043a14083a141a3a14123a14203a141e3a141c3a14223a14243a14283a14263a142a3a14303a142e3a142c3a14343a14363a14323a14383a143a3a143e3a143c3a14403a14423a14443a14463a14483a144e3a14503a144a3a144c3a14523a14563a14583a14543a145a3a145c3a145e3a14603a14643a146c3a14623a146a3a14663a14683a146e3a14703a14723a147c3a14743a14763a14783a147a3a147e3a14803a14863a14823a14843a14883a148a3a148c3a148e3a14923a14903a14943a14963a14983a149a3a149c3a14a03a149e3a14a23a14a43a14a63a14a83a14aa3a14ac3a14")\ + X(18 , 0, 0x91, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046910646911046910e46911446911646910246910a46910c46911846910446910846911a46911246912046911e46911c46912246912446912846912646912a46913046912e46912c46913446913646913246913846913a46913e46913c46914046914246914446914646914846914e46915046914a46914c46915246915646915846915446915a46915c46915e46916046916446916c46916246916a46916646916846916e46917046917246917c46917446917646917846917a46917e46918046918646918246918446918846918a46918c46918e46919246919046919446919646919846919a46919c4691a046919e4691a24691a44691a64691a84691aa4691ac4691")\ + X(20 , 0, 0 , Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0270f2")\ + X(22 , 0, 0 , Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "02791c")\ + X(24 , 0, 0 , Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "027b1d")\ + X(26 , 0, 0x19, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "22f119")\ + X(28 , 0, 0 , Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "22f215")\ + X(30 , 0, 0 , IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "")\ + X(32 , 0, 0x5D, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "015d5d075d5d115d5d0f5d5d155d5d175d5d035d5d0b5d5d0d5d5d195d5d055d5d095d5d1b5d5d135d5d215d5d1f5d5d1d5d5d235d5d255d5d295d5d275d5d2b5d5d315d5d2f5d5d2d5d5d355d5d375d5d335d5d395d5d3b5d5d3f5d5d3d5d5d415d5d435d5d455d5d475d5d4f5d5d515d5d4b5d5d4d5d5d535d5d575d5d595d5d555d5d5b5d5d5d5d5d5f5d5d615d5d655d5d6d5d5d635d5d6b5d5d675d5d695d5d6f5d5d715d5d735d5d7d5d5d755d5d775d5d795d5d7b5d5d7f5d5d815d5d875d5d835d5d855d5d895d5d8b5d5d8d5d5d935d5d975d5d995d5d9b5d5d9d5d5da15d5d9f5d5da35d5da55d5da75d5da95d5dab5d5dad5d5d")\ + X(34 , 0, 0x29, Select , "Select" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(36 , 0, 0 , Fn , "Fn" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(38 , 0, 0x70, F1 , "F1" , "" , 0 , 11 , '~', -1 , -1 , "003b70063b70103b700e3b70143b70163b70023b700a3b700c3b70183b70043b70083b701a3b70123b70203b701e3b701c3b70223b70243b70283b70263b702a3b70303b702e3b702c3b70343b70363b70323b70383b703a3b703e3b703c3b70403b70423b70443b70463b70483b704e3b70503b704a3b704c3b70523b70563b70583b70543b705a3b705c3b705e3b70603b70643b706c3b70623b706a3b70663b70683b706e3b70703b70723b707c3b70743b70763b70783b707a3b707e3b70803b70863b70823b70843b70883b708a3b708c3b708e3b70923b70903b70943b70963b70983b709a3b709c3b70a03b709e3b70a23b70a43b70a63b70a83b70aa3b70ac3b70")\ + X(40 , 0, 0x71, F2 , "F2" , "" , 0 , 12 , '~', -1 , -1 , "003c71063c71103c710e3c71143c71163c71023c710a3c710c3c71183c71043c71083c711a3c71123c71203c711e3c711c3c71223c71243c71283c71263c712a3c71303c712e3c712c3c71343c71363c71323c71383c713a3c713e3c713c3c71403c71423c71443c71463c71483c714e3c71503c714a3c714c3c71523c71563c71583c71543c715a3c715c3c715e3c71603c71643c716c3c71623c716a3c71663c71683c716e3c71703c71723c717c3c71743c71763c71783c717a3c717e3c71803c71863c71823c71843c71883c718a3c718c3c718e3c71923c71903c71943c71963c71983c719a3c719c3c71a03c719e3c71a23c71a43c71a63c71a83c71aa3c71ac3c71")\ + X(42 , 0, 0x72, F3 , "F3" , "" , 0 , 13 , '~', -1 , -1 , "003d72063d72103d720e3d72143d72163d72023d720a3d720c3d72183d72043d72083d721a3d72123d72203d721e3d721c3d72223d72243d72283d72263d722a3d72303d722e3d722c3d72343d72363d72323d72383d723a3d723e3d723c3d72403d72423d72443d72463d72483d724e3d72503d724a3d724c3d72523d72563d72583d72543d725a3d725c3d725e3d72603d72643d726c3d72623d726a3d72663d72683d726e3d72703d72723d727c3d72743d72763d72783d727a3d727e3d72803d72863d72823d72843d72883d728a3d728c3d728e3d72923d72903d72943d72963d72983d729a3d729c3d72a03d729e3d72a23d72a43d72a63d72a83d72aa3d72ac3d72")\ + X(44 , 0, 0x73, F4 , "F4" , "" , 0 , 14 , '~', -1 , -1 , "003e73063e73103e730e3e73143e73163e73023e730a3e730c3e73183e73043e73083e731a3e73123e73203e731e3e731c3e73223e73243e73283e73263e732a3e73303e732e3e732c3e73343e73363e73323e73383e733a3e733e3e733c3e73403e73423e73443e73463e73483e734e3e73503e734a3e734c3e73523e73563e73583e73543e735a3e735c3e735e3e73603e73643e736c3e73623e736a3e73663e73683e736e3e73703e73723e737c3e73743e73763e73783e737a3e737e3e73803e73863e73823e73843e73883e738a3e738c3e738e3e73923e73903e73943e73963e73983e739a3e739c3e73a03e739e3e73a23e73a43e73a63e73a83e73aa3e73ac3e73")\ + X(46 , 0, 0x74, F5 , "F5" , "" , 0 , 15 , '~', -1 , -1 , "003f74063f74103f740e3f74143f74163f74023f740a3f740c3f74183f74043f74083f741a3f74123f74203f741e3f741c3f74223f74243f74283f74263f742a3f74303f742e3f742c3f74343f74363f74323f74383f743a3f743e3f743c3f74403f74423f74443f74463f74483f744e3f74503f744a3f744c3f74523f74563f74583f74543f745a3f745c3f745e3f74603f74643f746c3f74623f746a3f74663f74683f746e3f74703f74723f747c3f74743f74763f74783f747a3f747e3f74803f74863f74823f74843f74883f748a3f748c3f748e3f74923f74903f74943f74963f74983f749a3f749c3f74a03f749e3f74a23f74a43f74a63f74a83f74aa3f74ac3f74")\ + X(48 , 0, 0x75, F6 , "F6" , "" , 0 , 17 , '~', -1 , -1 , "0040750640751040750e40751440751640750240750a40750c40751840750440750840751a40751240752040751e40751c40752240752440752840752640752a40753040752e40752c40753440753640753240753840753a40753e40753c40754040754240754440754640754840754e40755040754a40754c40755240755640755840755440755a40755c40755e40756040756440756c40756240756a40756640756840756e40757040757240757c40757440757640757840757a40757e40758040758640758240758440758840758a40758c40758e40759240759040759440759640759840759a40759c4075a040759e4075a24075a44075a64075a84075aa4075ac4075")\ + X(50 , 0, 0x76, F7 , "F7" , "" , 0 , 18 , '~', -1 , -1 , "0041760641761041760e41761441761641760241760a41760c41761841760441760841761a41761241762041761e41761c41762241762441762841762641762a41763041762e41762c41763441763641763241763841763a41763e41763c41764041764241764441764641764841764e41765041764a41764c41765241765641765841765441765a41765c41765e41766041766441766c41766241766a41766641766841766e41767041767241767c41767441767641767841767a41767e41768041768641768241768441768841768a41768c41768e41769241769041769441769641769841769a41769c4176a041769e4176a24176a44176a64176a84176aa4176ac4176")\ + X(52 , 0, 0x77, F8 , "F8" , "" , 0 , 19 , '~', -1 , -1 , "0042770642771042770e42771442771642770242770a42770c42771842770442770842771a42771242772042771e42771c42772242772442772842772642772a42773042772e42772c42773442773642773242773842773a42773e42773c42774042774242774442774642774842774e42775042774a42774c42775242775642775842775442775a42775c42775e42776042776442776c42776242776a42776642776842776e42777042777242777c42777442777642777842777a42777e42778042778642778242778442778842778a42778c42778e42779242779042779442779642779842779a42779c4277a042779e4277a24277a44277a64277a84277aa4277ac4277")\ + X(54 , 0, 0x78, F9 , "F9" , "" , 0 , 20 , '~', -1 , -1 , "0043780643781043780e43781443781643780243780a43780c43781843780443780843781a43781243782043781e43781c43782243782443782843782643782a43783043782e43782c43783443783643783243783843783a43783e43783c43784043784243784443784643784843784e43785043784a43784c43785243785643785843785443785a43785c43785e43786043786443786c43786243786a43786643786843786e43787043787243787c43787443787643787843787a43787e43788043788643788243788443788843788a43788c43788e43789243789043789443789643789843789a43789c4378a043789e4378a24378a44378a64378a84378aa4378ac4378")\ + X(56 , 0, 0x79, F10 , "F10" , "" , 0 , 21 , '~', -1 , -1 , "0044790644791044790e44791444791644790244790a44790c44791844790444790844791a44791244792044791e44791c44792244792444792844792644792a44793044792e44792c44793444793644793244793844793a44793e44793c44794044794244794444794644794844794e44795044794a44794c44795244795644795844795444795a44795c44795e44796044796444796c44796244796a44796644796844796e44797044797244797c44797444797644797844797a44797e44798044798644798244798444798844798a44798c44798e44799244799044799444799644799844799a44799c4479a044799e4479a24479a44479a64479a84479aa4479ac4479")\ + X(58 , 0, 0x7A, F11 , "F11" , "" , 0 , 23 , '~', -1 , -1 , "00577a06577a10577a0e577a14577a16577a02577a0a577a0c577a18577a04577a08577a1a577a12577a20577a1e577a1c577a22577a24577a28577a26577a2a577a30577a2e577a2c577a34577a36577a32577a38577a3a577a3e577a3c577a40577a42577a44577a46577a48577a4e577a50577a4a577a4c577a52577a56577a58577a54577a5a577a5c577a5e577a60577a64577a6c577a62577a6a577a66577a68577a6e577a70577a72577a7c577a74577a76577a78577a7a577a7e577a80577a86577a82577a84577a88577a8a577a8c577a8e577a92577a90577a94577a96577a98577a9a577a9c577aa0577a9e577aa2577aa4577aa6577aa8577aaa577aac577a")\ + X(60 , 0, 0x7B, F12 , "F12" , "" , 0 , 24 , '~', -1 , -1 , "00587b06587b10587b0e587b14587b16587b02587b0a587b0c587b18587b04587b08587b1a587b12587b20587b1e587b1c587b22587b24587b28587b26587b2a587b30587b2e587b2c587b34587b36587b32587b38587b3a587b3e587b3c587b40587b42587b44587b46587b48587b4e587b50587b4a587b4c587b52587b56587b58587b54587b5a587b5c587b5e587b60587b64587b6c587b62587b6a587b66587b68587b6e587b70587b72587b7c587b74587b76587b78587b7a587b7e587b80587b86587b82587b84587b88587b8a587b8c587b8e587b92587b90587b94587b96587b98587b9a587b9c587ba0587b9e587ba2587ba4587ba6587ba8587baa587bac587b")\ + X(62 , 0, 0x7C, F13 , "F13" , "" , 0 , 57376, 'u', -1 , -1 , "00647c06647c10647c0e647c14647c16647c02647c0a647c0c647c18647c04647c08647c1a647c12647c20647c1e647c1c647c22647c24647c28647c26647c2a647c30647c2e647c2c647c34647c36647c32647c38647c3a647c3e647c3c647c40647c42647c44647c46647c48647c4e647c50647c4a647c4c647c52647c56647c58647c54647c5a647c5c647c5e647c60647c64647c6c647c62647c6a647c66647c68647c6e647c70647c72647c7c647c74647c76647c78647c7a647c7e647c80647c86647c82647c84647c88647c8a647c8c647c8e647c92647c90647c94647c96647c98647c9a647c9c647ca0647c9e647ca2647ca4647ca6647ca8647caa647cac647c")\ + X(64 , 0, 0x7D, F14 , "F14" , "" , 0 , 57377, 'u', -1 , -1 , "00657d06657d10657d0e657d14657d16657d02657d0a657d0c657d18657d04657d08657d1a657d12657d20657d1e657d1c657d22657d24657d28657d26657d2a657d30657d2e657d2c657d34657d36657d32657d38657d3a657d3e657d3c657d40657d42657d44657d46657d48657d4e657d50657d4a657d4c657d52657d56657d58657d54657d5a657d5c657d5e657d60657d64657d6c657d62657d6a657d66657d68657d6e657d70657d72657d7c657d74657d76657d78657d7a657d7e657d80657d86657d82657d84657d88657d8a657d8c657d8e657d92657d90657d94657d96657d98657d9a657d9c657da0657d9e657da2657da4657da6657da8657daa657dac657d")\ + X(66 , 0, 0x7E, F15 , "F15" , "" , 0 , 57378, 'u', -1 , -1 , "00667e06667e10667e0e667e14667e16667e02667e0a667e0c667e18667e04667e08667e1a667e12667e20667e1e667e1c667e22667e24667e28667e26667e2a667e30667e2e667e2c667e34667e36667e32667e38667e3a667e3e667e3c667e40667e42667e44667e46667e48667e4e667e50667e4a667e4c667e52667e56667e58667e54667e5a667e5c667e5e667e60667e64667e6c667e62667e6a667e66667e68667e6e667e70667e72667e7c667e74667e76667e78667e7a667e7e667e80667e86667e82667e84667e88667e8a667e8c667e8e667e92667e90667e94667e96667e98667e9a667e9c667ea0667e9e667ea2667ea4667ea6667ea8667eaa667eac667e")\ + X(68 , 0, 0x7F, F16 , "F16" , "" , 0 , 57379, 'u', -1 , -1 , "00677f06677f10677f0e677f14677f16677f02677f0a677f0c677f18677f04677f08677f1a677f12677f20677f1e677f1c677f22677f24677f28677f26677f2a677f30677f2e677f2c677f34677f36677f32677f38677f3a677f3e677f3c677f40677f42677f44677f46677f48677f4e677f50677f4a677f4c677f52677f56677f58677f54677f5a677f5c677f5e677f60677f64677f6c677f62677f6a677f66677f68677f6e677f70677f72677f7c677f74677f76677f78677f7a677f7e677f80677f86677f82677f84677f88677f8a677f8c677f8e677f92677f90677f94677f96677f98677f9a677f9c677fa0677f9e677fa2677fa4677fa6677fa8677faa677fac677f")\ + X(70 , 0, 0x80, F17 , "F17" , "" , 0 , 57380, 'u', -1 , -1 , "0068800668801068800e68801468801668800268800a68800c68801868800468800868801a68801268802068801e68801c68802268802468802868802668802a68803068802e68802c68803468803668803268803868803a68803e68803c68804068804268804468804668804868804e68805068804a68804c68805268805668805868805468805a68805c68805e68806068806468806c68806268806a68806668806868806e68807068807268807c68807468807668807868807a68807e68808068808668808268808468808868808a68808c68808e68809268809068809468809668809868809a68809c6880a068809e6880a26880a46880a66880a86880aa6880ac6880")\ + X(72 , 0, 0x81, F18 , "F18" , "" , 0 , 57381, 'u', -1 , -1 , "0069810669811069810e69811469811669810269810a69810c69811869810469810869811a69811269812069811e69811c69812269812469812869812669812a69813069812e69812c69813469813669813269813869813a69813e69813c69814069814269814469814669814869814e69815069814a69814c69815269815669815869815469815a69815c69815e69816069816469816c69816269816a69816669816869816e69817069817269817c69817469817669817869817a69817e69818069818669818269818469818869818a69818c69818e69819269819069819469819669819869819a69819c6981a069819e6981a26981a46981a66981a86981aa6981ac6981")\ + X(74 , 0, 0x82, F19 , "F19" , "" , 0 , 57382, 'u', -1 , -1 , "006a82066a82106a820e6a82146a82166a82026a820a6a820c6a82186a82046a82086a821a6a82126a82206a821e6a821c6a82226a82246a82286a82266a822a6a82306a822e6a822c6a82346a82366a82326a82386a823a6a823e6a823c6a82406a82426a82446a82466a82486a824e6a82506a824a6a824c6a82526a82566a82586a82546a825a6a825c6a825e6a82606a82646a826c6a82626a826a6a82666a82686a826e6a82706a82726a827c6a82746a82766a82786a827a6a827e6a82806a82866a82826a82846a82886a828a6a828c6a828e6a82926a82906a82946a82966a82986a829a6a829c6a82a06a829e6a82a26a82a46a82a66a82a86a82aa6a82ac6a82")\ + X(76 , 0, 0x83, F20 , "F20" , "" , 0 , 57383, 'u', -1 , -1 , "006b83066b83106b830e6b83146b83166b83026b830a6b830c6b83186b83046b83086b831a6b83126b83206b831e6b831c6b83226b83246b83286b83266b832a6b83306b832e6b832c6b83346b83366b83326b83386b833a6b833e6b833c6b83406b83426b83446b83466b83486b834e6b83506b834a6b834c6b83526b83566b83586b83546b835a6b835c6b835e6b83606b83646b836c6b83626b836a6b83666b83686b836e6b83706b83726b837c6b83746b83766b83786b837a6b837e6b83806b83866b83826b83846b83886b838a6b838c6b838e6b83926b83906b83946b83966b83986b839a6b839c6b83a06b839e6b83a26b83a46b83a66b83a86b83aa6b83ac6b83")\ + X(78 , 0, 0x84, F21 , "F21" , "" , 0 , 57384, 'u', -1 , -1 , "006c84066c84106c840e6c84146c84166c84026c840a6c840c6c84186c84046c84086c841a6c84126c84206c841e6c841c6c84226c84246c84286c84266c842a6c84306c842e6c842c6c84346c84366c84326c84386c843a6c843e6c843c6c84406c84426c84446c84466c84486c844e6c84506c844a6c844c6c84526c84566c84586c84546c845a6c845c6c845e6c84606c84646c846c6c84626c846a6c84666c84686c846e6c84706c84726c847c6c84746c84766c84786c847a6c847e6c84806c84866c84826c84846c84886c848a6c848c6c848e6c84926c84906c84946c84966c84986c849a6c849c6c84a06c849e6c84a26c84a46c84a66c84a86c84aa6c84ac6c84")\ + X(80 , 0, 0x85, F22 , "F22" , "" , 0 , 57385, 'u', -1 , -1 , "006d85066d85106d850e6d85146d85166d85026d850a6d850c6d85186d85046d85086d851a6d85126d85206d851e6d851c6d85226d85246d85286d85266d852a6d85306d852e6d852c6d85346d85366d85326d85386d853a6d853e6d853c6d85406d85426d85446d85466d85486d854e6d85506d854a6d854c6d85526d85566d85586d85546d855a6d855c6d855e6d85606d85646d856c6d85626d856a6d85666d85686d856e6d85706d85726d857c6d85746d85766d85786d857a6d857e6d85806d85866d85826d85846d85886d858a6d858c6d858e6d85926d85906d85946d85966d85986d859a6d859c6d85a06d859e6d85a26d85a46d85a66d85a86d85aa6d85ac6d85")\ + X(82 , 0, 0x86, F23 , "F23" , "" , 0 , 57386, 'u', -1 , -1 , "006e86066e86106e860e6e86146e86166e86026e860a6e860c6e86186e86046e86086e861a6e86126e86206e861e6e861c6e86226e86246e86286e86266e862a6e86306e862e6e862c6e86346e86366e86326e86386e863a6e863e6e863c6e86406e86426e86446e86466e86486e864e6e86506e864a6e864c6e86526e86566e86586e86546e865a6e865c6e865e6e86606e86646e866c6e86626e866a6e86666e86686e866e6e86706e86726e867c6e86746e86766e86786e867a6e867e6e86806e86866e86826e86846e86886e868a6e868c6e868e6e86926e86906e86946e86966e86986e869a6e869c6e86a06e869e6e86a26e86a46e86a66e86a86e86aa6e86ac6e86")\ + X(84 , 0, 0x87, F24 , "F24" , "" , 0 , 57387, 'u', -1 , -1 , "006f87066f87106f870e6f87146f87166f87026f870a6f870c6f87186f87046f87086f871a6f87126f87206f871e6f871c6f87226f87246f87286f87266f872a6f87306f872e6f872c6f87346f87366f87326f87386f873a6f873e6f873c6f87406f87426f87446f87466f87486f874e6f87506f874a6f874c6f87526f87566f87586f87546f875a6f875c6f875e6f87606f87646f876c6f87626f876a6f87666f87686f876e6f87706f87726f877c6f87746f87766f87786f877a6f877e6f87806f87866f87826f87846f87886f878a6f878c6f878e6f87926f87906f87946f87966f87986f879a6f879c6f87a06f879e6f87a26f87a46f87a66f87a86f87aa6f87ac6f87")\ + X(86 , 0, 0 , F25 , "F25" , "" , 0 , 57388, 'u', -1 , -1 , "")\ + X(88 , 0, 0 , F26 , "F26" , "" , 0 , 57389, 'u', -1 , -1 , "")\ + X(90 , 0, 0 , F27 , "F27" , "" , 0 , 57390, 'u', -1 , -1 , "")\ + X(92 , 0, 0 , F28 , "F28" , "" , 0 , 57391, 'u', -1 , -1 , "")\ + X(94 , 0, 0 , F29 , "F29" , "" , 0 , 57392, 'u', -1 , -1 , "")\ + X(96 , 0, 0 , F30 , "F30" , "" , 0 , 57393, 'u', -1 , -1 , "")\ + X(98 , 0, 0 , F31 , "F31" , "" , 0 , 57394, 'u', -1 , -1 , "")\ + X(100 , 0, 0 , F32 , "F32" , "" , 0 , 57395, 'u', -1 , -1 , "")\ + X(102 , 0, 0 , F33 , "F33" , "" , 0 , 57396, 'u', -1 , -1 , "")\ + X(104 , 0, 0 , F34 , "F34" , "" , 0 , 57397, 'u', -1 , -1 , "")\ + X(106 , 0, 0 , F35 , "F35" , "" , 0 , 57398, 'u', -1 , -1 , "")\ + X(108 , 0, 0 , PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "01372c07372c11372c0f372c15372c17372c03372c0b372c0d372c19372c05372c09372c1b372c13372c21372c1f372c1d372c23372c25372c29372c27372c2b372c31372c2f372c2d372c35372c37372c33372c39372c3b372c3f372c3d372c41372c43372c45372c47372c49372c4f372c51372c4b372c4d372c53372c57372c59372c55372c5b372c5d372c5f372c61372c65372c6d372c63372c6b372c67372c69372c6f372c71372c73372c7d372c75372c77372c79372c7b372c7f372c81372c87372c83372c85372c89372c8b372c8d372c8f372c93372c91372c95372c97372c99372c9b372c9d372ca1372c9f372ca3372ca5372ca7372ca9372cab372cad372c")\ + X(110 , 0, 0x13, Pause , "Pause" , "" , 0 , 57362, 'u', '\x1a', '\x03', "0045900645901045900e45901445901645900245900a45900c45901845900445900845901a45901245902045901e45901c45902245902445902845902645902a45903045902e45902c45903445903645903245903845903a45903e45903c45904045904245904445904645904845904e45905045904a45904c45905245905645905845905445905a45905c45905e45906045906445906c45906245906a45906645906845906e45907045907245907c45907445907645907845907a45907e45908045908645908245908445908845908a45908c45908e45909245909045909445909645909845909a45909c4590a045909e4590a24590a44590a64590a84590aa4590ac4590")\ + X(112 , 1, 0 , Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0146030746031146030f46031546031746030346030b46030d46031946030546030946031b46031346032146031f46031d46032346032546032946032746032b46033146032f46032d46033546033746033346033946033b46033f46033d46034146034346034546034746034946034f46035146034b46034d46035346035746035946035546035b46035d46035f46036146036546036d46036346036b46036746036946036f46037146037346037d46037546037746037946037b46037f46038146038746038346038546038946038b46038d46038f46039346039146039546039746039946039b46039d4603a146039f4603a34603a54603a74603a94603ab4603ad4603")\ + X(114 , 1, 0 , SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c06542c10542c0e542c14542c16542c02542c0a542c0c542c18542c04542c08542c1a542c12542c20542c1e542c22542c24542c28542c26542c2a542c34542c36542c38542c3c542c40542c44542c46542c48542c4e542c50542c4a542c4c542c52542c56542c58542c6e542c72542c7c542c74542c76542c78542c7a542c7e542c8c542c8e542c92542c90542c94542c96542c98542ca2542ca6542ca8542caa542c")\ + X(116 , 1, 0x1B, Esc , "Esc" , "\x1B", 0x1b , 27 , 'u', '\x1b', '\x1b', "00011b06011b10011b0e011b14011b16011b02011b0a011b0c011b18011b04011b08011b1a011b12011b20011b1e011b1c011b22011b24011b28011b26011b2a011b30011b2e011b2c011b34011b36011b32011b38011b3a011b3e011b3c011b40011b42011b44011b46011b48011b4e011b50011b4a011b4c011b52011b56011b58011b54011b5a011b5c011b5e011b60011b64011b6c011b62011b6a011b66011b68011b6e011b70011b72011b7c011b74011b76011b78011b7a011b7e011b80011b86011b82011b84011b88011b8a011b8c011b8e011b92011b90011b94011b96011b98011b9a011b9c011ba0011b9e011ba2011ba4011ba6011ba8011baa011bac011b")\ + X(118 , 1, 0x09, Tab , "Tab" , "\x09", 0x09 , 9 , 'u', '\x09', '\x09', "000f09060f09100f090e0f09140f09160f09020f090a0f090c0f09180f09040f09080f091a0f09120f09200f091e0f091c0f09220f09240f09280f09260f092a0f09300f092e0f092c0f09340f09360f09320f09380f093a0f093e0f093c0f09400f09420f09440f09460f09480f094e0f09500f094a0f094c0f09520f09560f09580f09540f095a0f095c0f095e0f09600f09640f096c0f09620f096a0f09660f09680f096e0f09700f09720f097c0f09740f09760f09780f097a0f097e0f09800f09860f09820f09840f09880f098a0f098c0f098e0f09920f09900f09940f09960f09980f099a0f099c0f09a00f099e0f09a20f09a40f09a60f09a80f09aa0f09ac0f09")\ + X(120 , 1, 0x08, Backspace , "Backspace" , "\x08", 0x08 , 127 , 'u', '\x7f', '\x08', "000e08060e08100e080e0e08140e08160e08020e080a0e080c0e08180e08040e08080e081a0e08120e08200e081e0e081c0e08220e08240e08280e08260e082a0e08300e082e0e082c0e08340e08360e08320e08380e083a0e083e0e083c0e08400e08420e08440e08460e08480e084e0e08500e084a0e084c0e08520e08560e08580e08540e085a0e085c0e085e0e08600e08640e086c0e08620e086a0e08660e08680e086e0e08700e08720e087c0e08740e08760e08780e087a0e087e0e08800e08860e08820e08840e08880e088a0e088c0e088e0e08920e08900e08940e08960e08980e089a0e089c0e08a00e089e0e08a20e08a40e08a60e08a80e08aa0e08ac0e08")\ + X(122 , 1, 0x20, Space , "Space" , "\x20", 0x20 , 32 , 'u', '\x20', '\0' , "0039200639201039200e39201439201639200239200a39200c39201839200439200839201a39201239202039201e39201c39202239202439202839202639202a39203039202e39202c39203439203639203239203839203a39203e39203c39204039204239204439204639204839204e39205039204a39204c39205239205639205839205439205a39205c39205e39206039206439206c39206239206a39206639206839206e39207039207239207c39207439207639207839207a39207e39208039208639208239208439208839208a39208c39208e39209239209039209439209639209839209a39209c3920a039209e3920a23920a43920a63920a83920aa3920ac3920")\ + X(124 , 1, 0 , KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d061c0d101c0d0e1c0d141c0d161c0d021c0d0a1c0d0c1c0d181c0d041c0d081c0d1a1c0d121c0d201c0d1e1c0d1c1c0d221c0d241c0d281c0d261c0d2a1c0d301c0d2e1c0d2c1c0d341c0d361c0d321c0d381c0d3a1c0d3e1c0d3c1c0d401c0d421c0d441c0d461c0d481c0d4e1c0d501c0d4a1c0d4c1c0d521c0d561c0d581c0d541c0d5a1c0d5c1c0d5e1c0d601c0d641c0d6c1c0d621c0d6a1c0d661c0d681c0d6e1c0d701c0d721c0d7c1c0d741c0d761c0d781c0d7a1c0d7e1c0d801c0d861c0d821c0d841c0d881c0d8a1c0d8c1c0d8e1c0d921c0d901c0d941c0d961c0d981c0d9a1c0d9c1c0da01c0d9e1c0da21c0da41c0da61c0da81c0daa1c0dac1c0d")\ + X( 125, 1, 0 , NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "011c0d071c0d111c0d0f1c0d151c0d171c0d031c0d0b1c0d0d1c0d191c0d051c0d091c0d1b1c0d131c0d211c0d1f1c0d1d1c0d231c0d251c0d291c0d271c0d2b1c0d311c0d2f1c0d2d1c0d351c0d371c0d331c0d391c0d3b1c0d3f1c0d3d1c0d411c0d431c0d451c0d471c0d491c0d4f1c0d511c0d4b1c0d4d1c0d531c0d571c0d591c0d551c0d5b1c0d5d1c0d5f1c0d611c0d651c0d6d1c0d631c0d6b1c0d671c0d691c0d6f1c0d711c0d731c0d7d1c0d751c0d771c0d791c0d7b1c0d7f1c0d811c0d871c0d831c0d851c0d891c0d8b1c0d8d1c0d8f1c0d931c0d911c0d951c0d971c0d991c0d9b1c0d9d1c0da11c0d9f1c0da31c0da51c0da71c0da91c0dab1c0dad1c0d")\ + X(126 , 1, 0 , KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "01522d07522d11522d0f522d15522d17522d03522d0b522d0d522d19522d05522d09522d1b522d13522d21522d1f522d1d522d23522d25522d29522d27522d2b522d31522d2f522d2d522d35522d37522d33522d39522d3b522d3f522d3d522d41522d43522d45522d47522d49522d4f522d51522d4b522d4d522d53522d57522d59522d55522d5b522d5d522d5f522d61522d65522d6d522d63522d6b522d67522d69522d6f522d71522d73522d7d522d75522d77522d79522d7b522d7f522d81522d87522d83522d85522d89522d8b522d8d522d8f522d93522d91522d95522d97522d99522d9b522d9d522da1522d9f522da3522da5522da7522da9522dab522dad522d")\ + X( 127, 1, 0 , NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00822d06822d10822d0e822d14822d16822d02822d0a822d0c822d18822d04822d08822d1a822d12822d20822d1e822d1c822d22822d24822d28822d26822d2a822d30822d2e822d2c822d34822d36822d32822d38822d3a822d3e822d3c822d40822d42822d44822d46822d48822d4e822d50822d4a822d4c822d52822d56822d58822d54822d5a822d5c822d5e822d60822d64822d6c822d62822d6a822d66822d68822d6e822d70822d72822d7c822d74822d76822d78822d7a822d7e822d80822d86822d82822d84822d88822d8a822d8c822d8e822d92822d90822d94822d96822d98822d9a822d9c822da0822d9e822da2822da4822da6822da8822daa822dac822d")\ + X(128 , 1, 0 , KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "01532e07532e11532e0f532e15532e17532e03532e0b532e0d532e19532e05532e09532e1b532e13532e21532e1f532e1d532e23532e25532e29532e27532e2b532e31532e2f532e2d532e35532e37532e33532e39532e3b532e3f532e3d532e41532e43532e45532e47532e49532e4f532e51532e4b532e4d532e53532e57532e59532e55532e5b532e5d532e5f532e61532e65532e6d532e63532e6b532e67532e69532e6f532e71532e73532e7d532e75532e77532e79532e7b532e7f532e81532e87532e83532e85532e89532e8b532e8d532e8f532e93532e91532e95532e97532e99532e9b532e9d532ea1532e9f532ea3532ea5532ea7532ea9532eab532ead532e")\ + X( 129, 1, 0 , NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00832e06832e10832e0e832e14832e16832e02832e0a832e0c832e18832e04832e08832e1a832e12832e20832e1e832e1c832e22832e24832e28832e26832e2a832e30832e2e832e2c832e34832e36832e32832e38832e3a832e3e832e3c832e40832e42832e44832e46832e48832e4e832e50832e4a832e4c832e52832e56832e58832e54832e5a832e5c832e5e832e60832e64832e6c832e62832e6a832e66832e68832e6e832e70832e72832e7c832e74832e76832e78832e7a832e7e832e80832e86832e82832e84832e88832e8a832e8c832e8e832e92832e90832e94832e96832e98832e9a832e9c832ea0832e9e832ea2832ea4832ea6832ea8832eaa832eac832e")\ + X(130 , 1, 0 , KeyClear , "Clear" , "" , 0 , 1 , 'E', -1 , -1 , "")\ + X( 131, 1, 0 , NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "008c0c068c0c108c0c0e8c0c148c0c168c0c028c0c0a8c0c0c8c0c188c0c048c0c088c0c1a8c0c128c0c208c0c1e8c0c1c8c0c228c0c248c0c288c0c268c0c2a8c0c308c0c2e8c0c2c8c0c348c0c368c0c328c0c388c0c3a8c0c3e8c0c3c8c0c408c0c428c0c448c0c468c0c488c0c4e8c0c508c0c4a8c0c4c8c0c528c0c568c0c588c0c548c0c5a8c0c5c8c0c5e8c0c608c0c648c0c6c8c0c628c0c6a8c0c668c0c688c0c6e8c0c708c0c728c0c7c8c0c748c0c768c0c788c0c7a8c0c7e8c0c808c0c868c0c828c0c848c0c888c0c8a8c0c8c8c0c8e8c0c928c0c908c0c948c0c968c0c988c0c9a8c0c9c8c0ca08c0c9e8c0ca28c0ca48c0ca68c0ca88c0caa8c0cac8c0c")\ + X(132 , 1, 0 , KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0149210749211149210f49211549211749210349210b49210d49211949210549210949211b49211349212149211f49211d49212349212549212949212749212b49213149212f49212d49213549213749213349213949213b49213f49213d49214149214349214549214749214949214f49215149214b49214d49215349215749215949215549215b49215d49215f49216149216549216d49216349216b49216749216949216f49217149217349217d49217549217749217949217b49217f49218149218749218349218549218949218b49218d49218f49219349219149219549219749219949219b49219d4921a149219f4921a34921a54921a74921a94921ab4921ad4921")\ + X( 133, 1, 0 , NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0089210689211089210e89211489211689210289210a89210c89211889210489210889211a89211289212089211e89211c89212289212489212889212689212a89213089212e89212c89213489213689213289213889213a89213e89213c89214089214289214489214689214889214e89215089214a89214c89215289215689215889215489215a89215c89215e89216089216489216c89216289216a89216689216889216e89217089217289217c89217489217689217889217a89217e89218089218689218289218489218889218a89218c89218e89219289219089219489219689219889219a89219c8921a089219e8921a28921a48921a68921a88921aa8921ac8921")\ + X(134 , 1, 0 , KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0151220751221151220f51221551221751220351220b51220d51221951220551220951221b51221351222151221f51221d51222351222551222951222751222b51223151222f51222d51223551223751223351223951223b51223f51223d51224151224351224551224751224951224f51225151224b51224d51225351225751225951225551225b51225d51225f51226151226551226d51226351226b51226751226951226f51227151227351227d51227551227751227951227b51227f51228151228751228351228551228951228b51228d51228f51229351229151229551229751229951229b51229d5122a151229f5122a35122a55122a75122a95122ab5122ad5122")\ + X( 135, 1, 0 , NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0081220681221081220e81221481221681220281220a81220c81221881220481220881221a81221281222081221e81221c81222281222481222881222681222a81223081222e81222c81223481223681223281223881223a81223e81223c81224081224281224481224681224881224e81225081224a81224c81225281225681225881225481225a81225c81225e81226081226481226c81226281226a81226681226881226e81227081227281227c81227481227681227881227a81227e81228081228681228281228481228881228a81228c81228e81229281229081229481229681229881229a81229c8122a081229e8122a28122a48122a68122a88122aa8122ac8122")\ + X(136 , 1, 0 , KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0147240747241147240f47241547241747240347240b47240d47241947240547240947241b47241347242147241f47241d47242347242547242947242747242b47243147242f47242d47243547243747243347243947243b47243f47243d47244147244347244547244747244947244f47245147244b47244d47245347245747245947245547245b47245d47245f47246147246547246d47246347246b47246747246947246f47247147247347247d47247547247747247947247b47247f47248147248747248347248547248947248b47248d47248f47249347249147249547249747249947249b47249d4724a147249f4724a34724a54724a74724a94724ab4724ad4724")\ + X( 137, 1, 0 , NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0087240687241087240e87241487241687240287240a87240c87241887240487240887241a87241287242087241e87241c87242287242487242887242687242a87243087242e87242c87243487243687243287243887243a87243e87243c87244087244287244487244687244887244e87245087244a87244c87245287245687245887245487245a87245c87245e87246087246487246c87246287246a87246687246887246e87247087247287247c87247487247687247887247a87247e87248087248687248287248487248887248a87248c87248e87249287249087249487249687249887249a87249c8724a087249e8724a28724a48724a68724a88724aa8724ac8724")\ + X(138 , 1, 0 , KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "014f23074f23114f230f4f23154f23174f23034f230b4f230d4f23194f23054f23094f231b4f23134f23214f231f4f231d4f23234f23254f23294f23274f232b4f23314f232f4f232d4f23354f23374f23334f23394f233b4f233f4f233d4f23414f23434f23454f23474f23494f234f4f23514f234b4f234d4f23534f23574f23594f23554f235b4f235d4f235f4f23614f23654f236d4f23634f236b4f23674f23694f236f4f23714f23734f237d4f23754f23774f23794f237b4f237f4f23814f23874f23834f23854f23894f238b4f238d4f238f4f23934f23914f23954f23974f23994f239b4f239d4f23a14f239f4f23a34f23a54f23a74f23a94f23ab4f23ad4f23")\ + X( 139, 1, 0 , NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "008f23068f23108f230e8f23148f23168f23028f230a8f230c8f23188f23048f23088f231a8f23128f23208f231e8f231c8f23228f23248f23288f23268f232a8f23308f232e8f232c8f23348f23368f23328f23388f233a8f233e8f233c8f23408f23428f23448f23468f23488f234e8f23508f234a8f234c8f23528f23568f23588f23548f235a8f235c8f235e8f23608f23648f236c8f23628f236a8f23668f23688f236e8f23708f23728f237c8f23748f23768f23788f237a8f237e8f23808f23868f23828f23848f23888f238a8f238c8f238e8f23928f23908f23948f23968f23988f239a8f239c8f23a08f239e8f23a28f23a48f23a68f23a88f23aa8f23ac8f23")\ + X(140 , 1, 0 , KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "014b25074b25114b250f4b25154b25174b25034b250b4b250d4b25194b25054b25094b251b4b25134b25214b251f4b251d4b25234b25254b25294b25274b252b4b25314b252f4b252d4b25354b25374b25334b25394b253b4b253f4b253d4b25414b25434b25454b25474b25494b254f4b25514b254b4b254d4b25534b25574b25594b25554b255b4b255d4b255f4b25614b25654b256d4b25634b256b4b25674b25694b256f4b25714b25734b257d4b25754b25774b25794b257b4b257f4b25814b25874b25834b25854b25894b258b4b258d4b258f4b25934b25914b25954b25974b25994b259b4b259d4b25a14b259f4b25a34b25a54b25a74b25a94b25ab4b25ad4b25")\ + X( 141, 1, 0 , NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "008b25068b25108b250e8b25148b25168b25028b250a8b250c8b25188b25048b25088b251a8b25128b25208b251e8b251c8b25228b25248b25288b25268b252a8b25308b252e8b252c8b25348b25368b25328b25388b253a8b253e8b253c8b25408b25428b25448b25468b25488b254e8b25508b254a8b254c8b25528b25568b25588b25548b255a8b255c8b255e8b25608b25648b256c8b25628b256a8b25668b25688b256e8b25708b25728b257c8b25748b25768b25788b257a8b257e8b25808b25868b25828b25848b25888b258a8b258c8b258e8b25928b25908b25948b25968b25988b259a8b259c8b25a08b259e8b25a28b25a48b25a68b25a88b25aa8b25ac8b25")\ + X(142 , 1, 0 , KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "014d27074d27114d270f4d27154d27174d27034d270b4d270d4d27194d27054d27094d271b4d27134d27214d271f4d271d4d27234d27254d27294d27274d272b4d27314d272f4d272d4d27354d27374d27334d27394d273b4d273f4d273d4d27414d27434d27454d27474d27494d274f4d27514d274b4d274d4d27534d27574d27594d27554d275b4d275d4d275f4d27614d27654d276d4d27634d276b4d27674d27694d276f4d27714d27734d277d4d27754d27774d27794d277b4d277f4d27814d27874d27834d27854d27894d278b4d278d4d278f4d27934d27914d27954d27974d27994d279b4d279d4d27a14d279f4d27a34d27a54d27a74d27a94d27ab4d27ad4d27")\ + X( 143, 1, 0 , NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "008d27068d27108d270e8d27148d27168d27028d270a8d270c8d27188d27048d27088d271a8d27128d27208d271e8d271c8d27228d27248d27288d27268d272a8d27308d272e8d272c8d27348d27368d27328d27388d273a8d273e8d273c8d27408d27428d27448d27468d27488d274e8d27508d274a8d274c8d27528d27568d27588d27548d275a8d275c8d275e8d27608d27648d276c8d27628d276a8d27668d27688d276e8d27708d27728d277c8d27748d27768d27788d277a8d277e8d27808d27868d27828d27848d27888d278a8d278c8d278e8d27928d27908d27948d27968d27988d279a8d279c8d27a08d279e8d27a28d27a48d27a68d27a88d27aa8d27ac8d27")\ + X(144 , 1, 0 , KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0148260748261148260f48261548261748260348260b48260d48261948260548260948261b48261348262148261f48261d48262348262548262948262748262b48263148262f48262d48263548263748263348263948263b48263f48263d48264148264348264548264748264948264f48265148264b48264d48265348265748265948265548265b48265d48265f48266148266548266d48266348266b48266748266948266f48267148267348267d48267548267748267948267b48267f48268148268748268348268548268948268b48268d48268f48269348269148269548269748269948269b48269d4826a148269f4826a34826a54826a74826a94826ab4826ad4826")\ + X( 145, 1, 0 , NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0088260688261088260e88261488261688260288260a88260c88261888260488260888261a88261288262088261e88261c88262288262488262888262688262a88263088262e88262c88263488263688263288263888263a88263e88263c88264088264288264488264688264888264e88265088264a88264c88265288265688265888265488265a88265c88265e88266088266488266c88266288266a88266688266888266e88267088267288267c88267488267688267888267a88267e88268088268688268288268488268888268a88268c88268e88269288269088269488269688269888269a88269c8826a088269e8826a28826a48826a68826a88826aa8826ac8826")\ + X(146 , 1, 0 , KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0150280750281150280f50281550281750280350280b50280d50281950280550280950281b50281350282150281f50281d50282350282550282950282750282b50283150282f50282d50283550283750283350283950283b50283f50283d50284150284350284550284750284950284f50285150284b50284d50285350285750285950285550285b50285d50285f50286150286550286d50286350286b50286750286950286f50287150287350287d50287550287750287950287b50287f50288150288750288350288550288950288b50288d50288f50289350289150289550289750289950289b50289d5028a150289f5028a35028a55028a75028a95028ab5028ad5028")\ + X( 147, 1, 0 , NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0080280680281080280e80281480281680280280280a80280c80281880280480280880281a80281280282080281e80281c80282280282480282880282680282a80283080282e80282c80283480283680283280283880283a80283e80283c80284080284280284480284680284880284e80285080284a80284c80285280285680285880285480285a80285c80285e80286080286480286c80286280286a80286680286880286e80287080287280287c80287480287680287880287a80287e80288080288680288280288480288880288a80288c80288e80289280289080289480289680289880289a80289c8028a080289e8028a28028a48028a68028a88028aa8028ac8028")\ + X(148 , 1, 0x30, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30060b30100b300e0b30140b30160b30020b300a0b300c0b30180b30040b30080b301a0b30120b30200b301e0b301c0b30220b30240b30280b30260b302a0b30300b302e0b302c0b30340b30360b30320b30380b303a0b303e0b303c0b30400b30420b30440b30460b30480b304e0b30500b304a0b304c0b30520b30560b30580b30540b305a0b305c0b305e0b30600b30640b306c0b30620b306a0b30660b30680b306e0b30700b30720b307c0b30740b30760b30780b307a0b307e29307e0bc0800b30860b30820b30840b30880b308a0b308c0b308e0bc0920b30900b30940b30960b30980b309a0b309c0b30a00b309e0b30a20b30a40b30a60b30a82d30aa3430ac0b30")\ + X( 149, 1, 0x60, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052600652601052600e52601452601652600252600a52600c52601852600452600852601a52601252602052601e52601c52602252602452602852602652602a52603052602e52602c52603452603652603252603852603a52603e52603c52604052604252604452604652604852604e52605052604a52604c52605252605652605852605452605a52605c52605e52606052606452606c52606252606a52606652606852606e52607052607252607c52607452607652607852607a52607e52608052608652608252608452608852608a52608c52608e52609252609052609452609652609852609a52609c5260a052609e5260a25260a45260a65260a85260aa5260ac5260")\ + X(150 , 1, 0x31, Key1 , "1" , "1" , 0x31 , 49 , 'u', '1' , '1' , "0002310602311002310e02311402311602310202310a02310c02311802310402310802311a02311202312002311e02311c02312202312402312802312602312a02313002312e02312c02313402313602313202313802313a02313e02313c02314002314202314402314602314802314e02315002314a02314c02315202315602315802315402315a02315c02315e02316002316402316c02316202316a02316602316802316e02317002317202317c02317402317602317802317a02317e02318002318602318202318402318802318a02318c02318e02319202319002319402319602319802319a02319c0231a002319e0231a20231a40231a60231a80231aa0d31ac0231")\ + X( 151, 1, 0x61, Numpad1 , "1" , "1" , 0x31 , 57400, 'u', '1' , '1' , "004f61064f61104f610e4f61144f61164f61024f610a4f610c4f61184f61044f61084f611a4f61124f61204f611e4f611c4f61224f61244f61284f61264f612a4f61304f612e4f612c4f61344f61364f61324f61384f613a4f613e4f613c4f61404f61424f61444f61464f61484f614e4f61504f614a4f614c4f61524f61564f61584f61544f615a4f615c4f615e4f61604f61644f616c4f61624f616a4f61664f61684f616e4f61704f61724f617c4f61744f61764f61784f617a4f617e4f61804f61864f61824f61844f61884f618a4f618c4f618e4f61924f61904f61944f61964f61984f619a4f619c4f61a04f619e4f61a24f61a44f61a64f61a84f61aa4f61ac4f61")\ + X(152 , 1, 0x32, Key2 , "2" , "2" , 0x32 , 50 , 'u', '2' , '\0' , "0003320603321003320e03321403321603320203320a03320c03321803320403320803321a03321203322003321e03321c03322203322403322803322603322a03323003322e03322c03323403323603323203323803323a03323e03323c03324003324203324403324603324803324e03325003324a03324c03325203325603325803325403325a03325c03325e03326003326403326c03326203326a03326603326803326e03327003327203327c03327403327603327803327a03327e03328003328603328203328403328803328a03328c03328e03329203329003329403329603329803329a03329c0332a003329e0332a20332a40332a60332a80332aa0c32ac0332")\ + X( 153, 1, 0x62, Numpad2 , "2" , "2" , 0x32 , 57401, 'u', '2' , '\0' , "0050620650621050620e50621450621650620250620a50620c50621850620450620850621a50621250622050621e50621c50622250622450622850622650622a50623050622e50622c50623450623650623250623850623a50623e50623c50624050624250624450624650624850624e50625050624a50624c50625250625650625850625450625a50625c50625e50626050626450626c50626250626a50626650626850626e50627050627250627c50627450627650627850627a50627e50628050628650628250628450628850628a50628c50628e50629250629050629450629650629850629a50629c5062a050629e5062a25062a45062a65062a85062aa5062ac5062")\ + X(154 , 1, 0x33, Key3 , "3" , "3" , 0x33 , 51 , 'u', '3' , '\x1b', "0004330604331004330e04331404331604330204330a04330c04331804330404330804331a04331204332004331e04331c04332204332404332804332604332a04333004332e04332c04333404333604333204333804333a04333e04333c04334004334204334404334604334804334e04335004334a04334c04335204335604335804335404335a04335c04335e04336004336404336c04336204336a04336604336804336e04337004337204337c04337404337604337804337a04337e04338004338604338204338404338804338a04338c04338e04339204339004339404339604339804339a04339c0433a004339e0433a20433a40433a60433a80433aa0b33ac0433")\ + X( 155, 1, 0x63, Numpad3 , "3" , "3" , 0x33 , 57402, 'u', '3' , '\x1b', "0051630651631051630e51631451631651630251630a51630c51631851630451630851631a51631251632051631e51631c51632251632451632851632651632a51633051632e51632c51633451633651633251633851633a51633e51633c51634051634251634451634651634851634e51635051634a51634c51635251635651635851635451635a51635c51635e51636051636451636c51636251636a51636651636851636e51637051637251637c51637451637651637851637a51637e51638051638651638251638451638851638a51638c51638e51639251639051639451639651639851639a51639c5163a051639e5163a25163a45163a65163a85163aa5163ac5163")\ + X(156 , 1, 0x34, Key4 , "4" , "4" , 0x34 , 52 , 'u', '4' , '\x1c', "0005340605341005340e05341405341605340205340a05340c05341805340405340805341a05341205342005341e05341c05342205342405342805342605342a05343005342e05342c05343405343605343205343805343a05343e05343c05344005344205344405344605344805344e05345005344a05344c05345205345605345805345405345a05345c05345e05346005346405346c05346205346a05346605346805346e05347005347205347c05347405347605347805347a05347e05348005348605348205348405348805348a05348c05348e05349205349005349405349605349805349a05349c0534a005349e0534a20534a40534a60534a80534aa0a34ac0534")\ + X( 157, 1, 0x64, Numpad4 , "4" , "4" , 0x34 , 57403, 'u', '4' , '\x1c', "004b64064b64104b640e4b64144b64164b64024b640a4b640c4b64184b64044b64084b641a4b64124b64204b641e4b641c4b64224b64244b64284b64264b642a4b64304b642e4b642c4b64344b64364b64324b64384b643a4b643e4b643c4b64404b64424b64444b64464b64484b644e4b64504b644a4b644c4b64524b64564b64584b64544b645a4b645c4b645e4b64604b64644b646c4b64624b646a4b64664b64684b646e4b64704b64724b647c4b64744b64764b64784b647a4b647e4b64804b64864b64824b64844b64884b648a4b648c4b648e4b64924b64904b64944b64964b64984b649a4b649c4b64a04b649e4b64a24b64a44b64a64b64a84b64aa4b64ac4b64")\ + X(158 , 1, 0x35, Key5 , "5" , "5" , 0x35 , 53 , 'u', '5' , '\x1d', "0006350606351006350e06351406351606350206350a06350c06351806350406350806351a06351206352006351e06351c06352206352406352806352606352a06353006352e06352c06353406353606353206353806353a06353e06353c06354006354206354406354606354806354e06355006354a06354c06355206355606355806355406355a06355c06355e06356006356406356c06356206356a06356606356806356e06357006357206357c06357406357606357806357a06357e06358006358606358206358406358806358a06358c06358e06359206359006359406359606359806359a06359c0635a006359e0635a20635a40635a60635a81035aa1a35ac0635")\ + X( 159, 1, 0x65, Numpad5 , "5" , "5" , 0x35 , 57404, 'u', '5' , '\x1d', "004c65064c65104c650e4c65144c65164c65024c650a4c650c4c65184c65044c65084c651a4c65124c65204c651e4c651c4c65224c65244c65284c65264c652a4c65304c652e4c652c4c65344c65364c65324c65384c653a4c653e4c653c4c65404c65424c65444c65464c65484c654e4c65504c654a4c654c4c65524c65564c65584c65544c655a4c655c4c655e4c65604c65644c656c4c65624c656a4c65664c65684c656e4c65704c65724c657c4c65744c65764c65784c657a4c657e4c65804c65864c65824c65844c65884c658a4c658c4c658e4c65924c65904c65944c65964c65984c659a4c659c4c65a04c659e4c65a24c65a44c65a64c65a84c65aa4c65ac4c65")\ + X(160 , 1, 0x36, Key6 , "6" , "6" , 0x36 , 54 , 'u', '6' , '\x1e', "0007360607361007360e07361407361607360207360a07360c07361807360407360807361a07361207362007361e07361c07362207362407362807362607362a07363007362e07362c07363407363607363207363807363a07363e07363c07364007364207364407364607364807364e07365007364a07364c07365207365607365807365407365a07365c07365e07366007366407366c07366207366a07366607366807366e07367007367207367c07367407367607367807367a07367e07368007368607368207368407368807368a07368c07368e07369207369007369407369607369807369a07369c0736a007369e0736a20736a40736a60736a81136aa1936ac0736")\ + X( 161, 1, 0x66, Numpad6 , "6" , "6" , 0x36 , 57405, 'u', '6' , '\x1e', "004d66064d66104d660e4d66144d66164d66024d660a4d660c4d66184d66044d66084d661a4d66124d66204d661e4d661c4d66224d66244d66284d66264d662a4d66304d662e4d662c4d66344d66364d66324d66384d663a4d663e4d663c4d66404d66424d66444d66464d66484d664e4d66504d664a4d664c4d66524d66564d66584d66544d665a4d665c4d665e4d66604d66644d666c4d66624d666a4d66664d66684d666e4d66704d66724d667c4d66744d66764d66784d667a4d667e4d66804d66864d66824d66844d66884d668a4d668c4d668e4d66924d66904d66944d66964d66984d669a4d669c4d66a04d669e4d66a24d66a44d66a64d66a84d66aa4d66ac4d66")\ + X(162 , 1, 0x37, Key7 , "7" , "7" , 0x37 , 55 , 'u', '7' , '\x1f', "0008370608371008370e08371408371608370208370a08370c08371808370408370808371a08371208372008371e08371c08372208372408372808372608372a08373008372e08372c08373408373608373208373808373a08373e08373c08374008374208374408374608374808374e08375008374a08374c08375208375608375808375408375a08375c08375e08376008376408376c08376208376a08376608376808376e08377008377208377c08377408377608377808377a08377e08378008378608378208378408378808378a08378c08378e08379208379008379408379608379808379a08379c0837a008379e0837a20837a40837a60837a81e37aa2837ac0837")\ + X( 163, 1, 0x67, Numpad7 , "7" , "7" , 0x37 , 57406, 'u', '7' , '\x1f', "0047670647671047670e47671447671647670247670a47670c47671847670447670847671a47671247672047671e47671c47672247672447672847672647672a47673047672e47672c47673447673647673247673847673a47673e47673c47674047674247674447674647674847674e47675047674a47674c47675247675647675847675447675a47675c47675e47676047676447676c47676247676a47676647676847676e47677047677247677c47677447677647677847677a47677e47678047678647678247678447678847678a47678c47678e47679247679047679447679647679847679a47679c4767a047679e4767a24767a44767a64767a84767aa4767ac4767")\ + X(164 , 1, 0x38, Key8 , "8" , "8" , 0x38 , 56 , 'u', '8' , '\x7f', "0009380609381009380e09381409381609380209380a09380c09381809380409380809381a09381209382009381e09381c09382209382409382809382609382a09383009382e09382c09383409383609383209383809383a09383e09383c09384009384209384409384609384809384e09385009384a09384c09385209385609385809385409385a09385c09385e09386009386409386c09386209386a09386609386809386e09387009387209387c09387409387609387809387a09387e09388009388609388209388409388809388a09388c09388e09389209389009389409389609389809389a09389c0938a009389e0938a20938a40938a60938a81f38aa2738ac0938")\ + X( 165, 1, 0x68, Numpad8 , "8" , "8" , 0x38 , 57407, 'u', '8' , '\x7f', "0048680648681048680e48681448681648680248680a48680c48681848680448680848681a48681248682048681e48681c48682248682448682848682648682a48683048682e48682c48683448683648683248683848683a48683e48683c48684048684248684448684648684848684e48685048684a48684c48685248685648685848685448685a48685c48685e48686048686448686c48686248686a48686648686848686e48687048687248687c48687448687648687848687a48687e48688048688648688248688448688848688a48688c48688e48689248689048689448689648689848689a48689c4868a048689e4868a24868a44868a64868a84868aa4868ac4868")\ + X(166 , 1, 0x39, Key9 , "9" , "9" , 0x39 , 57 , 'u', '9' , '9' , "000a39060a39100a390e0a39140a39160a39020a390a0a390c0a39180a39040a39080a391a0a39120a39200a391e0a391c0a39220a39240a39280a39260a392a0a39300a392e0a392c0a39340a39360a39320a39380a393a0a393e0a393c0a39400a39420a39440a39460a39480a394e0a39500a394a0a394c0a39520a39560a39580a39540a395a0a395c0a395e0a39600a39640a396c0a39620a396a0a39660a39680a396e0a39700a39720a397c0a39740a39760a39780a397a0a397e0a39800a39860a39820a39840a39880a398a0a398c0a398e0a39920a39900a39940a39960a39980a399a0a399c0a39a00a399e0a39a20a39a40a39a60a39a82c39aa3539ac0a39")\ + X( 167, 1, 0x69, Numpad9 , "9" , "9" , 0x39 , 57408, 'u', '9' , '9' , "0049690649691049690e49691449691649690249690a49690c49691849690449690849691a49691249692049691e49691c49692249692449692849692649692a49693049692e49692c49693449693649693249693849693a49693e49693c49694049694249694449694649694849694e49695049694a49694c49695249695649695849695449695a49695c49695e49696049696449696c49696249696a49696649696849696e49697049697249697c49697449697649697849697a49697e49698049698649698249698449698849698a49698c49698e49699249699049699449699649699849699a49699c4969a049699e4969a24969a44969a64969a84969aa4969ac4969")\ + X(168 , 1, 0 , KeyMultiply , "*" , "*" , 0x2A , 42 , 'u', '*' , '*' , "641bba8c0cdf962bdc982bdc9a2bdc9c2bdc")\ + X( 169, 1, 0x6A, NumpadMultiply , "*" , "*" , 0x2A , 57411, 'u', '*' , '*' , "00376a06376a10376a0e376a14376a16376a02376a0a376a0c376a18376a04376a08376a1a376a12376a20376a1e376a1c376a22376a24376a28376a26376a2a376a30376a2e376a2c376a34376a36376a32376a38376a3a376a3e376a3c376a40376a42376a44376a46376a48376a4e376a50376a4a376a4c376a52376a56376a58376a54376a5a376a5c376a5e376a60376a64376a6c376a62376a6a376a66376a68376a6e376a70376a72376a7c376a74376a76376a78376a7a376a7e376a80376a86376a82376a84376a88376a8a376a8c376a8e376a92376a90376a94376a96376a98376a9a376a9c376aa0376a9e376aa2376aa4376aa6376aa8376aaa376aac376a")\ + X(170 , 1, 0 , KeySlash , "/" , "/" , 0x2F , 47 , 'u', '/' , '\x1f', "0035bf0635bf1035bf0e35bf1435bf1635bf0235bf0a35bf0c35bf1835bf0435bf0835bf1a35bf1235bf2035bf1e35bf1c35bf2235bf2435bf2835bf2635bf2a35bf3035bf2e35bf2c35bf3435bf3635bf3235bf3835bf3c73c14035bf4229de640cdb9235bf9a28dba41abfa60cbba80bbfaa04bf")\ + X( 171, 1, 0x6F, NumpadDivide , "/" , "/" , 0x2F , 57410, 'u', '/' , '\x1f', "01356f07356f11356f0f356f15356f17356f03356f0b356f0d356f19356f05356f09356f1b356f13356f21356f1f356f1d356f23356f25356f29356f27356f2b356f31356f2f356f2d356f35356f37356f33356f39356f3b356f3f356f3d356f41356f43356f45356f47356f49356f4f356f51356f4b356f4d356f53356f57356f59356f55356f5b356f5d356f5f356f61356f65356f6d356f63356f6b356f67356f69356f6f356f71356f73356f7d356f75356f77356f79356f7b356f7f356f81356f87356f83356f85356f89356f8b356f8d356f8f356f93356f91356f95356f97356f99356f9b356f9d356fa1356f9f356fa3356fa5356fa7356fa9356fab356fad356f")\ + X(172 , 1, 0 , KeyPlus , "Plus" , "+" , 0x2B , 43 , 'u', '+' , '+' , "440cbb461abb480dbb4e0cbb501bbb4a0cbb4c0cbb560cbd5a1bbb5c1bbb5e1abb600cbb6427bb6c0cbb620cbb6a1bbb660cbb681bbb702bbf720cbb7c0dbb761bbb781bbb7a1bbb801bbb861bbb821bbb841bbb900dbb940cbd9a1bbba629c0")\ + X( 173, 1, 0x6B, NumpadPlus , "Plus" , "+" , 0x2B , 57413, 'u', '+' , '+' , "004e6b064e6b104e6b0e4e6b144e6b164e6b024e6b0a4e6b0c4e6b184e6b044e6b084e6b1a4e6b124e6b204e6b1e4e6b1c4e6b224e6b244e6b284e6b264e6b2a4e6b304e6b2e4e6b2c4e6b344e6b364e6b324e6b384e6b3a4e6b3e4e6b3c4e6b404e6b424e6b444e6b464e6b484e6b4e4e6b504e6b4a4e6b4c4e6b524e6b564e6b584e6b544e6b5a4e6b5c4e6b5e4e6b604e6b644e6b6c4e6b624e6b6a4e6b664e6b684e6b6e4e6b704e6b724e6b7c4e6b744e6b764e6b784e6b7a4e6b7e4e6b804e6b864e6b824e6b844e6b884e6b8a4e6b8c4e6b8e4e6b924e6b904e6b944e6b964e6b984e6b9a4e6b9c4e6ba04e6b9e4e6ba24e6ba44e6ba64e6ba84e6baa4e6bac4e6b")\ + X(174 , 1, 0 , KeyMinus , "Minus" , "-" , 0x2D , 45 , 'u', '-' , '-' , "000cbd060cbd100cbd0e0cbd140cbd160cbd020cbd0a0cbd0c0cbd180cbd040cbd080cbd1a0cbd120cbd200cbd1e0cbd1c0cbd220cbd240cbd280cbd260cbd2a0cbd300cbd2e0cbd2c0cbd340cbd360cbd320cbd380cbd3a0cbd3e0cbd3c0cbd400cbd420cbd4435bd4635bd4835bd4e35bd5035bd4a35bd4c35bd5235bf5635dd5835bf540cbd5a35bd5c35bd5e35bd6035bd6435bd6c35bd6235bd6a35bd6635bd6835bd6e35bd700ddb7235bd7c35bd7435bd7635bd7835bd7a35bd7e35bd8035bd8635bd8235bd8435bd8835bd8a35bd8c0dbd8e35bf9256e2920cbd9035bd9435bf9a1abda00dbd9e0dbda428bda60dbda828bdaa1ebd")\ + X( 175, 1, 0x6D, NumpadMinus , "Minus" , "-" , 0x2D , 57412, 'u', '-' , '-' , "004a6d064a6d104a6d0e4a6d144a6d164a6d024a6d0a4a6d0c4a6d184a6d044a6d084a6d1a4a6d124a6d204a6d1e4a6d1c4a6d224a6d244a6d284a6d264a6d2a4a6d304a6d2e4a6d2c4a6d344a6d364a6d324a6d384a6d3a4a6d3e4a6d3c4a6d404a6d424a6d444a6d464a6d484a6d4e4a6d504a6d4a4a6d4c4a6d524a6d564a6d584a6d544a6d5a4a6d5c4a6d5e4a6d604a6d644a6d6c4a6d624a6d6a4a6d664a6d684a6d6e4a6d704a6d724a6d7c4a6d744a6d764a6d784a6d7a4a6d7e4a6d804a6d864a6d824a6d844a6d884a6d8a4a6d8c4a6d8e4a6d924a6d904a6d944a6d964a6d984a6d9a4a6d9c4a6da04a6d9e4a6da24a6da44a6da64a6da84a6daa4a6dac4a6d")\ + X(176 , 1, 0 , KeyEqual , "=" , "=" , 0x3D , 61 , 'u', '=' , '=' , "000dbb060dbb100dbb0e0dbb140dbb160dbb020dbb0a0dbb0c0dbb180dbb040dbb080dbb1a0dbb120dbb200dbb1c0dbb220dbb240dbb280dbb260dbb2a0dbb300dbb2e0dbb2c0dbb340dbb360dbb380dbb3a0dbb3e0dbb3c0dbb400dbb420dbb520cbd580cbd5435df6e0cbb740cbf920dbb960dbb980dbb9c0dbba035bb9e35bba41bbba81bbbaa1bbbac0cbd")\ + X( 177, 1, 0x92, NumpadEqual , "=" , "=" , 0x3D , 57415, 'u', '=' , '=' , "")\ + X(178 , 1, 0 , KeyPeriod , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be0634be1034be0e34be1434be1634be0234be0a34be0c34be1834be0434be0834be1a34be1234be2034be1e34be1c34be2234be2434be2834be2634be2a34be3034be2e34be2c34be3434be3634be3234be3834be3a34be3e34be3c34be4034be4234be4434be4634be4834be4e34be5034be4a34be4c34be5234be5634be5834be5434be5a34be5c34be5e34be6034be6434be6c34be6234be6a34be6634be6834be6e34be7034be7234be7c34be7434be7634be7834be7a34be7e34be8034be8634be8234be8434be8834be8a34be8c35be8e34be9234be9034be9434be9a32bea412bea634bea813beaa18beac2fbe")\ + X( 179, 1, 0x6E, NumpadDecimal , "." , "." , 0x2E , 57409, 'u', '.' , '.' , "00536e06536e10536e0e536e14536e16536e02536e0a536e0c536e18536e04536e08536e1a536e12536e20536e1e536e1c536e22536e24536e28536e26536e2a536e30536e2e536e2c536e34536e36536e32536e38536e3a536e3e536e3c536e40536e42536e44536e46536e48536e4e536e50536e4a536e4c536e52536e56536e58536e54536e5a536e5c536e5e536e60536e64536e6c536e62536e6a536e66536e68536e6e536e70536e72536e7c536e74536e76536e78536e7a536e7e536e80536e86536e82536e84536e88536e8a536e8c536e8e536e92536e90536e94536e96536e98536e9a536e9c536ea0536e9e536ea2536ea4536ea6536ea8536eaa536eac536e")\ + X(180 , 1, 0 , KeyComma , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "0033bc0633bc1033bc0e33bc1433bc1633bc0233bc0a33bc0c33bc1833bc0433bc0833bc1a33bc1233bc2033bc1e33bc1c33bc2233bc2433bc2833bc2633bc2a33bc3033bc2e33bc2c33bc3433bc3633bc3233bc3833bc3a33bc3e33bc3c33bc4033bc4233bc4433bc4633bc4833bc4e33bc5033bc4a33bc4c33bc5233bc5633bc5833bc5433bc5a33bc5c33bc5e33bc6033bc6433bc6c33bc6233bc6a33bc6633bc6833bc6e33bc7033bc7233bc7c33bc7433bc7633bc7833bc7a33bc7e33bc8033bc8633bc8233bc8433bc8833bc8a33bc8c2bbc8e33bc9233bc9033bc9433bc9632bc9832bc9a33bc9c32bca032bc9e32bca411bca635bca82fbcaa33bcac22bc")\ + X( 181, 1, 0 , NumpadPoint , "," , "," , 0x2C , 57416, 'u', ',' , ',' , "007ec2067ec2107ec20e7ec2147ec2167ec2027ec20a7ec20c7ec2187ec2047ec2087ec21a7ec2127ec2207ec21e7ec21c7ec2227ec2247ec2287ec2267ec22a7ec2307ec22e7ec22c7ec2347ec2367ec2327ec2387ec23a7ec23e7ec23c7ec2407ec2427ec2447ec2467ec2487ec24e7ec2507ec24a7ec24c7ec2527ec2567ec2587ec2547ec25a7ec25c7ec25e7ec2607ec2647ec26c7ec2627ec26a7ec2667ec2687ec26e7ec2707ec2727ec27c7ec2747ec2767ec2787ec27a7ec27e7ec2807ec2867ec2827ec2847ec2887ec28a7ec28c7ec28e7ec2927ec2907ec2947ec2967ec2987ec29a7ec29c7ec2a07ec29e7ec2a27ec2a47ec2a67ec2a87ec2aa7ec2ac7ec2")\ + X(182 , 1, 0 , Colon , ":" , ":" , 0x3A , 58 , 'u', ':' , ':' , "9634bf9834bf9a34bf9c34bfa034bf9e34bf")\ + X(184 , 1, 0 , Semicolon , ";" , ";" , 0x3B , 59 , 'u', ';' , ';' , "0027ba0627ba1027ba0e27ba1427ba1627ba0227ba0a27ba0c27ba1827ba0427ba0827ba1a27ba1227ba2027ba1e27ba1c27ba2227ba2427ba2827ba2627ba2a27ba3027ba2e27ba2c27ba3427ba3627ba3227ba3a27ba3e27ba3c35bf4227ba5229c05829c06e29c07429c09219ba9633be9833be9a35ba9c33bea033be9e33bea42cbaa81abaaa10ba")\ + X(186 , 1, 0 , TurnedComma , "ʻ" , "ʻ" , 0x02BB, 699 , 'u', -1 , -1 , "2028de")\ + X(188 , 1, 0 , OpenSquareBracket , "[" , "[" , 0x5B , 91 , 'u', '[' , '\x1b', "001adb061adb101adb0e1adb141adb161adb021adb0a1adb0c1adb181adb041adb081adb1a1adb121adb201adb1e1adb1c1adb221adb241adb281adb261adb2a1adb301adb2e1adb2c1adb3c1bdd4028de481adb921adba40cdba80cdbaa02db")\ + X(190 , 1, 0 , CloseSquareBracket , "]" , "]" , 0x5D , 93 , 'u', ']' , '\x1d', "001bdd061bdd101bdd0e1bdd141bdd161bdd021bdd0a1bdd0c1bdd181bdd041bdd081bdd1a1bdd121bdd201bdd1e1bdd1c1bdd221bdd241bdd281bdd261bdd2a1bdd301bdd2e1bdd2c1bdd3c2bdc402bdc460ddb481bdd6456e2921bdd9429c0a40ddda80dddaa03dd")\ + X(192 , 1, 0 , OpenCurlyBracket , "{" , "{" , 0x7B , 123 , 'u', '{' , 27 , "5028de6a28de")\ + X(194 , 1, 0 , CloseCurlyBracket , "}" , "}" , 0x7D , 125 , 'u', '}' , 29 , "461bdd502bbf6a2bbf")\ + X(196 , 1, 0 , CloseRoundBracket , ")" , ")" , 0x29 , 41 , 'u', ')' , ')' , "521bdd6e1bdd960cdb980cdb9c0cdba00cdb9e0cdb")\ + X(198 , 1, 0 , LessThan , "<" , "<" , 0x3C , 60 , 'u', '<' , '<' , "2429c03a2bdc4056e24456e24656e24856e24e56e25056e24a56e24c56e25656e25456e25a56e25c56e25e56e26056e2642bdc6c56e26256e26a56e26656e26856e27056e27256e27c56e27656e27856e27a56e28056e28656e28256e28856e28a56e28c56e29056e29456e29656e29856e29a56e29c56e2a056e29e56e2a256e2a656e2")\ + X(200 , 1, 0 , BackSlash , "\\" , "\\" , 0x5C , 92 , 'u', '\\' , '\x1c', "002bdc0056e2062bdc0656e2102bdc1056e20e56e20e2bdc1456e2142bdc162bdc1656e2022bdc0256e20a2bdc0a56e20c2bdc0c56e21856e2182bdc042bdc0456e20856e2082bdc1a2bdc1a56e2122bdc1256e2202bdc2056e21e56e21e2bdc1c2bdc1c56e2222bdc2256e22456e2282bde2856dc262bde2656dc2a56dc3056dc2e56dc2c56dc3256e2322bdc3856e23c56e24029c04629c04829c04a0ddb5256e25a29dc5c29dc5e29dc660ddb6e56e2922bdca42bdca456e2a82bdca856e2aa56e2aa2bdc")\ + X(202 , 1, 0 , Underscore , "_" , "_" , 0x5F , 95 , 'u', '_' , '\x1f', "0273e2")\ + X(204 , 1, 0 , VerticalBar , "|" , "|" , 0x7C , 124 , 'u', '|' , 28 , "5029dc4a29dc6a29dc6629dc")\ + X(206 , 1, 0 , DivisionSign , "÷" , "÷" , 0xF7 , 247 , 'u', -1 , -1 , "541add")\ + X(208 , 1, 0 , OneHalf , "½" , "½" , 0xBD , 189 , 'u', -1 , -1 , "4e29dc6029dc6c29dc")\ + X(210 , 1, 0 , SuperscriptTwo , "²" , "²" , 0xB2 , 178 , 'u', -1 , -1 , "9629de9c29dea029de9e29de")\ + X(212 , 1, 0 , DegreeSign , "°" , "°" , 0xB0 , 176 , 'u', -1 , -1 , "3e29de640dbf7029dc")\ + X(214 , 1, 0 , NumeroSign , "º" , "º" , 0xBA , 186 , 'u', -1 , -1 , "5e28de6829dc")\ + X(216 , 1, 0 , Acute , "´" , "´" , 0xB4 , 180 , 'u', -1 , -1 , "3c1adb440ddb4827ba4e0ddb501aba4c0ddb520dbb560dbb580dbb542bbf5e1bba600ddb6428c06c0ddb620ddb6a1aba6828de6e0dbf7028de740ddf760ddd780ddd7a0ddd800ddd860ddd820ddd840ddd")\ + X(218 , 1, 0 , Caron , "ˇ" , "ˇ" , 0x02C7, 780 , 'u', -1 , -1 , "5629de")\ + X(220 , 1, 0 , Cedilla , "¸" , "¸" , 0xB8 , 184 , 'u', -1 , -1 , "3a1bdd9029c0")\ + X(222 , 1, 0 , Circumflex , "^" , "^" , 0x5E , 94 , 'u', '^' , 30 , "3a1adb3e1adb421adb4828de7629dc7829dc7a29dc8029dc8629dc8229dc8429dc880ddd8a0ddd961add981add9a0ddd9c1adda01add9e1addac15db")\ + X(224 , 1, 0 , Ogonek , "˛" , "˛" , 0x02DB, 731 , 'u', -1 , -1 , "7229c0")\ + X(226 , 1, 0 , Cross , "˟" , "˟" , 0x02DF, 735 , 'u', -1 , -1 , "8456e2")\ + X(228 , 1, 0 , Tilde , "~" , "~" , 0x7E , 771 , 'u', '~' , 30 , "3c28de5e2bbf")\ + X(230 , 1, 0 , Tonos , "΄" , "΄" , 0x0384, 900 , 'u', -1 , -1 , "4627ba")\ + X(232 , 1, 0 , Umlaut , "¨" , "¨" , 0xA8 , 168 , 'u', -1 , -1 , "441bba4628de4e1bba4a1bba4c1bba522bdc540ddb601bba641add621bba661bba6e2bdc881bc08a1bc0")\ + X(234 , 1, 0 , BackQuote , "`" , "`" , 0x60 , 96 , 'u', '`' , '`' , "0029c00629c01029c00e29c01429c01629c00229c00a29c00c29c01829c00429c00829c01a29c01229c02029c01e29c01c29c02229c0242bdc2829df2629df2a29df3029df2e29df2c29df3229c03a28c0482bdc541bba681aba9229c0a229dca429c0a829c0aa29c0")\ + X(236 , 1, 0 , SingleQuote , "'" , "'" , 0x27 , 39 , 'u', '\'' , '\'' , "0028de0628de1028de0e28de1428de1628de0228de0a28de0c28de1828de0428de0828de1a28de1228de1e28de1c28de2228de2428de2828c02628c02a28c03028c02e28c02c28c03428de3628de3228de3c29c0442bbf460cbf480cbf4e2bbf500cdb4a2bbf4c2bbf562bdc5429dc5a0cdb5c0cdb5e0cdb602bbf6c2bbf622bbf6a0cdb662bbf680cdb701bba720dbf7c0cbf880cdb8a0cdb9228de900cbf940dbb9a0cdea410dea835deaa2cde")\ + X(238 , 1, 0 , DoubleQuote , "\"" , "\"" , 0x22 , 34 , 'u', '"' , '"' , "8c29c0")\ + X(240 , 1, 0 , SingleRightQuote , "’" , "’" , 0x2019, 8217 , 'u', -1 , -1 , "ac31c0")\ + X(242 , 1, 0 , SingleLowQuote , "‚" , "‚" , 0x201A, 8218 , 'u', -1 , -1 , "7c29c0")\ + X(244 , 1, 0 , DoubleLowQuote , "„" , "„" , 0x201E, 8222 , 'u', -1 , -1 , "3829c0")\ + X(246 , 1, 0 , LeftGuillemet , "«" , "«" , 0xAB , 171 , 'u', -1 , -1 , "3a56e25e0ddd")\ + X(248 , 1, 0 , Hash , "#" , "#" , 0x23 , 35 , 'u', '#' , '#' , "2a2bde302bde2e2bde2c2bde362bdc3a29de462bdc782bbf802bbf862bbf822bbf842bbf")\ + X(250 , 1, 0 , AtSign , "@" , "@" , 0x40 , 64 , 'u', '@' , '\0' , "401bdd6429de9a29c0")\ + X(252 , 1, 0 , Exclamation , "!" , "!" , 0x21 , 33 , 'u', '!' , '!' , "9635df9835df9c35df")\ + X(254 , 1, 0 , InvertedExclamation, "¡" , "¡" , 0xA1 , 161 , 'u', -1 , -1 , "680ddd")\ + X(256 , 1, 0 , QuestionMark , "?" , "?" , 0x3F , 63 , 'u', '?' , 127 , "a20cbb")\ + X(258 , 1, 0 , InvertedQuestion , "¿" , "¿" , 0xBF , 191 , 'u', -1 , -1 , "500ddd6a0ddd")\ + X(260 , 1, 0 , Paragraph , "§" , "§" , 0xA7 , 167 , 'u', -1 , -1 , "4429dc4c29dc5228de5828de6229dc6e28de7428de8829bf8a29bf")\ + X(262 , 1, 0 , Ampersand , "&" , "&" , 0x26 , 38 , 'u', '&' , '&' , "5856e27456e2")\ + X(264 , 1, 0 , Dollar , "$" , "$" , 0x24 , 36 , 'u', '$' , '$' , "882bdf8a2bdf961bba9c1bbaa01bba9e1bbaac29de")\ + X(266 , 1, 0 , Percent , "%" , "%" , 0x25 , 37 , 'u', '%' , '%' , "ac0dbb")\ + X(268 , 1, 0 , Dong , "₫" , "₫" , 0x20AB, 8363 , 'u', -1 , -1 , "320dbb")\ + X(270 , 1, 0 , Yen , "¥" , "¥" , 0xA5 , 165 , 'u', -1 , -1 , "027ddc227ddc")\ + X(272 , 1, 0 , DotlessI , "ı" , "ı" , 0x0131, 305 , 'u', -1 , -1 , "8c1749a61349")\ + X(274 , 1, 0 , MicroSign , "µ" , "µ" , 0xB5 , 181 , 'u', -1 , -1 , "a02bdc9e2bdc")\ + X(276 , 1, 0 , Eth , "ð" , "ð" , 0xF0 , 240 , 'u', -1 , -1 , "6c1bba701add")\ + X(278 , 1, 0 , Thorn , "þ" , "þ" , 0xFE , 254 , 'u', -1 , -1 , "7035bd")\ + X(280 , 1, 0 , Eszett , "ẞ" , "ß" , 0xDF , 223 , 'u', -1 , -1 , "760cdb780cdb7a0cdb800cdb860cdb820cdb840cdb")\ + X(282 , 1, 0x41, KeyA , "A" , "a" , 0x61 , 97 , 'u', 'a' , '\x01', "001e41061e41101e410e1e41141e41161e41021e410a1e410c1e41181e41041e41081e411a1e41121e41201e411e1e411c1e41221e41241e41281e41261e412a1e41301e412e1e412c1e41341e41361e41321e41381e413a1e413e1e413c1e41401e41421e41441e41461e41481e414e1e41501e414a1e414c1e41521e41561e41581e41541e415a1e415c1e415e1e41601e41641e416c1e41621e416a1e41661e41681e416e1e41701e41721e417c1e41741e41761e41781e417a1e417e1e41801e41861e41821e41841e41881e418a1e418c1e418e1e41921e41901e41941e419610419810419a10419c1041a010419e1041a21e41a41e41a62141a82141aa2541ac1e41")\ + X(284 , 1, 0x42, KeyB , "B" , "b" , 0x62 , 98 , 'u', 'b' , '\x02', "0030420630421030420e30421430421630420230420a30420c30421830420430420830421a30421230422030421e30421c30422230422430422830422630422a30423030422e30422c30423430423630423230423830423a30423e30423c30424030424230424430424630424830424e30425030424a30424c30425230425630425830425430425a30425c30425e30426030426430426c30426230426a30426630426830426e30427030427230427c30427430427630427830427a30427e30428030428630428230428430428830428a30428c30428e30429230429030429430429630429830429a30429c3042a030429e3042a23042a43142a63342a81942aa1242ac1042")\ + X(286 , 1, 0x43, KeyC , "C" , "c" , 0x63 , 99 , 'u', 'c' , '\x03', "002e43062e43102e430e2e43142e43162e43022e430a2e430c2e43182e43042e43082e431a2e43122e43202e431e2e431c2e43222e43242e43282e43262e432a2e43302e432e2e432c2e43342e43362e43322e43382e433a2e433e2e433c2e43402e43422e43442e43462e43482e434e2e43502e434a2e434c2e43522e43562e43582e43542e435a2e435c2e435e2e43602e43642e436c2e43622e436a2e43662e43682e436e2e43702e43722e437c2e43742e43762e43782e437a2e437e2e43802e43862e43822e43842e43882e438a2e438c2e438e2e43922e43902e43942e43962e43982e439a2e439c2e43a02e439e2e43a22e43a41743a62f43a82643aa2043ac2343")\ + X(288 , 1, 0x44, KeyD , "D" , "d" , 0x64 , 100 , 'u', 'd' , '\x04', "0020440620441020440e20441420441620440220440a20440c20441820440420440820441a20441220442020441e20441c20442220442420442820442620442a20443020442e20442c20443420443620443220443820443a20443e20443c20444020444220444420444620444820444e20445020444a20444c20445220445620445820445420445a20445c20445e20446020446420446c20446220446a20446620446820446e20447020447220447c20447420447620447820447a20447e20448020448620448220448420448820448a20448c20448e20449222449020449420449620449820449a20449c2044a020449e2044a22044a42344a61544a82544aa2144ac1744")\ + X(290 , 1, 0x45, KeyE , "E" , "e" , 0x65 , 101 , 'u', 'e' , '\x05', "0012450612451012450e12451412451612450212450a12450c12451812450412450812451a12451212452012451e12451c12452212452412452812452612452a12453012452e12452c12453412453612453212453812453a12453e12453c12454012454212454412454612454812454e12455012454a12454c12455212455612455812455412455a12455c12455e12456012456412456c12456212456a12456612456812456e12457012457212457c12457412457612457812457a12457e12458012458612458212458412458812458a12458c12458e12459225459012459412459612459812459a12459c1245a012459e1245a21245a42045a62045a82245aa2445ac2145")\ + X(292 , 1, 0x46, KeyF , "F" , "f" , 0x66 , 102 , 'u', 'f' , '\x06', "0021460621461021460e21461421461621460221460a21460c21461821460421460821461a21461221462021461e21461c21462221462421462821462621462a21463021462e21462c21463421463621463221463821463a21463e21463c21464021464221464421464621464821464e21465021464a21464c21465221465621465821465421465a21465c21465e21466021466421466c21466221466a21466621466821466e21467021467221467c21467421467621467821467a21467e21468021468621468221468421468821468a21468c21468e21469212469021469421469621469821469a21469c2146a021469e2146a234bea41546a61046a80946aa0646ac3546")\ + X(294 , 1, 0x47, KeyG , "G" , "g" , 0x67 , 103 , 'u', 'g' , '\x07', "0022470622471022470e22471422471622470222470a22470c22471822470422470822471a22471222472022471e22471c22472222472422472822472622472a22473022472e22472c22473422473622473222473822473a22473e22473c22474022474222474422474622474822474e22475022474a22474c22475222475622475822475422475a22475c22475e22476022476422476c22476222476a22476622476822476e22477022477222477c22477422477622477822477a22477e22478022478622478222478422478822478a22478c22478e22479214479022479422479622479822479a22479c2247a022479e2247a22247a41647a61147a83447aa2e47ac3347")\ + X(296 , 1, 0x48, KeyH , "H" , "h" , 0x68 , 104 , 'u', 'h' , '\x08', "0023480623481023480e23481423481623480223480a23480c23481823480423480823481a23481223482023481e23481c23482223482423482823482623482a23483023482e23482c23483423483623483223483823483a23483e23483c23484023484223484423484623484823484e23485023484a23484c23485223485623485823485423485a23485c23485e23486023486423486c23486223486a23486623486823486e23487023487223487c23487423487623487823487a23487e23488023488623488223488423488823488a23488c23488e23489223489023489423489623489823489a23489c2348a023489e2348a22348a42448a61848a82348aa2348ac3448")\ + X(298 , 1, 0x49, KeyI , "I" , "i" , 0x69 , 105 , 'u', 'i' , '\x09', "0017490617491017490e17491417491617490217490a17490c17491817490417490817491a17491217492017491e17491c17492217492417492817492617492a17493017492e17492c17493417493617493217493817493a17493e17493c17494017494217494417494617494817494e17495017494a17494c17495217495617495817495417495a17495c17495e17496017496417496c17496217496a17496617496817496e17497017497217497c17497417497617497817497a17497e17498017498617498217498417498817498a17498c28de8e17499226499017499417499617499817499a17499c1749a017499e1749a21749a42249a61fdba83049aa3249ac2049")\ + X(300 , 1, 0x4A, KeyJ , "J" , "j" , 0x6A , 106 , 'u', 'j' , '\x0a', "00244a06244a10244a0e244a14244a16244a02244a0a244a0c244a18244a04244a08244a1a244a12244a20244a1e244a1c244a22244a24244a28244a26244a2a244a30244a2e244a2c244a34244a36244a32244a38244a3a244a3e244a3c244a40244a42244a44244a46244a48244a4e244a50244a4a244a4c244a52244a56244a58244a54244a5a244a5c244a5e244a60244a64244a6c244a62244a6a244a66244a68244a6e244a70244a72244a7c244a74244a76244a78244a7a244a7e244a80244a86244a82244a84244a88244a8a244a8c244a8e244a92154a90244a94244a96244a98244a9a244a9c244aa0244a9e244aa2244aa42e4aa62c4aa8064aaa094aac194a")\ + X(302 , 1, 0x4B, KeyK , "K" , "k" , 0x6B , 107 , 'u', 'k' , '\x0b', "00254b06254b10254b0e254b14254b16254b02254b0a254b0c254b18254b04254b08254b1a254b12254b20254b1e254b1c254b22254b24254b28254b26254b2a254b30254b2e254b2c254b34254b36254b32254b38254b3a254b3e254b3c254b40254b42254b44254b46254b48254b4e254b50254b4a254b4c254b52254b56254b58254b54254b5a254b5c254b5e254b60254b64254b6c254b62254b6a254b66254b68254b6e254b70254b72254b7c254b74254b76254b78254b7a254b7e254b80254b86254b82254b84254b88254b8a254b8c254b8e254b92314b90254b94254b96254b98254b9a254b9c254ba0254b9e254ba2254ba42f4ba6244ba8274baa1f4bac304b")\ + X(304 , 1, 0x4C, KeyL , "L" , "l" , 0x6C , 108 , 'u', 'l' , '\x0c', "00264c06264c10264c0e264c14264c16264c02264c0a264c0c264c18264c04264c08264c1a264c12264c20264c1e264c1c264c22264c24264c28264c26264c2a264c30264c2e264c2c264c34264c36264c32264c38264c3a264c3e264c3c264c40264c42264c44264c46264c48264c4e264c50264c4a264c4c264c52264c56264c58264c54264c5a264c5c264c5e264c60264c64264c6c264c62264c6a264c66264c68264c6e264c70264c72264c7c264c74264c76264c78264c7a264c7e264c80264c86264c82264c84264c88264c8a264c8c264c8e264c92164c90264c94264c96264c98264c9a264c9c264ca0264c9e264ca2264ca4194ca6264ca8074caa084cac184c")\ + X(306 , 1, 0x4D, KeyM , "M" , "m" , 0x6D , 109 , 'u', 'm' , '\x0d', "00324d06324d10324d0e324d14324d16324d02324d0a324d0c324d18324d04324d08324d1a324d12324d20324d1e324d1c324d22324d24324d28324d26324d2a324d30324d2e324d2c324d34324d36324d32324d38324d3a324d3e324d3c324d40324d42324d44324d46324d48324d4e324d50324d4a324d4c324d52324d56324d58324d54324d5a324d5c324d5e324d60324d64324d6c324d62324d6a324d66324d68324d6e324d70324d72324d7c324d74324d76324d78324d7a324d7e324d80324d86324d82324d84324d88324d8a324d8c324d8e324d92324d90324d94324d96274d98274d9a274d9c274da0274d9e274da2324da4324da6254da8084daa074dac284d")\ + X(308 , 1, 0x4E, KeyN , "N" , "n" , 0x6E , 110 , 'u', 'n' , '\x0e', "00314e06314e10314e0e314e14314e16314e02314e0a314e0c314e18314e04314e08314e1a314e12314e20314e1e314e1c314e22314e24314e28314e26314e2a314e30314e2e314e2c314e34314e36314e32314e38314e3a314e3e314e3c314e40314e42314e44314e46314e48314e4e314e50314e4a314e4c314e52314e56314e58314e54314e5a314e5c314e5e314e60314e64314e6c314e62314e6a314e66314e68314e6e314e70314e72314e7c314e74314e76314e78314e7a314e7e314e80314e86314e82314e84314e88314e8a314e8c314e8e314e92244e90314e94314e96314e98314e9a314e9c314ea0314e9e314ea2314ea4264ea6174ea8314eaa314eac274e")\ + X(310 , 1, 0x4F, KeyO , "O" , "o" , 0x6F , 111 , 'u', 'o' , '\x0f', "00184f06184f10184f0e184f14184f16184f02184f0a184f0c184f18184f04184f08184f1a184f12184f20184f1e184f1c184f22184f24184f28184f26184f2a184f30184f2e184f2c184f34184f36184f32184f38184f3a184f3e184f3c184f40184f42184f44184f46184f48184f4e184f50184f4a184f4c184f52184f56184f58184f54184f5a184f5c184f5e184f60184f64184f6c184f62184f6a184f66184f68184f6e184f70184f72184f7c184f74184f76184f78184f7a184f7e184f80184f86184f82184f84184f88184f8a184f8c184f8e184f92274f90184f94184f96184f98184f9a184f9c184fa0184f9e184fa2184fa41f4fa6144fa8144faa174fac134f")\ + X(312 , 1, 0x50, KeyP , "P" , "p" , 0x70 , 112 , 'u', 'p' , '\x10', "0019500619501019500e19501419501619500219500a19500c19501819500419500819501a19501219502019501e19501c19502219502419502819502619502a19503019502e19502c19503419503619503219503819503a19503e19503c19504019504219504419504619504819504e19505019504a19504c19505219505619505819505419505a19505c19505e19506019506419506c19506219506a19506619506819506e19507019507219507c19507419507619507819507a19507e19508019508619508219508419508819508a19508c19508e19509213509019509419509619509819509a19509c1950a019509e1950a21950a41350a61950a80a50aa0550ac1250")\ + X(314 , 1, 0x51, KeyQ , "Q" , "q" , 0x71 , 113 , 'u', 'q' , '\x11', "0010510610511010510e10511410511610510210510a10510c10511810510410510810511a10511210512010511e10511c10512210512410512810512610512a10513010512e10512c10513410513610513210513810513a10513e10513c10514010514210514410514610514810514e10515010514a10514c10515210515610515810515410515a10515c10515e10516010516410516c10516210516a10516610516810516e10517010517210517c10517410517610517810517a10517e10518010518610518210518410518810518a10518c10518e1051921051901051941051961e51981e519a1e519c1e51a01e519e1e51a22bbfa42d51a61a51a81251aa1151ac3251")\ + X(316 , 1, 0x52, KeyR , "R" , "r" , 0x72 , 114 , 'u', 'r' , '\x12', "0013520613521013520e13521413521613520213520a13520c13521813520413520813521a13521213522013521e13521c13522213522413522813522613522a13523013522e13522c13523413523613523213523813523a13523e13523c13524013524213524413524613524813524e13525013524a13524c13525213525613525813525413525a13525c13525e13526013526413526c13526213526a13526613526813526e13527013527213527c13527413527613527813527a13527e13528013528613528213528413528813528a13528c13528e1352921f529013529413529613529813529a13529c1352a013529e1352a21352a41852a61652a81552aa1552ac2652")\ + X(318 , 1, 0x53, KeyS , "S" , "s" , 0x73 , 115 , 'u', 's' , '\x13', "001f53061f53101f530e1f53141f53161f53021f530a1f530c1f53181f53041f53081f531a1f53121f53201f531e1f531c1f53221f53241f53281f53261f532a1f53301f532e1f532c1f53341f53361f53321f53381f533a1f533e1f533c1f53401f53421f53441f53461f53481f534e1f53501f534a1f534c1f53521f53561f53581f53541f535a1f535c1f535e1f53601f53641f536c1f53621f536a1f53661f53681f536e1f53701f53721f537c1f53741f53761f53781f537a1f537e1f53801f53861f53821f53841f53881f538a1f538c1f538e1f53922053901f53941f53961f53981f539a1f539c1f53a01f539e1f53a21f53a42753a63253a81653aa1653ac2553")\ + X(320 , 1, 0x54, KeyT , "T" , "t" , 0x74 , 116 , 'u', 't' , '\x14', "0014540614541014540e14541414541614540214540a14540c14541814540414540814541a14541214542014541e14541c14542214542414542814542614542a14543014542e14542c14543414543614543214543814543a14543e14543c14544014544214544414544614544814544e14545014544a14544c14545214545614545814545414545a14545c14545e14546014546414546c14546214546a14546614546814546e14547014547214547c14547414547614547814547a14547e14548014548614548214548414548814548a14548c14548e14549221549014549414549614549814549a14549c1454a014549e1454a21454a42554a62354a82454aa2254ac2454")\ + X(322 , 1, 0x55, KeyU , "U" , "u" , 0x75 , 117 , 'u', 'u' , '\x15', "0016550616551016550e16551416551616550216550a16550c16551816550416550816551a16551216552016551e16551c16552216552416552816552616552a16553016552e16552c16553416553616553216553816553a16553e16553c16554016554216554416554616554816554e16555016554a16554c16555216555616555816555416555a16555c16555e16556016556416556c16556216556a16556616556816556e16557016557216557c16557416557616557816557a16557e16558016558616558216558416558816558a16558c16558e16559217559016559416559616559816559a16559c1655a016559e1655a21655a42155a61e55a81755aa1455ac1f55")\ + X(324 , 1, 0x56, KeyV , "V" , "v" , 0x76 , 118 , 'u', 'v' , '\x16', "002f56062f56102f560e2f56142f56162f56022f560a2f560c2f56182f56042f56082f561a2f56122f56202f561e2f561c2f56222f56242f56282f56262f562a2f56302f562e2f562c2f56342f56362f56322f56382f563a2f563e2f563c2f56402f56422f56442f56462f56482f564e2f56502f564a2f564c2f56522f56562f56582f56542f565a2f565c2f565e2f56602f56642f566c2f56622f566a2f56662f56682f566e2f56702f56722f567c2f56742f56762f56782f567a2f567e2f56802f56862f56822f56842f56882f568a2f568c2f568e2f56922f56902f56942f56962f56982f569a2f569c2f56a02f569e2f56a22f56a43456a62e56a83356aa2f56ac1656")\ + X(326 , 1, 0x57, KeyW , "W" , "w" , 0x77 , 119 , 'u', 'w' , '\x17', "0011570611571011570e11571411571611570211570a11570c11571811570411570811571a11571211572011571e11571c11572211572411572811572611572a11573011572e11572c11573411573611573211573811573a11573e11573c11574011574211574411574611574811574e11575011574a11574c11575211575611575811575411575a11575c11575e11576011576411576c11576211576a11576611576811576e11577011577211577c11577411577611577811577a11577e11578011578611578211578411578811578a11578c11578e1157921157901157941157962c57982c579a2c579c2c57a02c579e2c57a21bbaa43357a61b57a83257aa3057ac1b57")\ + X(328 , 1, 0x58, KeyX , "X" , "x" , 0x78 , 120 , 'u', 'x' , '\x18', "002d58062d58102d580e2d58142d58162d58022d580a2d580c2d58182d58042d58082d581a2d58122d58202d581e2d581c2d58222d58242d58282d58262d582a2d58302d582e2d582c2d58342d58362d58322d58382d583a2d583e2d583c2d58402d58422d58442d58462d58482d584e2d58502d584a2d584c2d58522d58562d58582d58542d585a2d585c2d585e2d58602d58642d586c2d58622d586a2d58662d58682d586e2d58702d58722d587c2d58742d58762d58782d587a2d587e2d58802d58862d58822d58842d58882d588a2d588c2d588e2d58922d58902d58942d58962d58982d589a2d589c2d58a02d589e2d58a20ddba43058a62b58a82e58aa2d58ac2e58")\ + X(330 , 1, 0x59, KeyY , "Y" , "y" , 0x79 , 121 , 'u', 'y' , '\x19', "0015590615591015590e15591415591615590215590a15590c15591815590415590815591a15591215592015591e15591c15592215592415592815592615592a15593015592e15592c15593415593615593215593815593a15593e15593c1559402c594215594415594615594815594e15595015594a15594c15595215595615595815595415595a15595c15595e15596015596415596c15596215596a15596615596815596e2c59701559722c597c2c59742c59762c59782c597a2c597e2c59802c59862c59822c59842c59882c598a2c598c15598e1559921859902c59942c599615599815599a15599c1559a015599e1559a21559a41459a62759a81859aa1359ac2d59")\ + X(332 , 1, 0x5A, KeyZ , "Z" , "z" , 0x7A , 122 , 'u', 'z' , '\x1a', "002c5a062c5a102c5a0e2c5a142c5a162c5a022c5a0a2c5a0c2c5a182c5a042c5a082c5a1a2c5a122c5a202c5a1e2c5a1c2c5a222c5a242c5a282c5a262c5a2a2c5a302c5a2e2c5a2c2c5a342c5a362c5a322c5a382c5a3a2c5a3e2c5a3c2c5a40155a422c5a442c5a462c5a482c5a4e2c5a502c5a4a2c5a4c2c5a522c5a562c5a582c5a542c5a5a2c5a5c2c5a5e2c5a602c5a642c5a6c2c5a622c5a6a2c5a662c5a682c5a6e155a702c5a72155a7c155a74155a76155a78155a7a155a7e155a80155a86155a82155a84155a88155a8a155a8c2c5a8e2c5a922c5a90155a94155a96115a98115a9a115a9c115aa0115a9e115aa22c5aa4355aa6315aa8205aaa265aac1a5a")\ + X(334 , 1, 0 , AeLigature , "Æ" , "æ" , 0xE6 , 230 , 'u', -1 , -1 , "4e27c04a28de6027c06c27c06628de7027c0")\ + X(336 , 1, 0 , AcuteA , "Á" , "á" , 0xE1 , 225 , 'u', -1 , -1 , "7e28de8e28de")\ + X(338 , 1, 0 , BreveA , "Ă" , "ă" , 0x0103, 259 , 'u', -1 , -1 , "381adb941adb")\ + X(340 , 1, 0 , CircumflexA , "Â" , "â" , 0xE2 , 226 , 'u', -1 , -1 , "382bdc942bdc")\ + X(342 , 1, 0 , GraveA , "À" , "à" , 0xE0 , 224 , 'u', -1 , -1 , "3e2bdc422bdc5a28de5c28de8828dcac2cdd")\ + X(344 , 1, 0 , OgonekA , "Ą" , "ą" , 0x0105, 261 , 'u', -1 , -1 , "7228dea21051")\ + X(346 , 1, 0 , RingA , "Å" , "å" , 0xE5 , 229 , 'u', -1 , -1 , "441add4e1add4a1add4c1add601add6c1add621add661add")\ + X(348 , 1, 0 , TildeA , "Ã" , "ã" , 0xE3 , 227 , 'u', -1 , -1 , "9829de")\ + X(350 , 1, 0 , UmlautA , "Ä" , "ä" , 0xE4 , 228 , 'u', -1 , -1 , "4428de4c28de5628bf581bdd6228de741bdd7628de7828de7a28de8028de8628de8228de8428de8a28dc")\ + X(352 , 1, 0 , AcuteC , "Ć" , "ć" , 0x0107, 263 , 'u', -1 , -1 , "7c28de9028de")\ + X(354 , 1, 0 , CaronC , "Č" , "č" , 0x010D, 269 , 'u', -1 , -1 , "7c27ba9027baa233bc")\ + X(356 , 1, 0 , CedillaC , "Ç" , "ç" , 0xE7 , 231 , 'u', -1 , -1 , "3e1bdd3c27ba401adb421bdd5428de5e27c0682bbf8c34dca630bfac2bdc")\ + X(358 , 1, 0 , DotAboveC , "Ċ" , "ċ" , 0x010B, 267 , 'u', -1 , -1 , "3429c03629c0")\ + X(360 , 1, 0 , AcuteE , "É" , "é" , 0xE9 , 233 , 'u', -1 , -1 , "3a35bf3e35bf4235bf7e27ba8827de8e27baac11ba")\ + X(362 , 1, 0 , CircumflexE , "Ê" , "ê" , 0xEA , 234 , 'u', -1 , -1 , "ac56e2")\ + X(364 , 1, 0 , GraveE , "È" , "è" , 0xE8 , 232 , 'u', -1 , -1 , "3e28c04228c05a1aba5c1aba881abaac14bf")\ + X(366 , 1, 0 , DotAboveE , "Ė" , "ė" , 0x0117, 279 , 'u', -1 , -1 , "a228de")\ + X(368 , 1, 0 , OgonekE , "Ę" , "ę" , 0x0119, 281 , 'u', -1 , -1 , "a235bd")\ + X(370 , 1, 0 , UmlautE , "Ë" , "ë" , 0xEB , 235 , 'u', -1 , -1 , "4027ba")\ + X(372 , 1, 0 , CrossedD , "Đ" , "đ" , 0x0111, 273 , 'u', -1 , -1 , "7c1bdd901bdd")\ + X(374 , 1, 0 , BreveG , "Ğ" , "ğ" , 0x011F, 287 , 'u', -1 , -1 , "8c1adba612ba")\ + X(376 , 1, 0 , DotAboveG , "Ġ" , "ġ" , 0x0121, 289 , 'u', -1 , -1 , "341adb361adb")\ + X(378 , 1, 0 , CrossedH , "Ħ" , "ħ" , 0x0127, 295 , 'u', -1 , -1 , "341bdd361bdd")\ + X(380 , 1, 0 , AcuteI , "Í" , "í" , 0xED , 237 , 'u', -1 , -1 , "7e56e28e29308e56e2")\ + X(382 , 1, 0 , CircumflexI , "Î" , "î" , 0xEE , 238 , 'u', -1 , -1 , "381bdd941bdd")\ + X(384 , 1, 0 , GraveI , "Ì" , "ì" , 0xEC , 236 , 'u', -1 , -1 , "5a0ddd5c0ddd")\ + X(386 , 1, 0 , OgonekI , "Į" , "į" , 0x012F, 303 , 'u', -1 , -1 , "a21add")\ + X(388 , 1, 0 , CrossedL , "Ł" , "ł" , 0x0142, 322 , 'u', -1 , -1 , "7227ba762bbf7a2bbf")\ + X(390 , 1, 0 , CaronN , "Ň" , "ň" , 0x0148, 328 , 'u', -1 , -1 , "582bdc742bdc")\ + X(392 , 1, 0 , TildeN , "Ñ" , "ñ" , 0xF1 , 241 , 'u', -1 , -1 , "5027c05427c06a27c06827c0")\ + X(394 , 1, 0 , AcuteO , "Ó" , "ó" , 0xF3 , 243 , 'u', -1 , -1 , "722bdc7e0dbb8e0dbb981bba")\ + X(396 , 1, 0 , CircumflexO , "Ô" , "ô" , 0xF4 , 244 , 'u', -1 , -1 , "5827ba7427ba")\ + X(398 , 1, 0 , DoubleAcuteO , "Ő" , "ő" , 0x0151, 337 , 'u', -1 , -1 , "7e1adb8e1adb")\ + X(400 , 1, 0 , GraveO , "Ò" , "ò" , 0xF2 , 242 , 'u', -1 , -1 , "5a27c05c27c0")\ + X(402 , 1, 0 , HornO , "Ơ" , "ơ" , 0x01A1, 417 , 'u', -1 , -1 , "321bdd")\ + X(404 , 1, 0 , SlashedO , "Ø" , "ø" , 0xF8 , 248 , 'u', -1 , -1 , "4e28de4a27c06028de6c28de6627c0")\ + X(406 , 1, 0 , TildeO , "Õ" , "õ" , 0xF5 , 245 , 'u', -1 , -1 , "561bdb")\ + X(408 , 1, 0 , UmlautO , "Ö" , "ö" , 0xF6 , 246 , 'u', -1 , -1 , "4427c04c27c05627ba6227c0700cbb7627c07827c07a27c08027c08627c08227c08427c08a27de8c33bfa62ddc")\ + X(410 , 1, 0 , AcuteS , "Ś" , "ś" , 0x015B, 347 , 'u', -1 , -1 , "721bdd")\ + X(412 , 1, 0 , CaronS , "Š" , "š" , 0x0161, 353 , 'u', -1 , -1 , "7c1adb901adba22146")\ + X(414 , 1, 0 , CedillaS , "Ş" , "ş" , 0x015F, 351 , 'u', -1 , -1 , "8c27ba9427baa628de")\ + X(416 , 1, 0 , CommaS , "Ș" , "ș" , 0x0219, 537 , 'u', -1 , -1 , "3827ba")\ + X(418 , 1, 0 , CedillaT , "Ţ" , "ţ" , 0x0163, 355 , 'u', -1 , -1 , "9428de")\ + X(420 , 1, 0 , CommaT , "Ț" , "ț" , 0x021B, 539 , 'u', -1 , -1 , "3828de")\ + X(422 , 1, 0 , AcuteU , "Ú" , "ú" , 0xFA , 250 , 'u', -1 , -1 , "521adb581adb6e1adb741adb7e1bdd8e1bdd")\ + X(424 , 1, 0 , DoubleAcuteU , "Ű" , "ű" , 0x0171, 369 , 'u', -1 , -1 , "7e2bdc8e2bdc")\ + X(426 , 1, 0 , GraveU , "Ù" , "ù" , 0xF9 , 249 , 'u', -1 , -1 , "3e56e24256e25a2bbf5c2bbf9628c09828c09c28c0a028c09e28c0")\ + X(428 , 1, 0 , HornU , "Ư" , "ư" , 0x01B0, 432 , 'u', -1 , -1 , "321adb")\ + X(430 , 1, 0 , MacronU , "Ū" , "ū" , 0x016B, 363 , 'u', -1 , -1 , "a22d58")\ + X(432 , 1, 0 , OgonekU , "Ų" , "ų" , 0x0173, 371 , 'u', -1 , -1 , "a227c0")\ + X(434 , 1, 0 , RingU , "Ů" , "ů" , 0x016F, 367 , 'u', -1 , -1 , "5227ba6e27ba")\ + X(436 , 1, 0 , UmlautU , "Ü" , "ü" , 0xFC , 252 , 'u', -1 , -1 , "561ac0761aba781aba7a1aba7e0cbf801aba861aba821aba841aba8a1aba8c1bdd8e0cbda622dd")\ + X(438 , 1, 0 , CaronZ , "Ž" , "ž" , 0x017E, 382 , 'u', -1 , -1 , "1e0dbb7c2bdc902bdca21157")\ + X(440 , 1, 0 , DotAboveZ , "Ż" , "ż" , 0x017C, 380 , 'u', -1 , -1 , "342bdc3656e2721adb")\ + X(442 , 0, 0x5F, Sleep , "Sleep" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(444 , 0, 0xB6, AppStart1 , "AppStart1" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(446 , 0, 0xB7, AppStart2 , "AppStart2" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(448 , 0, 0 , AppNewWindow , "AppNewWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(450 , 0, 0 , AppOpenWindow , "AppOpenWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(452 , 0, 0x2F, AppHelp , "AppHelp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(454 , 0, 0 , AppSave , "AppSave" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(456 , 0, 0 , AppFind , "AppFind" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(458 , 0, 0 , AppPrint , "AppPrint" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(460 , 0, 0 , AppClose , "AppClose" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(462 , 1, 0 , AppCut , "AppCut" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(464 , 0, 0 , AppCopy , "AppCopy" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(466 , 1, 0 , AppPaste , "AppPaste" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(468 , 1, 0 , AppUndo , "AppUndo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(470 , 1, 0 , AppRedo , "AppRedo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(472 , 0, 0 , AppSpeechMode , "AppSpeechMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(474 , 0, 0 , AppSpeechCorrection, "AppSpeechCorrect" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(476 , 0, 0 , AppSpellCheck , "AppSpellCheck" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(478 , 0, 0 , Calculator , "Calculator" , "" , 0 , 0 , 'u', -1 , -1 , "0121b70721b71121b70f21b71521b71721b70321b70b21b70d21b71921b70521b70921b71b21b71321b72121b71f21b71d21b72321b72521b72921b72721b72b21b73121b72f21b72d21b73521b73721b73321b73921b73b21b73f21b73d21b74121b74321b74521b74721b74921b74f21b75121b74b21b74d21b75321b75721b75921b75521b75b21b75d21b75f21b76121b76521b76d21b76321b76b21b76721b76921b76f21b77121b77321b77d21b77521b77721b77921b77b21b77f21b78121b78721b78321b78521b78921b78b21b78d21b78f21b79321b79121b79521b79721b79921b79b21b79d21b7a121b79f21b7a321b7a521b7a721b7a921b7ab21b7ad21b7")\ + X(480 , 0, 0xB4, Mail , "Mail" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(482 , 0, 0 , MailSend , "MailSend" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(484 , 0, 0 , MailForward , "MailForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(486 , 0, 0 , MailReply , "MailReply" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(488 , 0, 0 , MediaBassBoost , "MediaBassBoost" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(490 , 0, 0 , MediaBassDown , "MediaBassDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(492 , 0, 0 , MediaBassUp , "MediaBassUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(494 , 0, 0 , MediaChanDown , "MediaChanDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(496 , 0, 0 , MediaChanUp , "MediaChanUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(498 , 0, 0 , MediaTrebleDown , "MediaTrebleDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(500 , 0, 0 , MediaTrebleUp , "MediaTrebleUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(502 , 0, 0 , MediaVolMute , "MediaVolMute" , "" , 0 , 57440, 'u', -1 , -1 , "0120ad0720ad1120ad0f20ad1520ad1720ad0320ad0b20ad0d20ad1920ad0520ad0920ad1b20ad1320ad2120ad1f20ad1d20ad2320ad2520ad2920ad2720ad2b20ad3120ad2f20ad2d20ad3520ad3720ad3320ad3920ad3b20ad3f20ad3d20ad4120ad4320ad4520ad4720ad4920ad4f20ad5120ad4b20ad4d20ad5320ad5720ad5920ad5520ad5b20ad5d20ad5f20ad6120ad6520ad6d20ad6320ad6b20ad6720ad6920ad6f20ad7120ad7320ad7d20ad7520ad7720ad7920ad7b20ad7f20ad8120ad8720ad8320ad8520ad8920ad8b20ad8d20ad8f20ad9320ad9120ad9520ad9720ad9920ad9b20ad9d20ada120ad9f20ada320ada520ada720ada920adab20adad20ad")\ + X(504 , 0, 0 , MediaVolDown , "MediaVolDown" , "" , 0 , 57438, 'u', -1 , -1 , "012eae072eae112eae0f2eae152eae172eae032eae0b2eae0d2eae192eae052eae092eae1b2eae132eae212eae1f2eae1d2eae232eae252eae292eae272eae2b2eae312eae2f2eae2d2eae352eae372eae332eae392eae3b2eae3f2eae3d2eae412eae432eae452eae472eae492eae4f2eae512eae4b2eae4d2eae532eae572eae592eae552eae5b2eae5d2eae5f2eae612eae652eae6d2eae632eae6b2eae672eae692eae6f2eae712eae732eae7d2eae752eae772eae792eae7b2eae7f2eae812eae872eae832eae852eae892eae8b2eae8d2eae8f2eae932eae912eae952eae972eae992eae9b2eae9d2eaea12eae9f2eaea32eaea52eaea72eaea92eaeab2eaead2eae")\ + X(506 , 0, 0 , MediaVolUp , "MediaVolUp" , "" , 0 , 57439, 'u', -1 , -1 , "0130af0730af1130af0f30af1530af1730af0330af0b30af0d30af1930af0530af0930af1b30af1330af2130af1f30af1d30af2330af2530af2930af2730af2b30af3130af2f30af2d30af3530af3730af3330af3930af3b30af3f30af3d30af4130af4330af4530af4730af4930af4f30af5130af4b30af4d30af5330af5730af5930af5530af5b30af5d30af5f30af6130af6530af6d30af6330af6b30af6730af6930af6f30af7130af7330af7d30af7530af7730af7930af7b30af7f30af8130af8730af8330af8530af8930af8b30af8d30af8f30af9330af9130af9530af9730af9930af9b30af9d30afa130af9f30afa330afa530afa730afa930afab30afad30af")\ + X(508 , 0, 0xB0, MediaNext , "MediaNext" , "" , 0 , 57435, 'u', -1 , -1 , "0119b00719b01119b00f19b01519b01719b00319b00b19b00d19b01919b00519b00919b01b19b01319b02119b01f19b01d19b02319b02519b02919b02719b02b19b03119b02f19b02d19b03519b03719b03319b03919b03b19b03f19b03d19b04119b04319b04519b04719b04919b04f19b05119b04b19b04d19b05319b05719b05919b05519b05b19b05d19b05f19b06119b06519b06d19b06319b06b19b06719b06919b06f19b07119b07319b07d19b07519b07719b07919b07b19b07f19b08119b08719b08319b08519b08919b08b19b08d19b08f19b09319b09119b09519b09719b09919b09b19b09d19b0a119b09f19b0a319b0a519b0a719b0a919b0ab19b0ad19b0")\ + X(510 , 0, 0xB1, MediaPrev , "MediaPrev" , "" , 0 , 57436, 'u', -1 , -1 , "0110b10710b11110b10f10b11510b11710b10310b10b10b10d10b11910b10510b10910b11b10b11310b12110b11f10b11d10b12310b12510b12910b12710b12b10b13110b12f10b12d10b13510b13710b13310b13910b13b10b13f10b13d10b14110b14310b14510b14710b14910b14f10b15110b14b10b14d10b15310b15710b15910b15510b15b10b15d10b15f10b16110b16510b16d10b16310b16b10b16710b16910b16f10b17110b17310b17d10b17510b17710b17910b17b10b17f10b18110b18710b18310b18510b18910b18b10b18d10b18f10b19310b19110b19510b19710b19910b19b10b19d10b1a110b19f10b1a310b1a510b1a710b1a910b1ab10b1ad10b1")\ + X(512 , 0, 0xB2, MediaStop , "MediaStop" , "" , 0 , 57432, 'u', -1 , -1 , "0124b20724b21124b20f24b21524b21724b20324b20b24b20d24b21924b20524b20924b21b24b21324b22124b21f24b21d24b22324b22524b22924b22724b22b24b23124b22f24b22d24b23524b23724b23324b23924b23b24b23f24b23d24b24124b24324b24524b24724b24924b24f24b25124b24b24b24d24b25324b25724b25924b25524b25b24b25d24b25f24b26124b26524b26d24b26324b26b24b26724b26924b26f24b27124b27324b27d24b27524b27724b27924b27b24b27f24b28124b28724b28324b28524b28924b28b24b28d24b28f24b29324b29124b29524b29724b29924b29b24b29d24b2a124b29f24b2a324b2a524b2a724b2a924b2ab24b2ad24b2")\ + X(514 , 0, 0 , MediaPause , "MediaPause" , "" , 0 , 57429, 'u', -1 , -1 , "")\ + X(516 , 0, 0xB3, MediaPlayPause , "MediaPlayPause" , "" , 0 , 57430, 'u', -1 , -1 , "0122b30722b31122b30f22b31522b31722b30322b30b22b30d22b31922b30522b30922b31b22b31322b32122b31f22b31d22b32322b32522b32922b32722b32b22b33122b32f22b32d22b33522b33722b33322b33922b33b22b33f22b33d22b34122b34322b34522b34722b34922b34f22b35122b34b22b34d22b35322b35722b35922b35522b35b22b35d22b35f22b36122b36522b36d22b36322b36b22b36722b36922b36f22b37122b37322b37d22b37522b37722b37922b37b22b37f22b38122b38722b38322b38522b38922b38b22b38d22b38f22b39322b39122b39522b39722b39922b39b22b39d22b3a122b39f22b3a322b3a522b3a722b3a922b3ab22b3ad22b3")\ + X(518 , 0, 0 , MediaPlay , "MediaPlay" , "" , 0 , 57428, 'u', -1 , -1 , "")\ + X(520 , 0, 0xB5, MediaSelectMode , "MediaSelectMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(522 , 0, 0 , MediaReverse , "MediaReverse" , "" , 0 , 57431, 'u', -1 , -1 , "")\ + X(524 , 0, 0 , MediaRecord , "MediaRecord" , "" , 0 , 57437, 'u', -1 , -1 , "")\ + X(526 , 0, 0 , MediaFastForward , "MediaFastForward" , "" , 0 , 57433, 'u', -1 , -1 , "")\ + X(528 , 0, 0 , MediaRewind , "MediaRewind" , "" , 0 , 57434, 'u', -1 , -1 , "")\ + X(530 , 0, 0 , MicAirToggle , "MicAirToggle" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(532 , 0, 0xAD, MicMute , "MicMute" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(534 , 0, 0xAF, MicVolUp , "MicVolUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(536 , 0, 0xAE, MicVolDown , "MicVolDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(538 , 0, 0xA6, BrowserBackward , "BrowserBackward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(540 , 0, 0xA7, BrowserForward , "BrowserForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(542 , 0, 0xA8, BrowserRefresh , "BrowserRefresh" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(544 , 0, 0xA9, BrowserStop , "BrowserStop" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(546 , 0, 0xAA, BrowserSearch , "BrowserSearch" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(548 , 0, 0xAB, BrowserFavorites , "BrowserFavorites" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(550 , 0, 0xAC, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0132ac0732ac1132ac0f32ac1532ac1732ac0332ac0b32ac0d32ac1932ac0532ac0932ac1b32ac1332ac2132ac1f32ac1d32ac2332ac2532ac2932ac2732ac2b32ac3132ac2f32ac2d32ac3532ac3732ac3332ac3932ac3b32ac3f32ac3d32ac4132ac4332ac4532ac4732ac4932ac4f32ac5132ac4b32ac4d32ac5332ac5732ac5932ac5532ac5b32ac5d32ac5f32ac6132ac6532ac6d32ac6332ac6b32ac6732ac6932ac6f32ac7132ac7332ac7d32ac7532ac7732ac7932ac7b32ac7f32ac8132ac8732ac8332ac8532ac8932ac8b32ac8d32ac8f32ac9332ac9132ac9532ac9732ac9932ac9b32ac9d32aca132ac9f32aca332aca532aca732aca932acab32acad32ac")\ + X(552 , 0, 0 , lastKey , "lastKey" , "" , 0 , 0 , 0 , -1 , -1 , "") // Max 12 bits for KeyId. static constexpr auto idbits = 12; - #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ static constexpr auto Name = KeyId; key_list #undef X + static constexpr auto fx_map = [] + { + auto m = std::array{}; + auto fill = [&](si32 KeyId, si32 Vk) + { + if (m[Vk]) log("vkey duplicates"); /* It won't compile if collide. */\ + if (Vk) m[Vk] = KeyId; + }; + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + fill(KeyId, Vk); + key_list + #undef X + return m; + }(); static constexpr auto key_map = [] { auto m = std::array{}; @@ -670,7 +684,7 @@ namespace netxs::input m[key_hash] = (si16)KeyId; } }; - #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ fill(KeyId, qiew{ PhysicalCode }); key_list #undef X @@ -694,7 +708,7 @@ namespace netxs::input constexpr auto total_hash_count = [] { auto total_hash_count = 0; - #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ total_hash_count += (si32)qiew{ PhysicalCode }.size() / 6; key_list #undef X @@ -713,7 +727,7 @@ namespace netxs::input m[i++] = { .code = KeyId, .scan = scan, .unic = unic, .klid = klid, .vkey = vkey }; } }; - #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ fill(KeyId, Uc, qiew{ PhysicalCode }); key_list #undef X @@ -812,7 +826,7 @@ namespace netxs::input static const auto keymap = std::unordered_map { - #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ { map{ 0,0,0,0 }, KeyId }, key_list #undef X @@ -821,7 +835,7 @@ namespace netxs::input static const auto _init0 = [] { //todo move it to std::array - #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ map::set(KeyId, Input, #Name, Generic, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode); key_list #undef X @@ -829,21 +843,21 @@ namespace netxs::input }(); static const auto kkpmap = std::unordered_map { - #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ { KKPdef | (KKPsuffix << 16), KeyId }, key_list #undef X }; static const auto specific_names = utf::unordered_map { - #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ { utf::to_lower(#Name), KeyId }, key_list #undef X }; static const auto generic_names = utf::unordered_map { - #define X(KeyId, Input, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ { utf::to_lower(Generic), KeyId & -2 }, key_list #undef X @@ -3070,11 +3084,15 @@ namespace netxs::input } return keyid; } - auto xlat_direct(si32 vk, si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 layout_fallback) + auto xlat_direct(si32 virt_ex, si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 layout_fallback) { auto keyid = key::undef; auto numlock = keymod & input::hids::NumLock; - if (xlayout) + if (auto keycode = input::key::fx_map[virt_ex & 0xFF]) + { + keyid = keycode; + } + else if (xlayout) { auto klid = input::key::is_layout_supported(xlayout) ? xlayout : layout_fallback ? layout_fallback From 85a9a93204de2d98eb98610004598ace970386dd Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Mon, 22 Jun 2026 22:01:43 +0500 Subject: [PATCH 46/71] #943 WIP: Fix RightCtrl/RightAlt on Canadian/Korean layouts --- src/netxs/desktopio/input.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index d2ac82e28b..a3b09529d0 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -340,9 +340,9 @@ namespace netxs::input X(0 , 1, 0 , undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(1 , 0, 0 , invalid , "invalid" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(2 , 0, 0xA2, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001d11061d11101d110e1d11141d11161d11021d110a1d110c1d11181d11041d11081d111a1d11121d11201d111e1d111c1d11221d11241d11281d11261d112a1d11301d112e1d112c1d11341d11361d11321d11381d113a1d113e1d113c1d11401d11421d11441d11461d11481d114e1d11501d114a1d114c1d11521d11561d11581d11541d115a1d115c1d115e1d11601d11641d116c1d11621d116a1d11661d11681d116e1d11701d11721d117c1d11741d11761d11781d117a1d117e1d11801d11861d11821d11841d11881d118a1d118c1d118e1d11921d11901d11941d11961d11981d119a1d119c1d11a01d119e1d11a21d11a41d11a61d11a81d11aa1d11ac1d11")\ - X( 3 , 0, 0xA3, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011d11071d11111d110f1d11151d11171d11031d110b1d110d1d11191d11051d11091d111b1d11131d11211d111f1d111d1d11231d19251d11291d11271d112b1d11311d112f1d112d1d11351d11371d11331d11391d113b1d113f1d113d1d11411d11431ddf451d11471d11491d114f1d11511d114b1d114d1d11531d11571d11591d11551d115b1d115d1d115f1d11611d11651d116d1d11631d116b1d11671d11691d116f1d11711d11731d117d1d11751d11771d11791d117b1d117f1d11811d11871d11831d11851d11891d118b1d118d1d118f1d11931d11911d11951d11971d11991d119b1d119d1d11a11d119f1d11a31d11a51d11a71d11a91d11ab1d11ad1d11")\ + X( 3 , 0, 0xA3, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011d11071d11111d110f1d11151d11171d11031d110b1d110d1d11191d11051d11091d111b1d11131d11211d111f1d111d1d11251d11291d11271d112b1d11311d112f1d112d1d11351d11371d11331d11391d113b1d113f1d113d1d11411d11451d11471d11491d114f1d11511d114b1d114d1d11531d11571d11591d11551d115b1d115d1d115f1d11611d11651d116d1d11631d116b1d11671d11691d116f1d11711d11731d117d1d11751d11771d11791d117b1d117f1d11811d11871d11831d11851d11891d118b1d118d1d118f1d11931d11911d11951d11971d11991d119b1d119d1d11a11d119f1d11a31d11a51d11a71d11a91d11ab1d11ad1d11")\ X(4 , 0, 0xA4, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038120638121038120e38121438121638120238120a38120c38121838120438120838121a38121238122038121e38121c38122238122438122838122638122a38123038122e38122c38123438123638123238123838123a38123e38123c38124038124238124438124638124838124e38125038124a38124c38125238125638125838125438125a38125c38125e38126038126438126c38126238126a38126638126838126e38127038127238127c38127438127638127838127a38127e38128038128638128238128438128838128a38128c38128e38129238129038129438129638129838129a38129c3812a038129e3812a23812a43812a63812a83812aa3812ac3812")\ - X( 5 , 0, 0xA5, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138120738121138120f38121538121738120338120b38120d38121938120538120938121b38121338122138121f38121d38122338152538122938122738122b38123138122f38122d38123538123738123338123938123b38123f38123d38124138124338124538124738124938124f38125138124b38124d38125338125738125938125538125b38125d38125f38126138126538126d38126338126b38126738126938126f38127138127338127d38127538127738127938127b38127f38128138128738128338128538128938128b38128d38128f38129338129138129538129738129938129b38129d3812a138129f3812a33812a53812a73812a93812ab3812ad3812")\ + X( 5 , 0, 0xA5, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138120738121138120f38121538121738120338120b38120d38121938120538120938121b38121338122138121f38121d38122538122938122738122b38123138122f38122d38123538123738123338123938123b38123f38123d38124138124338124538124738124938124f38125138124b38124d38125338125738125938125538125b38125d38125f38126138126538126d38126338126b38126738126938126f38127138127338127d38127538127738127938127b38127f38128138128738128338128538128938128b38128d38128f38129338129138129538129738129938129b38129d3812a138129f3812a33812a53812a73812a93812ab3812ad3812")\ X(6 , 0, 0xA0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002a10062a10102a100e2a10142a10162a10022a100a2a100c2a10182a10042a10082a101a2a10122a10202a101e2a101c2a10222a10242a10282a10262a102a2a10302a102e2a102c2a10342a10362a10322a10382a103a2a103e2a103c2a10402a10422a10442a10462a10482a104e2a10502a104a2a104c2a10522a10562a10582a10542a105a2a105c2a105e2a10602a10642a106c2a10622a106a2a10662a10682a106e2a10702a10722a107c2a10742a10762a10782a107a2a107e2a10802a10862a10822a10842a10882a108a2a108c2a108e2a10922a10902a10942a10962a10982a109a2a109c2a10a02a109e2a10a22a10a42a10a62a10a82a10aa2a10ac2a10")\ X( 7 , 0, 0xA1, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036100636101036100e36101436101636100236100a36100c36101836100436100836101a36101236102036101e36101c36102236102436102836102636102a36103036102e36102c36103436103636103236103836103a36103e36103c36104036104236104436104636104836104e36105036104a36104c36105236105636105836105436105a36105c36105e36106036106436106c36106236106a36106636106836106e36107036107236107c36107436107636107836107a36107e36108036108636108236108436108836108a36108c36108e36109236109036109436109636109836109a36109c3610a036109e3610a23610a43610a63610a83610aa3610ac3610")\ X(8 , 0, 0x5B, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "015b5b075b5b115b5b0f5b5b155b5b175b5b035b5b0b5b5b0d5b5b195b5b055b5b095b5b1b5b5b135b5b215b5b1f5b5b1d5b5b235b5b255b5b295b5b275b5b2b5b5b315b5b2f5b5b2d5b5b355b5b375b5b335b5b395b5b3b5b5b3f5b5b3d5b5b415b5b435b5b455b5b475b5b4f5b5b515b5b4b5b5b4d5b5b535b5b575b5b595b5b555b5b5b5b5b5d5b5b5f5b5b615b5b655b5b6d5b5b635b5b6b5b5b675b5b695b5b6f5b5b715b5b735b5b7d5b5b755b5b775b5b795b5b7b5b5b7f5b5b815b5b875b5b835b5b855b5b895b5b8b5b5b8d5b5b935b5b975b5b995b5b9b5b5b9d5b5ba15b5b9f5b5ba35b5ba55b5ba75b5ba95b5bab5b5bad5b5b")\ @@ -356,9 +356,9 @@ namespace netxs::input X(20 , 0, 0 , Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0270f2")\ X(22 , 0, 0 , Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "02791c")\ X(24 , 0, 0 , Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "027b1d")\ - X(26 , 0, 0x19, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "22f119")\ - X(28 , 0, 0 , Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "22f215")\ - X(30 , 0, 0 , IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "")\ + X(26 , 0, 0x19, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "22f119231d19")\ + X(28 , 0, 0 , Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "22f215233815")\ + X(30 , 0, 0 , IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "431ddf")\ X(32 , 0, 0x5D, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "015d5d075d5d115d5d0f5d5d155d5d175d5d035d5d0b5d5d0d5d5d195d5d055d5d095d5d1b5d5d135d5d215d5d1f5d5d1d5d5d235d5d255d5d295d5d275d5d2b5d5d315d5d2f5d5d2d5d5d355d5d375d5d335d5d395d5d3b5d5d3f5d5d3d5d5d415d5d435d5d455d5d475d5d4f5d5d515d5d4b5d5d4d5d5d535d5d575d5d595d5d555d5d5b5d5d5d5d5d5f5d5d615d5d655d5d6d5d5d635d5d6b5d5d675d5d695d5d6f5d5d715d5d735d5d7d5d5d755d5d775d5d795d5d7b5d5d7f5d5d815d5d875d5d835d5d855d5d895d5d8b5d5d8d5d5d935d5d975d5d995d5d9b5d5d9d5d5da15d5d9f5d5da35d5da55d5da75d5da95d5dab5d5dad5d5d")\ X(34 , 0, 0x29, Select , "Select" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(36 , 0, 0 , Fn , "Fn" , "" , 0 , 0 , 'u', -1 , -1 , "")\ From 3c596cfdbb9d101d70c6146c22005d04560f4ec4 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Tue, 23 Jun 2026 10:01:48 +0500 Subject: [PATCH 47/71] Fix bug in to_utf_from_code (non UTF-8 output) --- src/netxs/desktopio/utf.hpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/netxs/desktopio/utf.hpp b/src/netxs/desktopio/utf.hpp index a0a9369cba..0bb4b8d44c 100644 --- a/src/netxs/desktopio/utf.hpp +++ b/src/netxs/desktopio/utf.hpp @@ -1413,13 +1413,19 @@ namespace netxs::utf push((char)(0x80 | ((code >> 0x06) & 0x3f))); push((char)(0x80 | ( code & 0x3f))); } - else + else if (code <= 0x1fffff) // Max UTF-8 value for 4 bytes. { push((char)(0xf0 | ((code >> 0x12) & 0x07))); push((char)(0x80 | ((code >> 0x0c) & 0x3f))); push((char)(0x80 | ((code >> 0x06) & 0x3f))); push((char)(0x80 | ( code & 0x3f))); } + else + { + push(utf::replacement[0]); + push(utf::replacement[1]); + push(utf::replacement[2]); + } } void _to_utf(text& utf8, utfx code) { From 6e63b514f84479969162e3a15b8fa04549ea14f7 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Tue, 23 Jun 2026 12:57:55 +0500 Subject: [PATCH 48/71] Fix dead loop when synchronizing empty grapheme cluster list (fake jumbo clusters) --- CMakeSettings.json | 5 +++-- src/netxs/desktopio/canvas.hpp | 5 +++++ src/netxs/desktopio/console.hpp | 5 ++++- src/netxs/desktopio/directvt.hpp | 6 +++++- src/netxs/desktopio/input.hpp | 5 +++-- src/netxs/desktopio/utf.hpp | 10 +++++++++- 6 files changed, 29 insertions(+), 7 deletions(-) diff --git a/CMakeSettings.json b/CMakeSettings.json index adb0d9618d..aee0142540 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -5,7 +5,8 @@ // /bigobj Our event model spawns a large number of objects. By default, an object file can hold up to 65,279 (almost 2^16) addressable sections. This limit applies no matter which target platform is specified. /bigobj increases that address capacity to 4,294,967,296 (2^32). // /utf-8 All literals in our source code are in UTF-8 format. // /Zc:preprocessor Enable a new, modern preprocessor that is fully conformant to C99, C++11, and later standards. - "WIN32_CXX_FLAGS": "/EHsc /bigobj /utf-8 /Zc:preprocessor", + // /constexpr:steps Increase the constexpr evaluation limit. + "WIN32_CXX_FLAGS": "/EHsc /bigobj /utf-8 /Zc:preprocessor /constexpr:steps 10000000", // /MTd Static debug build (don't rely on the shared dlls). // /DDEBUG Define the preprocessor symbol DEBUG. // /Zi Generate complete debugging information (.PDB files) to allow for source-level debugging in Visual Studio. @@ -13,7 +14,7 @@ // /Od Disable all compiler optimizations. // /RTC1 Enable stack frame run-time checking (local variables uninitialized) and detects when smaller variables are assigned larger values and data is lost. // /W4 Set the compiler warning level to 4 (maximum standard level). - "WIN32_CXX_FLAGS_DEBUG": "/MTd /DDEBUG /Zi /Ob0 /Od /RTC1 /W4 /constexpr:steps 10000000", + "WIN32_CXX_FLAGS_DEBUG": "/MTd /DDEBUG /Zi /Ob0 /Od /RTC1 /W4", // /MT Static release build (don't rely on the shared dlls). // /DNDEBUG Define the preprocessor symbol NDEBUG to disable assertions. // /O2 Optimize speed (and code size). diff --git a/src/netxs/desktopio/canvas.hpp b/src/netxs/desktopio/canvas.hpp index aa66e2e6ef..33d31a2362 100644 --- a/src/netxs/desktopio/canvas.hpp +++ b/src/netxs/desktopio/canvas.hpp @@ -1877,6 +1877,10 @@ namespace netxs { return (token & netxs::letoh((ui64)0b1100'0000'0000'0000)) == netxs::letoh((ui64)0b1000'0000'0000'0000); // (bytes[1] & 0b1100'0000) == 0b1000'0000; } + void reset_jumbo_flag() + { + token |= (token & netxs::letoh((ui64)0b1000'0000'0000'0000)) >> 1; // (Do OR 8th with 7th bit: 00.., 01.. or 11.. is allowed, not 10..) Reset jumbo flag to avoid fake jumbo clusters. + } void set_jumbo_flag() { token = (token & netxs::letoh(~(ui64)0b1100'0000'0000'0000)) | netxs::letoh((ui64)0b1000'0000'0000'0000); // bytes[1] = (bytes[1] & ~0b1100'0000) | 0b1000'0000;// First byte in UTF-8 cannot start with 0b10xx'xxxx. @@ -1926,6 +1930,7 @@ namespace netxs token = isrtl; // token = 0; mtx(w, h); std::memcpy(bytes() + 1, utf8.data(), count); + reset_jumbo_flag(); } else { diff --git a/src/netxs/desktopio/console.hpp b/src/netxs/desktopio/console.hpp index 24046d3294..644732cd75 100644 --- a/src/netxs/desktopio/console.hpp +++ b/src/netxs/desktopio/console.hpp @@ -225,7 +225,10 @@ namespace netxs::ui } } } - list.thing.sendby(canal); + if (!list.thing.empty()) // Don't send empty list. + { + list.thing.sendby(canal); + } } void handle(s11n::xs::request_img lock) { diff --git a/src/netxs/desktopio/directvt.hpp b/src/netxs/desktopio/directvt.hpp index 0db1ba36dc..5e2c4be036 100644 --- a/src/netxs/desktopio/directvt.hpp +++ b/src/netxs/desktopio/directvt.hpp @@ -255,6 +255,10 @@ namespace netxs::directvt { return valid; } + auto empty() const + { + return start == block.size(); + } protected: escx block; @@ -264,7 +268,7 @@ namespace netxs::directvt // stream: . template - void fuse(T&& data) { fuse_ext(block, std::forward(data)); } + void fuse(T&& data) { binary::fuse_ext(block, std::forward(data)); } // stream: Replace bytes at specified position. template inline auto& add_at(sz_t at, T&& data) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index a3b09529d0..ba7cf608a9 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -679,8 +679,9 @@ namespace netxs::input { while (codes) { - auto key_hash = utf::to_int_from_hex_str(codes.pop_front(6)) >> 8; - if (m[key_hash]) log("key duplicates"); // It won't compile if collide. + auto hash = codes.pop_front(6); + auto key_hash = utf::to_int_from_hex_str(hash) >> 8; + if (m[key_hash]) log("Key %KeyId% is duplicated (hash=%hash%)", KeyId, hash); // It won't compile if collide. m[key_hash] = (si16)KeyId; } }; diff --git a/src/netxs/desktopio/utf.hpp b/src/netxs/desktopio/utf.hpp index 0bb4b8d44c..f83175355b 100644 --- a/src/netxs/desktopio/utf.hpp +++ b/src/netxs/desktopio/utf.hpp @@ -895,7 +895,15 @@ namespace netxs::utf do { - if (next.is_cmd()) + if (!next.correct) + { + last_cluster = {}; + auto crop = frag{ replacement, next }; + yield(crop); + code.step(); + next = code.take(); + } + else if (next.is_cmd()) { auto custom_cluster_initiator = Clusterize && next.cdpoint == matrix::stx; if (custom_cluster_initiator) From fa899a506f32a398ce7d702283a443fa65ef0a05 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Tue, 23 Jun 2026 13:31:32 +0500 Subject: [PATCH 49/71] Drop binary::stream::empty() --- src/netxs/desktopio/console.hpp | 5 +---- src/netxs/desktopio/directvt.hpp | 4 ---- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/netxs/desktopio/console.hpp b/src/netxs/desktopio/console.hpp index 644732cd75..c0e6fd0301 100644 --- a/src/netxs/desktopio/console.hpp +++ b/src/netxs/desktopio/console.hpp @@ -225,10 +225,7 @@ namespace netxs::ui } } } - if (!list.thing.empty()) // Don't send empty list. - { - list.thing.sendby(canal); - } + list.thing.sendby(canal); } void handle(s11n::xs::request_img lock) { diff --git a/src/netxs/desktopio/directvt.hpp b/src/netxs/desktopio/directvt.hpp index 5e2c4be036..132c3336ad 100644 --- a/src/netxs/desktopio/directvt.hpp +++ b/src/netxs/desktopio/directvt.hpp @@ -255,10 +255,6 @@ namespace netxs::directvt { return valid; } - auto empty() const - { - return start == block.size(); - } protected: escx block; From aad3f22cecce02df9f7df23da5c86c315d88fe24 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Wed, 24 Jun 2026 13:32:04 +0500 Subject: [PATCH 50/71] #943 WIP: Fast detection of function keys --- src/netxs/desktopio/gui.hpp | 18 +- src/netxs/desktopio/input.hpp | 692 ++++++++++++++++----------------- src/netxs/desktopio/system.hpp | 26 +- 3 files changed, 352 insertions(+), 384 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 3d1506cc98..f0c1a0be1d 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3526,7 +3526,7 @@ namespace netxs::gui stream_keybd(gear); gear.payload = input::keybd::type::keypress; } - virtual si32 keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) = 0; + virtual void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) = 0; virtual void keybd_read_vkstat() = 0; virtual void keybd_wipe_vkstat() = 0; virtual bool keybd_read_input() = 0; @@ -4669,9 +4669,8 @@ namespace netxs::gui gear.extflag = extflag; gear.virtcod = virtcod; gear.scancod = scancod; - auto virt_ex = keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); - //log("vk=%% vk_ex=%%", utf::to_hex((byte)virtcod), utf::to_hex((byte)virt_ex)); - auto keycode = input::key::xlat_direct(virt_ex, scancod, extflag, keymod, xlayout, klid_fallback); + keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); + auto keycode = input::key::xlat_direct(virtcod, scancod, extflag, xlayout, klid_fallback); if ((gear.keystat == input::key::released || keycode != gear.keycode) && keystat == input::key::repeated) keystat = input::key::pressed; // LeftMod+RightMod press is treated by the OS as a repeated LeftMod. gear.keystat = keystat; gear.keycode = keycode; @@ -5537,9 +5536,8 @@ namespace netxs::gui auto sc = input::key::map::data(input::key::Space).scan; ::ToUnicodeEx(vk, sc, ks.data(), &uc, 1, 0, 0); } - si32 keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) + void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) { - auto virtcod_ex = virtcod; shifted.clear(); unshift.clear(); auto is_printable = scancod && ((virtcod >= 0x30 && virtcod <= 0x5A) @@ -5568,12 +5566,6 @@ namespace netxs::gui utf::to_utf(buf.data(), rc, shifted); } } - else if (!is_printable && virtcod == vkey::ctrl || virtcod == vkey::alt || virtcod == vkey::shift) - { - if (extflag) scancod |= 0xE000; - virtcod_ex = ::MapVirtualKeyExW(scancod, MAPVK_VSC_TO_VK_EX, hkl); - } - return virtcod_ex; } void layer_present(layer& s) { @@ -6236,7 +6228,7 @@ namespace netxs::gui void keybd_read_vkstat() {} void keybd_send_block(view /*block*/) {} void keybd_sync_layout() {} - si32 keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, bool /*extflag*/, text& /*shifted*/, text& /*unshift*/) {} + void keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, bool /*extflag*/, text& /*shifted*/, text& /*unshift*/) {} void keybd_sync_state(si32 /*virtcod*/) {} void keybd_reset_deadkey() {} bool layer_create(layer& /*s*/, winbase* /*host_ptr*/ = nullptr, twod /*win_coord*/ = {}, twod /*grid_size*/ = {}, dent /*border_dent*/ = {}, twod /*cell_size*/ = {}) { return true; } diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index ba7cf608a9..ddd1419245 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -335,320 +335,321 @@ namespace netxs::input // Notes: // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. + // Shift: We normalize the left and right shifts: right shift = VK_SHIFT+ExtFlag. #define key_list \ - /* ID Input vk Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */\ - X(0 , 1, 0 , undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(1 , 0, 0 , invalid , "invalid" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(2 , 0, 0xA2, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001d11061d11101d110e1d11141d11161d11021d110a1d110c1d11181d11041d11081d111a1d11121d11201d111e1d111c1d11221d11241d11281d11261d112a1d11301d112e1d112c1d11341d11361d11321d11381d113a1d113e1d113c1d11401d11421d11441d11461d11481d114e1d11501d114a1d114c1d11521d11561d11581d11541d115a1d115c1d115e1d11601d11641d116c1d11621d116a1d11661d11681d116e1d11701d11721d117c1d11741d11761d11781d117a1d117e1d11801d11861d11821d11841d11881d118a1d118c1d118e1d11921d11901d11941d11961d11981d119a1d119c1d11a01d119e1d11a21d11a41d11a61d11a81d11aa1d11ac1d11")\ - X( 3 , 0, 0xA3, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011d11071d11111d110f1d11151d11171d11031d110b1d110d1d11191d11051d11091d111b1d11131d11211d111f1d111d1d11251d11291d11271d112b1d11311d112f1d112d1d11351d11371d11331d11391d113b1d113f1d113d1d11411d11451d11471d11491d114f1d11511d114b1d114d1d11531d11571d11591d11551d115b1d115d1d115f1d11611d11651d116d1d11631d116b1d11671d11691d116f1d11711d11731d117d1d11751d11771d11791d117b1d117f1d11811d11871d11831d11851d11891d118b1d118d1d118f1d11931d11911d11951d11971d11991d119b1d119d1d11a11d119f1d11a31d11a51d11a71d11a91d11ab1d11ad1d11")\ - X(4 , 0, 0xA4, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038120638121038120e38121438121638120238120a38120c38121838120438120838121a38121238122038121e38121c38122238122438122838122638122a38123038122e38122c38123438123638123238123838123a38123e38123c38124038124238124438124638124838124e38125038124a38124c38125238125638125838125438125a38125c38125e38126038126438126c38126238126a38126638126838126e38127038127238127c38127438127638127838127a38127e38128038128638128238128438128838128a38128c38128e38129238129038129438129638129838129a38129c3812a038129e3812a23812a43812a63812a83812aa3812ac3812")\ - X( 5 , 0, 0xA5, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138120738121138120f38121538121738120338120b38120d38121938120538120938121b38121338122138121f38121d38122538122938122738122b38123138122f38122d38123538123738123338123938123b38123f38123d38124138124338124538124738124938124f38125138124b38124d38125338125738125938125538125b38125d38125f38126138126538126d38126338126b38126738126938126f38127138127338127d38127538127738127938127b38127f38128138128738128338128538128938128b38128d38128f38129338129138129538129738129938129b38129d3812a138129f3812a33812a53812a73812a93812ab3812ad3812")\ - X(6 , 0, 0xA0, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002a10062a10102a100e2a10142a10162a10022a100a2a100c2a10182a10042a10082a101a2a10122a10202a101e2a101c2a10222a10242a10282a10262a102a2a10302a102e2a102c2a10342a10362a10322a10382a103a2a103e2a103c2a10402a10422a10442a10462a10482a104e2a10502a104a2a104c2a10522a10562a10582a10542a105a2a105c2a105e2a10602a10642a106c2a10622a106a2a10662a10682a106e2a10702a10722a107c2a10742a10762a10782a107a2a107e2a10802a10862a10822a10842a10882a108a2a108c2a108e2a10922a10902a10942a10962a10982a109a2a109c2a10a02a109e2a10a22a10a42a10a62a10a82a10aa2a10ac2a10")\ - X( 7 , 0, 0xA1, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036100636101036100e36101436101636100236100a36100c36101836100436100836101a36101236102036101e36101c36102236102436102836102636102a36103036102e36102c36103436103636103236103836103a36103e36103c36104036104236104436104636104836104e36105036104a36104c36105236105636105836105436105a36105c36105e36106036106436106c36106236106a36106636106836106e36107036107236107c36107436107636107836107a36107e36108036108636108236108436108836108a36108c36108e36109236109036109436109636109836109a36109c3610a036109e3610a23610a43610a63610a83610aa3610ac3610")\ - X(8 , 0, 0x5B, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "015b5b075b5b115b5b0f5b5b155b5b175b5b035b5b0b5b5b0d5b5b195b5b055b5b095b5b1b5b5b135b5b215b5b1f5b5b1d5b5b235b5b255b5b295b5b275b5b2b5b5b315b5b2f5b5b2d5b5b355b5b375b5b335b5b395b5b3b5b5b3f5b5b3d5b5b415b5b435b5b455b5b475b5b4f5b5b515b5b4b5b5b4d5b5b535b5b575b5b595b5b555b5b5b5b5b5d5b5b5f5b5b615b5b655b5b6d5b5b635b5b6b5b5b675b5b695b5b6f5b5b715b5b735b5b7d5b5b755b5b775b5b795b5b7b5b5b7f5b5b815b5b875b5b835b5b855b5b895b5b8b5b5b8d5b5b935b5b975b5b995b5b9b5b5b9d5b5ba15b5b9f5b5ba35b5ba55b5ba75b5ba95b5bab5b5bad5b5b")\ - X( 9 , 0, 0x5C, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "015c5c075c5c115c5c0f5c5c155c5c175c5c035c5c0b5c5c0d5c5c195c5c055c5c095c5c1b5c5c135c5c215c5c1f5c5c1d5c5c235c5c255c5c295c5c275c5c2b5c5c315c5c2f5c5c2d5c5c355c5c375c5c335c5c395c5c3b5c5c3f5c5c3d5c5c415c5c435c5c455c5c475c5c495c5c4f5c5c515c5c4b5c5c4d5c5c535c5c575c5c595c5c555c5c5b5c5c5d5c5c5f5c5c615c5c655c5c6d5c5c635c5c6b5c5c675c5c695c5c6f5c5c715c5c735c5c7d5c5c755c5c775c5c795c5c7b5c5c7f5c5c815c5c875c5c835c5c855c5c895c5c8b5c5c8d5c5c8f5c5c935c5c915c5c955c5c975c5c995c5c9b5c5c9d5c5ca15c5c9f5c5ca35c5ca55c5ca75c5ca95c5cab5c5cad5c5c")\ - X(10 , 0, 0 , LeftHyper , "Hyper" , "" , 0 , 57445, 'u', -1 , -1 , "")\ - X( 11 , 0, 0 , RightHyper , "Hyper" , "" , 0 , 57451, 'u', -1 , -1 , "")\ - X(12 , 0, 0 , AltGR , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ - X(14 , 0, 0x90, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0145900745901145900f45901545901745900345900b45900d45901945900545900945901b45901345902145901f45901d45902345902545902945902745902b45903145902f45902d45903545903745903345903945903b45903f45903d45904145904345904545904745904945904f45905145904b45904d45905345905745905945905545905b45905d45905f45906145906545906d45906345906b45906745906945906f45907145907345907d45907545907745907945907b45907f45908145908745908345908545908945908b45908d45908f45909345909145909545909745909945909b45909d4590a145909f4590a34590a54590a74590a94590ab4590ad4590")\ - X(16 , 0, 0x14, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14063a14103a140e3a14143a14163a14023a140a3a140c3a14183a14043a14083a141a3a14123a14203a141e3a141c3a14223a14243a14283a14263a142a3a14303a142e3a142c3a14343a14363a14323a14383a143a3a143e3a143c3a14403a14423a14443a14463a14483a144e3a14503a144a3a144c3a14523a14563a14583a14543a145a3a145c3a145e3a14603a14643a146c3a14623a146a3a14663a14683a146e3a14703a14723a147c3a14743a14763a14783a147a3a147e3a14803a14863a14823a14843a14883a148a3a148c3a148e3a14923a14903a14943a14963a14983a149a3a149c3a14a03a149e3a14a23a14a43a14a63a14a83a14aa3a14ac3a14")\ - X(18 , 0, 0x91, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046910646911046910e46911446911646910246910a46910c46911846910446910846911a46911246912046911e46911c46912246912446912846912646912a46913046912e46912c46913446913646913246913846913a46913e46913c46914046914246914446914646914846914e46915046914a46914c46915246915646915846915446915a46915c46915e46916046916446916c46916246916a46916646916846916e46917046917246917c46917446917646917846917a46917e46918046918646918246918446918846918a46918c46918e46919246919046919446919646919846919a46919c4691a046919e4691a24691a44691a64691a84691aa4691ac4691")\ - X(20 , 0, 0 , Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0270f2")\ - X(22 , 0, 0 , Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "02791c")\ - X(24 , 0, 0 , Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "027b1d")\ - X(26 , 0, 0x19, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "22f119231d19")\ - X(28 , 0, 0 , Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "22f215233815")\ - X(30 , 0, 0 , IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "431ddf")\ - X(32 , 0, 0x5D, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "015d5d075d5d115d5d0f5d5d155d5d175d5d035d5d0b5d5d0d5d5d195d5d055d5d095d5d1b5d5d135d5d215d5d1f5d5d1d5d5d235d5d255d5d295d5d275d5d2b5d5d315d5d2f5d5d2d5d5d355d5d375d5d335d5d395d5d3b5d5d3f5d5d3d5d5d415d5d435d5d455d5d475d5d4f5d5d515d5d4b5d5d4d5d5d535d5d575d5d595d5d555d5d5b5d5d5d5d5d5f5d5d615d5d655d5d6d5d5d635d5d6b5d5d675d5d695d5d6f5d5d715d5d735d5d7d5d5d755d5d775d5d795d5d7b5d5d7f5d5d815d5d875d5d835d5d855d5d895d5d8b5d5d8d5d5d935d5d975d5d995d5d9b5d5d9d5d5da15d5d9f5d5da35d5da55d5da75d5da95d5dab5d5dad5d5d")\ - X(34 , 0, 0x29, Select , "Select" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(36 , 0, 0 , Fn , "Fn" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(38 , 0, 0x70, F1 , "F1" , "" , 0 , 11 , '~', -1 , -1 , "003b70063b70103b700e3b70143b70163b70023b700a3b700c3b70183b70043b70083b701a3b70123b70203b701e3b701c3b70223b70243b70283b70263b702a3b70303b702e3b702c3b70343b70363b70323b70383b703a3b703e3b703c3b70403b70423b70443b70463b70483b704e3b70503b704a3b704c3b70523b70563b70583b70543b705a3b705c3b705e3b70603b70643b706c3b70623b706a3b70663b70683b706e3b70703b70723b707c3b70743b70763b70783b707a3b707e3b70803b70863b70823b70843b70883b708a3b708c3b708e3b70923b70903b70943b70963b70983b709a3b709c3b70a03b709e3b70a23b70a43b70a63b70a83b70aa3b70ac3b70")\ - X(40 , 0, 0x71, F2 , "F2" , "" , 0 , 12 , '~', -1 , -1 , "003c71063c71103c710e3c71143c71163c71023c710a3c710c3c71183c71043c71083c711a3c71123c71203c711e3c711c3c71223c71243c71283c71263c712a3c71303c712e3c712c3c71343c71363c71323c71383c713a3c713e3c713c3c71403c71423c71443c71463c71483c714e3c71503c714a3c714c3c71523c71563c71583c71543c715a3c715c3c715e3c71603c71643c716c3c71623c716a3c71663c71683c716e3c71703c71723c717c3c71743c71763c71783c717a3c717e3c71803c71863c71823c71843c71883c718a3c718c3c718e3c71923c71903c71943c71963c71983c719a3c719c3c71a03c719e3c71a23c71a43c71a63c71a83c71aa3c71ac3c71")\ - X(42 , 0, 0x72, F3 , "F3" , "" , 0 , 13 , '~', -1 , -1 , "003d72063d72103d720e3d72143d72163d72023d720a3d720c3d72183d72043d72083d721a3d72123d72203d721e3d721c3d72223d72243d72283d72263d722a3d72303d722e3d722c3d72343d72363d72323d72383d723a3d723e3d723c3d72403d72423d72443d72463d72483d724e3d72503d724a3d724c3d72523d72563d72583d72543d725a3d725c3d725e3d72603d72643d726c3d72623d726a3d72663d72683d726e3d72703d72723d727c3d72743d72763d72783d727a3d727e3d72803d72863d72823d72843d72883d728a3d728c3d728e3d72923d72903d72943d72963d72983d729a3d729c3d72a03d729e3d72a23d72a43d72a63d72a83d72aa3d72ac3d72")\ - X(44 , 0, 0x73, F4 , "F4" , "" , 0 , 14 , '~', -1 , -1 , "003e73063e73103e730e3e73143e73163e73023e730a3e730c3e73183e73043e73083e731a3e73123e73203e731e3e731c3e73223e73243e73283e73263e732a3e73303e732e3e732c3e73343e73363e73323e73383e733a3e733e3e733c3e73403e73423e73443e73463e73483e734e3e73503e734a3e734c3e73523e73563e73583e73543e735a3e735c3e735e3e73603e73643e736c3e73623e736a3e73663e73683e736e3e73703e73723e737c3e73743e73763e73783e737a3e737e3e73803e73863e73823e73843e73883e738a3e738c3e738e3e73923e73903e73943e73963e73983e739a3e739c3e73a03e739e3e73a23e73a43e73a63e73a83e73aa3e73ac3e73")\ - X(46 , 0, 0x74, F5 , "F5" , "" , 0 , 15 , '~', -1 , -1 , "003f74063f74103f740e3f74143f74163f74023f740a3f740c3f74183f74043f74083f741a3f74123f74203f741e3f741c3f74223f74243f74283f74263f742a3f74303f742e3f742c3f74343f74363f74323f74383f743a3f743e3f743c3f74403f74423f74443f74463f74483f744e3f74503f744a3f744c3f74523f74563f74583f74543f745a3f745c3f745e3f74603f74643f746c3f74623f746a3f74663f74683f746e3f74703f74723f747c3f74743f74763f74783f747a3f747e3f74803f74863f74823f74843f74883f748a3f748c3f748e3f74923f74903f74943f74963f74983f749a3f749c3f74a03f749e3f74a23f74a43f74a63f74a83f74aa3f74ac3f74")\ - X(48 , 0, 0x75, F6 , "F6" , "" , 0 , 17 , '~', -1 , -1 , "0040750640751040750e40751440751640750240750a40750c40751840750440750840751a40751240752040751e40751c40752240752440752840752640752a40753040752e40752c40753440753640753240753840753a40753e40753c40754040754240754440754640754840754e40755040754a40754c40755240755640755840755440755a40755c40755e40756040756440756c40756240756a40756640756840756e40757040757240757c40757440757640757840757a40757e40758040758640758240758440758840758a40758c40758e40759240759040759440759640759840759a40759c4075a040759e4075a24075a44075a64075a84075aa4075ac4075")\ - X(50 , 0, 0x76, F7 , "F7" , "" , 0 , 18 , '~', -1 , -1 , "0041760641761041760e41761441761641760241760a41760c41761841760441760841761a41761241762041761e41761c41762241762441762841762641762a41763041762e41762c41763441763641763241763841763a41763e41763c41764041764241764441764641764841764e41765041764a41764c41765241765641765841765441765a41765c41765e41766041766441766c41766241766a41766641766841766e41767041767241767c41767441767641767841767a41767e41768041768641768241768441768841768a41768c41768e41769241769041769441769641769841769a41769c4176a041769e4176a24176a44176a64176a84176aa4176ac4176")\ - X(52 , 0, 0x77, F8 , "F8" , "" , 0 , 19 , '~', -1 , -1 , "0042770642771042770e42771442771642770242770a42770c42771842770442770842771a42771242772042771e42771c42772242772442772842772642772a42773042772e42772c42773442773642773242773842773a42773e42773c42774042774242774442774642774842774e42775042774a42774c42775242775642775842775442775a42775c42775e42776042776442776c42776242776a42776642776842776e42777042777242777c42777442777642777842777a42777e42778042778642778242778442778842778a42778c42778e42779242779042779442779642779842779a42779c4277a042779e4277a24277a44277a64277a84277aa4277ac4277")\ - X(54 , 0, 0x78, F9 , "F9" , "" , 0 , 20 , '~', -1 , -1 , "0043780643781043780e43781443781643780243780a43780c43781843780443780843781a43781243782043781e43781c43782243782443782843782643782a43783043782e43782c43783443783643783243783843783a43783e43783c43784043784243784443784643784843784e43785043784a43784c43785243785643785843785443785a43785c43785e43786043786443786c43786243786a43786643786843786e43787043787243787c43787443787643787843787a43787e43788043788643788243788443788843788a43788c43788e43789243789043789443789643789843789a43789c4378a043789e4378a24378a44378a64378a84378aa4378ac4378")\ - X(56 , 0, 0x79, F10 , "F10" , "" , 0 , 21 , '~', -1 , -1 , "0044790644791044790e44791444791644790244790a44790c44791844790444790844791a44791244792044791e44791c44792244792444792844792644792a44793044792e44792c44793444793644793244793844793a44793e44793c44794044794244794444794644794844794e44795044794a44794c44795244795644795844795444795a44795c44795e44796044796444796c44796244796a44796644796844796e44797044797244797c44797444797644797844797a44797e44798044798644798244798444798844798a44798c44798e44799244799044799444799644799844799a44799c4479a044799e4479a24479a44479a64479a84479aa4479ac4479")\ - X(58 , 0, 0x7A, F11 , "F11" , "" , 0 , 23 , '~', -1 , -1 , "00577a06577a10577a0e577a14577a16577a02577a0a577a0c577a18577a04577a08577a1a577a12577a20577a1e577a1c577a22577a24577a28577a26577a2a577a30577a2e577a2c577a34577a36577a32577a38577a3a577a3e577a3c577a40577a42577a44577a46577a48577a4e577a50577a4a577a4c577a52577a56577a58577a54577a5a577a5c577a5e577a60577a64577a6c577a62577a6a577a66577a68577a6e577a70577a72577a7c577a74577a76577a78577a7a577a7e577a80577a86577a82577a84577a88577a8a577a8c577a8e577a92577a90577a94577a96577a98577a9a577a9c577aa0577a9e577aa2577aa4577aa6577aa8577aaa577aac577a")\ - X(60 , 0, 0x7B, F12 , "F12" , "" , 0 , 24 , '~', -1 , -1 , "00587b06587b10587b0e587b14587b16587b02587b0a587b0c587b18587b04587b08587b1a587b12587b20587b1e587b1c587b22587b24587b28587b26587b2a587b30587b2e587b2c587b34587b36587b32587b38587b3a587b3e587b3c587b40587b42587b44587b46587b48587b4e587b50587b4a587b4c587b52587b56587b58587b54587b5a587b5c587b5e587b60587b64587b6c587b62587b6a587b66587b68587b6e587b70587b72587b7c587b74587b76587b78587b7a587b7e587b80587b86587b82587b84587b88587b8a587b8c587b8e587b92587b90587b94587b96587b98587b9a587b9c587ba0587b9e587ba2587ba4587ba6587ba8587baa587bac587b")\ - X(62 , 0, 0x7C, F13 , "F13" , "" , 0 , 57376, 'u', -1 , -1 , "00647c06647c10647c0e647c14647c16647c02647c0a647c0c647c18647c04647c08647c1a647c12647c20647c1e647c1c647c22647c24647c28647c26647c2a647c30647c2e647c2c647c34647c36647c32647c38647c3a647c3e647c3c647c40647c42647c44647c46647c48647c4e647c50647c4a647c4c647c52647c56647c58647c54647c5a647c5c647c5e647c60647c64647c6c647c62647c6a647c66647c68647c6e647c70647c72647c7c647c74647c76647c78647c7a647c7e647c80647c86647c82647c84647c88647c8a647c8c647c8e647c92647c90647c94647c96647c98647c9a647c9c647ca0647c9e647ca2647ca4647ca6647ca8647caa647cac647c")\ - X(64 , 0, 0x7D, F14 , "F14" , "" , 0 , 57377, 'u', -1 , -1 , "00657d06657d10657d0e657d14657d16657d02657d0a657d0c657d18657d04657d08657d1a657d12657d20657d1e657d1c657d22657d24657d28657d26657d2a657d30657d2e657d2c657d34657d36657d32657d38657d3a657d3e657d3c657d40657d42657d44657d46657d48657d4e657d50657d4a657d4c657d52657d56657d58657d54657d5a657d5c657d5e657d60657d64657d6c657d62657d6a657d66657d68657d6e657d70657d72657d7c657d74657d76657d78657d7a657d7e657d80657d86657d82657d84657d88657d8a657d8c657d8e657d92657d90657d94657d96657d98657d9a657d9c657da0657d9e657da2657da4657da6657da8657daa657dac657d")\ - X(66 , 0, 0x7E, F15 , "F15" , "" , 0 , 57378, 'u', -1 , -1 , "00667e06667e10667e0e667e14667e16667e02667e0a667e0c667e18667e04667e08667e1a667e12667e20667e1e667e1c667e22667e24667e28667e26667e2a667e30667e2e667e2c667e34667e36667e32667e38667e3a667e3e667e3c667e40667e42667e44667e46667e48667e4e667e50667e4a667e4c667e52667e56667e58667e54667e5a667e5c667e5e667e60667e64667e6c667e62667e6a667e66667e68667e6e667e70667e72667e7c667e74667e76667e78667e7a667e7e667e80667e86667e82667e84667e88667e8a667e8c667e8e667e92667e90667e94667e96667e98667e9a667e9c667ea0667e9e667ea2667ea4667ea6667ea8667eaa667eac667e")\ - X(68 , 0, 0x7F, F16 , "F16" , "" , 0 , 57379, 'u', -1 , -1 , "00677f06677f10677f0e677f14677f16677f02677f0a677f0c677f18677f04677f08677f1a677f12677f20677f1e677f1c677f22677f24677f28677f26677f2a677f30677f2e677f2c677f34677f36677f32677f38677f3a677f3e677f3c677f40677f42677f44677f46677f48677f4e677f50677f4a677f4c677f52677f56677f58677f54677f5a677f5c677f5e677f60677f64677f6c677f62677f6a677f66677f68677f6e677f70677f72677f7c677f74677f76677f78677f7a677f7e677f80677f86677f82677f84677f88677f8a677f8c677f8e677f92677f90677f94677f96677f98677f9a677f9c677fa0677f9e677fa2677fa4677fa6677fa8677faa677fac677f")\ - X(70 , 0, 0x80, F17 , "F17" , "" , 0 , 57380, 'u', -1 , -1 , "0068800668801068800e68801468801668800268800a68800c68801868800468800868801a68801268802068801e68801c68802268802468802868802668802a68803068802e68802c68803468803668803268803868803a68803e68803c68804068804268804468804668804868804e68805068804a68804c68805268805668805868805468805a68805c68805e68806068806468806c68806268806a68806668806868806e68807068807268807c68807468807668807868807a68807e68808068808668808268808468808868808a68808c68808e68809268809068809468809668809868809a68809c6880a068809e6880a26880a46880a66880a86880aa6880ac6880")\ - X(72 , 0, 0x81, F18 , "F18" , "" , 0 , 57381, 'u', -1 , -1 , "0069810669811069810e69811469811669810269810a69810c69811869810469810869811a69811269812069811e69811c69812269812469812869812669812a69813069812e69812c69813469813669813269813869813a69813e69813c69814069814269814469814669814869814e69815069814a69814c69815269815669815869815469815a69815c69815e69816069816469816c69816269816a69816669816869816e69817069817269817c69817469817669817869817a69817e69818069818669818269818469818869818a69818c69818e69819269819069819469819669819869819a69819c6981a069819e6981a26981a46981a66981a86981aa6981ac6981")\ - X(74 , 0, 0x82, F19 , "F19" , "" , 0 , 57382, 'u', -1 , -1 , "006a82066a82106a820e6a82146a82166a82026a820a6a820c6a82186a82046a82086a821a6a82126a82206a821e6a821c6a82226a82246a82286a82266a822a6a82306a822e6a822c6a82346a82366a82326a82386a823a6a823e6a823c6a82406a82426a82446a82466a82486a824e6a82506a824a6a824c6a82526a82566a82586a82546a825a6a825c6a825e6a82606a82646a826c6a82626a826a6a82666a82686a826e6a82706a82726a827c6a82746a82766a82786a827a6a827e6a82806a82866a82826a82846a82886a828a6a828c6a828e6a82926a82906a82946a82966a82986a829a6a829c6a82a06a829e6a82a26a82a46a82a66a82a86a82aa6a82ac6a82")\ - X(76 , 0, 0x83, F20 , "F20" , "" , 0 , 57383, 'u', -1 , -1 , "006b83066b83106b830e6b83146b83166b83026b830a6b830c6b83186b83046b83086b831a6b83126b83206b831e6b831c6b83226b83246b83286b83266b832a6b83306b832e6b832c6b83346b83366b83326b83386b833a6b833e6b833c6b83406b83426b83446b83466b83486b834e6b83506b834a6b834c6b83526b83566b83586b83546b835a6b835c6b835e6b83606b83646b836c6b83626b836a6b83666b83686b836e6b83706b83726b837c6b83746b83766b83786b837a6b837e6b83806b83866b83826b83846b83886b838a6b838c6b838e6b83926b83906b83946b83966b83986b839a6b839c6b83a06b839e6b83a26b83a46b83a66b83a86b83aa6b83ac6b83")\ - X(78 , 0, 0x84, F21 , "F21" , "" , 0 , 57384, 'u', -1 , -1 , "006c84066c84106c840e6c84146c84166c84026c840a6c840c6c84186c84046c84086c841a6c84126c84206c841e6c841c6c84226c84246c84286c84266c842a6c84306c842e6c842c6c84346c84366c84326c84386c843a6c843e6c843c6c84406c84426c84446c84466c84486c844e6c84506c844a6c844c6c84526c84566c84586c84546c845a6c845c6c845e6c84606c84646c846c6c84626c846a6c84666c84686c846e6c84706c84726c847c6c84746c84766c84786c847a6c847e6c84806c84866c84826c84846c84886c848a6c848c6c848e6c84926c84906c84946c84966c84986c849a6c849c6c84a06c849e6c84a26c84a46c84a66c84a86c84aa6c84ac6c84")\ - X(80 , 0, 0x85, F22 , "F22" , "" , 0 , 57385, 'u', -1 , -1 , "006d85066d85106d850e6d85146d85166d85026d850a6d850c6d85186d85046d85086d851a6d85126d85206d851e6d851c6d85226d85246d85286d85266d852a6d85306d852e6d852c6d85346d85366d85326d85386d853a6d853e6d853c6d85406d85426d85446d85466d85486d854e6d85506d854a6d854c6d85526d85566d85586d85546d855a6d855c6d855e6d85606d85646d856c6d85626d856a6d85666d85686d856e6d85706d85726d857c6d85746d85766d85786d857a6d857e6d85806d85866d85826d85846d85886d858a6d858c6d858e6d85926d85906d85946d85966d85986d859a6d859c6d85a06d859e6d85a26d85a46d85a66d85a86d85aa6d85ac6d85")\ - X(82 , 0, 0x86, F23 , "F23" , "" , 0 , 57386, 'u', -1 , -1 , "006e86066e86106e860e6e86146e86166e86026e860a6e860c6e86186e86046e86086e861a6e86126e86206e861e6e861c6e86226e86246e86286e86266e862a6e86306e862e6e862c6e86346e86366e86326e86386e863a6e863e6e863c6e86406e86426e86446e86466e86486e864e6e86506e864a6e864c6e86526e86566e86586e86546e865a6e865c6e865e6e86606e86646e866c6e86626e866a6e86666e86686e866e6e86706e86726e867c6e86746e86766e86786e867a6e867e6e86806e86866e86826e86846e86886e868a6e868c6e868e6e86926e86906e86946e86966e86986e869a6e869c6e86a06e869e6e86a26e86a46e86a66e86a86e86aa6e86ac6e86")\ - X(84 , 0, 0x87, F24 , "F24" , "" , 0 , 57387, 'u', -1 , -1 , "006f87066f87106f870e6f87146f87166f87026f870a6f870c6f87186f87046f87086f871a6f87126f87206f871e6f871c6f87226f87246f87286f87266f872a6f87306f872e6f872c6f87346f87366f87326f87386f873a6f873e6f873c6f87406f87426f87446f87466f87486f874e6f87506f874a6f874c6f87526f87566f87586f87546f875a6f875c6f875e6f87606f87646f876c6f87626f876a6f87666f87686f876e6f87706f87726f877c6f87746f87766f87786f877a6f877e6f87806f87866f87826f87846f87886f878a6f878c6f878e6f87926f87906f87946f87966f87986f879a6f879c6f87a06f879e6f87a26f87a46f87a66f87a86f87aa6f87ac6f87")\ - X(86 , 0, 0 , F25 , "F25" , "" , 0 , 57388, 'u', -1 , -1 , "")\ - X(88 , 0, 0 , F26 , "F26" , "" , 0 , 57389, 'u', -1 , -1 , "")\ - X(90 , 0, 0 , F27 , "F27" , "" , 0 , 57390, 'u', -1 , -1 , "")\ - X(92 , 0, 0 , F28 , "F28" , "" , 0 , 57391, 'u', -1 , -1 , "")\ - X(94 , 0, 0 , F29 , "F29" , "" , 0 , 57392, 'u', -1 , -1 , "")\ - X(96 , 0, 0 , F30 , "F30" , "" , 0 , 57393, 'u', -1 , -1 , "")\ - X(98 , 0, 0 , F31 , "F31" , "" , 0 , 57394, 'u', -1 , -1 , "")\ - X(100 , 0, 0 , F32 , "F32" , "" , 0 , 57395, 'u', -1 , -1 , "")\ - X(102 , 0, 0 , F33 , "F33" , "" , 0 , 57396, 'u', -1 , -1 , "")\ - X(104 , 0, 0 , F34 , "F34" , "" , 0 , 57397, 'u', -1 , -1 , "")\ - X(106 , 0, 0 , F35 , "F35" , "" , 0 , 57398, 'u', -1 , -1 , "")\ - X(108 , 0, 0 , PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "01372c07372c11372c0f372c15372c17372c03372c0b372c0d372c19372c05372c09372c1b372c13372c21372c1f372c1d372c23372c25372c29372c27372c2b372c31372c2f372c2d372c35372c37372c33372c39372c3b372c3f372c3d372c41372c43372c45372c47372c49372c4f372c51372c4b372c4d372c53372c57372c59372c55372c5b372c5d372c5f372c61372c65372c6d372c63372c6b372c67372c69372c6f372c71372c73372c7d372c75372c77372c79372c7b372c7f372c81372c87372c83372c85372c89372c8b372c8d372c8f372c93372c91372c95372c97372c99372c9b372c9d372ca1372c9f372ca3372ca5372ca7372ca9372cab372cad372c")\ - X(110 , 0, 0x13, Pause , "Pause" , "" , 0 , 57362, 'u', '\x1a', '\x03', "0045900645901045900e45901445901645900245900a45900c45901845900445900845901a45901245902045901e45901c45902245902445902845902645902a45903045902e45902c45903445903645903245903845903a45903e45903c45904045904245904445904645904845904e45905045904a45904c45905245905645905845905445905a45905c45905e45906045906445906c45906245906a45906645906845906e45907045907245907c45907445907645907845907a45907e45908045908645908245908445908845908a45908c45908e45909245909045909445909645909845909a45909c4590a045909e4590a24590a44590a64590a84590aa4590ac4590")\ - X(112 , 1, 0 , Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0146030746031146030f46031546031746030346030b46030d46031946030546030946031b46031346032146031f46031d46032346032546032946032746032b46033146032f46032d46033546033746033346033946033b46033f46033d46034146034346034546034746034946034f46035146034b46034d46035346035746035946035546035b46035d46035f46036146036546036d46036346036b46036746036946036f46037146037346037d46037546037746037946037b46037f46038146038746038346038546038946038b46038d46038f46039346039146039546039746039946039b46039d4603a146039f4603a34603a54603a74603a94603ab4603ad4603")\ - X(114 , 1, 0 , SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c06542c10542c0e542c14542c16542c02542c0a542c0c542c18542c04542c08542c1a542c12542c20542c1e542c22542c24542c28542c26542c2a542c34542c36542c38542c3c542c40542c44542c46542c48542c4e542c50542c4a542c4c542c52542c56542c58542c6e542c72542c7c542c74542c76542c78542c7a542c7e542c8c542c8e542c92542c90542c94542c96542c98542ca2542ca6542ca8542caa542c")\ - X(116 , 1, 0x1B, Esc , "Esc" , "\x1B", 0x1b , 27 , 'u', '\x1b', '\x1b', "00011b06011b10011b0e011b14011b16011b02011b0a011b0c011b18011b04011b08011b1a011b12011b20011b1e011b1c011b22011b24011b28011b26011b2a011b30011b2e011b2c011b34011b36011b32011b38011b3a011b3e011b3c011b40011b42011b44011b46011b48011b4e011b50011b4a011b4c011b52011b56011b58011b54011b5a011b5c011b5e011b60011b64011b6c011b62011b6a011b66011b68011b6e011b70011b72011b7c011b74011b76011b78011b7a011b7e011b80011b86011b82011b84011b88011b8a011b8c011b8e011b92011b90011b94011b96011b98011b9a011b9c011ba0011b9e011ba2011ba4011ba6011ba8011baa011bac011b")\ - X(118 , 1, 0x09, Tab , "Tab" , "\x09", 0x09 , 9 , 'u', '\x09', '\x09', "000f09060f09100f090e0f09140f09160f09020f090a0f090c0f09180f09040f09080f091a0f09120f09200f091e0f091c0f09220f09240f09280f09260f092a0f09300f092e0f092c0f09340f09360f09320f09380f093a0f093e0f093c0f09400f09420f09440f09460f09480f094e0f09500f094a0f094c0f09520f09560f09580f09540f095a0f095c0f095e0f09600f09640f096c0f09620f096a0f09660f09680f096e0f09700f09720f097c0f09740f09760f09780f097a0f097e0f09800f09860f09820f09840f09880f098a0f098c0f098e0f09920f09900f09940f09960f09980f099a0f099c0f09a00f099e0f09a20f09a40f09a60f09a80f09aa0f09ac0f09")\ - X(120 , 1, 0x08, Backspace , "Backspace" , "\x08", 0x08 , 127 , 'u', '\x7f', '\x08', "000e08060e08100e080e0e08140e08160e08020e080a0e080c0e08180e08040e08080e081a0e08120e08200e081e0e081c0e08220e08240e08280e08260e082a0e08300e082e0e082c0e08340e08360e08320e08380e083a0e083e0e083c0e08400e08420e08440e08460e08480e084e0e08500e084a0e084c0e08520e08560e08580e08540e085a0e085c0e085e0e08600e08640e086c0e08620e086a0e08660e08680e086e0e08700e08720e087c0e08740e08760e08780e087a0e087e0e08800e08860e08820e08840e08880e088a0e088c0e088e0e08920e08900e08940e08960e08980e089a0e089c0e08a00e089e0e08a20e08a40e08a60e08a80e08aa0e08ac0e08")\ - X(122 , 1, 0x20, Space , "Space" , "\x20", 0x20 , 32 , 'u', '\x20', '\0' , "0039200639201039200e39201439201639200239200a39200c39201839200439200839201a39201239202039201e39201c39202239202439202839202639202a39203039202e39202c39203439203639203239203839203a39203e39203c39204039204239204439204639204839204e39205039204a39204c39205239205639205839205439205a39205c39205e39206039206439206c39206239206a39206639206839206e39207039207239207c39207439207639207839207a39207e39208039208639208239208439208839208a39208c39208e39209239209039209439209639209839209a39209c3920a039209e3920a23920a43920a63920a83920aa3920ac3920")\ - X(124 , 1, 0 , KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d061c0d101c0d0e1c0d141c0d161c0d021c0d0a1c0d0c1c0d181c0d041c0d081c0d1a1c0d121c0d201c0d1e1c0d1c1c0d221c0d241c0d281c0d261c0d2a1c0d301c0d2e1c0d2c1c0d341c0d361c0d321c0d381c0d3a1c0d3e1c0d3c1c0d401c0d421c0d441c0d461c0d481c0d4e1c0d501c0d4a1c0d4c1c0d521c0d561c0d581c0d541c0d5a1c0d5c1c0d5e1c0d601c0d641c0d6c1c0d621c0d6a1c0d661c0d681c0d6e1c0d701c0d721c0d7c1c0d741c0d761c0d781c0d7a1c0d7e1c0d801c0d861c0d821c0d841c0d881c0d8a1c0d8c1c0d8e1c0d921c0d901c0d941c0d961c0d981c0d9a1c0d9c1c0da01c0d9e1c0da21c0da41c0da61c0da81c0daa1c0dac1c0d")\ - X( 125, 1, 0 , NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "011c0d071c0d111c0d0f1c0d151c0d171c0d031c0d0b1c0d0d1c0d191c0d051c0d091c0d1b1c0d131c0d211c0d1f1c0d1d1c0d231c0d251c0d291c0d271c0d2b1c0d311c0d2f1c0d2d1c0d351c0d371c0d331c0d391c0d3b1c0d3f1c0d3d1c0d411c0d431c0d451c0d471c0d491c0d4f1c0d511c0d4b1c0d4d1c0d531c0d571c0d591c0d551c0d5b1c0d5d1c0d5f1c0d611c0d651c0d6d1c0d631c0d6b1c0d671c0d691c0d6f1c0d711c0d731c0d7d1c0d751c0d771c0d791c0d7b1c0d7f1c0d811c0d871c0d831c0d851c0d891c0d8b1c0d8d1c0d8f1c0d931c0d911c0d951c0d971c0d991c0d9b1c0d9d1c0da11c0d9f1c0da31c0da51c0da71c0da91c0dab1c0dad1c0d")\ - X(126 , 1, 0 , KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "01522d07522d11522d0f522d15522d17522d03522d0b522d0d522d19522d05522d09522d1b522d13522d21522d1f522d1d522d23522d25522d29522d27522d2b522d31522d2f522d2d522d35522d37522d33522d39522d3b522d3f522d3d522d41522d43522d45522d47522d49522d4f522d51522d4b522d4d522d53522d57522d59522d55522d5b522d5d522d5f522d61522d65522d6d522d63522d6b522d67522d69522d6f522d71522d73522d7d522d75522d77522d79522d7b522d7f522d81522d87522d83522d85522d89522d8b522d8d522d8f522d93522d91522d95522d97522d99522d9b522d9d522da1522d9f522da3522da5522da7522da9522dab522dad522d")\ - X( 127, 1, 0 , NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00822d06822d10822d0e822d14822d16822d02822d0a822d0c822d18822d04822d08822d1a822d12822d20822d1e822d1c822d22822d24822d28822d26822d2a822d30822d2e822d2c822d34822d36822d32822d38822d3a822d3e822d3c822d40822d42822d44822d46822d48822d4e822d50822d4a822d4c822d52822d56822d58822d54822d5a822d5c822d5e822d60822d64822d6c822d62822d6a822d66822d68822d6e822d70822d72822d7c822d74822d76822d78822d7a822d7e822d80822d86822d82822d84822d88822d8a822d8c822d8e822d92822d90822d94822d96822d98822d9a822d9c822da0822d9e822da2822da4822da6822da8822daa822dac822d")\ - X(128 , 1, 0 , KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "01532e07532e11532e0f532e15532e17532e03532e0b532e0d532e19532e05532e09532e1b532e13532e21532e1f532e1d532e23532e25532e29532e27532e2b532e31532e2f532e2d532e35532e37532e33532e39532e3b532e3f532e3d532e41532e43532e45532e47532e49532e4f532e51532e4b532e4d532e53532e57532e59532e55532e5b532e5d532e5f532e61532e65532e6d532e63532e6b532e67532e69532e6f532e71532e73532e7d532e75532e77532e79532e7b532e7f532e81532e87532e83532e85532e89532e8b532e8d532e8f532e93532e91532e95532e97532e99532e9b532e9d532ea1532e9f532ea3532ea5532ea7532ea9532eab532ead532e")\ - X( 129, 1, 0 , NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00832e06832e10832e0e832e14832e16832e02832e0a832e0c832e18832e04832e08832e1a832e12832e20832e1e832e1c832e22832e24832e28832e26832e2a832e30832e2e832e2c832e34832e36832e32832e38832e3a832e3e832e3c832e40832e42832e44832e46832e48832e4e832e50832e4a832e4c832e52832e56832e58832e54832e5a832e5c832e5e832e60832e64832e6c832e62832e6a832e66832e68832e6e832e70832e72832e7c832e74832e76832e78832e7a832e7e832e80832e86832e82832e84832e88832e8a832e8c832e8e832e92832e90832e94832e96832e98832e9a832e9c832ea0832e9e832ea2832ea4832ea6832ea8832eaa832eac832e")\ - X(130 , 1, 0 , KeyClear , "Clear" , "" , 0 , 1 , 'E', -1 , -1 , "")\ - X( 131, 1, 0 , NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "008c0c068c0c108c0c0e8c0c148c0c168c0c028c0c0a8c0c0c8c0c188c0c048c0c088c0c1a8c0c128c0c208c0c1e8c0c1c8c0c228c0c248c0c288c0c268c0c2a8c0c308c0c2e8c0c2c8c0c348c0c368c0c328c0c388c0c3a8c0c3e8c0c3c8c0c408c0c428c0c448c0c468c0c488c0c4e8c0c508c0c4a8c0c4c8c0c528c0c568c0c588c0c548c0c5a8c0c5c8c0c5e8c0c608c0c648c0c6c8c0c628c0c6a8c0c668c0c688c0c6e8c0c708c0c728c0c7c8c0c748c0c768c0c788c0c7a8c0c7e8c0c808c0c868c0c828c0c848c0c888c0c8a8c0c8c8c0c8e8c0c928c0c908c0c948c0c968c0c988c0c9a8c0c9c8c0ca08c0c9e8c0ca28c0ca48c0ca68c0ca88c0caa8c0cac8c0c")\ - X(132 , 1, 0 , KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0149210749211149210f49211549211749210349210b49210d49211949210549210949211b49211349212149211f49211d49212349212549212949212749212b49213149212f49212d49213549213749213349213949213b49213f49213d49214149214349214549214749214949214f49215149214b49214d49215349215749215949215549215b49215d49215f49216149216549216d49216349216b49216749216949216f49217149217349217d49217549217749217949217b49217f49218149218749218349218549218949218b49218d49218f49219349219149219549219749219949219b49219d4921a149219f4921a34921a54921a74921a94921ab4921ad4921")\ - X( 133, 1, 0 , NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0089210689211089210e89211489211689210289210a89210c89211889210489210889211a89211289212089211e89211c89212289212489212889212689212a89213089212e89212c89213489213689213289213889213a89213e89213c89214089214289214489214689214889214e89215089214a89214c89215289215689215889215489215a89215c89215e89216089216489216c89216289216a89216689216889216e89217089217289217c89217489217689217889217a89217e89218089218689218289218489218889218a89218c89218e89219289219089219489219689219889219a89219c8921a089219e8921a28921a48921a68921a88921aa8921ac8921")\ - X(134 , 1, 0 , KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0151220751221151220f51221551221751220351220b51220d51221951220551220951221b51221351222151221f51221d51222351222551222951222751222b51223151222f51222d51223551223751223351223951223b51223f51223d51224151224351224551224751224951224f51225151224b51224d51225351225751225951225551225b51225d51225f51226151226551226d51226351226b51226751226951226f51227151227351227d51227551227751227951227b51227f51228151228751228351228551228951228b51228d51228f51229351229151229551229751229951229b51229d5122a151229f5122a35122a55122a75122a95122ab5122ad5122")\ - X( 135, 1, 0 , NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0081220681221081220e81221481221681220281220a81220c81221881220481220881221a81221281222081221e81221c81222281222481222881222681222a81223081222e81222c81223481223681223281223881223a81223e81223c81224081224281224481224681224881224e81225081224a81224c81225281225681225881225481225a81225c81225e81226081226481226c81226281226a81226681226881226e81227081227281227c81227481227681227881227a81227e81228081228681228281228481228881228a81228c81228e81229281229081229481229681229881229a81229c8122a081229e8122a28122a48122a68122a88122aa8122ac8122")\ - X(136 , 1, 0 , KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0147240747241147240f47241547241747240347240b47240d47241947240547240947241b47241347242147241f47241d47242347242547242947242747242b47243147242f47242d47243547243747243347243947243b47243f47243d47244147244347244547244747244947244f47245147244b47244d47245347245747245947245547245b47245d47245f47246147246547246d47246347246b47246747246947246f47247147247347247d47247547247747247947247b47247f47248147248747248347248547248947248b47248d47248f47249347249147249547249747249947249b47249d4724a147249f4724a34724a54724a74724a94724ab4724ad4724")\ - X( 137, 1, 0 , NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0087240687241087240e87241487241687240287240a87240c87241887240487240887241a87241287242087241e87241c87242287242487242887242687242a87243087242e87242c87243487243687243287243887243a87243e87243c87244087244287244487244687244887244e87245087244a87244c87245287245687245887245487245a87245c87245e87246087246487246c87246287246a87246687246887246e87247087247287247c87247487247687247887247a87247e87248087248687248287248487248887248a87248c87248e87249287249087249487249687249887249a87249c8724a087249e8724a28724a48724a68724a88724aa8724ac8724")\ - X(138 , 1, 0 , KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "014f23074f23114f230f4f23154f23174f23034f230b4f230d4f23194f23054f23094f231b4f23134f23214f231f4f231d4f23234f23254f23294f23274f232b4f23314f232f4f232d4f23354f23374f23334f23394f233b4f233f4f233d4f23414f23434f23454f23474f23494f234f4f23514f234b4f234d4f23534f23574f23594f23554f235b4f235d4f235f4f23614f23654f236d4f23634f236b4f23674f23694f236f4f23714f23734f237d4f23754f23774f23794f237b4f237f4f23814f23874f23834f23854f23894f238b4f238d4f238f4f23934f23914f23954f23974f23994f239b4f239d4f23a14f239f4f23a34f23a54f23a74f23a94f23ab4f23ad4f23")\ - X( 139, 1, 0 , NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "008f23068f23108f230e8f23148f23168f23028f230a8f230c8f23188f23048f23088f231a8f23128f23208f231e8f231c8f23228f23248f23288f23268f232a8f23308f232e8f232c8f23348f23368f23328f23388f233a8f233e8f233c8f23408f23428f23448f23468f23488f234e8f23508f234a8f234c8f23528f23568f23588f23548f235a8f235c8f235e8f23608f23648f236c8f23628f236a8f23668f23688f236e8f23708f23728f237c8f23748f23768f23788f237a8f237e8f23808f23868f23828f23848f23888f238a8f238c8f238e8f23928f23908f23948f23968f23988f239a8f239c8f23a08f239e8f23a28f23a48f23a68f23a88f23aa8f23ac8f23")\ - X(140 , 1, 0 , KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "014b25074b25114b250f4b25154b25174b25034b250b4b250d4b25194b25054b25094b251b4b25134b25214b251f4b251d4b25234b25254b25294b25274b252b4b25314b252f4b252d4b25354b25374b25334b25394b253b4b253f4b253d4b25414b25434b25454b25474b25494b254f4b25514b254b4b254d4b25534b25574b25594b25554b255b4b255d4b255f4b25614b25654b256d4b25634b256b4b25674b25694b256f4b25714b25734b257d4b25754b25774b25794b257b4b257f4b25814b25874b25834b25854b25894b258b4b258d4b258f4b25934b25914b25954b25974b25994b259b4b259d4b25a14b259f4b25a34b25a54b25a74b25a94b25ab4b25ad4b25")\ - X( 141, 1, 0 , NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "008b25068b25108b250e8b25148b25168b25028b250a8b250c8b25188b25048b25088b251a8b25128b25208b251e8b251c8b25228b25248b25288b25268b252a8b25308b252e8b252c8b25348b25368b25328b25388b253a8b253e8b253c8b25408b25428b25448b25468b25488b254e8b25508b254a8b254c8b25528b25568b25588b25548b255a8b255c8b255e8b25608b25648b256c8b25628b256a8b25668b25688b256e8b25708b25728b257c8b25748b25768b25788b257a8b257e8b25808b25868b25828b25848b25888b258a8b258c8b258e8b25928b25908b25948b25968b25988b259a8b259c8b25a08b259e8b25a28b25a48b25a68b25a88b25aa8b25ac8b25")\ - X(142 , 1, 0 , KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "014d27074d27114d270f4d27154d27174d27034d270b4d270d4d27194d27054d27094d271b4d27134d27214d271f4d271d4d27234d27254d27294d27274d272b4d27314d272f4d272d4d27354d27374d27334d27394d273b4d273f4d273d4d27414d27434d27454d27474d27494d274f4d27514d274b4d274d4d27534d27574d27594d27554d275b4d275d4d275f4d27614d27654d276d4d27634d276b4d27674d27694d276f4d27714d27734d277d4d27754d27774d27794d277b4d277f4d27814d27874d27834d27854d27894d278b4d278d4d278f4d27934d27914d27954d27974d27994d279b4d279d4d27a14d279f4d27a34d27a54d27a74d27a94d27ab4d27ad4d27")\ - X( 143, 1, 0 , NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "008d27068d27108d270e8d27148d27168d27028d270a8d270c8d27188d27048d27088d271a8d27128d27208d271e8d271c8d27228d27248d27288d27268d272a8d27308d272e8d272c8d27348d27368d27328d27388d273a8d273e8d273c8d27408d27428d27448d27468d27488d274e8d27508d274a8d274c8d27528d27568d27588d27548d275a8d275c8d275e8d27608d27648d276c8d27628d276a8d27668d27688d276e8d27708d27728d277c8d27748d27768d27788d277a8d277e8d27808d27868d27828d27848d27888d278a8d278c8d278e8d27928d27908d27948d27968d27988d279a8d279c8d27a08d279e8d27a28d27a48d27a68d27a88d27aa8d27ac8d27")\ - X(144 , 1, 0 , KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0148260748261148260f48261548261748260348260b48260d48261948260548260948261b48261348262148261f48261d48262348262548262948262748262b48263148262f48262d48263548263748263348263948263b48263f48263d48264148264348264548264748264948264f48265148264b48264d48265348265748265948265548265b48265d48265f48266148266548266d48266348266b48266748266948266f48267148267348267d48267548267748267948267b48267f48268148268748268348268548268948268b48268d48268f48269348269148269548269748269948269b48269d4826a148269f4826a34826a54826a74826a94826ab4826ad4826")\ - X( 145, 1, 0 , NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0088260688261088260e88261488261688260288260a88260c88261888260488260888261a88261288262088261e88261c88262288262488262888262688262a88263088262e88262c88263488263688263288263888263a88263e88263c88264088264288264488264688264888264e88265088264a88264c88265288265688265888265488265a88265c88265e88266088266488266c88266288266a88266688266888266e88267088267288267c88267488267688267888267a88267e88268088268688268288268488268888268a88268c88268e88269288269088269488269688269888269a88269c8826a088269e8826a28826a48826a68826a88826aa8826ac8826")\ - X(146 , 1, 0 , KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0150280750281150280f50281550281750280350280b50280d50281950280550280950281b50281350282150281f50281d50282350282550282950282750282b50283150282f50282d50283550283750283350283950283b50283f50283d50284150284350284550284750284950284f50285150284b50284d50285350285750285950285550285b50285d50285f50286150286550286d50286350286b50286750286950286f50287150287350287d50287550287750287950287b50287f50288150288750288350288550288950288b50288d50288f50289350289150289550289750289950289b50289d5028a150289f5028a35028a55028a75028a95028ab5028ad5028")\ - X( 147, 1, 0 , NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0080280680281080280e80281480281680280280280a80280c80281880280480280880281a80281280282080281e80281c80282280282480282880282680282a80283080282e80282c80283480283680283280283880283a80283e80283c80284080284280284480284680284880284e80285080284a80284c80285280285680285880285480285a80285c80285e80286080286480286c80286280286a80286680286880286e80287080287280287c80287480287680287880287a80287e80288080288680288280288480288880288a80288c80288e80289280289080289480289680289880289a80289c8028a080289e8028a28028a48028a68028a88028aa8028ac8028")\ - X(148 , 1, 0x30, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30060b30100b300e0b30140b30160b30020b300a0b300c0b30180b30040b30080b301a0b30120b30200b301e0b301c0b30220b30240b30280b30260b302a0b30300b302e0b302c0b30340b30360b30320b30380b303a0b303e0b303c0b30400b30420b30440b30460b30480b304e0b30500b304a0b304c0b30520b30560b30580b30540b305a0b305c0b305e0b30600b30640b306c0b30620b306a0b30660b30680b306e0b30700b30720b307c0b30740b30760b30780b307a0b307e29307e0bc0800b30860b30820b30840b30880b308a0b308c0b308e0bc0920b30900b30940b30960b30980b309a0b309c0b30a00b309e0b30a20b30a40b30a60b30a82d30aa3430ac0b30")\ - X( 149, 1, 0x60, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052600652601052600e52601452601652600252600a52600c52601852600452600852601a52601252602052601e52601c52602252602452602852602652602a52603052602e52602c52603452603652603252603852603a52603e52603c52604052604252604452604652604852604e52605052604a52604c52605252605652605852605452605a52605c52605e52606052606452606c52606252606a52606652606852606e52607052607252607c52607452607652607852607a52607e52608052608652608252608452608852608a52608c52608e52609252609052609452609652609852609a52609c5260a052609e5260a25260a45260a65260a85260aa5260ac5260")\ - X(150 , 1, 0x31, Key1 , "1" , "1" , 0x31 , 49 , 'u', '1' , '1' , "0002310602311002310e02311402311602310202310a02310c02311802310402310802311a02311202312002311e02311c02312202312402312802312602312a02313002312e02312c02313402313602313202313802313a02313e02313c02314002314202314402314602314802314e02315002314a02314c02315202315602315802315402315a02315c02315e02316002316402316c02316202316a02316602316802316e02317002317202317c02317402317602317802317a02317e02318002318602318202318402318802318a02318c02318e02319202319002319402319602319802319a02319c0231a002319e0231a20231a40231a60231a80231aa0d31ac0231")\ - X( 151, 1, 0x61, Numpad1 , "1" , "1" , 0x31 , 57400, 'u', '1' , '1' , "004f61064f61104f610e4f61144f61164f61024f610a4f610c4f61184f61044f61084f611a4f61124f61204f611e4f611c4f61224f61244f61284f61264f612a4f61304f612e4f612c4f61344f61364f61324f61384f613a4f613e4f613c4f61404f61424f61444f61464f61484f614e4f61504f614a4f614c4f61524f61564f61584f61544f615a4f615c4f615e4f61604f61644f616c4f61624f616a4f61664f61684f616e4f61704f61724f617c4f61744f61764f61784f617a4f617e4f61804f61864f61824f61844f61884f618a4f618c4f618e4f61924f61904f61944f61964f61984f619a4f619c4f61a04f619e4f61a24f61a44f61a64f61a84f61aa4f61ac4f61")\ - X(152 , 1, 0x32, Key2 , "2" , "2" , 0x32 , 50 , 'u', '2' , '\0' , "0003320603321003320e03321403321603320203320a03320c03321803320403320803321a03321203322003321e03321c03322203322403322803322603322a03323003322e03322c03323403323603323203323803323a03323e03323c03324003324203324403324603324803324e03325003324a03324c03325203325603325803325403325a03325c03325e03326003326403326c03326203326a03326603326803326e03327003327203327c03327403327603327803327a03327e03328003328603328203328403328803328a03328c03328e03329203329003329403329603329803329a03329c0332a003329e0332a20332a40332a60332a80332aa0c32ac0332")\ - X( 153, 1, 0x62, Numpad2 , "2" , "2" , 0x32 , 57401, 'u', '2' , '\0' , "0050620650621050620e50621450621650620250620a50620c50621850620450620850621a50621250622050621e50621c50622250622450622850622650622a50623050622e50622c50623450623650623250623850623a50623e50623c50624050624250624450624650624850624e50625050624a50624c50625250625650625850625450625a50625c50625e50626050626450626c50626250626a50626650626850626e50627050627250627c50627450627650627850627a50627e50628050628650628250628450628850628a50628c50628e50629250629050629450629650629850629a50629c5062a050629e5062a25062a45062a65062a85062aa5062ac5062")\ - X(154 , 1, 0x33, Key3 , "3" , "3" , 0x33 , 51 , 'u', '3' , '\x1b', "0004330604331004330e04331404331604330204330a04330c04331804330404330804331a04331204332004331e04331c04332204332404332804332604332a04333004332e04332c04333404333604333204333804333a04333e04333c04334004334204334404334604334804334e04335004334a04334c04335204335604335804335404335a04335c04335e04336004336404336c04336204336a04336604336804336e04337004337204337c04337404337604337804337a04337e04338004338604338204338404338804338a04338c04338e04339204339004339404339604339804339a04339c0433a004339e0433a20433a40433a60433a80433aa0b33ac0433")\ - X( 155, 1, 0x63, Numpad3 , "3" , "3" , 0x33 , 57402, 'u', '3' , '\x1b', "0051630651631051630e51631451631651630251630a51630c51631851630451630851631a51631251632051631e51631c51632251632451632851632651632a51633051632e51632c51633451633651633251633851633a51633e51633c51634051634251634451634651634851634e51635051634a51634c51635251635651635851635451635a51635c51635e51636051636451636c51636251636a51636651636851636e51637051637251637c51637451637651637851637a51637e51638051638651638251638451638851638a51638c51638e51639251639051639451639651639851639a51639c5163a051639e5163a25163a45163a65163a85163aa5163ac5163")\ - X(156 , 1, 0x34, Key4 , "4" , "4" , 0x34 , 52 , 'u', '4' , '\x1c', "0005340605341005340e05341405341605340205340a05340c05341805340405340805341a05341205342005341e05341c05342205342405342805342605342a05343005342e05342c05343405343605343205343805343a05343e05343c05344005344205344405344605344805344e05345005344a05344c05345205345605345805345405345a05345c05345e05346005346405346c05346205346a05346605346805346e05347005347205347c05347405347605347805347a05347e05348005348605348205348405348805348a05348c05348e05349205349005349405349605349805349a05349c0534a005349e0534a20534a40534a60534a80534aa0a34ac0534")\ - X( 157, 1, 0x64, Numpad4 , "4" , "4" , 0x34 , 57403, 'u', '4' , '\x1c', "004b64064b64104b640e4b64144b64164b64024b640a4b640c4b64184b64044b64084b641a4b64124b64204b641e4b641c4b64224b64244b64284b64264b642a4b64304b642e4b642c4b64344b64364b64324b64384b643a4b643e4b643c4b64404b64424b64444b64464b64484b644e4b64504b644a4b644c4b64524b64564b64584b64544b645a4b645c4b645e4b64604b64644b646c4b64624b646a4b64664b64684b646e4b64704b64724b647c4b64744b64764b64784b647a4b647e4b64804b64864b64824b64844b64884b648a4b648c4b648e4b64924b64904b64944b64964b64984b649a4b649c4b64a04b649e4b64a24b64a44b64a64b64a84b64aa4b64ac4b64")\ - X(158 , 1, 0x35, Key5 , "5" , "5" , 0x35 , 53 , 'u', '5' , '\x1d', "0006350606351006350e06351406351606350206350a06350c06351806350406350806351a06351206352006351e06351c06352206352406352806352606352a06353006352e06352c06353406353606353206353806353a06353e06353c06354006354206354406354606354806354e06355006354a06354c06355206355606355806355406355a06355c06355e06356006356406356c06356206356a06356606356806356e06357006357206357c06357406357606357806357a06357e06358006358606358206358406358806358a06358c06358e06359206359006359406359606359806359a06359c0635a006359e0635a20635a40635a60635a81035aa1a35ac0635")\ - X( 159, 1, 0x65, Numpad5 , "5" , "5" , 0x35 , 57404, 'u', '5' , '\x1d', "004c65064c65104c650e4c65144c65164c65024c650a4c650c4c65184c65044c65084c651a4c65124c65204c651e4c651c4c65224c65244c65284c65264c652a4c65304c652e4c652c4c65344c65364c65324c65384c653a4c653e4c653c4c65404c65424c65444c65464c65484c654e4c65504c654a4c654c4c65524c65564c65584c65544c655a4c655c4c655e4c65604c65644c656c4c65624c656a4c65664c65684c656e4c65704c65724c657c4c65744c65764c65784c657a4c657e4c65804c65864c65824c65844c65884c658a4c658c4c658e4c65924c65904c65944c65964c65984c659a4c659c4c65a04c659e4c65a24c65a44c65a64c65a84c65aa4c65ac4c65")\ - X(160 , 1, 0x36, Key6 , "6" , "6" , 0x36 , 54 , 'u', '6' , '\x1e', "0007360607361007360e07361407361607360207360a07360c07361807360407360807361a07361207362007361e07361c07362207362407362807362607362a07363007362e07362c07363407363607363207363807363a07363e07363c07364007364207364407364607364807364e07365007364a07364c07365207365607365807365407365a07365c07365e07366007366407366c07366207366a07366607366807366e07367007367207367c07367407367607367807367a07367e07368007368607368207368407368807368a07368c07368e07369207369007369407369607369807369a07369c0736a007369e0736a20736a40736a60736a81136aa1936ac0736")\ - X( 161, 1, 0x66, Numpad6 , "6" , "6" , 0x36 , 57405, 'u', '6' , '\x1e', "004d66064d66104d660e4d66144d66164d66024d660a4d660c4d66184d66044d66084d661a4d66124d66204d661e4d661c4d66224d66244d66284d66264d662a4d66304d662e4d662c4d66344d66364d66324d66384d663a4d663e4d663c4d66404d66424d66444d66464d66484d664e4d66504d664a4d664c4d66524d66564d66584d66544d665a4d665c4d665e4d66604d66644d666c4d66624d666a4d66664d66684d666e4d66704d66724d667c4d66744d66764d66784d667a4d667e4d66804d66864d66824d66844d66884d668a4d668c4d668e4d66924d66904d66944d66964d66984d669a4d669c4d66a04d669e4d66a24d66a44d66a64d66a84d66aa4d66ac4d66")\ - X(162 , 1, 0x37, Key7 , "7" , "7" , 0x37 , 55 , 'u', '7' , '\x1f', "0008370608371008370e08371408371608370208370a08370c08371808370408370808371a08371208372008371e08371c08372208372408372808372608372a08373008372e08372c08373408373608373208373808373a08373e08373c08374008374208374408374608374808374e08375008374a08374c08375208375608375808375408375a08375c08375e08376008376408376c08376208376a08376608376808376e08377008377208377c08377408377608377808377a08377e08378008378608378208378408378808378a08378c08378e08379208379008379408379608379808379a08379c0837a008379e0837a20837a40837a60837a81e37aa2837ac0837")\ - X( 163, 1, 0x67, Numpad7 , "7" , "7" , 0x37 , 57406, 'u', '7' , '\x1f', "0047670647671047670e47671447671647670247670a47670c47671847670447670847671a47671247672047671e47671c47672247672447672847672647672a47673047672e47672c47673447673647673247673847673a47673e47673c47674047674247674447674647674847674e47675047674a47674c47675247675647675847675447675a47675c47675e47676047676447676c47676247676a47676647676847676e47677047677247677c47677447677647677847677a47677e47678047678647678247678447678847678a47678c47678e47679247679047679447679647679847679a47679c4767a047679e4767a24767a44767a64767a84767aa4767ac4767")\ - X(164 , 1, 0x38, Key8 , "8" , "8" , 0x38 , 56 , 'u', '8' , '\x7f', "0009380609381009380e09381409381609380209380a09380c09381809380409380809381a09381209382009381e09381c09382209382409382809382609382a09383009382e09382c09383409383609383209383809383a09383e09383c09384009384209384409384609384809384e09385009384a09384c09385209385609385809385409385a09385c09385e09386009386409386c09386209386a09386609386809386e09387009387209387c09387409387609387809387a09387e09388009388609388209388409388809388a09388c09388e09389209389009389409389609389809389a09389c0938a009389e0938a20938a40938a60938a81f38aa2738ac0938")\ - X( 165, 1, 0x68, Numpad8 , "8" , "8" , 0x38 , 57407, 'u', '8' , '\x7f', "0048680648681048680e48681448681648680248680a48680c48681848680448680848681a48681248682048681e48681c48682248682448682848682648682a48683048682e48682c48683448683648683248683848683a48683e48683c48684048684248684448684648684848684e48685048684a48684c48685248685648685848685448685a48685c48685e48686048686448686c48686248686a48686648686848686e48687048687248687c48687448687648687848687a48687e48688048688648688248688448688848688a48688c48688e48689248689048689448689648689848689a48689c4868a048689e4868a24868a44868a64868a84868aa4868ac4868")\ - X(166 , 1, 0x39, Key9 , "9" , "9" , 0x39 , 57 , 'u', '9' , '9' , "000a39060a39100a390e0a39140a39160a39020a390a0a390c0a39180a39040a39080a391a0a39120a39200a391e0a391c0a39220a39240a39280a39260a392a0a39300a392e0a392c0a39340a39360a39320a39380a393a0a393e0a393c0a39400a39420a39440a39460a39480a394e0a39500a394a0a394c0a39520a39560a39580a39540a395a0a395c0a395e0a39600a39640a396c0a39620a396a0a39660a39680a396e0a39700a39720a397c0a39740a39760a39780a397a0a397e0a39800a39860a39820a39840a39880a398a0a398c0a398e0a39920a39900a39940a39960a39980a399a0a399c0a39a00a399e0a39a20a39a40a39a60a39a82c39aa3539ac0a39")\ - X( 167, 1, 0x69, Numpad9 , "9" , "9" , 0x39 , 57408, 'u', '9' , '9' , "0049690649691049690e49691449691649690249690a49690c49691849690449690849691a49691249692049691e49691c49692249692449692849692649692a49693049692e49692c49693449693649693249693849693a49693e49693c49694049694249694449694649694849694e49695049694a49694c49695249695649695849695449695a49695c49695e49696049696449696c49696249696a49696649696849696e49697049697249697c49697449697649697849697a49697e49698049698649698249698449698849698a49698c49698e49699249699049699449699649699849699a49699c4969a049699e4969a24969a44969a64969a84969aa4969ac4969")\ - X(168 , 1, 0 , KeyMultiply , "*" , "*" , 0x2A , 42 , 'u', '*' , '*' , "641bba8c0cdf962bdc982bdc9a2bdc9c2bdc")\ - X( 169, 1, 0x6A, NumpadMultiply , "*" , "*" , 0x2A , 57411, 'u', '*' , '*' , "00376a06376a10376a0e376a14376a16376a02376a0a376a0c376a18376a04376a08376a1a376a12376a20376a1e376a1c376a22376a24376a28376a26376a2a376a30376a2e376a2c376a34376a36376a32376a38376a3a376a3e376a3c376a40376a42376a44376a46376a48376a4e376a50376a4a376a4c376a52376a56376a58376a54376a5a376a5c376a5e376a60376a64376a6c376a62376a6a376a66376a68376a6e376a70376a72376a7c376a74376a76376a78376a7a376a7e376a80376a86376a82376a84376a88376a8a376a8c376a8e376a92376a90376a94376a96376a98376a9a376a9c376aa0376a9e376aa2376aa4376aa6376aa8376aaa376aac376a")\ - X(170 , 1, 0 , KeySlash , "/" , "/" , 0x2F , 47 , 'u', '/' , '\x1f', "0035bf0635bf1035bf0e35bf1435bf1635bf0235bf0a35bf0c35bf1835bf0435bf0835bf1a35bf1235bf2035bf1e35bf1c35bf2235bf2435bf2835bf2635bf2a35bf3035bf2e35bf2c35bf3435bf3635bf3235bf3835bf3c73c14035bf4229de640cdb9235bf9a28dba41abfa60cbba80bbfaa04bf")\ - X( 171, 1, 0x6F, NumpadDivide , "/" , "/" , 0x2F , 57410, 'u', '/' , '\x1f', "01356f07356f11356f0f356f15356f17356f03356f0b356f0d356f19356f05356f09356f1b356f13356f21356f1f356f1d356f23356f25356f29356f27356f2b356f31356f2f356f2d356f35356f37356f33356f39356f3b356f3f356f3d356f41356f43356f45356f47356f49356f4f356f51356f4b356f4d356f53356f57356f59356f55356f5b356f5d356f5f356f61356f65356f6d356f63356f6b356f67356f69356f6f356f71356f73356f7d356f75356f77356f79356f7b356f7f356f81356f87356f83356f85356f89356f8b356f8d356f8f356f93356f91356f95356f97356f99356f9b356f9d356fa1356f9f356fa3356fa5356fa7356fa9356fab356fad356f")\ - X(172 , 1, 0 , KeyPlus , "Plus" , "+" , 0x2B , 43 , 'u', '+' , '+' , "440cbb461abb480dbb4e0cbb501bbb4a0cbb4c0cbb560cbd5a1bbb5c1bbb5e1abb600cbb6427bb6c0cbb620cbb6a1bbb660cbb681bbb702bbf720cbb7c0dbb761bbb781bbb7a1bbb801bbb861bbb821bbb841bbb900dbb940cbd9a1bbba629c0")\ - X( 173, 1, 0x6B, NumpadPlus , "Plus" , "+" , 0x2B , 57413, 'u', '+' , '+' , "004e6b064e6b104e6b0e4e6b144e6b164e6b024e6b0a4e6b0c4e6b184e6b044e6b084e6b1a4e6b124e6b204e6b1e4e6b1c4e6b224e6b244e6b284e6b264e6b2a4e6b304e6b2e4e6b2c4e6b344e6b364e6b324e6b384e6b3a4e6b3e4e6b3c4e6b404e6b424e6b444e6b464e6b484e6b4e4e6b504e6b4a4e6b4c4e6b524e6b564e6b584e6b544e6b5a4e6b5c4e6b5e4e6b604e6b644e6b6c4e6b624e6b6a4e6b664e6b684e6b6e4e6b704e6b724e6b7c4e6b744e6b764e6b784e6b7a4e6b7e4e6b804e6b864e6b824e6b844e6b884e6b8a4e6b8c4e6b8e4e6b924e6b904e6b944e6b964e6b984e6b9a4e6b9c4e6ba04e6b9e4e6ba24e6ba44e6ba64e6ba84e6baa4e6bac4e6b")\ - X(174 , 1, 0 , KeyMinus , "Minus" , "-" , 0x2D , 45 , 'u', '-' , '-' , "000cbd060cbd100cbd0e0cbd140cbd160cbd020cbd0a0cbd0c0cbd180cbd040cbd080cbd1a0cbd120cbd200cbd1e0cbd1c0cbd220cbd240cbd280cbd260cbd2a0cbd300cbd2e0cbd2c0cbd340cbd360cbd320cbd380cbd3a0cbd3e0cbd3c0cbd400cbd420cbd4435bd4635bd4835bd4e35bd5035bd4a35bd4c35bd5235bf5635dd5835bf540cbd5a35bd5c35bd5e35bd6035bd6435bd6c35bd6235bd6a35bd6635bd6835bd6e35bd700ddb7235bd7c35bd7435bd7635bd7835bd7a35bd7e35bd8035bd8635bd8235bd8435bd8835bd8a35bd8c0dbd8e35bf9256e2920cbd9035bd9435bf9a1abda00dbd9e0dbda428bda60dbda828bdaa1ebd")\ - X( 175, 1, 0x6D, NumpadMinus , "Minus" , "-" , 0x2D , 57412, 'u', '-' , '-' , "004a6d064a6d104a6d0e4a6d144a6d164a6d024a6d0a4a6d0c4a6d184a6d044a6d084a6d1a4a6d124a6d204a6d1e4a6d1c4a6d224a6d244a6d284a6d264a6d2a4a6d304a6d2e4a6d2c4a6d344a6d364a6d324a6d384a6d3a4a6d3e4a6d3c4a6d404a6d424a6d444a6d464a6d484a6d4e4a6d504a6d4a4a6d4c4a6d524a6d564a6d584a6d544a6d5a4a6d5c4a6d5e4a6d604a6d644a6d6c4a6d624a6d6a4a6d664a6d684a6d6e4a6d704a6d724a6d7c4a6d744a6d764a6d784a6d7a4a6d7e4a6d804a6d864a6d824a6d844a6d884a6d8a4a6d8c4a6d8e4a6d924a6d904a6d944a6d964a6d984a6d9a4a6d9c4a6da04a6d9e4a6da24a6da44a6da64a6da84a6daa4a6dac4a6d")\ - X(176 , 1, 0 , KeyEqual , "=" , "=" , 0x3D , 61 , 'u', '=' , '=' , "000dbb060dbb100dbb0e0dbb140dbb160dbb020dbb0a0dbb0c0dbb180dbb040dbb080dbb1a0dbb120dbb200dbb1c0dbb220dbb240dbb280dbb260dbb2a0dbb300dbb2e0dbb2c0dbb340dbb360dbb380dbb3a0dbb3e0dbb3c0dbb400dbb420dbb520cbd580cbd5435df6e0cbb740cbf920dbb960dbb980dbb9c0dbba035bb9e35bba41bbba81bbbaa1bbbac0cbd")\ - X( 177, 1, 0x92, NumpadEqual , "=" , "=" , 0x3D , 57415, 'u', '=' , '=' , "")\ - X(178 , 1, 0 , KeyPeriod , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be0634be1034be0e34be1434be1634be0234be0a34be0c34be1834be0434be0834be1a34be1234be2034be1e34be1c34be2234be2434be2834be2634be2a34be3034be2e34be2c34be3434be3634be3234be3834be3a34be3e34be3c34be4034be4234be4434be4634be4834be4e34be5034be4a34be4c34be5234be5634be5834be5434be5a34be5c34be5e34be6034be6434be6c34be6234be6a34be6634be6834be6e34be7034be7234be7c34be7434be7634be7834be7a34be7e34be8034be8634be8234be8434be8834be8a34be8c35be8e34be9234be9034be9434be9a32bea412bea634bea813beaa18beac2fbe")\ - X( 179, 1, 0x6E, NumpadDecimal , "." , "." , 0x2E , 57409, 'u', '.' , '.' , "00536e06536e10536e0e536e14536e16536e02536e0a536e0c536e18536e04536e08536e1a536e12536e20536e1e536e1c536e22536e24536e28536e26536e2a536e30536e2e536e2c536e34536e36536e32536e38536e3a536e3e536e3c536e40536e42536e44536e46536e48536e4e536e50536e4a536e4c536e52536e56536e58536e54536e5a536e5c536e5e536e60536e64536e6c536e62536e6a536e66536e68536e6e536e70536e72536e7c536e74536e76536e78536e7a536e7e536e80536e86536e82536e84536e88536e8a536e8c536e8e536e92536e90536e94536e96536e98536e9a536e9c536ea0536e9e536ea2536ea4536ea6536ea8536eaa536eac536e")\ - X(180 , 1, 0 , KeyComma , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "0033bc0633bc1033bc0e33bc1433bc1633bc0233bc0a33bc0c33bc1833bc0433bc0833bc1a33bc1233bc2033bc1e33bc1c33bc2233bc2433bc2833bc2633bc2a33bc3033bc2e33bc2c33bc3433bc3633bc3233bc3833bc3a33bc3e33bc3c33bc4033bc4233bc4433bc4633bc4833bc4e33bc5033bc4a33bc4c33bc5233bc5633bc5833bc5433bc5a33bc5c33bc5e33bc6033bc6433bc6c33bc6233bc6a33bc6633bc6833bc6e33bc7033bc7233bc7c33bc7433bc7633bc7833bc7a33bc7e33bc8033bc8633bc8233bc8433bc8833bc8a33bc8c2bbc8e33bc9233bc9033bc9433bc9632bc9832bc9a33bc9c32bca032bc9e32bca411bca635bca82fbcaa33bcac22bc")\ - X( 181, 1, 0 , NumpadPoint , "," , "," , 0x2C , 57416, 'u', ',' , ',' , "007ec2067ec2107ec20e7ec2147ec2167ec2027ec20a7ec20c7ec2187ec2047ec2087ec21a7ec2127ec2207ec21e7ec21c7ec2227ec2247ec2287ec2267ec22a7ec2307ec22e7ec22c7ec2347ec2367ec2327ec2387ec23a7ec23e7ec23c7ec2407ec2427ec2447ec2467ec2487ec24e7ec2507ec24a7ec24c7ec2527ec2567ec2587ec2547ec25a7ec25c7ec25e7ec2607ec2647ec26c7ec2627ec26a7ec2667ec2687ec26e7ec2707ec2727ec27c7ec2747ec2767ec2787ec27a7ec27e7ec2807ec2867ec2827ec2847ec2887ec28a7ec28c7ec28e7ec2927ec2907ec2947ec2967ec2987ec29a7ec29c7ec2a07ec29e7ec2a27ec2a47ec2a67ec2a87ec2aa7ec2ac7ec2")\ - X(182 , 1, 0 , Colon , ":" , ":" , 0x3A , 58 , 'u', ':' , ':' , "9634bf9834bf9a34bf9c34bfa034bf9e34bf")\ - X(184 , 1, 0 , Semicolon , ";" , ";" , 0x3B , 59 , 'u', ';' , ';' , "0027ba0627ba1027ba0e27ba1427ba1627ba0227ba0a27ba0c27ba1827ba0427ba0827ba1a27ba1227ba2027ba1e27ba1c27ba2227ba2427ba2827ba2627ba2a27ba3027ba2e27ba2c27ba3427ba3627ba3227ba3a27ba3e27ba3c35bf4227ba5229c05829c06e29c07429c09219ba9633be9833be9a35ba9c33bea033be9e33bea42cbaa81abaaa10ba")\ - X(186 , 1, 0 , TurnedComma , "ʻ" , "ʻ" , 0x02BB, 699 , 'u', -1 , -1 , "2028de")\ - X(188 , 1, 0 , OpenSquareBracket , "[" , "[" , 0x5B , 91 , 'u', '[' , '\x1b', "001adb061adb101adb0e1adb141adb161adb021adb0a1adb0c1adb181adb041adb081adb1a1adb121adb201adb1e1adb1c1adb221adb241adb281adb261adb2a1adb301adb2e1adb2c1adb3c1bdd4028de481adb921adba40cdba80cdbaa02db")\ - X(190 , 1, 0 , CloseSquareBracket , "]" , "]" , 0x5D , 93 , 'u', ']' , '\x1d', "001bdd061bdd101bdd0e1bdd141bdd161bdd021bdd0a1bdd0c1bdd181bdd041bdd081bdd1a1bdd121bdd201bdd1e1bdd1c1bdd221bdd241bdd281bdd261bdd2a1bdd301bdd2e1bdd2c1bdd3c2bdc402bdc460ddb481bdd6456e2921bdd9429c0a40ddda80dddaa03dd")\ - X(192 , 1, 0 , OpenCurlyBracket , "{" , "{" , 0x7B , 123 , 'u', '{' , 27 , "5028de6a28de")\ - X(194 , 1, 0 , CloseCurlyBracket , "}" , "}" , 0x7D , 125 , 'u', '}' , 29 , "461bdd502bbf6a2bbf")\ - X(196 , 1, 0 , CloseRoundBracket , ")" , ")" , 0x29 , 41 , 'u', ')' , ')' , "521bdd6e1bdd960cdb980cdb9c0cdba00cdb9e0cdb")\ - X(198 , 1, 0 , LessThan , "<" , "<" , 0x3C , 60 , 'u', '<' , '<' , "2429c03a2bdc4056e24456e24656e24856e24e56e25056e24a56e24c56e25656e25456e25a56e25c56e25e56e26056e2642bdc6c56e26256e26a56e26656e26856e27056e27256e27c56e27656e27856e27a56e28056e28656e28256e28856e28a56e28c56e29056e29456e29656e29856e29a56e29c56e2a056e29e56e2a256e2a656e2")\ - X(200 , 1, 0 , BackSlash , "\\" , "\\" , 0x5C , 92 , 'u', '\\' , '\x1c', "002bdc0056e2062bdc0656e2102bdc1056e20e56e20e2bdc1456e2142bdc162bdc1656e2022bdc0256e20a2bdc0a56e20c2bdc0c56e21856e2182bdc042bdc0456e20856e2082bdc1a2bdc1a56e2122bdc1256e2202bdc2056e21e56e21e2bdc1c2bdc1c56e2222bdc2256e22456e2282bde2856dc262bde2656dc2a56dc3056dc2e56dc2c56dc3256e2322bdc3856e23c56e24029c04629c04829c04a0ddb5256e25a29dc5c29dc5e29dc660ddb6e56e2922bdca42bdca456e2a82bdca856e2aa56e2aa2bdc")\ - X(202 , 1, 0 , Underscore , "_" , "_" , 0x5F , 95 , 'u', '_' , '\x1f', "0273e2")\ - X(204 , 1, 0 , VerticalBar , "|" , "|" , 0x7C , 124 , 'u', '|' , 28 , "5029dc4a29dc6a29dc6629dc")\ - X(206 , 1, 0 , DivisionSign , "÷" , "÷" , 0xF7 , 247 , 'u', -1 , -1 , "541add")\ - X(208 , 1, 0 , OneHalf , "½" , "½" , 0xBD , 189 , 'u', -1 , -1 , "4e29dc6029dc6c29dc")\ - X(210 , 1, 0 , SuperscriptTwo , "²" , "²" , 0xB2 , 178 , 'u', -1 , -1 , "9629de9c29dea029de9e29de")\ - X(212 , 1, 0 , DegreeSign , "°" , "°" , 0xB0 , 176 , 'u', -1 , -1 , "3e29de640dbf7029dc")\ - X(214 , 1, 0 , NumeroSign , "º" , "º" , 0xBA , 186 , 'u', -1 , -1 , "5e28de6829dc")\ - X(216 , 1, 0 , Acute , "´" , "´" , 0xB4 , 180 , 'u', -1 , -1 , "3c1adb440ddb4827ba4e0ddb501aba4c0ddb520dbb560dbb580dbb542bbf5e1bba600ddb6428c06c0ddb620ddb6a1aba6828de6e0dbf7028de740ddf760ddd780ddd7a0ddd800ddd860ddd820ddd840ddd")\ - X(218 , 1, 0 , Caron , "ˇ" , "ˇ" , 0x02C7, 780 , 'u', -1 , -1 , "5629de")\ - X(220 , 1, 0 , Cedilla , "¸" , "¸" , 0xB8 , 184 , 'u', -1 , -1 , "3a1bdd9029c0")\ - X(222 , 1, 0 , Circumflex , "^" , "^" , 0x5E , 94 , 'u', '^' , 30 , "3a1adb3e1adb421adb4828de7629dc7829dc7a29dc8029dc8629dc8229dc8429dc880ddd8a0ddd961add981add9a0ddd9c1adda01add9e1addac15db")\ - X(224 , 1, 0 , Ogonek , "˛" , "˛" , 0x02DB, 731 , 'u', -1 , -1 , "7229c0")\ - X(226 , 1, 0 , Cross , "˟" , "˟" , 0x02DF, 735 , 'u', -1 , -1 , "8456e2")\ - X(228 , 1, 0 , Tilde , "~" , "~" , 0x7E , 771 , 'u', '~' , 30 , "3c28de5e2bbf")\ - X(230 , 1, 0 , Tonos , "΄" , "΄" , 0x0384, 900 , 'u', -1 , -1 , "4627ba")\ - X(232 , 1, 0 , Umlaut , "¨" , "¨" , 0xA8 , 168 , 'u', -1 , -1 , "441bba4628de4e1bba4a1bba4c1bba522bdc540ddb601bba641add621bba661bba6e2bdc881bc08a1bc0")\ - X(234 , 1, 0 , BackQuote , "`" , "`" , 0x60 , 96 , 'u', '`' , '`' , "0029c00629c01029c00e29c01429c01629c00229c00a29c00c29c01829c00429c00829c01a29c01229c02029c01e29c01c29c02229c0242bdc2829df2629df2a29df3029df2e29df2c29df3229c03a28c0482bdc541bba681aba9229c0a229dca429c0a829c0aa29c0")\ - X(236 , 1, 0 , SingleQuote , "'" , "'" , 0x27 , 39 , 'u', '\'' , '\'' , "0028de0628de1028de0e28de1428de1628de0228de0a28de0c28de1828de0428de0828de1a28de1228de1e28de1c28de2228de2428de2828c02628c02a28c03028c02e28c02c28c03428de3628de3228de3c29c0442bbf460cbf480cbf4e2bbf500cdb4a2bbf4c2bbf562bdc5429dc5a0cdb5c0cdb5e0cdb602bbf6c2bbf622bbf6a0cdb662bbf680cdb701bba720dbf7c0cbf880cdb8a0cdb9228de900cbf940dbb9a0cdea410dea835deaa2cde")\ - X(238 , 1, 0 , DoubleQuote , "\"" , "\"" , 0x22 , 34 , 'u', '"' , '"' , "8c29c0")\ - X(240 , 1, 0 , SingleRightQuote , "’" , "’" , 0x2019, 8217 , 'u', -1 , -1 , "ac31c0")\ - X(242 , 1, 0 , SingleLowQuote , "‚" , "‚" , 0x201A, 8218 , 'u', -1 , -1 , "7c29c0")\ - X(244 , 1, 0 , DoubleLowQuote , "„" , "„" , 0x201E, 8222 , 'u', -1 , -1 , "3829c0")\ - X(246 , 1, 0 , LeftGuillemet , "«" , "«" , 0xAB , 171 , 'u', -1 , -1 , "3a56e25e0ddd")\ - X(248 , 1, 0 , Hash , "#" , "#" , 0x23 , 35 , 'u', '#' , '#' , "2a2bde302bde2e2bde2c2bde362bdc3a29de462bdc782bbf802bbf862bbf822bbf842bbf")\ - X(250 , 1, 0 , AtSign , "@" , "@" , 0x40 , 64 , 'u', '@' , '\0' , "401bdd6429de9a29c0")\ - X(252 , 1, 0 , Exclamation , "!" , "!" , 0x21 , 33 , 'u', '!' , '!' , "9635df9835df9c35df")\ - X(254 , 1, 0 , InvertedExclamation, "¡" , "¡" , 0xA1 , 161 , 'u', -1 , -1 , "680ddd")\ - X(256 , 1, 0 , QuestionMark , "?" , "?" , 0x3F , 63 , 'u', '?' , 127 , "a20cbb")\ - X(258 , 1, 0 , InvertedQuestion , "¿" , "¿" , 0xBF , 191 , 'u', -1 , -1 , "500ddd6a0ddd")\ - X(260 , 1, 0 , Paragraph , "§" , "§" , 0xA7 , 167 , 'u', -1 , -1 , "4429dc4c29dc5228de5828de6229dc6e28de7428de8829bf8a29bf")\ - X(262 , 1, 0 , Ampersand , "&" , "&" , 0x26 , 38 , 'u', '&' , '&' , "5856e27456e2")\ - X(264 , 1, 0 , Dollar , "$" , "$" , 0x24 , 36 , 'u', '$' , '$' , "882bdf8a2bdf961bba9c1bbaa01bba9e1bbaac29de")\ - X(266 , 1, 0 , Percent , "%" , "%" , 0x25 , 37 , 'u', '%' , '%' , "ac0dbb")\ - X(268 , 1, 0 , Dong , "₫" , "₫" , 0x20AB, 8363 , 'u', -1 , -1 , "320dbb")\ - X(270 , 1, 0 , Yen , "¥" , "¥" , 0xA5 , 165 , 'u', -1 , -1 , "027ddc227ddc")\ - X(272 , 1, 0 , DotlessI , "ı" , "ı" , 0x0131, 305 , 'u', -1 , -1 , "8c1749a61349")\ - X(274 , 1, 0 , MicroSign , "µ" , "µ" , 0xB5 , 181 , 'u', -1 , -1 , "a02bdc9e2bdc")\ - X(276 , 1, 0 , Eth , "ð" , "ð" , 0xF0 , 240 , 'u', -1 , -1 , "6c1bba701add")\ - X(278 , 1, 0 , Thorn , "þ" , "þ" , 0xFE , 254 , 'u', -1 , -1 , "7035bd")\ - X(280 , 1, 0 , Eszett , "ẞ" , "ß" , 0xDF , 223 , 'u', -1 , -1 , "760cdb780cdb7a0cdb800cdb860cdb820cdb840cdb")\ - X(282 , 1, 0x41, KeyA , "A" , "a" , 0x61 , 97 , 'u', 'a' , '\x01', "001e41061e41101e410e1e41141e41161e41021e410a1e410c1e41181e41041e41081e411a1e41121e41201e411e1e411c1e41221e41241e41281e41261e412a1e41301e412e1e412c1e41341e41361e41321e41381e413a1e413e1e413c1e41401e41421e41441e41461e41481e414e1e41501e414a1e414c1e41521e41561e41581e41541e415a1e415c1e415e1e41601e41641e416c1e41621e416a1e41661e41681e416e1e41701e41721e417c1e41741e41761e41781e417a1e417e1e41801e41861e41821e41841e41881e418a1e418c1e418e1e41921e41901e41941e419610419810419a10419c1041a010419e1041a21e41a41e41a62141a82141aa2541ac1e41")\ - X(284 , 1, 0x42, KeyB , "B" , "b" , 0x62 , 98 , 'u', 'b' , '\x02', "0030420630421030420e30421430421630420230420a30420c30421830420430420830421a30421230422030421e30421c30422230422430422830422630422a30423030422e30422c30423430423630423230423830423a30423e30423c30424030424230424430424630424830424e30425030424a30424c30425230425630425830425430425a30425c30425e30426030426430426c30426230426a30426630426830426e30427030427230427c30427430427630427830427a30427e30428030428630428230428430428830428a30428c30428e30429230429030429430429630429830429a30429c3042a030429e3042a23042a43142a63342a81942aa1242ac1042")\ - X(286 , 1, 0x43, KeyC , "C" , "c" , 0x63 , 99 , 'u', 'c' , '\x03', "002e43062e43102e430e2e43142e43162e43022e430a2e430c2e43182e43042e43082e431a2e43122e43202e431e2e431c2e43222e43242e43282e43262e432a2e43302e432e2e432c2e43342e43362e43322e43382e433a2e433e2e433c2e43402e43422e43442e43462e43482e434e2e43502e434a2e434c2e43522e43562e43582e43542e435a2e435c2e435e2e43602e43642e436c2e43622e436a2e43662e43682e436e2e43702e43722e437c2e43742e43762e43782e437a2e437e2e43802e43862e43822e43842e43882e438a2e438c2e438e2e43922e43902e43942e43962e43982e439a2e439c2e43a02e439e2e43a22e43a41743a62f43a82643aa2043ac2343")\ - X(288 , 1, 0x44, KeyD , "D" , "d" , 0x64 , 100 , 'u', 'd' , '\x04', "0020440620441020440e20441420441620440220440a20440c20441820440420440820441a20441220442020441e20441c20442220442420442820442620442a20443020442e20442c20443420443620443220443820443a20443e20443c20444020444220444420444620444820444e20445020444a20444c20445220445620445820445420445a20445c20445e20446020446420446c20446220446a20446620446820446e20447020447220447c20447420447620447820447a20447e20448020448620448220448420448820448a20448c20448e20449222449020449420449620449820449a20449c2044a020449e2044a22044a42344a61544a82544aa2144ac1744")\ - X(290 , 1, 0x45, KeyE , "E" , "e" , 0x65 , 101 , 'u', 'e' , '\x05', "0012450612451012450e12451412451612450212450a12450c12451812450412450812451a12451212452012451e12451c12452212452412452812452612452a12453012452e12452c12453412453612453212453812453a12453e12453c12454012454212454412454612454812454e12455012454a12454c12455212455612455812455412455a12455c12455e12456012456412456c12456212456a12456612456812456e12457012457212457c12457412457612457812457a12457e12458012458612458212458412458812458a12458c12458e12459225459012459412459612459812459a12459c1245a012459e1245a21245a42045a62045a82245aa2445ac2145")\ - X(292 , 1, 0x46, KeyF , "F" , "f" , 0x66 , 102 , 'u', 'f' , '\x06', "0021460621461021460e21461421461621460221460a21460c21461821460421460821461a21461221462021461e21461c21462221462421462821462621462a21463021462e21462c21463421463621463221463821463a21463e21463c21464021464221464421464621464821464e21465021464a21464c21465221465621465821465421465a21465c21465e21466021466421466c21466221466a21466621466821466e21467021467221467c21467421467621467821467a21467e21468021468621468221468421468821468a21468c21468e21469212469021469421469621469821469a21469c2146a021469e2146a234bea41546a61046a80946aa0646ac3546")\ - X(294 , 1, 0x47, KeyG , "G" , "g" , 0x67 , 103 , 'u', 'g' , '\x07', "0022470622471022470e22471422471622470222470a22470c22471822470422470822471a22471222472022471e22471c22472222472422472822472622472a22473022472e22472c22473422473622473222473822473a22473e22473c22474022474222474422474622474822474e22475022474a22474c22475222475622475822475422475a22475c22475e22476022476422476c22476222476a22476622476822476e22477022477222477c22477422477622477822477a22477e22478022478622478222478422478822478a22478c22478e22479214479022479422479622479822479a22479c2247a022479e2247a22247a41647a61147a83447aa2e47ac3347")\ - X(296 , 1, 0x48, KeyH , "H" , "h" , 0x68 , 104 , 'u', 'h' , '\x08', "0023480623481023480e23481423481623480223480a23480c23481823480423480823481a23481223482023481e23481c23482223482423482823482623482a23483023482e23482c23483423483623483223483823483a23483e23483c23484023484223484423484623484823484e23485023484a23484c23485223485623485823485423485a23485c23485e23486023486423486c23486223486a23486623486823486e23487023487223487c23487423487623487823487a23487e23488023488623488223488423488823488a23488c23488e23489223489023489423489623489823489a23489c2348a023489e2348a22348a42448a61848a82348aa2348ac3448")\ - X(298 , 1, 0x49, KeyI , "I" , "i" , 0x69 , 105 , 'u', 'i' , '\x09', "0017490617491017490e17491417491617490217490a17490c17491817490417490817491a17491217492017491e17491c17492217492417492817492617492a17493017492e17492c17493417493617493217493817493a17493e17493c17494017494217494417494617494817494e17495017494a17494c17495217495617495817495417495a17495c17495e17496017496417496c17496217496a17496617496817496e17497017497217497c17497417497617497817497a17497e17498017498617498217498417498817498a17498c28de8e17499226499017499417499617499817499a17499c1749a017499e1749a21749a42249a61fdba83049aa3249ac2049")\ - X(300 , 1, 0x4A, KeyJ , "J" , "j" , 0x6A , 106 , 'u', 'j' , '\x0a', "00244a06244a10244a0e244a14244a16244a02244a0a244a0c244a18244a04244a08244a1a244a12244a20244a1e244a1c244a22244a24244a28244a26244a2a244a30244a2e244a2c244a34244a36244a32244a38244a3a244a3e244a3c244a40244a42244a44244a46244a48244a4e244a50244a4a244a4c244a52244a56244a58244a54244a5a244a5c244a5e244a60244a64244a6c244a62244a6a244a66244a68244a6e244a70244a72244a7c244a74244a76244a78244a7a244a7e244a80244a86244a82244a84244a88244a8a244a8c244a8e244a92154a90244a94244a96244a98244a9a244a9c244aa0244a9e244aa2244aa42e4aa62c4aa8064aaa094aac194a")\ - X(302 , 1, 0x4B, KeyK , "K" , "k" , 0x6B , 107 , 'u', 'k' , '\x0b', "00254b06254b10254b0e254b14254b16254b02254b0a254b0c254b18254b04254b08254b1a254b12254b20254b1e254b1c254b22254b24254b28254b26254b2a254b30254b2e254b2c254b34254b36254b32254b38254b3a254b3e254b3c254b40254b42254b44254b46254b48254b4e254b50254b4a254b4c254b52254b56254b58254b54254b5a254b5c254b5e254b60254b64254b6c254b62254b6a254b66254b68254b6e254b70254b72254b7c254b74254b76254b78254b7a254b7e254b80254b86254b82254b84254b88254b8a254b8c254b8e254b92314b90254b94254b96254b98254b9a254b9c254ba0254b9e254ba2254ba42f4ba6244ba8274baa1f4bac304b")\ - X(304 , 1, 0x4C, KeyL , "L" , "l" , 0x6C , 108 , 'u', 'l' , '\x0c', "00264c06264c10264c0e264c14264c16264c02264c0a264c0c264c18264c04264c08264c1a264c12264c20264c1e264c1c264c22264c24264c28264c26264c2a264c30264c2e264c2c264c34264c36264c32264c38264c3a264c3e264c3c264c40264c42264c44264c46264c48264c4e264c50264c4a264c4c264c52264c56264c58264c54264c5a264c5c264c5e264c60264c64264c6c264c62264c6a264c66264c68264c6e264c70264c72264c7c264c74264c76264c78264c7a264c7e264c80264c86264c82264c84264c88264c8a264c8c264c8e264c92164c90264c94264c96264c98264c9a264c9c264ca0264c9e264ca2264ca4194ca6264ca8074caa084cac184c")\ - X(306 , 1, 0x4D, KeyM , "M" , "m" , 0x6D , 109 , 'u', 'm' , '\x0d', "00324d06324d10324d0e324d14324d16324d02324d0a324d0c324d18324d04324d08324d1a324d12324d20324d1e324d1c324d22324d24324d28324d26324d2a324d30324d2e324d2c324d34324d36324d32324d38324d3a324d3e324d3c324d40324d42324d44324d46324d48324d4e324d50324d4a324d4c324d52324d56324d58324d54324d5a324d5c324d5e324d60324d64324d6c324d62324d6a324d66324d68324d6e324d70324d72324d7c324d74324d76324d78324d7a324d7e324d80324d86324d82324d84324d88324d8a324d8c324d8e324d92324d90324d94324d96274d98274d9a274d9c274da0274d9e274da2324da4324da6254da8084daa074dac284d")\ - X(308 , 1, 0x4E, KeyN , "N" , "n" , 0x6E , 110 , 'u', 'n' , '\x0e', "00314e06314e10314e0e314e14314e16314e02314e0a314e0c314e18314e04314e08314e1a314e12314e20314e1e314e1c314e22314e24314e28314e26314e2a314e30314e2e314e2c314e34314e36314e32314e38314e3a314e3e314e3c314e40314e42314e44314e46314e48314e4e314e50314e4a314e4c314e52314e56314e58314e54314e5a314e5c314e5e314e60314e64314e6c314e62314e6a314e66314e68314e6e314e70314e72314e7c314e74314e76314e78314e7a314e7e314e80314e86314e82314e84314e88314e8a314e8c314e8e314e92244e90314e94314e96314e98314e9a314e9c314ea0314e9e314ea2314ea4264ea6174ea8314eaa314eac274e")\ - X(310 , 1, 0x4F, KeyO , "O" , "o" , 0x6F , 111 , 'u', 'o' , '\x0f', "00184f06184f10184f0e184f14184f16184f02184f0a184f0c184f18184f04184f08184f1a184f12184f20184f1e184f1c184f22184f24184f28184f26184f2a184f30184f2e184f2c184f34184f36184f32184f38184f3a184f3e184f3c184f40184f42184f44184f46184f48184f4e184f50184f4a184f4c184f52184f56184f58184f54184f5a184f5c184f5e184f60184f64184f6c184f62184f6a184f66184f68184f6e184f70184f72184f7c184f74184f76184f78184f7a184f7e184f80184f86184f82184f84184f88184f8a184f8c184f8e184f92274f90184f94184f96184f98184f9a184f9c184fa0184f9e184fa2184fa41f4fa6144fa8144faa174fac134f")\ - X(312 , 1, 0x50, KeyP , "P" , "p" , 0x70 , 112 , 'u', 'p' , '\x10', "0019500619501019500e19501419501619500219500a19500c19501819500419500819501a19501219502019501e19501c19502219502419502819502619502a19503019502e19502c19503419503619503219503819503a19503e19503c19504019504219504419504619504819504e19505019504a19504c19505219505619505819505419505a19505c19505e19506019506419506c19506219506a19506619506819506e19507019507219507c19507419507619507819507a19507e19508019508619508219508419508819508a19508c19508e19509213509019509419509619509819509a19509c1950a019509e1950a21950a41350a61950a80a50aa0550ac1250")\ - X(314 , 1, 0x51, KeyQ , "Q" , "q" , 0x71 , 113 , 'u', 'q' , '\x11', "0010510610511010510e10511410511610510210510a10510c10511810510410510810511a10511210512010511e10511c10512210512410512810512610512a10513010512e10512c10513410513610513210513810513a10513e10513c10514010514210514410514610514810514e10515010514a10514c10515210515610515810515410515a10515c10515e10516010516410516c10516210516a10516610516810516e10517010517210517c10517410517610517810517a10517e10518010518610518210518410518810518a10518c10518e1051921051901051941051961e51981e519a1e519c1e51a01e519e1e51a22bbfa42d51a61a51a81251aa1151ac3251")\ - X(316 , 1, 0x52, KeyR , "R" , "r" , 0x72 , 114 , 'u', 'r' , '\x12', "0013520613521013520e13521413521613520213520a13520c13521813520413520813521a13521213522013521e13521c13522213522413522813522613522a13523013522e13522c13523413523613523213523813523a13523e13523c13524013524213524413524613524813524e13525013524a13524c13525213525613525813525413525a13525c13525e13526013526413526c13526213526a13526613526813526e13527013527213527c13527413527613527813527a13527e13528013528613528213528413528813528a13528c13528e1352921f529013529413529613529813529a13529c1352a013529e1352a21352a41852a61652a81552aa1552ac2652")\ - X(318 , 1, 0x53, KeyS , "S" , "s" , 0x73 , 115 , 'u', 's' , '\x13', "001f53061f53101f530e1f53141f53161f53021f530a1f530c1f53181f53041f53081f531a1f53121f53201f531e1f531c1f53221f53241f53281f53261f532a1f53301f532e1f532c1f53341f53361f53321f53381f533a1f533e1f533c1f53401f53421f53441f53461f53481f534e1f53501f534a1f534c1f53521f53561f53581f53541f535a1f535c1f535e1f53601f53641f536c1f53621f536a1f53661f53681f536e1f53701f53721f537c1f53741f53761f53781f537a1f537e1f53801f53861f53821f53841f53881f538a1f538c1f538e1f53922053901f53941f53961f53981f539a1f539c1f53a01f539e1f53a21f53a42753a63253a81653aa1653ac2553")\ - X(320 , 1, 0x54, KeyT , "T" , "t" , 0x74 , 116 , 'u', 't' , '\x14', "0014540614541014540e14541414541614540214540a14540c14541814540414540814541a14541214542014541e14541c14542214542414542814542614542a14543014542e14542c14543414543614543214543814543a14543e14543c14544014544214544414544614544814544e14545014544a14544c14545214545614545814545414545a14545c14545e14546014546414546c14546214546a14546614546814546e14547014547214547c14547414547614547814547a14547e14548014548614548214548414548814548a14548c14548e14549221549014549414549614549814549a14549c1454a014549e1454a21454a42554a62354a82454aa2254ac2454")\ - X(322 , 1, 0x55, KeyU , "U" , "u" , 0x75 , 117 , 'u', 'u' , '\x15', "0016550616551016550e16551416551616550216550a16550c16551816550416550816551a16551216552016551e16551c16552216552416552816552616552a16553016552e16552c16553416553616553216553816553a16553e16553c16554016554216554416554616554816554e16555016554a16554c16555216555616555816555416555a16555c16555e16556016556416556c16556216556a16556616556816556e16557016557216557c16557416557616557816557a16557e16558016558616558216558416558816558a16558c16558e16559217559016559416559616559816559a16559c1655a016559e1655a21655a42155a61e55a81755aa1455ac1f55")\ - X(324 , 1, 0x56, KeyV , "V" , "v" , 0x76 , 118 , 'u', 'v' , '\x16', "002f56062f56102f560e2f56142f56162f56022f560a2f560c2f56182f56042f56082f561a2f56122f56202f561e2f561c2f56222f56242f56282f56262f562a2f56302f562e2f562c2f56342f56362f56322f56382f563a2f563e2f563c2f56402f56422f56442f56462f56482f564e2f56502f564a2f564c2f56522f56562f56582f56542f565a2f565c2f565e2f56602f56642f566c2f56622f566a2f56662f56682f566e2f56702f56722f567c2f56742f56762f56782f567a2f567e2f56802f56862f56822f56842f56882f568a2f568c2f568e2f56922f56902f56942f56962f56982f569a2f569c2f56a02f569e2f56a22f56a43456a62e56a83356aa2f56ac1656")\ - X(326 , 1, 0x57, KeyW , "W" , "w" , 0x77 , 119 , 'u', 'w' , '\x17', "0011570611571011570e11571411571611570211570a11570c11571811570411570811571a11571211572011571e11571c11572211572411572811572611572a11573011572e11572c11573411573611573211573811573a11573e11573c11574011574211574411574611574811574e11575011574a11574c11575211575611575811575411575a11575c11575e11576011576411576c11576211576a11576611576811576e11577011577211577c11577411577611577811577a11577e11578011578611578211578411578811578a11578c11578e1157921157901157941157962c57982c579a2c579c2c57a02c579e2c57a21bbaa43357a61b57a83257aa3057ac1b57")\ - X(328 , 1, 0x58, KeyX , "X" , "x" , 0x78 , 120 , 'u', 'x' , '\x18', "002d58062d58102d580e2d58142d58162d58022d580a2d580c2d58182d58042d58082d581a2d58122d58202d581e2d581c2d58222d58242d58282d58262d582a2d58302d582e2d582c2d58342d58362d58322d58382d583a2d583e2d583c2d58402d58422d58442d58462d58482d584e2d58502d584a2d584c2d58522d58562d58582d58542d585a2d585c2d585e2d58602d58642d586c2d58622d586a2d58662d58682d586e2d58702d58722d587c2d58742d58762d58782d587a2d587e2d58802d58862d58822d58842d58882d588a2d588c2d588e2d58922d58902d58942d58962d58982d589a2d589c2d58a02d589e2d58a20ddba43058a62b58a82e58aa2d58ac2e58")\ - X(330 , 1, 0x59, KeyY , "Y" , "y" , 0x79 , 121 , 'u', 'y' , '\x19', "0015590615591015590e15591415591615590215590a15590c15591815590415590815591a15591215592015591e15591c15592215592415592815592615592a15593015592e15592c15593415593615593215593815593a15593e15593c1559402c594215594415594615594815594e15595015594a15594c15595215595615595815595415595a15595c15595e15596015596415596c15596215596a15596615596815596e2c59701559722c597c2c59742c59762c59782c597a2c597e2c59802c59862c59822c59842c59882c598a2c598c15598e1559921859902c59942c599615599815599a15599c1559a015599e1559a21559a41459a62759a81859aa1359ac2d59")\ - X(332 , 1, 0x5A, KeyZ , "Z" , "z" , 0x7A , 122 , 'u', 'z' , '\x1a', "002c5a062c5a102c5a0e2c5a142c5a162c5a022c5a0a2c5a0c2c5a182c5a042c5a082c5a1a2c5a122c5a202c5a1e2c5a1c2c5a222c5a242c5a282c5a262c5a2a2c5a302c5a2e2c5a2c2c5a342c5a362c5a322c5a382c5a3a2c5a3e2c5a3c2c5a40155a422c5a442c5a462c5a482c5a4e2c5a502c5a4a2c5a4c2c5a522c5a562c5a582c5a542c5a5a2c5a5c2c5a5e2c5a602c5a642c5a6c2c5a622c5a6a2c5a662c5a682c5a6e155a702c5a72155a7c155a74155a76155a78155a7a155a7e155a80155a86155a82155a84155a88155a8a155a8c2c5a8e2c5a922c5a90155a94155a96115a98115a9a115a9c115aa0115a9e115aa22c5aa4355aa6315aa8205aaa265aac1a5a")\ - X(334 , 1, 0 , AeLigature , "Æ" , "æ" , 0xE6 , 230 , 'u', -1 , -1 , "4e27c04a28de6027c06c27c06628de7027c0")\ - X(336 , 1, 0 , AcuteA , "Á" , "á" , 0xE1 , 225 , 'u', -1 , -1 , "7e28de8e28de")\ - X(338 , 1, 0 , BreveA , "Ă" , "ă" , 0x0103, 259 , 'u', -1 , -1 , "381adb941adb")\ - X(340 , 1, 0 , CircumflexA , "Â" , "â" , 0xE2 , 226 , 'u', -1 , -1 , "382bdc942bdc")\ - X(342 , 1, 0 , GraveA , "À" , "à" , 0xE0 , 224 , 'u', -1 , -1 , "3e2bdc422bdc5a28de5c28de8828dcac2cdd")\ - X(344 , 1, 0 , OgonekA , "Ą" , "ą" , 0x0105, 261 , 'u', -1 , -1 , "7228dea21051")\ - X(346 , 1, 0 , RingA , "Å" , "å" , 0xE5 , 229 , 'u', -1 , -1 , "441add4e1add4a1add4c1add601add6c1add621add661add")\ - X(348 , 1, 0 , TildeA , "Ã" , "ã" , 0xE3 , 227 , 'u', -1 , -1 , "9829de")\ - X(350 , 1, 0 , UmlautA , "Ä" , "ä" , 0xE4 , 228 , 'u', -1 , -1 , "4428de4c28de5628bf581bdd6228de741bdd7628de7828de7a28de8028de8628de8228de8428de8a28dc")\ - X(352 , 1, 0 , AcuteC , "Ć" , "ć" , 0x0107, 263 , 'u', -1 , -1 , "7c28de9028de")\ - X(354 , 1, 0 , CaronC , "Č" , "č" , 0x010D, 269 , 'u', -1 , -1 , "7c27ba9027baa233bc")\ - X(356 , 1, 0 , CedillaC , "Ç" , "ç" , 0xE7 , 231 , 'u', -1 , -1 , "3e1bdd3c27ba401adb421bdd5428de5e27c0682bbf8c34dca630bfac2bdc")\ - X(358 , 1, 0 , DotAboveC , "Ċ" , "ċ" , 0x010B, 267 , 'u', -1 , -1 , "3429c03629c0")\ - X(360 , 1, 0 , AcuteE , "É" , "é" , 0xE9 , 233 , 'u', -1 , -1 , "3a35bf3e35bf4235bf7e27ba8827de8e27baac11ba")\ - X(362 , 1, 0 , CircumflexE , "Ê" , "ê" , 0xEA , 234 , 'u', -1 , -1 , "ac56e2")\ - X(364 , 1, 0 , GraveE , "È" , "è" , 0xE8 , 232 , 'u', -1 , -1 , "3e28c04228c05a1aba5c1aba881abaac14bf")\ - X(366 , 1, 0 , DotAboveE , "Ė" , "ė" , 0x0117, 279 , 'u', -1 , -1 , "a228de")\ - X(368 , 1, 0 , OgonekE , "Ę" , "ę" , 0x0119, 281 , 'u', -1 , -1 , "a235bd")\ - X(370 , 1, 0 , UmlautE , "Ë" , "ë" , 0xEB , 235 , 'u', -1 , -1 , "4027ba")\ - X(372 , 1, 0 , CrossedD , "Đ" , "đ" , 0x0111, 273 , 'u', -1 , -1 , "7c1bdd901bdd")\ - X(374 , 1, 0 , BreveG , "Ğ" , "ğ" , 0x011F, 287 , 'u', -1 , -1 , "8c1adba612ba")\ - X(376 , 1, 0 , DotAboveG , "Ġ" , "ġ" , 0x0121, 289 , 'u', -1 , -1 , "341adb361adb")\ - X(378 , 1, 0 , CrossedH , "Ħ" , "ħ" , 0x0127, 295 , 'u', -1 , -1 , "341bdd361bdd")\ - X(380 , 1, 0 , AcuteI , "Í" , "í" , 0xED , 237 , 'u', -1 , -1 , "7e56e28e29308e56e2")\ - X(382 , 1, 0 , CircumflexI , "Î" , "î" , 0xEE , 238 , 'u', -1 , -1 , "381bdd941bdd")\ - X(384 , 1, 0 , GraveI , "Ì" , "ì" , 0xEC , 236 , 'u', -1 , -1 , "5a0ddd5c0ddd")\ - X(386 , 1, 0 , OgonekI , "Į" , "į" , 0x012F, 303 , 'u', -1 , -1 , "a21add")\ - X(388 , 1, 0 , CrossedL , "Ł" , "ł" , 0x0142, 322 , 'u', -1 , -1 , "7227ba762bbf7a2bbf")\ - X(390 , 1, 0 , CaronN , "Ň" , "ň" , 0x0148, 328 , 'u', -1 , -1 , "582bdc742bdc")\ - X(392 , 1, 0 , TildeN , "Ñ" , "ñ" , 0xF1 , 241 , 'u', -1 , -1 , "5027c05427c06a27c06827c0")\ - X(394 , 1, 0 , AcuteO , "Ó" , "ó" , 0xF3 , 243 , 'u', -1 , -1 , "722bdc7e0dbb8e0dbb981bba")\ - X(396 , 1, 0 , CircumflexO , "Ô" , "ô" , 0xF4 , 244 , 'u', -1 , -1 , "5827ba7427ba")\ - X(398 , 1, 0 , DoubleAcuteO , "Ő" , "ő" , 0x0151, 337 , 'u', -1 , -1 , "7e1adb8e1adb")\ - X(400 , 1, 0 , GraveO , "Ò" , "ò" , 0xF2 , 242 , 'u', -1 , -1 , "5a27c05c27c0")\ - X(402 , 1, 0 , HornO , "Ơ" , "ơ" , 0x01A1, 417 , 'u', -1 , -1 , "321bdd")\ - X(404 , 1, 0 , SlashedO , "Ø" , "ø" , 0xF8 , 248 , 'u', -1 , -1 , "4e28de4a27c06028de6c28de6627c0")\ - X(406 , 1, 0 , TildeO , "Õ" , "õ" , 0xF5 , 245 , 'u', -1 , -1 , "561bdb")\ - X(408 , 1, 0 , UmlautO , "Ö" , "ö" , 0xF6 , 246 , 'u', -1 , -1 , "4427c04c27c05627ba6227c0700cbb7627c07827c07a27c08027c08627c08227c08427c08a27de8c33bfa62ddc")\ - X(410 , 1, 0 , AcuteS , "Ś" , "ś" , 0x015B, 347 , 'u', -1 , -1 , "721bdd")\ - X(412 , 1, 0 , CaronS , "Š" , "š" , 0x0161, 353 , 'u', -1 , -1 , "7c1adb901adba22146")\ - X(414 , 1, 0 , CedillaS , "Ş" , "ş" , 0x015F, 351 , 'u', -1 , -1 , "8c27ba9427baa628de")\ - X(416 , 1, 0 , CommaS , "Ș" , "ș" , 0x0219, 537 , 'u', -1 , -1 , "3827ba")\ - X(418 , 1, 0 , CedillaT , "Ţ" , "ţ" , 0x0163, 355 , 'u', -1 , -1 , "9428de")\ - X(420 , 1, 0 , CommaT , "Ț" , "ț" , 0x021B, 539 , 'u', -1 , -1 , "3828de")\ - X(422 , 1, 0 , AcuteU , "Ú" , "ú" , 0xFA , 250 , 'u', -1 , -1 , "521adb581adb6e1adb741adb7e1bdd8e1bdd")\ - X(424 , 1, 0 , DoubleAcuteU , "Ű" , "ű" , 0x0171, 369 , 'u', -1 , -1 , "7e2bdc8e2bdc")\ - X(426 , 1, 0 , GraveU , "Ù" , "ù" , 0xF9 , 249 , 'u', -1 , -1 , "3e56e24256e25a2bbf5c2bbf9628c09828c09c28c0a028c09e28c0")\ - X(428 , 1, 0 , HornU , "Ư" , "ư" , 0x01B0, 432 , 'u', -1 , -1 , "321adb")\ - X(430 , 1, 0 , MacronU , "Ū" , "ū" , 0x016B, 363 , 'u', -1 , -1 , "a22d58")\ - X(432 , 1, 0 , OgonekU , "Ų" , "ų" , 0x0173, 371 , 'u', -1 , -1 , "a227c0")\ - X(434 , 1, 0 , RingU , "Ů" , "ů" , 0x016F, 367 , 'u', -1 , -1 , "5227ba6e27ba")\ - X(436 , 1, 0 , UmlautU , "Ü" , "ü" , 0xFC , 252 , 'u', -1 , -1 , "561ac0761aba781aba7a1aba7e0cbf801aba861aba821aba841aba8a1aba8c1bdd8e0cbda622dd")\ - X(438 , 1, 0 , CaronZ , "Ž" , "ž" , 0x017E, 382 , 'u', -1 , -1 , "1e0dbb7c2bdc902bdca21157")\ - X(440 , 1, 0 , DotAboveZ , "Ż" , "ż" , 0x017C, 380 , 'u', -1 , -1 , "342bdc3656e2721adb")\ - X(442 , 0, 0x5F, Sleep , "Sleep" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(444 , 0, 0xB6, AppStart1 , "AppStart1" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(446 , 0, 0xB7, AppStart2 , "AppStart2" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(448 , 0, 0 , AppNewWindow , "AppNewWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(450 , 0, 0 , AppOpenWindow , "AppOpenWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(452 , 0, 0x2F, AppHelp , "AppHelp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(454 , 0, 0 , AppSave , "AppSave" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(456 , 0, 0 , AppFind , "AppFind" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(458 , 0, 0 , AppPrint , "AppPrint" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(460 , 0, 0 , AppClose , "AppClose" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(462 , 1, 0 , AppCut , "AppCut" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(464 , 0, 0 , AppCopy , "AppCopy" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(466 , 1, 0 , AppPaste , "AppPaste" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(468 , 1, 0 , AppUndo , "AppUndo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(470 , 1, 0 , AppRedo , "AppRedo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(472 , 0, 0 , AppSpeechMode , "AppSpeechMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(474 , 0, 0 , AppSpeechCorrection, "AppSpeechCorrect" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(476 , 0, 0 , AppSpellCheck , "AppSpellCheck" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(478 , 0, 0 , Calculator , "Calculator" , "" , 0 , 0 , 'u', -1 , -1 , "0121b70721b71121b70f21b71521b71721b70321b70b21b70d21b71921b70521b70921b71b21b71321b72121b71f21b71d21b72321b72521b72921b72721b72b21b73121b72f21b72d21b73521b73721b73321b73921b73b21b73f21b73d21b74121b74321b74521b74721b74921b74f21b75121b74b21b74d21b75321b75721b75921b75521b75b21b75d21b75f21b76121b76521b76d21b76321b76b21b76721b76921b76f21b77121b77321b77d21b77521b77721b77921b77b21b77f21b78121b78721b78321b78521b78921b78b21b78d21b78f21b79321b79121b79521b79721b79921b79b21b79d21b7a121b79f21b7a321b7a521b7a721b7a921b7ab21b7ad21b7")\ - X(480 , 0, 0xB4, Mail , "Mail" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(482 , 0, 0 , MailSend , "MailSend" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(484 , 0, 0 , MailForward , "MailForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(486 , 0, 0 , MailReply , "MailReply" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(488 , 0, 0 , MediaBassBoost , "MediaBassBoost" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(490 , 0, 0 , MediaBassDown , "MediaBassDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(492 , 0, 0 , MediaBassUp , "MediaBassUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(494 , 0, 0 , MediaChanDown , "MediaChanDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(496 , 0, 0 , MediaChanUp , "MediaChanUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(498 , 0, 0 , MediaTrebleDown , "MediaTrebleDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(500 , 0, 0 , MediaTrebleUp , "MediaTrebleUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(502 , 0, 0 , MediaVolMute , "MediaVolMute" , "" , 0 , 57440, 'u', -1 , -1 , "0120ad0720ad1120ad0f20ad1520ad1720ad0320ad0b20ad0d20ad1920ad0520ad0920ad1b20ad1320ad2120ad1f20ad1d20ad2320ad2520ad2920ad2720ad2b20ad3120ad2f20ad2d20ad3520ad3720ad3320ad3920ad3b20ad3f20ad3d20ad4120ad4320ad4520ad4720ad4920ad4f20ad5120ad4b20ad4d20ad5320ad5720ad5920ad5520ad5b20ad5d20ad5f20ad6120ad6520ad6d20ad6320ad6b20ad6720ad6920ad6f20ad7120ad7320ad7d20ad7520ad7720ad7920ad7b20ad7f20ad8120ad8720ad8320ad8520ad8920ad8b20ad8d20ad8f20ad9320ad9120ad9520ad9720ad9920ad9b20ad9d20ada120ad9f20ada320ada520ada720ada920adab20adad20ad")\ - X(504 , 0, 0 , MediaVolDown , "MediaVolDown" , "" , 0 , 57438, 'u', -1 , -1 , "012eae072eae112eae0f2eae152eae172eae032eae0b2eae0d2eae192eae052eae092eae1b2eae132eae212eae1f2eae1d2eae232eae252eae292eae272eae2b2eae312eae2f2eae2d2eae352eae372eae332eae392eae3b2eae3f2eae3d2eae412eae432eae452eae472eae492eae4f2eae512eae4b2eae4d2eae532eae572eae592eae552eae5b2eae5d2eae5f2eae612eae652eae6d2eae632eae6b2eae672eae692eae6f2eae712eae732eae7d2eae752eae772eae792eae7b2eae7f2eae812eae872eae832eae852eae892eae8b2eae8d2eae8f2eae932eae912eae952eae972eae992eae9b2eae9d2eaea12eae9f2eaea32eaea52eaea72eaea92eaeab2eaead2eae")\ - X(506 , 0, 0 , MediaVolUp , "MediaVolUp" , "" , 0 , 57439, 'u', -1 , -1 , "0130af0730af1130af0f30af1530af1730af0330af0b30af0d30af1930af0530af0930af1b30af1330af2130af1f30af1d30af2330af2530af2930af2730af2b30af3130af2f30af2d30af3530af3730af3330af3930af3b30af3f30af3d30af4130af4330af4530af4730af4930af4f30af5130af4b30af4d30af5330af5730af5930af5530af5b30af5d30af5f30af6130af6530af6d30af6330af6b30af6730af6930af6f30af7130af7330af7d30af7530af7730af7930af7b30af7f30af8130af8730af8330af8530af8930af8b30af8d30af8f30af9330af9130af9530af9730af9930af9b30af9d30afa130af9f30afa330afa530afa730afa930afab30afad30af")\ - X(508 , 0, 0xB0, MediaNext , "MediaNext" , "" , 0 , 57435, 'u', -1 , -1 , "0119b00719b01119b00f19b01519b01719b00319b00b19b00d19b01919b00519b00919b01b19b01319b02119b01f19b01d19b02319b02519b02919b02719b02b19b03119b02f19b02d19b03519b03719b03319b03919b03b19b03f19b03d19b04119b04319b04519b04719b04919b04f19b05119b04b19b04d19b05319b05719b05919b05519b05b19b05d19b05f19b06119b06519b06d19b06319b06b19b06719b06919b06f19b07119b07319b07d19b07519b07719b07919b07b19b07f19b08119b08719b08319b08519b08919b08b19b08d19b08f19b09319b09119b09519b09719b09919b09b19b09d19b0a119b09f19b0a319b0a519b0a719b0a919b0ab19b0ad19b0")\ - X(510 , 0, 0xB1, MediaPrev , "MediaPrev" , "" , 0 , 57436, 'u', -1 , -1 , "0110b10710b11110b10f10b11510b11710b10310b10b10b10d10b11910b10510b10910b11b10b11310b12110b11f10b11d10b12310b12510b12910b12710b12b10b13110b12f10b12d10b13510b13710b13310b13910b13b10b13f10b13d10b14110b14310b14510b14710b14910b14f10b15110b14b10b14d10b15310b15710b15910b15510b15b10b15d10b15f10b16110b16510b16d10b16310b16b10b16710b16910b16f10b17110b17310b17d10b17510b17710b17910b17b10b17f10b18110b18710b18310b18510b18910b18b10b18d10b18f10b19310b19110b19510b19710b19910b19b10b19d10b1a110b19f10b1a310b1a510b1a710b1a910b1ab10b1ad10b1")\ - X(512 , 0, 0xB2, MediaStop , "MediaStop" , "" , 0 , 57432, 'u', -1 , -1 , "0124b20724b21124b20f24b21524b21724b20324b20b24b20d24b21924b20524b20924b21b24b21324b22124b21f24b21d24b22324b22524b22924b22724b22b24b23124b22f24b22d24b23524b23724b23324b23924b23b24b23f24b23d24b24124b24324b24524b24724b24924b24f24b25124b24b24b24d24b25324b25724b25924b25524b25b24b25d24b25f24b26124b26524b26d24b26324b26b24b26724b26924b26f24b27124b27324b27d24b27524b27724b27924b27b24b27f24b28124b28724b28324b28524b28924b28b24b28d24b28f24b29324b29124b29524b29724b29924b29b24b29d24b2a124b29f24b2a324b2a524b2a724b2a924b2ab24b2ad24b2")\ - X(514 , 0, 0 , MediaPause , "MediaPause" , "" , 0 , 57429, 'u', -1 , -1 , "")\ - X(516 , 0, 0xB3, MediaPlayPause , "MediaPlayPause" , "" , 0 , 57430, 'u', -1 , -1 , "0122b30722b31122b30f22b31522b31722b30322b30b22b30d22b31922b30522b30922b31b22b31322b32122b31f22b31d22b32322b32522b32922b32722b32b22b33122b32f22b32d22b33522b33722b33322b33922b33b22b33f22b33d22b34122b34322b34522b34722b34922b34f22b35122b34b22b34d22b35322b35722b35922b35522b35b22b35d22b35f22b36122b36522b36d22b36322b36b22b36722b36922b36f22b37122b37322b37d22b37522b37722b37922b37b22b37f22b38122b38722b38322b38522b38922b38b22b38d22b38f22b39322b39122b39522b39722b39922b39b22b39d22b3a122b39f22b3a322b3a522b3a722b3a922b3ab22b3ad22b3")\ - X(518 , 0, 0 , MediaPlay , "MediaPlay" , "" , 0 , 57428, 'u', -1 , -1 , "")\ - X(520 , 0, 0xB5, MediaSelectMode , "MediaSelectMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(522 , 0, 0 , MediaReverse , "MediaReverse" , "" , 0 , 57431, 'u', -1 , -1 , "")\ - X(524 , 0, 0 , MediaRecord , "MediaRecord" , "" , 0 , 57437, 'u', -1 , -1 , "")\ - X(526 , 0, 0 , MediaFastForward , "MediaFastForward" , "" , 0 , 57433, 'u', -1 , -1 , "")\ - X(528 , 0, 0 , MediaRewind , "MediaRewind" , "" , 0 , 57434, 'u', -1 , -1 , "")\ - X(530 , 0, 0 , MicAirToggle , "MicAirToggle" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(532 , 0, 0xAD, MicMute , "MicMute" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(534 , 0, 0xAF, MicVolUp , "MicVolUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(536 , 0, 0xAE, MicVolDown , "MicVolDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(538 , 0, 0xA6, BrowserBackward , "BrowserBackward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(540 , 0, 0xA7, BrowserForward , "BrowserForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(542 , 0, 0xA8, BrowserRefresh , "BrowserRefresh" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(544 , 0, 0xA9, BrowserStop , "BrowserStop" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(546 , 0, 0xAA, BrowserSearch , "BrowserSearch" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(548 , 0, 0xAB, BrowserFavorites , "BrowserFavorites" , "" , 0 , 0 , 'u', -1 , -1 , "")\ - X(550 , 0, 0xAC, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0132ac0732ac1132ac0f32ac1532ac1732ac0332ac0b32ac0d32ac1932ac0532ac0932ac1b32ac1332ac2132ac1f32ac1d32ac2332ac2532ac2932ac2732ac2b32ac3132ac2f32ac2d32ac3532ac3732ac3332ac3932ac3b32ac3f32ac3d32ac4132ac4332ac4532ac4732ac4932ac4f32ac5132ac4b32ac4d32ac5332ac5732ac5932ac5532ac5b32ac5d32ac5f32ac6132ac6532ac6d32ac6332ac6b32ac6732ac6932ac6f32ac7132ac7332ac7d32ac7532ac7732ac7932ac7b32ac7f32ac8132ac8732ac8332ac8532ac8932ac8b32ac8d32ac8f32ac9332ac9132ac9532ac9732ac9932ac9b32ac9d32aca132ac9f32aca332aca532aca732aca932acab32acad32ac")\ - X(552 , 0, 0 , lastKey , "lastKey" , "" , 0 , 0 , 0 , -1 , -1 , "") + /* ID Input Ex_Vk Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */\ + X(0 , 1, 0 , undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(1 , 0, 0 , invalid , "invalid" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(2 , 0, 0x011, LeftCtrl , "Ctrl" , "" , 0 , 57442, 'u', -1 , -1 , "001d11061d11101d110e1d11141d11161d11021d110a1d110c1d11181d11041d11081d111a1d11121d11201d111e1d111c1d11221d11241d11281d11261d112a1d11301d112e1d112c1d11341d11361d11321d11381d113a1d113e1d113c1d11401d11421d11441d11461d11481d114e1d11501d114a1d114c1d11521d11561d11581d11541d115a1d115c1d115e1d11601d11641d116c1d11621d116a1d11661d11681d116e1d11701d11721d117c1d11741d11761d11781d117a1d117e1d11801d11861d11821d11841d11881d118a1d118c1d118e1d11921d11901d11941d11961d11981d119a1d119c1d11a01d119e1d11a21d11a41d11a61d11a81d11aa1d11ac1d11")\ + X( 3 , 0, 0x111, RightCtrl , "Ctrl" , "" , 0 , 57448, 'u', -1 , -1 , "011d11071d11111d110f1d11151d11171d11031d110b1d110d1d11191d11051d11091d111b1d11131d11211d111f1d111d1d11251d11291d11271d112b1d11311d112f1d112d1d11351d11371d11331d11391d113b1d113f1d113d1d11411d11451d11471d11491d114f1d11511d114b1d114d1d11531d11571d11591d11551d115b1d115d1d115f1d11611d11651d116d1d11631d116b1d11671d11691d116f1d11711d11731d117d1d11751d11771d11791d117b1d117f1d11811d11871d11831d11851d11891d118b1d118d1d118f1d11931d11911d11951d11971d11991d119b1d119d1d11a11d119f1d11a31d11a51d11a71d11a91d11ab1d11ad1d11")\ + X(4 , 0, 0x012, LeftAlt , "Alt" , "" , 0 , 57443, 'u', -1 , -1 , "0038120638121038120e38121438121638120238120a38120c38121838120438120838121a38121238122038121e38121c38122238122438122838122638122a38123038122e38122c38123438123638123238123838123a38123e38123c38124038124238124438124638124838124e38125038124a38124c38125238125638125838125438125a38125c38125e38126038126438126c38126238126a38126638126838126e38127038127238127c38127438127638127838127a38127e38128038128638128238128438128838128a38128c38128e38129238129038129438129638129838129a38129c3812a038129e3812a23812a43812a63812a83812aa3812ac3812")\ + X( 5 , 0, 0x112, RightAlt , "Alt" , "" , 0 , 57449, 'u', -1 , -1 , "0138120738121138120f38121538121738120338120b38120d38121938120538120938121b38121338122138121f38121d38122538122938122738122b38123138122f38122d38123538123738123338123938123b38123f38123d38124138124338124538124738124938124f38125138124b38124d38125338125738125938125538125b38125d38125f38126138126538126d38126338126b38126738126938126f38127138127338127d38127538127738127938127b38127f38128138128738128338128538128938128b38128d38128f38129338129138129538129738129938129b38129d3812a138129f3812a33812a53812a73812a93812ab3812ad3812")\ + X(6 , 0, 0x010, LeftShift , "Shift" , "" , 0 , 57441, 'u', -1 , -1 , "002a10062a10102a100e2a10142a10162a10022a100a2a100c2a10182a10042a10082a101a2a10122a10202a101e2a101c2a10222a10242a10282a10262a102a2a10302a102e2a102c2a10342a10362a10322a10382a103a2a103e2a103c2a10402a10422a10442a10462a10482a104e2a10502a104a2a104c2a10522a10562a10582a10542a105a2a105c2a105e2a10602a10642a106c2a10622a106a2a10662a10682a106e2a10702a10722a107c2a10742a10762a10782a107a2a107e2a10802a10862a10822a10842a10882a108a2a108c2a108e2a10922a10902a10942a10962a10982a109a2a109c2a10a02a109e2a10a22a10a42a10a62a10a82a10aa2a10ac2a10")\ + X( 7 , 0, 0x110, RightShift , "Shift" , "" , 0 , 57447, 'u', -1 , -1 , "0036100636101036100e36101436101636100236100a36100c36101836100436100836101a36101236102036101e36101c36102236102436102836102636102a36103036102e36102c36103436103636103236103836103a36103e36103c36104036104236104436104636104836104e36105036104a36104c36105236105636105836105436105a36105c36105e36106036106436106c36106236106a36106636106836106e36107036107236107c36107436107636107836107a36107e36108036108636108236108436108836108a36108c36108e36109236109036109436109636109836109a36109c3610a036109e3610a23610a43610a63610a83610aa3610ac3610")\ + X(8 , 0, 0x15B, LeftSuper , "Super" , "" , 0 , 57444, 'u', -1 , -1 , "015b5b075b5b115b5b0f5b5b155b5b175b5b035b5b0b5b5b0d5b5b195b5b055b5b095b5b1b5b5b135b5b215b5b1f5b5b1d5b5b235b5b255b5b295b5b275b5b2b5b5b315b5b2f5b5b2d5b5b355b5b375b5b335b5b395b5b3b5b5b3f5b5b3d5b5b415b5b435b5b455b5b475b5b4f5b5b515b5b4b5b5b4d5b5b535b5b575b5b595b5b555b5b5b5b5b5d5b5b5f5b5b615b5b655b5b6d5b5b635b5b6b5b5b675b5b695b5b6f5b5b715b5b735b5b7d5b5b755b5b775b5b795b5b7b5b5b7f5b5b815b5b875b5b835b5b855b5b895b5b8b5b5b8d5b5b935b5b975b5b995b5b9b5b5b9d5b5ba15b5b9f5b5ba35b5ba55b5ba75b5ba95b5bab5b5bad5b5b")\ + X( 9 , 0, 0x15C, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "015c5c075c5c115c5c0f5c5c155c5c175c5c035c5c0b5c5c0d5c5c195c5c055c5c095c5c1b5c5c135c5c215c5c1f5c5c1d5c5c235c5c255c5c295c5c275c5c2b5c5c315c5c2f5c5c2d5c5c355c5c375c5c335c5c395c5c3b5c5c3f5c5c3d5c5c415c5c435c5c455c5c475c5c495c5c4f5c5c515c5c4b5c5c4d5c5c535c5c575c5c595c5c555c5c5b5c5c5d5c5c5f5c5c615c5c655c5c6d5c5c635c5c6b5c5c675c5c695c5c6f5c5c715c5c735c5c7d5c5c755c5c775c5c795c5c7b5c5c7f5c5c815c5c875c5c835c5c855c5c895c5c8b5c5c8d5c5c8f5c5c935c5c915c5c955c5c975c5c995c5c9b5c5c9d5c5ca15c5c9f5c5ca35c5ca55c5ca75c5ca95c5cab5c5cad5c5c")\ + X(10 , 0, 0 , LeftHyper , "Hyper" , "" , 0 , 57445, 'u', -1 , -1 , "")\ + X( 11 , 0, 0 , RightHyper , "Hyper" , "" , 0 , 57451, 'u', -1 , -1 , "")\ + X(12 , 0, 0 , AltGR , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ + X(14 , 0, 0x190, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0145900745901145900f45901545901745900345900b45900d45901945900545900945901b45901345902145901f45901d45902345902545902945902745902b45903145902f45902d45903545903745903345903945903b45903f45903d45904145904345904545904745904945904f45905145904b45904d45905345905745905945905545905b45905d45905f45906145906545906d45906345906b45906745906945906f45907145907345907d45907545907745907945907b45907f45908145908745908345908545908945908b45908d45908f45909345909145909545909745909945909b45909d4590a145909f4590a34590a54590a74590a94590ab4590ad4590")\ + X(16 , 0, 0x014, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14063a14103a140e3a14143a14163a14023a140a3a140c3a14183a14043a14083a141a3a14123a14203a141e3a141c3a14223a14243a14283a14263a142a3a14303a142e3a142c3a14343a14363a14323a14383a143a3a143e3a143c3a14403a14423a14443a14463a14483a144e3a14503a144a3a144c3a14523a14563a14583a14543a145a3a145c3a145e3a14603a14643a146c3a14623a146a3a14663a14683a146e3a14703a14723a147c3a14743a14763a14783a147a3a147e3a14803a14863a14823a14843a14883a148a3a148c3a148e3a14923a14903a14943a14963a14983a149a3a149c3a14a03a149e3a14a23a14a43a14a63a14a83a14aa3a14ac3a14")\ + X(18 , 0, 0x091, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046910646911046910e46911446911646910246910a46910c46911846910446910846911a46911246912046911e46911c46912246912446912846912646912a46913046912e46912c46913446913646913246913846913a46913e46913c46914046914246914446914646914846914e46915046914a46914c46915246915646915846915446915a46915c46915e46916046916446916c46916246916a46916646916846916e46917046917246917c46917446917646917846917a46917e46918046918646918246918446918846918a46918c46918e46919246919046919446919646919846919a46919c4691a046919e4691a24691a44691a64691a84691aa4691ac4691")\ + X(20 , 0, 0 , Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0270f2")\ + X(22 , 0, 0 , Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "02791c")\ + X(24 , 0, 0 , Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "027b1d")\ + X(26 , 0, 0x019, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "22f119231d19")\ + X(28 , 0, 0 , Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "22f215233815")\ + X(30 , 0, 0 , IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "431ddf")\ + X(32 , 0, 0x15D, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "015d5d075d5d115d5d0f5d5d155d5d175d5d035d5d0b5d5d0d5d5d195d5d055d5d095d5d1b5d5d135d5d215d5d1f5d5d1d5d5d235d5d255d5d295d5d275d5d2b5d5d315d5d2f5d5d2d5d5d355d5d375d5d335d5d395d5d3b5d5d3f5d5d3d5d5d415d5d435d5d455d5d475d5d4f5d5d515d5d4b5d5d4d5d5d535d5d575d5d595d5d555d5d5b5d5d5d5d5d5f5d5d615d5d655d5d6d5d5d635d5d6b5d5d675d5d695d5d6f5d5d715d5d735d5d7d5d5d755d5d775d5d795d5d7b5d5d7f5d5d815d5d875d5d835d5d855d5d895d5d8b5d5d8d5d5d935d5d975d5d995d5d9b5d5d9d5d5da15d5d9f5d5da35d5da55d5da75d5da95d5dab5d5dad5d5d")\ + X(34 , 0, 0x029, Select , "Select" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(36 , 0, 0 , Fn , "Fn" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(38 , 0, 0x070, F1 , "F1" , "" , 0 , 11 , '~', -1 , -1 , "003b70063b70103b700e3b70143b70163b70023b700a3b700c3b70183b70043b70083b701a3b70123b70203b701e3b701c3b70223b70243b70283b70263b702a3b70303b702e3b702c3b70343b70363b70323b70383b703a3b703e3b703c3b70403b70423b70443b70463b70483b704e3b70503b704a3b704c3b70523b70563b70583b70543b705a3b705c3b705e3b70603b70643b706c3b70623b706a3b70663b70683b706e3b70703b70723b707c3b70743b70763b70783b707a3b707e3b70803b70863b70823b70843b70883b708a3b708c3b708e3b70923b70903b70943b70963b70983b709a3b709c3b70a03b709e3b70a23b70a43b70a63b70a83b70aa3b70ac3b70")\ + X(40 , 0, 0x071, F2 , "F2" , "" , 0 , 12 , '~', -1 , -1 , "003c71063c71103c710e3c71143c71163c71023c710a3c710c3c71183c71043c71083c711a3c71123c71203c711e3c711c3c71223c71243c71283c71263c712a3c71303c712e3c712c3c71343c71363c71323c71383c713a3c713e3c713c3c71403c71423c71443c71463c71483c714e3c71503c714a3c714c3c71523c71563c71583c71543c715a3c715c3c715e3c71603c71643c716c3c71623c716a3c71663c71683c716e3c71703c71723c717c3c71743c71763c71783c717a3c717e3c71803c71863c71823c71843c71883c718a3c718c3c718e3c71923c71903c71943c71963c71983c719a3c719c3c71a03c719e3c71a23c71a43c71a63c71a83c71aa3c71ac3c71")\ + X(42 , 0, 0x072, F3 , "F3" , "" , 0 , 13 , '~', -1 , -1 , "003d72063d72103d720e3d72143d72163d72023d720a3d720c3d72183d72043d72083d721a3d72123d72203d721e3d721c3d72223d72243d72283d72263d722a3d72303d722e3d722c3d72343d72363d72323d72383d723a3d723e3d723c3d72403d72423d72443d72463d72483d724e3d72503d724a3d724c3d72523d72563d72583d72543d725a3d725c3d725e3d72603d72643d726c3d72623d726a3d72663d72683d726e3d72703d72723d727c3d72743d72763d72783d727a3d727e3d72803d72863d72823d72843d72883d728a3d728c3d728e3d72923d72903d72943d72963d72983d729a3d729c3d72a03d729e3d72a23d72a43d72a63d72a83d72aa3d72ac3d72")\ + X(44 , 0, 0x073, F4 , "F4" , "" , 0 , 14 , '~', -1 , -1 , "003e73063e73103e730e3e73143e73163e73023e730a3e730c3e73183e73043e73083e731a3e73123e73203e731e3e731c3e73223e73243e73283e73263e732a3e73303e732e3e732c3e73343e73363e73323e73383e733a3e733e3e733c3e73403e73423e73443e73463e73483e734e3e73503e734a3e734c3e73523e73563e73583e73543e735a3e735c3e735e3e73603e73643e736c3e73623e736a3e73663e73683e736e3e73703e73723e737c3e73743e73763e73783e737a3e737e3e73803e73863e73823e73843e73883e738a3e738c3e738e3e73923e73903e73943e73963e73983e739a3e739c3e73a03e739e3e73a23e73a43e73a63e73a83e73aa3e73ac3e73")\ + X(46 , 0, 0x074, F5 , "F5" , "" , 0 , 15 , '~', -1 , -1 , "003f74063f74103f740e3f74143f74163f74023f740a3f740c3f74183f74043f74083f741a3f74123f74203f741e3f741c3f74223f74243f74283f74263f742a3f74303f742e3f742c3f74343f74363f74323f74383f743a3f743e3f743c3f74403f74423f74443f74463f74483f744e3f74503f744a3f744c3f74523f74563f74583f74543f745a3f745c3f745e3f74603f74643f746c3f74623f746a3f74663f74683f746e3f74703f74723f747c3f74743f74763f74783f747a3f747e3f74803f74863f74823f74843f74883f748a3f748c3f748e3f74923f74903f74943f74963f74983f749a3f749c3f74a03f749e3f74a23f74a43f74a63f74a83f74aa3f74ac3f74")\ + X(48 , 0, 0x075, F6 , "F6" , "" , 0 , 17 , '~', -1 , -1 , "0040750640751040750e40751440751640750240750a40750c40751840750440750840751a40751240752040751e40751c40752240752440752840752640752a40753040752e40752c40753440753640753240753840753a40753e40753c40754040754240754440754640754840754e40755040754a40754c40755240755640755840755440755a40755c40755e40756040756440756c40756240756a40756640756840756e40757040757240757c40757440757640757840757a40757e40758040758640758240758440758840758a40758c40758e40759240759040759440759640759840759a40759c4075a040759e4075a24075a44075a64075a84075aa4075ac4075")\ + X(50 , 0, 0x076, F7 , "F7" , "" , 0 , 18 , '~', -1 , -1 , "0041760641761041760e41761441761641760241760a41760c41761841760441760841761a41761241762041761e41761c41762241762441762841762641762a41763041762e41762c41763441763641763241763841763a41763e41763c41764041764241764441764641764841764e41765041764a41764c41765241765641765841765441765a41765c41765e41766041766441766c41766241766a41766641766841766e41767041767241767c41767441767641767841767a41767e41768041768641768241768441768841768a41768c41768e41769241769041769441769641769841769a41769c4176a041769e4176a24176a44176a64176a84176aa4176ac4176")\ + X(52 , 0, 0x077, F8 , "F8" , "" , 0 , 19 , '~', -1 , -1 , "0042770642771042770e42771442771642770242770a42770c42771842770442770842771a42771242772042771e42771c42772242772442772842772642772a42773042772e42772c42773442773642773242773842773a42773e42773c42774042774242774442774642774842774e42775042774a42774c42775242775642775842775442775a42775c42775e42776042776442776c42776242776a42776642776842776e42777042777242777c42777442777642777842777a42777e42778042778642778242778442778842778a42778c42778e42779242779042779442779642779842779a42779c4277a042779e4277a24277a44277a64277a84277aa4277ac4277")\ + X(54 , 0, 0x078, F9 , "F9" , "" , 0 , 20 , '~', -1 , -1 , "0043780643781043780e43781443781643780243780a43780c43781843780443780843781a43781243782043781e43781c43782243782443782843782643782a43783043782e43782c43783443783643783243783843783a43783e43783c43784043784243784443784643784843784e43785043784a43784c43785243785643785843785443785a43785c43785e43786043786443786c43786243786a43786643786843786e43787043787243787c43787443787643787843787a43787e43788043788643788243788443788843788a43788c43788e43789243789043789443789643789843789a43789c4378a043789e4378a24378a44378a64378a84378aa4378ac4378")\ + X(56 , 0, 0x079, F10 , "F10" , "" , 0 , 21 , '~', -1 , -1 , "0044790644791044790e44791444791644790244790a44790c44791844790444790844791a44791244792044791e44791c44792244792444792844792644792a44793044792e44792c44793444793644793244793844793a44793e44793c44794044794244794444794644794844794e44795044794a44794c44795244795644795844795444795a44795c44795e44796044796444796c44796244796a44796644796844796e44797044797244797c44797444797644797844797a44797e44798044798644798244798444798844798a44798c44798e44799244799044799444799644799844799a44799c4479a044799e4479a24479a44479a64479a84479aa4479ac4479")\ + X(58 , 0, 0x07A, F11 , "F11" , "" , 0 , 23 , '~', -1 , -1 , "00577a06577a10577a0e577a14577a16577a02577a0a577a0c577a18577a04577a08577a1a577a12577a20577a1e577a1c577a22577a24577a28577a26577a2a577a30577a2e577a2c577a34577a36577a32577a38577a3a577a3e577a3c577a40577a42577a44577a46577a48577a4e577a50577a4a577a4c577a52577a56577a58577a54577a5a577a5c577a5e577a60577a64577a6c577a62577a6a577a66577a68577a6e577a70577a72577a7c577a74577a76577a78577a7a577a7e577a80577a86577a82577a84577a88577a8a577a8c577a8e577a92577a90577a94577a96577a98577a9a577a9c577aa0577a9e577aa2577aa4577aa6577aa8577aaa577aac577a")\ + X(60 , 0, 0x07B, F12 , "F12" , "" , 0 , 24 , '~', -1 , -1 , "00587b06587b10587b0e587b14587b16587b02587b0a587b0c587b18587b04587b08587b1a587b12587b20587b1e587b1c587b22587b24587b28587b26587b2a587b30587b2e587b2c587b34587b36587b32587b38587b3a587b3e587b3c587b40587b42587b44587b46587b48587b4e587b50587b4a587b4c587b52587b56587b58587b54587b5a587b5c587b5e587b60587b64587b6c587b62587b6a587b66587b68587b6e587b70587b72587b7c587b74587b76587b78587b7a587b7e587b80587b86587b82587b84587b88587b8a587b8c587b8e587b92587b90587b94587b96587b98587b9a587b9c587ba0587b9e587ba2587ba4587ba6587ba8587baa587bac587b")\ + X(62 , 0, 0x07C, F13 , "F13" , "" , 0 , 57376, 'u', -1 , -1 , "00647c06647c10647c0e647c14647c16647c02647c0a647c0c647c18647c04647c08647c1a647c12647c20647c1e647c1c647c22647c24647c28647c26647c2a647c30647c2e647c2c647c34647c36647c32647c38647c3a647c3e647c3c647c40647c42647c44647c46647c48647c4e647c50647c4a647c4c647c52647c56647c58647c54647c5a647c5c647c5e647c60647c64647c6c647c62647c6a647c66647c68647c6e647c70647c72647c7c647c74647c76647c78647c7a647c7e647c80647c86647c82647c84647c88647c8a647c8c647c8e647c92647c90647c94647c96647c98647c9a647c9c647ca0647c9e647ca2647ca4647ca6647ca8647caa647cac647c")\ + X(64 , 0, 0x07D, F14 , "F14" , "" , 0 , 57377, 'u', -1 , -1 , "00657d06657d10657d0e657d14657d16657d02657d0a657d0c657d18657d04657d08657d1a657d12657d20657d1e657d1c657d22657d24657d28657d26657d2a657d30657d2e657d2c657d34657d36657d32657d38657d3a657d3e657d3c657d40657d42657d44657d46657d48657d4e657d50657d4a657d4c657d52657d56657d58657d54657d5a657d5c657d5e657d60657d64657d6c657d62657d6a657d66657d68657d6e657d70657d72657d7c657d74657d76657d78657d7a657d7e657d80657d86657d82657d84657d88657d8a657d8c657d8e657d92657d90657d94657d96657d98657d9a657d9c657da0657d9e657da2657da4657da6657da8657daa657dac657d")\ + X(66 , 0, 0x07E, F15 , "F15" , "" , 0 , 57378, 'u', -1 , -1 , "00667e06667e10667e0e667e14667e16667e02667e0a667e0c667e18667e04667e08667e1a667e12667e20667e1e667e1c667e22667e24667e28667e26667e2a667e30667e2e667e2c667e34667e36667e32667e38667e3a667e3e667e3c667e40667e42667e44667e46667e48667e4e667e50667e4a667e4c667e52667e56667e58667e54667e5a667e5c667e5e667e60667e64667e6c667e62667e6a667e66667e68667e6e667e70667e72667e7c667e74667e76667e78667e7a667e7e667e80667e86667e82667e84667e88667e8a667e8c667e8e667e92667e90667e94667e96667e98667e9a667e9c667ea0667e9e667ea2667ea4667ea6667ea8667eaa667eac667e")\ + X(68 , 0, 0x07F, F16 , "F16" , "" , 0 , 57379, 'u', -1 , -1 , "00677f06677f10677f0e677f14677f16677f02677f0a677f0c677f18677f04677f08677f1a677f12677f20677f1e677f1c677f22677f24677f28677f26677f2a677f30677f2e677f2c677f34677f36677f32677f38677f3a677f3e677f3c677f40677f42677f44677f46677f48677f4e677f50677f4a677f4c677f52677f56677f58677f54677f5a677f5c677f5e677f60677f64677f6c677f62677f6a677f66677f68677f6e677f70677f72677f7c677f74677f76677f78677f7a677f7e677f80677f86677f82677f84677f88677f8a677f8c677f8e677f92677f90677f94677f96677f98677f9a677f9c677fa0677f9e677fa2677fa4677fa6677fa8677faa677fac677f")\ + X(70 , 0, 0x080, F17 , "F17" , "" , 0 , 57380, 'u', -1 , -1 , "0068800668801068800e68801468801668800268800a68800c68801868800468800868801a68801268802068801e68801c68802268802468802868802668802a68803068802e68802c68803468803668803268803868803a68803e68803c68804068804268804468804668804868804e68805068804a68804c68805268805668805868805468805a68805c68805e68806068806468806c68806268806a68806668806868806e68807068807268807c68807468807668807868807a68807e68808068808668808268808468808868808a68808c68808e68809268809068809468809668809868809a68809c6880a068809e6880a26880a46880a66880a86880aa6880ac6880")\ + X(72 , 0, 0x081, F18 , "F18" , "" , 0 , 57381, 'u', -1 , -1 , "0069810669811069810e69811469811669810269810a69810c69811869810469810869811a69811269812069811e69811c69812269812469812869812669812a69813069812e69812c69813469813669813269813869813a69813e69813c69814069814269814469814669814869814e69815069814a69814c69815269815669815869815469815a69815c69815e69816069816469816c69816269816a69816669816869816e69817069817269817c69817469817669817869817a69817e69818069818669818269818469818869818a69818c69818e69819269819069819469819669819869819a69819c6981a069819e6981a26981a46981a66981a86981aa6981ac6981")\ + X(74 , 0, 0x082, F19 , "F19" , "" , 0 , 57382, 'u', -1 , -1 , "006a82066a82106a820e6a82146a82166a82026a820a6a820c6a82186a82046a82086a821a6a82126a82206a821e6a821c6a82226a82246a82286a82266a822a6a82306a822e6a822c6a82346a82366a82326a82386a823a6a823e6a823c6a82406a82426a82446a82466a82486a824e6a82506a824a6a824c6a82526a82566a82586a82546a825a6a825c6a825e6a82606a82646a826c6a82626a826a6a82666a82686a826e6a82706a82726a827c6a82746a82766a82786a827a6a827e6a82806a82866a82826a82846a82886a828a6a828c6a828e6a82926a82906a82946a82966a82986a829a6a829c6a82a06a829e6a82a26a82a46a82a66a82a86a82aa6a82ac6a82")\ + X(76 , 0, 0x083, F20 , "F20" , "" , 0 , 57383, 'u', -1 , -1 , "006b83066b83106b830e6b83146b83166b83026b830a6b830c6b83186b83046b83086b831a6b83126b83206b831e6b831c6b83226b83246b83286b83266b832a6b83306b832e6b832c6b83346b83366b83326b83386b833a6b833e6b833c6b83406b83426b83446b83466b83486b834e6b83506b834a6b834c6b83526b83566b83586b83546b835a6b835c6b835e6b83606b83646b836c6b83626b836a6b83666b83686b836e6b83706b83726b837c6b83746b83766b83786b837a6b837e6b83806b83866b83826b83846b83886b838a6b838c6b838e6b83926b83906b83946b83966b83986b839a6b839c6b83a06b839e6b83a26b83a46b83a66b83a86b83aa6b83ac6b83")\ + X(78 , 0, 0x084, F21 , "F21" , "" , 0 , 57384, 'u', -1 , -1 , "006c84066c84106c840e6c84146c84166c84026c840a6c840c6c84186c84046c84086c841a6c84126c84206c841e6c841c6c84226c84246c84286c84266c842a6c84306c842e6c842c6c84346c84366c84326c84386c843a6c843e6c843c6c84406c84426c84446c84466c84486c844e6c84506c844a6c844c6c84526c84566c84586c84546c845a6c845c6c845e6c84606c84646c846c6c84626c846a6c84666c84686c846e6c84706c84726c847c6c84746c84766c84786c847a6c847e6c84806c84866c84826c84846c84886c848a6c848c6c848e6c84926c84906c84946c84966c84986c849a6c849c6c84a06c849e6c84a26c84a46c84a66c84a86c84aa6c84ac6c84")\ + X(80 , 0, 0x085, F22 , "F22" , "" , 0 , 57385, 'u', -1 , -1 , "006d85066d85106d850e6d85146d85166d85026d850a6d850c6d85186d85046d85086d851a6d85126d85206d851e6d851c6d85226d85246d85286d85266d852a6d85306d852e6d852c6d85346d85366d85326d85386d853a6d853e6d853c6d85406d85426d85446d85466d85486d854e6d85506d854a6d854c6d85526d85566d85586d85546d855a6d855c6d855e6d85606d85646d856c6d85626d856a6d85666d85686d856e6d85706d85726d857c6d85746d85766d85786d857a6d857e6d85806d85866d85826d85846d85886d858a6d858c6d858e6d85926d85906d85946d85966d85986d859a6d859c6d85a06d859e6d85a26d85a46d85a66d85a86d85aa6d85ac6d85")\ + X(82 , 0, 0x086, F23 , "F23" , "" , 0 , 57386, 'u', -1 , -1 , "006e86066e86106e860e6e86146e86166e86026e860a6e860c6e86186e86046e86086e861a6e86126e86206e861e6e861c6e86226e86246e86286e86266e862a6e86306e862e6e862c6e86346e86366e86326e86386e863a6e863e6e863c6e86406e86426e86446e86466e86486e864e6e86506e864a6e864c6e86526e86566e86586e86546e865a6e865c6e865e6e86606e86646e866c6e86626e866a6e86666e86686e866e6e86706e86726e867c6e86746e86766e86786e867a6e867e6e86806e86866e86826e86846e86886e868a6e868c6e868e6e86926e86906e86946e86966e86986e869a6e869c6e86a06e869e6e86a26e86a46e86a66e86a86e86aa6e86ac6e86")\ + X(84 , 0, 0x087, F24 , "F24" , "" , 0 , 57387, 'u', -1 , -1 , "006f87066f87106f870e6f87146f87166f87026f870a6f870c6f87186f87046f87086f871a6f87126f87206f871e6f871c6f87226f87246f87286f87266f872a6f87306f872e6f872c6f87346f87366f87326f87386f873a6f873e6f873c6f87406f87426f87446f87466f87486f874e6f87506f874a6f874c6f87526f87566f87586f87546f875a6f875c6f875e6f87606f87646f876c6f87626f876a6f87666f87686f876e6f87706f87726f877c6f87746f87766f87786f877a6f877e6f87806f87866f87826f87846f87886f878a6f878c6f878e6f87926f87906f87946f87966f87986f879a6f879c6f87a06f879e6f87a26f87a46f87a66f87a86f87aa6f87ac6f87")\ + X(86 , 0, 0 , F25 , "F25" , "" , 0 , 57388, 'u', -1 , -1 , "")\ + X(88 , 0, 0 , F26 , "F26" , "" , 0 , 57389, 'u', -1 , -1 , "")\ + X(90 , 0, 0 , F27 , "F27" , "" , 0 , 57390, 'u', -1 , -1 , "")\ + X(92 , 0, 0 , F28 , "F28" , "" , 0 , 57391, 'u', -1 , -1 , "")\ + X(94 , 0, 0 , F29 , "F29" , "" , 0 , 57392, 'u', -1 , -1 , "")\ + X(96 , 0, 0 , F30 , "F30" , "" , 0 , 57393, 'u', -1 , -1 , "")\ + X(98 , 0, 0 , F31 , "F31" , "" , 0 , 57394, 'u', -1 , -1 , "")\ + X(100 , 0, 0 , F32 , "F32" , "" , 0 , 57395, 'u', -1 , -1 , "")\ + X(102 , 0, 0 , F33 , "F33" , "" , 0 , 57396, 'u', -1 , -1 , "")\ + X(104 , 0, 0 , F34 , "F34" , "" , 0 , 57397, 'u', -1 , -1 , "")\ + X(106 , 0, 0 , F35 , "F35" , "" , 0 , 57398, 'u', -1 , -1 , "")\ + X(108 , 0, 0 , PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "01372c07372c11372c0f372c15372c17372c03372c0b372c0d372c19372c05372c09372c1b372c13372c21372c1f372c1d372c23372c25372c29372c27372c2b372c31372c2f372c2d372c35372c37372c33372c39372c3b372c3f372c3d372c41372c43372c45372c47372c49372c4f372c51372c4b372c4d372c53372c57372c59372c55372c5b372c5d372c5f372c61372c65372c6d372c63372c6b372c67372c69372c6f372c71372c73372c7d372c75372c77372c79372c7b372c7f372c81372c87372c83372c85372c89372c8b372c8d372c8f372c93372c91372c95372c97372c99372c9b372c9d372ca1372c9f372ca3372ca5372ca7372ca9372cab372cad372c")\ + X(110 , 0, 0x013, Pause , "Pause" , "" , 0 , 57362, 'u', '\x1a', '\x03', "0045900645901045900e45901445901645900245900a45900c45901845900445900845901a45901245902045901e45901c45902245902445902845902645902a45903045902e45902c45903445903645903245903845903a45903e45903c45904045904245904445904645904845904e45905045904a45904c45905245905645905845905445905a45905c45905e45906045906445906c45906245906a45906645906845906e45907045907245907c45907445907645907845907a45907e45908045908645908245908445908845908a45908c45908e45909245909045909445909645909845909a45909c4590a045909e4590a24590a44590a64590a84590aa4590ac4590")\ + X(112 , 1, 0 , Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0146030746031146030f46031546031746030346030b46030d46031946030546030946031b46031346032146031f46031d46032346032546032946032746032b46033146032f46032d46033546033746033346033946033b46033f46033d46034146034346034546034746034946034f46035146034b46034d46035346035746035946035546035b46035d46035f46036146036546036d46036346036b46036746036946036f46037146037346037d46037546037746037946037b46037f46038146038746038346038546038946038b46038d46038f46039346039146039546039746039946039b46039d4603a146039f4603a34603a54603a74603a94603ab4603ad4603")\ + X(114 , 1, 0 , SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c06542c10542c0e542c14542c16542c02542c0a542c0c542c18542c04542c08542c1a542c12542c20542c1e542c22542c24542c28542c26542c2a542c34542c36542c38542c3c542c40542c44542c46542c48542c4e542c50542c4a542c4c542c52542c56542c58542c6e542c72542c7c542c74542c76542c78542c7a542c7e542c8c542c8e542c92542c90542c94542c96542c98542ca2542ca6542ca8542caa542c")\ + X(116 , 1, 0x01B, Esc , "Esc" , "\x1B", 0x1b , 27 , 'u', '\x1b', '\x1b', "00011b06011b10011b0e011b14011b16011b02011b0a011b0c011b18011b04011b08011b1a011b12011b20011b1e011b1c011b22011b24011b28011b26011b2a011b30011b2e011b2c011b34011b36011b32011b38011b3a011b3e011b3c011b40011b42011b44011b46011b48011b4e011b50011b4a011b4c011b52011b56011b58011b54011b5a011b5c011b5e011b60011b64011b6c011b62011b6a011b66011b68011b6e011b70011b72011b7c011b74011b76011b78011b7a011b7e011b80011b86011b82011b84011b88011b8a011b8c011b8e011b92011b90011b94011b96011b98011b9a011b9c011ba0011b9e011ba2011ba4011ba6011ba8011baa011bac011b")\ + X(118 , 1, 0x009, Tab , "Tab" , "\x09", 0x09 , 9 , 'u', '\x09', '\x09', "000f09060f09100f090e0f09140f09160f09020f090a0f090c0f09180f09040f09080f091a0f09120f09200f091e0f091c0f09220f09240f09280f09260f092a0f09300f092e0f092c0f09340f09360f09320f09380f093a0f093e0f093c0f09400f09420f09440f09460f09480f094e0f09500f094a0f094c0f09520f09560f09580f09540f095a0f095c0f095e0f09600f09640f096c0f09620f096a0f09660f09680f096e0f09700f09720f097c0f09740f09760f09780f097a0f097e0f09800f09860f09820f09840f09880f098a0f098c0f098e0f09920f09900f09940f09960f09980f099a0f099c0f09a00f099e0f09a20f09a40f09a60f09a80f09aa0f09ac0f09")\ + X(120 , 1, 0x008, Backspace , "Backspace" , "\x08", 0x08 , 127 , 'u', '\x7f', '\x08', "000e08060e08100e080e0e08140e08160e08020e080a0e080c0e08180e08040e08080e081a0e08120e08200e081e0e081c0e08220e08240e08280e08260e082a0e08300e082e0e082c0e08340e08360e08320e08380e083a0e083e0e083c0e08400e08420e08440e08460e08480e084e0e08500e084a0e084c0e08520e08560e08580e08540e085a0e085c0e085e0e08600e08640e086c0e08620e086a0e08660e08680e086e0e08700e08720e087c0e08740e08760e08780e087a0e087e0e08800e08860e08820e08840e08880e088a0e088c0e088e0e08920e08900e08940e08960e08980e089a0e089c0e08a00e089e0e08a20e08a40e08a60e08a80e08aa0e08ac0e08")\ + X(122 , 1, 0x020, Space , "Space" , "\x20", 0x20 , 32 , 'u', '\x20', '\0' , "0039200639201039200e39201439201639200239200a39200c39201839200439200839201a39201239202039201e39201c39202239202439202839202639202a39203039202e39202c39203439203639203239203839203a39203e39203c39204039204239204439204639204839204e39205039204a39204c39205239205639205839205439205a39205c39205e39206039206439206c39206239206a39206639206839206e39207039207239207c39207439207639207839207a39207e39208039208639208239208439208839208a39208c39208e39209239209039209439209639209839209a39209c3920a039209e3920a23920a43920a63920a83920aa3920ac3920")\ + X(124 , 1, 0x00D, KeyEnter , "Enter" , "\x0D", 0x0d , 13 , 'u', '\x0d', '\x0a', "001c0d061c0d101c0d0e1c0d141c0d161c0d021c0d0a1c0d0c1c0d181c0d041c0d081c0d1a1c0d121c0d201c0d1e1c0d1c1c0d221c0d241c0d281c0d261c0d2a1c0d301c0d2e1c0d2c1c0d341c0d361c0d321c0d381c0d3a1c0d3e1c0d3c1c0d401c0d421c0d441c0d461c0d481c0d4e1c0d501c0d4a1c0d4c1c0d521c0d561c0d581c0d541c0d5a1c0d5c1c0d5e1c0d601c0d641c0d6c1c0d621c0d6a1c0d661c0d681c0d6e1c0d701c0d721c0d7c1c0d741c0d761c0d781c0d7a1c0d7e1c0d801c0d861c0d821c0d841c0d881c0d8a1c0d8c1c0d8e1c0d921c0d901c0d941c0d961c0d981c0d9a1c0d9c1c0da01c0d9e1c0da21c0da41c0da61c0da81c0daa1c0dac1c0d")\ + X( 125, 1, 0x10D, NumpadEnter , "Enter" , "\x0D", 0x0d , 57414, 'u', '\x0d', '\x0a', "011c0d071c0d111c0d0f1c0d151c0d171c0d031c0d0b1c0d0d1c0d191c0d051c0d091c0d1b1c0d131c0d211c0d1f1c0d1d1c0d231c0d251c0d291c0d271c0d2b1c0d311c0d2f1c0d2d1c0d351c0d371c0d331c0d391c0d3b1c0d3f1c0d3d1c0d411c0d431c0d451c0d471c0d491c0d4f1c0d511c0d4b1c0d4d1c0d531c0d571c0d591c0d551c0d5b1c0d5d1c0d5f1c0d611c0d651c0d6d1c0d631c0d6b1c0d671c0d691c0d6f1c0d711c0d731c0d7d1c0d751c0d771c0d791c0d7b1c0d7f1c0d811c0d871c0d831c0d851c0d891c0d8b1c0d8d1c0d8f1c0d931c0d911c0d951c0d971c0d991c0d9b1c0d9d1c0da11c0d9f1c0da31c0da51c0da71c0da91c0dab1c0dad1c0d")\ + X(126 , 1, 0x12D, KeyInsert , "Insert" , "" , 0 , 2 , '~', -1 , -1 , "01522d07522d11522d0f522d15522d17522d03522d0b522d0d522d19522d05522d09522d1b522d13522d21522d1f522d1d522d23522d25522d29522d27522d2b522d31522d2f522d2d522d35522d37522d33522d39522d3b522d3f522d3d522d41522d43522d45522d47522d49522d4f522d51522d4b522d4d522d53522d57522d59522d55522d5b522d5d522d5f522d61522d65522d6d522d63522d6b522d67522d69522d6f522d71522d73522d7d522d75522d77522d79522d7b522d7f522d81522d87522d83522d85522d89522d8b522d8d522d8f522d93522d91522d95522d97522d99522d9b522d9d522da1522d9f522da3522da5522da7522da9522dab522dad522d")\ + X( 127, 1, 0x02D, NumpadInsert , "Insert" , "" , 0 , 57425, 'u', -1 , -1 , "00822d06822d10822d0e822d14822d16822d02822d0a822d0c822d18822d04822d08822d1a822d12822d20822d1e822d1c822d22822d24822d28822d26822d2a822d30822d2e822d2c822d34822d36822d32822d38822d3a822d3e822d3c822d40822d42822d44822d46822d48822d4e822d50822d4a822d4c822d52822d56822d58822d54822d5a822d5c822d5e822d60822d64822d6c822d62822d6a822d66822d68822d6e822d70822d72822d7c822d74822d76822d78822d7a822d7e822d80822d86822d82822d84822d88822d8a822d8c822d8e822d92822d90822d94822d96822d98822d9a822d9c822da0822d9e822da2822da4822da6822da8822daa822dac822d")\ + X(128 , 1, 0x12E, KeyDelete , "Delete" , "" , 0 , 3 , '~', -1 , -1 , "01532e07532e11532e0f532e15532e17532e03532e0b532e0d532e19532e05532e09532e1b532e13532e21532e1f532e1d532e23532e25532e29532e27532e2b532e31532e2f532e2d532e35532e37532e33532e39532e3b532e3f532e3d532e41532e43532e45532e47532e49532e4f532e51532e4b532e4d532e53532e57532e59532e55532e5b532e5d532e5f532e61532e65532e6d532e63532e6b532e67532e69532e6f532e71532e73532e7d532e75532e77532e79532e7b532e7f532e81532e87532e83532e85532e89532e8b532e8d532e8f532e93532e91532e95532e97532e99532e9b532e9d532ea1532e9f532ea3532ea5532ea7532ea9532eab532ead532e")\ + X( 129, 1, 0x02E, NumpadDelete , "Delete" , "" , 0 , 57426, 'u', -1 , -1 , "00832e06832e10832e0e832e14832e16832e02832e0a832e0c832e18832e04832e08832e1a832e12832e20832e1e832e1c832e22832e24832e28832e26832e2a832e30832e2e832e2c832e34832e36832e32832e38832e3a832e3e832e3c832e40832e42832e44832e46832e48832e4e832e50832e4a832e4c832e52832e56832e58832e54832e5a832e5c832e5e832e60832e64832e6c832e62832e6a832e66832e68832e6e832e70832e72832e7c832e74832e76832e78832e7a832e7e832e80832e86832e82832e84832e88832e8a832e8c832e8e832e92832e90832e94832e96832e98832e9a832e9c832ea0832e9e832ea2832ea4832ea6832ea8832eaa832eac832e")\ + X(130 , 1, 0x10C, KeyClear , "Clear" , "" , 0 , 1 , 'E', -1 , -1 , "")\ + X( 131, 1, 0x00C, NumpadClear , "Clear" , "" , 0 , 57427, '~', -1 , -1 , "008c0c068c0c108c0c0e8c0c148c0c168c0c028c0c0a8c0c0c8c0c188c0c048c0c088c0c1a8c0c128c0c208c0c1e8c0c1c8c0c228c0c248c0c288c0c268c0c2a8c0c308c0c2e8c0c2c8c0c348c0c368c0c328c0c388c0c3a8c0c3e8c0c3c8c0c408c0c428c0c448c0c468c0c488c0c4e8c0c508c0c4a8c0c4c8c0c528c0c568c0c588c0c548c0c5a8c0c5c8c0c5e8c0c608c0c648c0c6c8c0c628c0c6a8c0c668c0c688c0c6e8c0c708c0c728c0c7c8c0c748c0c768c0c788c0c7a8c0c7e8c0c808c0c868c0c828c0c848c0c888c0c8a8c0c8c8c0c8e8c0c928c0c908c0c948c0c968c0c988c0c9a8c0c9c8c0ca08c0c9e8c0ca28c0ca48c0ca68c0ca88c0caa8c0cac8c0c")\ + X(132 , 1, 0x121, KeyPageUp , "PageUp" , "" , 0 , 5 , '~', -1 , -1 , "0149210749211149210f49211549211749210349210b49210d49211949210549210949211b49211349212149211f49211d49212349212549212949212749212b49213149212f49212d49213549213749213349213949213b49213f49213d49214149214349214549214749214949214f49215149214b49214d49215349215749215949215549215b49215d49215f49216149216549216d49216349216b49216749216949216f49217149217349217d49217549217749217949217b49217f49218149218749218349218549218949218b49218d49218f49219349219149219549219749219949219b49219d4921a149219f4921a34921a54921a74921a94921ab4921ad4921")\ + X( 133, 1, 0x021, NumpadPageUp , "PageUp" , "" , 0 , 57421, 'u', -1 , -1 , "0089210689211089210e89211489211689210289210a89210c89211889210489210889211a89211289212089211e89211c89212289212489212889212689212a89213089212e89212c89213489213689213289213889213a89213e89213c89214089214289214489214689214889214e89215089214a89214c89215289215689215889215489215a89215c89215e89216089216489216c89216289216a89216689216889216e89217089217289217c89217489217689217889217a89217e89218089218689218289218489218889218a89218c89218e89219289219089219489219689219889219a89219c8921a089219e8921a28921a48921a68921a88921aa8921ac8921")\ + X(134 , 1, 0x122, KeyPageDown , "PageDown" , "" , 0 , 6 , '~', -1 , -1 , "0151220751221151220f51221551221751220351220b51220d51221951220551220951221b51221351222151221f51221d51222351222551222951222751222b51223151222f51222d51223551223751223351223951223b51223f51223d51224151224351224551224751224951224f51225151224b51224d51225351225751225951225551225b51225d51225f51226151226551226d51226351226b51226751226951226f51227151227351227d51227551227751227951227b51227f51228151228751228351228551228951228b51228d51228f51229351229151229551229751229951229b51229d5122a151229f5122a35122a55122a75122a95122ab5122ad5122")\ + X( 135, 1, 0x022, NumpadPageDown , "PageDown" , "" , 0 , 57422, 'u', -1 , -1 , "0081220681221081220e81221481221681220281220a81220c81221881220481220881221a81221281222081221e81221c81222281222481222881222681222a81223081222e81222c81223481223681223281223881223a81223e81223c81224081224281224481224681224881224e81225081224a81224c81225281225681225881225481225a81225c81225e81226081226481226c81226281226a81226681226881226e81227081227281227c81227481227681227881227a81227e81228081228681228281228481228881228a81228c81228e81229281229081229481229681229881229a81229c8122a081229e8122a28122a48122a68122a88122aa8122ac8122")\ + X(136 , 1, 0x124, KeyHome , "Home" , "" , 0 , 7 , '~', -1 , -1 , "0147240747241147240f47241547241747240347240b47240d47241947240547240947241b47241347242147241f47241d47242347242547242947242747242b47243147242f47242d47243547243747243347243947243b47243f47243d47244147244347244547244747244947244f47245147244b47244d47245347245747245947245547245b47245d47245f47246147246547246d47246347246b47246747246947246f47247147247347247d47247547247747247947247b47247f47248147248747248347248547248947248b47248d47248f47249347249147249547249747249947249b47249d4724a147249f4724a34724a54724a74724a94724ab4724ad4724")\ + X( 137, 1, 0x024, NumpadHome , "Home" , "" , 0 , 57423, 'u', -1 , -1 , "0087240687241087240e87241487241687240287240a87240c87241887240487240887241a87241287242087241e87241c87242287242487242887242687242a87243087242e87242c87243487243687243287243887243a87243e87243c87244087244287244487244687244887244e87245087244a87244c87245287245687245887245487245a87245c87245e87246087246487246c87246287246a87246687246887246e87247087247287247c87247487247687247887247a87247e87248087248687248287248487248887248a87248c87248e87249287249087249487249687249887249a87249c8724a087249e8724a28724a48724a68724a88724aa8724ac8724")\ + X(138 , 1, 0x123, KeyEnd , "End" , "" , 0 , 8 , '~', -1 , -1 , "014f23074f23114f230f4f23154f23174f23034f230b4f230d4f23194f23054f23094f231b4f23134f23214f231f4f231d4f23234f23254f23294f23274f232b4f23314f232f4f232d4f23354f23374f23334f23394f233b4f233f4f233d4f23414f23434f23454f23474f23494f234f4f23514f234b4f234d4f23534f23574f23594f23554f235b4f235d4f235f4f23614f23654f236d4f23634f236b4f23674f23694f236f4f23714f23734f237d4f23754f23774f23794f237b4f237f4f23814f23874f23834f23854f23894f238b4f238d4f238f4f23934f23914f23954f23974f23994f239b4f239d4f23a14f239f4f23a34f23a54f23a74f23a94f23ab4f23ad4f23")\ + X( 139, 1, 0x023, NumpadEnd , "End" , "" , 0 , 57424, 'u', -1 , -1 , "008f23068f23108f230e8f23148f23168f23028f230a8f230c8f23188f23048f23088f231a8f23128f23208f231e8f231c8f23228f23248f23288f23268f232a8f23308f232e8f232c8f23348f23368f23328f23388f233a8f233e8f233c8f23408f23428f23448f23468f23488f234e8f23508f234a8f234c8f23528f23568f23588f23548f235a8f235c8f235e8f23608f23648f236c8f23628f236a8f23668f23688f236e8f23708f23728f237c8f23748f23768f23788f237a8f237e8f23808f23868f23828f23848f23888f238a8f238c8f238e8f23928f23908f23948f23968f23988f239a8f239c8f23a08f239e8f23a28f23a48f23a68f23a88f23aa8f23ac8f23")\ + X(140 , 1, 0x125, KeyLeftArrow , "LeftArrow" , "" , 0 , 1 , 'D', -1 , -1 , "014b25074b25114b250f4b25154b25174b25034b250b4b250d4b25194b25054b25094b251b4b25134b25214b251f4b251d4b25234b25254b25294b25274b252b4b25314b252f4b252d4b25354b25374b25334b25394b253b4b253f4b253d4b25414b25434b25454b25474b25494b254f4b25514b254b4b254d4b25534b25574b25594b25554b255b4b255d4b255f4b25614b25654b256d4b25634b256b4b25674b25694b256f4b25714b25734b257d4b25754b25774b25794b257b4b257f4b25814b25874b25834b25854b25894b258b4b258d4b258f4b25934b25914b25954b25974b25994b259b4b259d4b25a14b259f4b25a34b25a54b25a74b25a94b25ab4b25ad4b25")\ + X( 141, 1, 0x025, NumpadLeftArrow , "LeftArrow" , "" , 0 , 57417, 'u', -1 , -1 , "008b25068b25108b250e8b25148b25168b25028b250a8b250c8b25188b25048b25088b251a8b25128b25208b251e8b251c8b25228b25248b25288b25268b252a8b25308b252e8b252c8b25348b25368b25328b25388b253a8b253e8b253c8b25408b25428b25448b25468b25488b254e8b25508b254a8b254c8b25528b25568b25588b25548b255a8b255c8b255e8b25608b25648b256c8b25628b256a8b25668b25688b256e8b25708b25728b257c8b25748b25768b25788b257a8b257e8b25808b25868b25828b25848b25888b258a8b258c8b258e8b25928b25908b25948b25968b25988b259a8b259c8b25a08b259e8b25a28b25a48b25a68b25a88b25aa8b25ac8b25")\ + X(142 , 1, 0x127, KeyRightArrow , "RightArrow" , "" , 0 , 1 , 'C', -1 , -1 , "014d27074d27114d270f4d27154d27174d27034d270b4d270d4d27194d27054d27094d271b4d27134d27214d271f4d271d4d27234d27254d27294d27274d272b4d27314d272f4d272d4d27354d27374d27334d27394d273b4d273f4d273d4d27414d27434d27454d27474d27494d274f4d27514d274b4d274d4d27534d27574d27594d27554d275b4d275d4d275f4d27614d27654d276d4d27634d276b4d27674d27694d276f4d27714d27734d277d4d27754d27774d27794d277b4d277f4d27814d27874d27834d27854d27894d278b4d278d4d278f4d27934d27914d27954d27974d27994d279b4d279d4d27a14d279f4d27a34d27a54d27a74d27a94d27ab4d27ad4d27")\ + X( 143, 1, 0x027, NumpadRightArrow , "RightArrow" , "" , 0 , 57418, 'u', -1 , -1 , "008d27068d27108d270e8d27148d27168d27028d270a8d270c8d27188d27048d27088d271a8d27128d27208d271e8d271c8d27228d27248d27288d27268d272a8d27308d272e8d272c8d27348d27368d27328d27388d273a8d273e8d273c8d27408d27428d27448d27468d27488d274e8d27508d274a8d274c8d27528d27568d27588d27548d275a8d275c8d275e8d27608d27648d276c8d27628d276a8d27668d27688d276e8d27708d27728d277c8d27748d27768d27788d277a8d277e8d27808d27868d27828d27848d27888d278a8d278c8d278e8d27928d27908d27948d27968d27988d279a8d279c8d27a08d279e8d27a28d27a48d27a68d27a88d27aa8d27ac8d27")\ + X(144 , 1, 0x126, KeyUpArrow , "UpArrow" , "" , 0 , 1 , 'A', -1 , -1 , "0148260748261148260f48261548261748260348260b48260d48261948260548260948261b48261348262148261f48261d48262348262548262948262748262b48263148262f48262d48263548263748263348263948263b48263f48263d48264148264348264548264748264948264f48265148264b48264d48265348265748265948265548265b48265d48265f48266148266548266d48266348266b48266748266948266f48267148267348267d48267548267748267948267b48267f48268148268748268348268548268948268b48268d48268f48269348269148269548269748269948269b48269d4826a148269f4826a34826a54826a74826a94826ab4826ad4826")\ + X( 145, 1, 0x026, NumpadUpArrow , "UpArrow" , "" , 0 , 57419, 'u', -1 , -1 , "0088260688261088260e88261488261688260288260a88260c88261888260488260888261a88261288262088261e88261c88262288262488262888262688262a88263088262e88262c88263488263688263288263888263a88263e88263c88264088264288264488264688264888264e88265088264a88264c88265288265688265888265488265a88265c88265e88266088266488266c88266288266a88266688266888266e88267088267288267c88267488267688267888267a88267e88268088268688268288268488268888268a88268c88268e88269288269088269488269688269888269a88269c8826a088269e8826a28826a48826a68826a88826aa8826ac8826")\ + X(146 , 1, 0x128, KeyDownArrow , "DownArrow" , "" , 0 , 1 , 'B', -1 , -1 , "0150280750281150280f50281550281750280350280b50280d50281950280550280950281b50281350282150281f50281d50282350282550282950282750282b50283150282f50282d50283550283750283350283950283b50283f50283d50284150284350284550284750284950284f50285150284b50284d50285350285750285950285550285b50285d50285f50286150286550286d50286350286b50286750286950286f50287150287350287d50287550287750287950287b50287f50288150288750288350288550288950288b50288d50288f50289350289150289550289750289950289b50289d5028a150289f5028a35028a55028a75028a95028ab5028ad5028")\ + X( 147, 1, 0x028, NumpadDownArrow , "DownArrow" , "" , 0 , 57420, 'u', -1 , -1 , "0080280680281080280e80281480281680280280280a80280c80281880280480280880281a80281280282080281e80281c80282280282480282880282680282a80283080282e80282c80283480283680283280283880283a80283e80283c80284080284280284480284680284880284e80285080284a80284c80285280285680285880285480285a80285c80285e80286080286480286c80286280286a80286680286880286e80287080287280287c80287480287680287880287a80287e80288080288680288280288480288880288a80288c80288e80289280289080289480289680289880289a80289c8028a080289e8028a28028a48028a68028a88028aa8028ac8028")\ + X(148 , 1, 0x030, Key0 , "0" , "0" , 0x30 , 48 , 'u', '0' , '0' , "000b30060b30100b300e0b30140b30160b30020b300a0b300c0b30180b30040b30080b301a0b30120b30200b301e0b301c0b30220b30240b30280b30260b302a0b30300b302e0b302c0b30340b30360b30320b30380b303a0b303e0b303c0b30400b30420b30440b30460b30480b304e0b30500b304a0b304c0b30520b30560b30580b30540b305a0b305c0b305e0b30600b30640b306c0b30620b306a0b30660b30680b306e0b30700b30720b307c0b30740b30760b30780b307a0b307e29307e0bc0800b30860b30820b30840b30880b308a0b308c0b308e0bc0920b30900b30940b30960b30980b309a0b309c0b30a00b309e0b30a20b30a40b30a60b30a82d30aa3430ac0b30")\ + X( 149, 1, 0x060, Numpad0 , "0" , "0" , 0x30 , 57399, 'u', '0' , '0' , "0052600652601052600e52601452601652600252600a52600c52601852600452600852601a52601252602052601e52601c52602252602452602852602652602a52603052602e52602c52603452603652603252603852603a52603e52603c52604052604252604452604652604852604e52605052604a52604c52605252605652605852605452605a52605c52605e52606052606452606c52606252606a52606652606852606e52607052607252607c52607452607652607852607a52607e52608052608652608252608452608852608a52608c52608e52609252609052609452609652609852609a52609c5260a052609e5260a25260a45260a65260a85260aa5260ac5260")\ + X(150 , 1, 0x031, Key1 , "1" , "1" , 0x31 , 49 , 'u', '1' , '1' , "0002310602311002310e02311402311602310202310a02310c02311802310402310802311a02311202312002311e02311c02312202312402312802312602312a02313002312e02312c02313402313602313202313802313a02313e02313c02314002314202314402314602314802314e02315002314a02314c02315202315602315802315402315a02315c02315e02316002316402316c02316202316a02316602316802316e02317002317202317c02317402317602317802317a02317e02318002318602318202318402318802318a02318c02318e02319202319002319402319602319802319a02319c0231a002319e0231a20231a40231a60231a80231aa0d31ac0231")\ + X( 151, 1, 0x061, Numpad1 , "1" , "1" , 0x31 , 57400, 'u', '1' , '1' , "004f61064f61104f610e4f61144f61164f61024f610a4f610c4f61184f61044f61084f611a4f61124f61204f611e4f611c4f61224f61244f61284f61264f612a4f61304f612e4f612c4f61344f61364f61324f61384f613a4f613e4f613c4f61404f61424f61444f61464f61484f614e4f61504f614a4f614c4f61524f61564f61584f61544f615a4f615c4f615e4f61604f61644f616c4f61624f616a4f61664f61684f616e4f61704f61724f617c4f61744f61764f61784f617a4f617e4f61804f61864f61824f61844f61884f618a4f618c4f618e4f61924f61904f61944f61964f61984f619a4f619c4f61a04f619e4f61a24f61a44f61a64f61a84f61aa4f61ac4f61")\ + X(152 , 1, 0x032, Key2 , "2" , "2" , 0x32 , 50 , 'u', '2' , '\0' , "0003320603321003320e03321403321603320203320a03320c03321803320403320803321a03321203322003321e03321c03322203322403322803322603322a03323003322e03322c03323403323603323203323803323a03323e03323c03324003324203324403324603324803324e03325003324a03324c03325203325603325803325403325a03325c03325e03326003326403326c03326203326a03326603326803326e03327003327203327c03327403327603327803327a03327e03328003328603328203328403328803328a03328c03328e03329203329003329403329603329803329a03329c0332a003329e0332a20332a40332a60332a80332aa0c32ac0332")\ + X( 153, 1, 0x062, Numpad2 , "2" , "2" , 0x32 , 57401, 'u', '2' , '\0' , "0050620650621050620e50621450621650620250620a50620c50621850620450620850621a50621250622050621e50621c50622250622450622850622650622a50623050622e50622c50623450623650623250623850623a50623e50623c50624050624250624450624650624850624e50625050624a50624c50625250625650625850625450625a50625c50625e50626050626450626c50626250626a50626650626850626e50627050627250627c50627450627650627850627a50627e50628050628650628250628450628850628a50628c50628e50629250629050629450629650629850629a50629c5062a050629e5062a25062a45062a65062a85062aa5062ac5062")\ + X(154 , 1, 0x033, Key3 , "3" , "3" , 0x33 , 51 , 'u', '3' , '\x1b', "0004330604331004330e04331404331604330204330a04330c04331804330404330804331a04331204332004331e04331c04332204332404332804332604332a04333004332e04332c04333404333604333204333804333a04333e04333c04334004334204334404334604334804334e04335004334a04334c04335204335604335804335404335a04335c04335e04336004336404336c04336204336a04336604336804336e04337004337204337c04337404337604337804337a04337e04338004338604338204338404338804338a04338c04338e04339204339004339404339604339804339a04339c0433a004339e0433a20433a40433a60433a80433aa0b33ac0433")\ + X( 155, 1, 0x063, Numpad3 , "3" , "3" , 0x33 , 57402, 'u', '3' , '\x1b', "0051630651631051630e51631451631651630251630a51630c51631851630451630851631a51631251632051631e51631c51632251632451632851632651632a51633051632e51632c51633451633651633251633851633a51633e51633c51634051634251634451634651634851634e51635051634a51634c51635251635651635851635451635a51635c51635e51636051636451636c51636251636a51636651636851636e51637051637251637c51637451637651637851637a51637e51638051638651638251638451638851638a51638c51638e51639251639051639451639651639851639a51639c5163a051639e5163a25163a45163a65163a85163aa5163ac5163")\ + X(156 , 1, 0x034, Key4 , "4" , "4" , 0x34 , 52 , 'u', '4' , '\x1c', "0005340605341005340e05341405341605340205340a05340c05341805340405340805341a05341205342005341e05341c05342205342405342805342605342a05343005342e05342c05343405343605343205343805343a05343e05343c05344005344205344405344605344805344e05345005344a05344c05345205345605345805345405345a05345c05345e05346005346405346c05346205346a05346605346805346e05347005347205347c05347405347605347805347a05347e05348005348605348205348405348805348a05348c05348e05349205349005349405349605349805349a05349c0534a005349e0534a20534a40534a60534a80534aa0a34ac0534")\ + X( 157, 1, 0x064, Numpad4 , "4" , "4" , 0x34 , 57403, 'u', '4' , '\x1c', "004b64064b64104b640e4b64144b64164b64024b640a4b640c4b64184b64044b64084b641a4b64124b64204b641e4b641c4b64224b64244b64284b64264b642a4b64304b642e4b642c4b64344b64364b64324b64384b643a4b643e4b643c4b64404b64424b64444b64464b64484b644e4b64504b644a4b644c4b64524b64564b64584b64544b645a4b645c4b645e4b64604b64644b646c4b64624b646a4b64664b64684b646e4b64704b64724b647c4b64744b64764b64784b647a4b647e4b64804b64864b64824b64844b64884b648a4b648c4b648e4b64924b64904b64944b64964b64984b649a4b649c4b64a04b649e4b64a24b64a44b64a64b64a84b64aa4b64ac4b64")\ + X(158 , 1, 0x035, Key5 , "5" , "5" , 0x35 , 53 , 'u', '5' , '\x1d', "0006350606351006350e06351406351606350206350a06350c06351806350406350806351a06351206352006351e06351c06352206352406352806352606352a06353006352e06352c06353406353606353206353806353a06353e06353c06354006354206354406354606354806354e06355006354a06354c06355206355606355806355406355a06355c06355e06356006356406356c06356206356a06356606356806356e06357006357206357c06357406357606357806357a06357e06358006358606358206358406358806358a06358c06358e06359206359006359406359606359806359a06359c0635a006359e0635a20635a40635a60635a81035aa1a35ac0635")\ + X( 159, 1, 0x065, Numpad5 , "5" , "5" , 0x35 , 57404, 'u', '5' , '\x1d', "004c65064c65104c650e4c65144c65164c65024c650a4c650c4c65184c65044c65084c651a4c65124c65204c651e4c651c4c65224c65244c65284c65264c652a4c65304c652e4c652c4c65344c65364c65324c65384c653a4c653e4c653c4c65404c65424c65444c65464c65484c654e4c65504c654a4c654c4c65524c65564c65584c65544c655a4c655c4c655e4c65604c65644c656c4c65624c656a4c65664c65684c656e4c65704c65724c657c4c65744c65764c65784c657a4c657e4c65804c65864c65824c65844c65884c658a4c658c4c658e4c65924c65904c65944c65964c65984c659a4c659c4c65a04c659e4c65a24c65a44c65a64c65a84c65aa4c65ac4c65")\ + X(160 , 1, 0x036, Key6 , "6" , "6" , 0x36 , 54 , 'u', '6' , '\x1e', "0007360607361007360e07361407361607360207360a07360c07361807360407360807361a07361207362007361e07361c07362207362407362807362607362a07363007362e07362c07363407363607363207363807363a07363e07363c07364007364207364407364607364807364e07365007364a07364c07365207365607365807365407365a07365c07365e07366007366407366c07366207366a07366607366807366e07367007367207367c07367407367607367807367a07367e07368007368607368207368407368807368a07368c07368e07369207369007369407369607369807369a07369c0736a007369e0736a20736a40736a60736a81136aa1936ac0736")\ + X( 161, 1, 0x066, Numpad6 , "6" , "6" , 0x36 , 57405, 'u', '6' , '\x1e', "004d66064d66104d660e4d66144d66164d66024d660a4d660c4d66184d66044d66084d661a4d66124d66204d661e4d661c4d66224d66244d66284d66264d662a4d66304d662e4d662c4d66344d66364d66324d66384d663a4d663e4d663c4d66404d66424d66444d66464d66484d664e4d66504d664a4d664c4d66524d66564d66584d66544d665a4d665c4d665e4d66604d66644d666c4d66624d666a4d66664d66684d666e4d66704d66724d667c4d66744d66764d66784d667a4d667e4d66804d66864d66824d66844d66884d668a4d668c4d668e4d66924d66904d66944d66964d66984d669a4d669c4d66a04d669e4d66a24d66a44d66a64d66a84d66aa4d66ac4d66")\ + X(162 , 1, 0x037, Key7 , "7" , "7" , 0x37 , 55 , 'u', '7' , '\x1f', "0008370608371008370e08371408371608370208370a08370c08371808370408370808371a08371208372008371e08371c08372208372408372808372608372a08373008372e08372c08373408373608373208373808373a08373e08373c08374008374208374408374608374808374e08375008374a08374c08375208375608375808375408375a08375c08375e08376008376408376c08376208376a08376608376808376e08377008377208377c08377408377608377808377a08377e08378008378608378208378408378808378a08378c08378e08379208379008379408379608379808379a08379c0837a008379e0837a20837a40837a60837a81e37aa2837ac0837")\ + X( 163, 1, 0x067, Numpad7 , "7" , "7" , 0x37 , 57406, 'u', '7' , '\x1f', "0047670647671047670e47671447671647670247670a47670c47671847670447670847671a47671247672047671e47671c47672247672447672847672647672a47673047672e47672c47673447673647673247673847673a47673e47673c47674047674247674447674647674847674e47675047674a47674c47675247675647675847675447675a47675c47675e47676047676447676c47676247676a47676647676847676e47677047677247677c47677447677647677847677a47677e47678047678647678247678447678847678a47678c47678e47679247679047679447679647679847679a47679c4767a047679e4767a24767a44767a64767a84767aa4767ac4767")\ + X(164 , 1, 0x038, Key8 , "8" , "8" , 0x38 , 56 , 'u', '8' , '\x7f', "0009380609381009380e09381409381609380209380a09380c09381809380409380809381a09381209382009381e09381c09382209382409382809382609382a09383009382e09382c09383409383609383209383809383a09383e09383c09384009384209384409384609384809384e09385009384a09384c09385209385609385809385409385a09385c09385e09386009386409386c09386209386a09386609386809386e09387009387209387c09387409387609387809387a09387e09388009388609388209388409388809388a09388c09388e09389209389009389409389609389809389a09389c0938a009389e0938a20938a40938a60938a81f38aa2738ac0938")\ + X( 165, 1, 0x068, Numpad8 , "8" , "8" , 0x38 , 57407, 'u', '8' , '\x7f', "0048680648681048680e48681448681648680248680a48680c48681848680448680848681a48681248682048681e48681c48682248682448682848682648682a48683048682e48682c48683448683648683248683848683a48683e48683c48684048684248684448684648684848684e48685048684a48684c48685248685648685848685448685a48685c48685e48686048686448686c48686248686a48686648686848686e48687048687248687c48687448687648687848687a48687e48688048688648688248688448688848688a48688c48688e48689248689048689448689648689848689a48689c4868a048689e4868a24868a44868a64868a84868aa4868ac4868")\ + X(166 , 1, 0x039, Key9 , "9" , "9" , 0x39 , 57 , 'u', '9' , '9' , "000a39060a39100a390e0a39140a39160a39020a390a0a390c0a39180a39040a39080a391a0a39120a39200a391e0a391c0a39220a39240a39280a39260a392a0a39300a392e0a392c0a39340a39360a39320a39380a393a0a393e0a393c0a39400a39420a39440a39460a39480a394e0a39500a394a0a394c0a39520a39560a39580a39540a395a0a395c0a395e0a39600a39640a396c0a39620a396a0a39660a39680a396e0a39700a39720a397c0a39740a39760a39780a397a0a397e0a39800a39860a39820a39840a39880a398a0a398c0a398e0a39920a39900a39940a39960a39980a399a0a399c0a39a00a399e0a39a20a39a40a39a60a39a82c39aa3539ac0a39")\ + X( 167, 1, 0x069, Numpad9 , "9" , "9" , 0x39 , 57408, 'u', '9' , '9' , "0049690649691049690e49691449691649690249690a49690c49691849690449690849691a49691249692049691e49691c49692249692449692849692649692a49693049692e49692c49693449693649693249693849693a49693e49693c49694049694249694449694649694849694e49695049694a49694c49695249695649695849695449695a49695c49695e49696049696449696c49696249696a49696649696849696e49697049697249697c49697449697649697849697a49697e49698049698649698249698449698849698a49698c49698e49699249699049699449699649699849699a49699c4969a049699e4969a24969a44969a64969a84969aa4969ac4969")\ + X(168 , 1, 0 , KeyMultiply , "*" , "*" , 0x2A , 42 , 'u', '*' , '*' , "641bba8c0cdf962bdc982bdc9a2bdc9c2bdc")\ + X( 169, 1, 0x06A, NumpadMultiply , "*" , "*" , 0x2A , 57411, 'u', '*' , '*' , "00376a06376a10376a0e376a14376a16376a02376a0a376a0c376a18376a04376a08376a1a376a12376a20376a1e376a1c376a22376a24376a28376a26376a2a376a30376a2e376a2c376a34376a36376a32376a38376a3a376a3e376a3c376a40376a42376a44376a46376a48376a4e376a50376a4a376a4c376a52376a56376a58376a54376a5a376a5c376a5e376a60376a64376a6c376a62376a6a376a66376a68376a6e376a70376a72376a7c376a74376a76376a78376a7a376a7e376a80376a86376a82376a84376a88376a8a376a8c376a8e376a92376a90376a94376a96376a98376a9a376a9c376aa0376a9e376aa2376aa4376aa6376aa8376aaa376aac376a")\ + X(170 , 1, 0 , KeySlash , "/" , "/" , 0x2F , 47 , 'u', '/' , '\x1f', "0035bf0635bf1035bf0e35bf1435bf1635bf0235bf0a35bf0c35bf1835bf0435bf0835bf1a35bf1235bf2035bf1e35bf1c35bf2235bf2435bf2835bf2635bf2a35bf3035bf2e35bf2c35bf3435bf3635bf3235bf3835bf3c73c14035bf4229de640cdb9235bf9a28dba41abfa60cbba80bbfaa04bf")\ + X( 171, 1, 0x16F, NumpadDivide , "/" , "/" , 0x2F , 57410, 'u', '/' , '\x1f', "01356f07356f11356f0f356f15356f17356f03356f0b356f0d356f19356f05356f09356f1b356f13356f21356f1f356f1d356f23356f25356f29356f27356f2b356f31356f2f356f2d356f35356f37356f33356f39356f3b356f3f356f3d356f41356f43356f45356f47356f49356f4f356f51356f4b356f4d356f53356f57356f59356f55356f5b356f5d356f5f356f61356f65356f6d356f63356f6b356f67356f69356f6f356f71356f73356f7d356f75356f77356f79356f7b356f7f356f81356f87356f83356f85356f89356f8b356f8d356f8f356f93356f91356f95356f97356f99356f9b356f9d356fa1356f9f356fa3356fa5356fa7356fa9356fab356fad356f")\ + X(172 , 1, 0 , KeyPlus , "Plus" , "+" , 0x2B , 43 , 'u', '+' , '+' , "440cbb461abb480dbb4e0cbb501bbb4a0cbb4c0cbb560cbd5a1bbb5c1bbb5e1abb600cbb6427bb6c0cbb620cbb6a1bbb660cbb681bbb702bbf720cbb7c0dbb761bbb781bbb7a1bbb801bbb861bbb821bbb841bbb900dbb940cbd9a1bbba629c0")\ + X( 173, 1, 0x06B, NumpadPlus , "Plus" , "+" , 0x2B , 57413, 'u', '+' , '+' , "004e6b064e6b104e6b0e4e6b144e6b164e6b024e6b0a4e6b0c4e6b184e6b044e6b084e6b1a4e6b124e6b204e6b1e4e6b1c4e6b224e6b244e6b284e6b264e6b2a4e6b304e6b2e4e6b2c4e6b344e6b364e6b324e6b384e6b3a4e6b3e4e6b3c4e6b404e6b424e6b444e6b464e6b484e6b4e4e6b504e6b4a4e6b4c4e6b524e6b564e6b584e6b544e6b5a4e6b5c4e6b5e4e6b604e6b644e6b6c4e6b624e6b6a4e6b664e6b684e6b6e4e6b704e6b724e6b7c4e6b744e6b764e6b784e6b7a4e6b7e4e6b804e6b864e6b824e6b844e6b884e6b8a4e6b8c4e6b8e4e6b924e6b904e6b944e6b964e6b984e6b9a4e6b9c4e6ba04e6b9e4e6ba24e6ba44e6ba64e6ba84e6baa4e6bac4e6b")\ + X(174 , 1, 0 , KeyMinus , "Minus" , "-" , 0x2D , 45 , 'u', '-' , '-' , "000cbd060cbd100cbd0e0cbd140cbd160cbd020cbd0a0cbd0c0cbd180cbd040cbd080cbd1a0cbd120cbd200cbd1e0cbd1c0cbd220cbd240cbd280cbd260cbd2a0cbd300cbd2e0cbd2c0cbd340cbd360cbd320cbd380cbd3a0cbd3e0cbd3c0cbd400cbd420cbd4435bd4635bd4835bd4e35bd5035bd4a35bd4c35bd5235bf5635dd5835bf540cbd5a35bd5c35bd5e35bd6035bd6435bd6c35bd6235bd6a35bd6635bd6835bd6e35bd700ddb7235bd7c35bd7435bd7635bd7835bd7a35bd7e35bd8035bd8635bd8235bd8435bd8835bd8a35bd8c0dbd8e35bf9256e2920cbd9035bd9435bf9a1abda00dbd9e0dbda428bda60dbda828bdaa1ebd")\ + X( 175, 1, 0x06D, NumpadMinus , "Minus" , "-" , 0x2D , 57412, 'u', '-' , '-' , "004a6d064a6d104a6d0e4a6d144a6d164a6d024a6d0a4a6d0c4a6d184a6d044a6d084a6d1a4a6d124a6d204a6d1e4a6d1c4a6d224a6d244a6d284a6d264a6d2a4a6d304a6d2e4a6d2c4a6d344a6d364a6d324a6d384a6d3a4a6d3e4a6d3c4a6d404a6d424a6d444a6d464a6d484a6d4e4a6d504a6d4a4a6d4c4a6d524a6d564a6d584a6d544a6d5a4a6d5c4a6d5e4a6d604a6d644a6d6c4a6d624a6d6a4a6d664a6d684a6d6e4a6d704a6d724a6d7c4a6d744a6d764a6d784a6d7a4a6d7e4a6d804a6d864a6d824a6d844a6d884a6d8a4a6d8c4a6d8e4a6d924a6d904a6d944a6d964a6d984a6d9a4a6d9c4a6da04a6d9e4a6da24a6da44a6da64a6da84a6daa4a6dac4a6d")\ + X(176 , 1, 0 , KeyEqual , "=" , "=" , 0x3D , 61 , 'u', '=' , '=' , "000dbb060dbb100dbb0e0dbb140dbb160dbb020dbb0a0dbb0c0dbb180dbb040dbb080dbb1a0dbb120dbb200dbb1c0dbb220dbb240dbb280dbb260dbb2a0dbb300dbb2e0dbb2c0dbb340dbb360dbb380dbb3a0dbb3e0dbb3c0dbb400dbb420dbb520cbd580cbd5435df6e0cbb740cbf920dbb960dbb980dbb9c0dbba035bb9e35bba41bbba81bbbaa1bbbac0cbd")\ + X( 177, 1, 0x092, NumpadEqual , "=" , "=" , 0x3D , 57415, 'u', '=' , '=' , "")\ + X(178 , 1, 0 , KeyPeriod , "." , "." , 0x2E , 46 , 'u', '.' , '.' , "0034be0634be1034be0e34be1434be1634be0234be0a34be0c34be1834be0434be0834be1a34be1234be2034be1e34be1c34be2234be2434be2834be2634be2a34be3034be2e34be2c34be3434be3634be3234be3834be3a34be3e34be3c34be4034be4234be4434be4634be4834be4e34be5034be4a34be4c34be5234be5634be5834be5434be5a34be5c34be5e34be6034be6434be6c34be6234be6a34be6634be6834be6e34be7034be7234be7c34be7434be7634be7834be7a34be7e34be8034be8634be8234be8434be8834be8a34be8c35be8e34be9234be9034be9434be9a32bea412bea634bea813beaa18beac2fbe")\ + X( 179, 1, 0x06E, NumpadDecimal , "." , "." , 0x2E , 57409, 'u', '.' , '.' , "00536e06536e10536e0e536e14536e16536e02536e0a536e0c536e18536e04536e08536e1a536e12536e20536e1e536e1c536e22536e24536e28536e26536e2a536e30536e2e536e2c536e34536e36536e32536e38536e3a536e3e536e3c536e40536e42536e44536e46536e48536e4e536e50536e4a536e4c536e52536e56536e58536e54536e5a536e5c536e5e536e60536e64536e6c536e62536e6a536e66536e68536e6e536e70536e72536e7c536e74536e76536e78536e7a536e7e536e80536e86536e82536e84536e88536e8a536e8c536e8e536e92536e90536e94536e96536e98536e9a536e9c536ea0536e9e536ea2536ea4536ea6536ea8536eaa536eac536e")\ + X(180 , 1, 0 , KeyComma , "," , "," , 0x2C , 44 , 'u', ',' , ',' , "0033bc0633bc1033bc0e33bc1433bc1633bc0233bc0a33bc0c33bc1833bc0433bc0833bc1a33bc1233bc2033bc1e33bc1c33bc2233bc2433bc2833bc2633bc2a33bc3033bc2e33bc2c33bc3433bc3633bc3233bc3833bc3a33bc3e33bc3c33bc4033bc4233bc4433bc4633bc4833bc4e33bc5033bc4a33bc4c33bc5233bc5633bc5833bc5433bc5a33bc5c33bc5e33bc6033bc6433bc6c33bc6233bc6a33bc6633bc6833bc6e33bc7033bc7233bc7c33bc7433bc7633bc7833bc7a33bc7e33bc8033bc8633bc8233bc8433bc8833bc8a33bc8c2bbc8e33bc9233bc9033bc9433bc9632bc9832bc9a33bc9c32bca032bc9e32bca411bca635bca82fbcaa33bcac22bc")\ + X( 181, 1, 0x0C2, NumpadPoint , "," , "," , 0x2C , 57416, 'u', ',' , ',' , "007ec2067ec2107ec20e7ec2147ec2167ec2027ec20a7ec20c7ec2187ec2047ec2087ec21a7ec2127ec2207ec21e7ec21c7ec2227ec2247ec2287ec2267ec22a7ec2307ec22e7ec22c7ec2347ec2367ec2327ec2387ec23a7ec23e7ec23c7ec2407ec2427ec2447ec2467ec2487ec24e7ec2507ec24a7ec24c7ec2527ec2567ec2587ec2547ec25a7ec25c7ec25e7ec2607ec2647ec26c7ec2627ec26a7ec2667ec2687ec26e7ec2707ec2727ec27c7ec2747ec2767ec2787ec27a7ec27e7ec2807ec2867ec2827ec2847ec2887ec28a7ec28c7ec28e7ec2927ec2907ec2947ec2967ec2987ec29a7ec29c7ec2a07ec29e7ec2a27ec2a47ec2a67ec2a87ec2aa7ec2ac7ec2")\ + X(182 , 1, 0 , Colon , ":" , ":" , 0x3A , 58 , 'u', ':' , ':' , "9634bf9834bf9a34bf9c34bfa034bf9e34bf")\ + X(184 , 1, 0 , Semicolon , ";" , ";" , 0x3B , 59 , 'u', ';' , ';' , "0027ba0627ba1027ba0e27ba1427ba1627ba0227ba0a27ba0c27ba1827ba0427ba0827ba1a27ba1227ba2027ba1e27ba1c27ba2227ba2427ba2827ba2627ba2a27ba3027ba2e27ba2c27ba3427ba3627ba3227ba3a27ba3e27ba3c35bf4227ba5229c05829c06e29c07429c09219ba9633be9833be9a35ba9c33bea033be9e33bea42cbaa81abaaa10ba")\ + X(186 , 1, 0 , TurnedComma , "ʻ" , "ʻ" , 0x02BB, 699 , 'u', -1 , -1 , "2028de")\ + X(188 , 1, 0 , OpenSquareBracket , "[" , "[" , 0x5B , 91 , 'u', '[' , '\x1b', "001adb061adb101adb0e1adb141adb161adb021adb0a1adb0c1adb181adb041adb081adb1a1adb121adb201adb1e1adb1c1adb221adb241adb281adb261adb2a1adb301adb2e1adb2c1adb3c1bdd4028de481adb921adba40cdba80cdbaa02db")\ + X(190 , 1, 0 , CloseSquareBracket , "]" , "]" , 0x5D , 93 , 'u', ']' , '\x1d', "001bdd061bdd101bdd0e1bdd141bdd161bdd021bdd0a1bdd0c1bdd181bdd041bdd081bdd1a1bdd121bdd201bdd1e1bdd1c1bdd221bdd241bdd281bdd261bdd2a1bdd301bdd2e1bdd2c1bdd3c2bdc402bdc460ddb481bdd6456e2921bdd9429c0a40ddda80dddaa03dd")\ + X(192 , 1, 0 , OpenCurlyBracket , "{" , "{" , 0x7B , 123 , 'u', '{' , 27 , "5028de6a28de")\ + X(194 , 1, 0 , CloseCurlyBracket , "}" , "}" , 0x7D , 125 , 'u', '}' , 29 , "461bdd502bbf6a2bbf")\ + X(196 , 1, 0 , CloseRoundBracket , ")" , ")" , 0x29 , 41 , 'u', ')' , ')' , "521bdd6e1bdd960cdb980cdb9c0cdba00cdb9e0cdb")\ + X(198 , 1, 0 , LessThan , "<" , "<" , 0x3C , 60 , 'u', '<' , '<' , "2429c03a2bdc4056e24456e24656e24856e24e56e25056e24a56e24c56e25656e25456e25a56e25c56e25e56e26056e2642bdc6c56e26256e26a56e26656e26856e27056e27256e27c56e27656e27856e27a56e28056e28656e28256e28856e28a56e28c56e29056e29456e29656e29856e29a56e29c56e2a056e29e56e2a256e2a656e2")\ + X(200 , 1, 0 , BackSlash , "\\" , "\\" , 0x5C , 92 , 'u', '\\' , '\x1c', "002bdc0056e2062bdc0656e2102bdc1056e20e56e20e2bdc1456e2142bdc162bdc1656e2022bdc0256e20a2bdc0a56e20c2bdc0c56e21856e2182bdc042bdc0456e20856e2082bdc1a2bdc1a56e2122bdc1256e2202bdc2056e21e56e21e2bdc1c2bdc1c56e2222bdc2256e22456e2282bde2856dc262bde2656dc2a56dc3056dc2e56dc2c56dc3256e2322bdc3856e23c56e24029c04629c04829c04a0ddb5256e25a29dc5c29dc5e29dc660ddb6e56e2922bdca42bdca456e2a82bdca856e2aa56e2aa2bdc")\ + X(202 , 1, 0 , Underscore , "_" , "_" , 0x5F , 95 , 'u', '_' , '\x1f', "0273e2")\ + X(204 , 1, 0 , VerticalBar , "|" , "|" , 0x7C , 124 , 'u', '|' , 28 , "5029dc4a29dc6a29dc6629dc")\ + X(206 , 1, 0 , DivisionSign , "÷" , "÷" , 0xF7 , 247 , 'u', -1 , -1 , "541add")\ + X(208 , 1, 0 , OneHalf , "½" , "½" , 0xBD , 189 , 'u', -1 , -1 , "4e29dc6029dc6c29dc")\ + X(210 , 1, 0 , SuperscriptTwo , "²" , "²" , 0xB2 , 178 , 'u', -1 , -1 , "9629de9c29dea029de9e29de")\ + X(212 , 1, 0 , DegreeSign , "°" , "°" , 0xB0 , 176 , 'u', -1 , -1 , "3e29de640dbf7029dc")\ + X(214 , 1, 0 , NumeroSign , "º" , "º" , 0xBA , 186 , 'u', -1 , -1 , "5e28de6829dc")\ + X(216 , 1, 0 , Acute , "´" , "´" , 0xB4 , 180 , 'u', -1 , -1 , "3c1adb440ddb4827ba4e0ddb501aba4c0ddb520dbb560dbb580dbb542bbf5e1bba600ddb6428c06c0ddb620ddb6a1aba6828de6e0dbf7028de740ddf760ddd780ddd7a0ddd800ddd860ddd820ddd840ddd")\ + X(218 , 1, 0 , Caron , "ˇ" , "ˇ" , 0x02C7, 780 , 'u', -1 , -1 , "5629de")\ + X(220 , 1, 0 , Cedilla , "¸" , "¸" , 0xB8 , 184 , 'u', -1 , -1 , "3a1bdd9029c0")\ + X(222 , 1, 0 , Circumflex , "^" , "^" , 0x5E , 94 , 'u', '^' , 30 , "3a1adb3e1adb421adb4828de7629dc7829dc7a29dc8029dc8629dc8229dc8429dc880ddd8a0ddd961add981add9a0ddd9c1adda01add9e1addac15db")\ + X(224 , 1, 0 , Ogonek , "˛" , "˛" , 0x02DB, 731 , 'u', -1 , -1 , "7229c0")\ + X(226 , 1, 0 , Cross , "˟" , "˟" , 0x02DF, 735 , 'u', -1 , -1 , "8456e2")\ + X(228 , 1, 0 , Tilde , "~" , "~" , 0x7E , 771 , 'u', '~' , 30 , "3c28de5e2bbf")\ + X(230 , 1, 0 , Tonos , "΄" , "΄" , 0x0384, 900 , 'u', -1 , -1 , "4627ba")\ + X(232 , 1, 0 , Umlaut , "¨" , "¨" , 0xA8 , 168 , 'u', -1 , -1 , "441bba4628de4e1bba4a1bba4c1bba522bdc540ddb601bba641add621bba661bba6e2bdc881bc08a1bc0")\ + X(234 , 1, 0 , BackQuote , "`" , "`" , 0x60 , 96 , 'u', '`' , '`' , "0029c00629c01029c00e29c01429c01629c00229c00a29c00c29c01829c00429c00829c01a29c01229c02029c01e29c01c29c02229c0242bdc2829df2629df2a29df3029df2e29df2c29df3229c03a28c0482bdc541bba681aba9229c0a229dca429c0a829c0aa29c0")\ + X(236 , 1, 0 , SingleQuote , "'" , "'" , 0x27 , 39 , 'u', '\'' , '\'' , "0028de0628de1028de0e28de1428de1628de0228de0a28de0c28de1828de0428de0828de1a28de1228de1e28de1c28de2228de2428de2828c02628c02a28c03028c02e28c02c28c03428de3628de3228de3c29c0442bbf460cbf480cbf4e2bbf500cdb4a2bbf4c2bbf562bdc5429dc5a0cdb5c0cdb5e0cdb602bbf6c2bbf622bbf6a0cdb662bbf680cdb701bba720dbf7c0cbf880cdb8a0cdb9228de900cbf940dbb9a0cdea410dea835deaa2cde")\ + X(238 , 1, 0 , DoubleQuote , "\"" , "\"" , 0x22 , 34 , 'u', '"' , '"' , "8c29c0")\ + X(240 , 1, 0 , SingleRightQuote , "’" , "’" , 0x2019, 8217 , 'u', -1 , -1 , "ac31c0")\ + X(242 , 1, 0 , SingleLowQuote , "‚" , "‚" , 0x201A, 8218 , 'u', -1 , -1 , "7c29c0")\ + X(244 , 1, 0 , DoubleLowQuote , "„" , "„" , 0x201E, 8222 , 'u', -1 , -1 , "3829c0")\ + X(246 , 1, 0 , LeftGuillemet , "«" , "«" , 0xAB , 171 , 'u', -1 , -1 , "3a56e25e0ddd")\ + X(248 , 1, 0 , Hash , "#" , "#" , 0x23 , 35 , 'u', '#' , '#' , "2a2bde302bde2e2bde2c2bde362bdc3a29de462bdc782bbf802bbf862bbf822bbf842bbf")\ + X(250 , 1, 0 , AtSign , "@" , "@" , 0x40 , 64 , 'u', '@' , '\0' , "401bdd6429de9a29c0")\ + X(252 , 1, 0 , Exclamation , "!" , "!" , 0x21 , 33 , 'u', '!' , '!' , "9635df9835df9c35df")\ + X(254 , 1, 0 , InvertedExclamation, "¡" , "¡" , 0xA1 , 161 , 'u', -1 , -1 , "680ddd")\ + X(256 , 1, 0 , QuestionMark , "?" , "?" , 0x3F , 63 , 'u', '?' , 127 , "a20cbb")\ + X(258 , 1, 0 , InvertedQuestion , "¿" , "¿" , 0xBF , 191 , 'u', -1 , -1 , "500ddd6a0ddd")\ + X(260 , 1, 0 , Paragraph , "§" , "§" , 0xA7 , 167 , 'u', -1 , -1 , "4429dc4c29dc5228de5828de6229dc6e28de7428de8829bf8a29bf")\ + X(262 , 1, 0 , Ampersand , "&" , "&" , 0x26 , 38 , 'u', '&' , '&' , "5856e27456e2")\ + X(264 , 1, 0 , Dollar , "$" , "$" , 0x24 , 36 , 'u', '$' , '$' , "882bdf8a2bdf961bba9c1bbaa01bba9e1bbaac29de")\ + X(266 , 1, 0 , Percent , "%" , "%" , 0x25 , 37 , 'u', '%' , '%' , "ac0dbb")\ + X(268 , 1, 0 , Dong , "₫" , "₫" , 0x20AB, 8363 , 'u', -1 , -1 , "320dbb")\ + X(270 , 1, 0 , Yen , "¥" , "¥" , 0xA5 , 165 , 'u', -1 , -1 , "027ddc227ddc")\ + X(272 , 1, 0 , DotlessI , "ı" , "ı" , 0x0131, 305 , 'u', -1 , -1 , "8c1749a61349")\ + X(274 , 1, 0 , MicroSign , "µ" , "µ" , 0xB5 , 181 , 'u', -1 , -1 , "a02bdc9e2bdc")\ + X(276 , 1, 0 , Eth , "ð" , "ð" , 0xF0 , 240 , 'u', -1 , -1 , "6c1bba701add")\ + X(278 , 1, 0 , Thorn , "þ" , "þ" , 0xFE , 254 , 'u', -1 , -1 , "7035bd")\ + X(280 , 1, 0 , Eszett , "ẞ" , "ß" , 0xDF , 223 , 'u', -1 , -1 , "760cdb780cdb7a0cdb800cdb860cdb820cdb840cdb")\ + X(282 , 1, 0x041, KeyA , "A" , "a" , 0x61 , 97 , 'u', 'a' , '\x01', "001e41061e41101e410e1e41141e41161e41021e410a1e410c1e41181e41041e41081e411a1e41121e41201e411e1e411c1e41221e41241e41281e41261e412a1e41301e412e1e412c1e41341e41361e41321e41381e413a1e413e1e413c1e41401e41421e41441e41461e41481e414e1e41501e414a1e414c1e41521e41561e41581e41541e415a1e415c1e415e1e41601e41641e416c1e41621e416a1e41661e41681e416e1e41701e41721e417c1e41741e41761e41781e417a1e417e1e41801e41861e41821e41841e41881e418a1e418c1e418e1e41921e41901e41941e419610419810419a10419c1041a010419e1041a21e41a41e41a62141a82141aa2541ac1e41")\ + X(284 , 1, 0x042, KeyB , "B" , "b" , 0x62 , 98 , 'u', 'b' , '\x02', "0030420630421030420e30421430421630420230420a30420c30421830420430420830421a30421230422030421e30421c30422230422430422830422630422a30423030422e30422c30423430423630423230423830423a30423e30423c30424030424230424430424630424830424e30425030424a30424c30425230425630425830425430425a30425c30425e30426030426430426c30426230426a30426630426830426e30427030427230427c30427430427630427830427a30427e30428030428630428230428430428830428a30428c30428e30429230429030429430429630429830429a30429c3042a030429e3042a23042a43142a63342a81942aa1242ac1042")\ + X(286 , 1, 0x043, KeyC , "C" , "c" , 0x63 , 99 , 'u', 'c' , '\x03', "002e43062e43102e430e2e43142e43162e43022e430a2e430c2e43182e43042e43082e431a2e43122e43202e431e2e431c2e43222e43242e43282e43262e432a2e43302e432e2e432c2e43342e43362e43322e43382e433a2e433e2e433c2e43402e43422e43442e43462e43482e434e2e43502e434a2e434c2e43522e43562e43582e43542e435a2e435c2e435e2e43602e43642e436c2e43622e436a2e43662e43682e436e2e43702e43722e437c2e43742e43762e43782e437a2e437e2e43802e43862e43822e43842e43882e438a2e438c2e438e2e43922e43902e43942e43962e43982e439a2e439c2e43a02e439e2e43a22e43a41743a62f43a82643aa2043ac2343")\ + X(288 , 1, 0x044, KeyD , "D" , "d" , 0x64 , 100 , 'u', 'd' , '\x04', "0020440620441020440e20441420441620440220440a20440c20441820440420440820441a20441220442020441e20441c20442220442420442820442620442a20443020442e20442c20443420443620443220443820443a20443e20443c20444020444220444420444620444820444e20445020444a20444c20445220445620445820445420445a20445c20445e20446020446420446c20446220446a20446620446820446e20447020447220447c20447420447620447820447a20447e20448020448620448220448420448820448a20448c20448e20449222449020449420449620449820449a20449c2044a020449e2044a22044a42344a61544a82544aa2144ac1744")\ + X(290 , 1, 0x045, KeyE , "E" , "e" , 0x65 , 101 , 'u', 'e' , '\x05', "0012450612451012450e12451412451612450212450a12450c12451812450412450812451a12451212452012451e12451c12452212452412452812452612452a12453012452e12452c12453412453612453212453812453a12453e12453c12454012454212454412454612454812454e12455012454a12454c12455212455612455812455412455a12455c12455e12456012456412456c12456212456a12456612456812456e12457012457212457c12457412457612457812457a12457e12458012458612458212458412458812458a12458c12458e12459225459012459412459612459812459a12459c1245a012459e1245a21245a42045a62045a82245aa2445ac2145")\ + X(292 , 1, 0x046, KeyF , "F" , "f" , 0x66 , 102 , 'u', 'f' , '\x06', "0021460621461021460e21461421461621460221460a21460c21461821460421460821461a21461221462021461e21461c21462221462421462821462621462a21463021462e21462c21463421463621463221463821463a21463e21463c21464021464221464421464621464821464e21465021464a21464c21465221465621465821465421465a21465c21465e21466021466421466c21466221466a21466621466821466e21467021467221467c21467421467621467821467a21467e21468021468621468221468421468821468a21468c21468e21469212469021469421469621469821469a21469c2146a021469e2146a234bea41546a61046a80946aa0646ac3546")\ + X(294 , 1, 0x047, KeyG , "G" , "g" , 0x67 , 103 , 'u', 'g' , '\x07', "0022470622471022470e22471422471622470222470a22470c22471822470422470822471a22471222472022471e22471c22472222472422472822472622472a22473022472e22472c22473422473622473222473822473a22473e22473c22474022474222474422474622474822474e22475022474a22474c22475222475622475822475422475a22475c22475e22476022476422476c22476222476a22476622476822476e22477022477222477c22477422477622477822477a22477e22478022478622478222478422478822478a22478c22478e22479214479022479422479622479822479a22479c2247a022479e2247a22247a41647a61147a83447aa2e47ac3347")\ + X(296 , 1, 0x048, KeyH , "H" , "h" , 0x68 , 104 , 'u', 'h' , '\x08', "0023480623481023480e23481423481623480223480a23480c23481823480423480823481a23481223482023481e23481c23482223482423482823482623482a23483023482e23482c23483423483623483223483823483a23483e23483c23484023484223484423484623484823484e23485023484a23484c23485223485623485823485423485a23485c23485e23486023486423486c23486223486a23486623486823486e23487023487223487c23487423487623487823487a23487e23488023488623488223488423488823488a23488c23488e23489223489023489423489623489823489a23489c2348a023489e2348a22348a42448a61848a82348aa2348ac3448")\ + X(298 , 1, 0x049, KeyI , "I" , "i" , 0x69 , 105 , 'u', 'i' , '\x09', "0017490617491017490e17491417491617490217490a17490c17491817490417490817491a17491217492017491e17491c17492217492417492817492617492a17493017492e17492c17493417493617493217493817493a17493e17493c17494017494217494417494617494817494e17495017494a17494c17495217495617495817495417495a17495c17495e17496017496417496c17496217496a17496617496817496e17497017497217497c17497417497617497817497a17497e17498017498617498217498417498817498a17498c28de8e17499226499017499417499617499817499a17499c1749a017499e1749a21749a42249a61fdba83049aa3249ac2049")\ + X(300 , 1, 0x04A, KeyJ , "J" , "j" , 0x6A , 106 , 'u', 'j' , '\x0a', "00244a06244a10244a0e244a14244a16244a02244a0a244a0c244a18244a04244a08244a1a244a12244a20244a1e244a1c244a22244a24244a28244a26244a2a244a30244a2e244a2c244a34244a36244a32244a38244a3a244a3e244a3c244a40244a42244a44244a46244a48244a4e244a50244a4a244a4c244a52244a56244a58244a54244a5a244a5c244a5e244a60244a64244a6c244a62244a6a244a66244a68244a6e244a70244a72244a7c244a74244a76244a78244a7a244a7e244a80244a86244a82244a84244a88244a8a244a8c244a8e244a92154a90244a94244a96244a98244a9a244a9c244aa0244a9e244aa2244aa42e4aa62c4aa8064aaa094aac194a")\ + X(302 , 1, 0x04B, KeyK , "K" , "k" , 0x6B , 107 , 'u', 'k' , '\x0b', "00254b06254b10254b0e254b14254b16254b02254b0a254b0c254b18254b04254b08254b1a254b12254b20254b1e254b1c254b22254b24254b28254b26254b2a254b30254b2e254b2c254b34254b36254b32254b38254b3a254b3e254b3c254b40254b42254b44254b46254b48254b4e254b50254b4a254b4c254b52254b56254b58254b54254b5a254b5c254b5e254b60254b64254b6c254b62254b6a254b66254b68254b6e254b70254b72254b7c254b74254b76254b78254b7a254b7e254b80254b86254b82254b84254b88254b8a254b8c254b8e254b92314b90254b94254b96254b98254b9a254b9c254ba0254b9e254ba2254ba42f4ba6244ba8274baa1f4bac304b")\ + X(304 , 1, 0x04C, KeyL , "L" , "l" , 0x6C , 108 , 'u', 'l' , '\x0c', "00264c06264c10264c0e264c14264c16264c02264c0a264c0c264c18264c04264c08264c1a264c12264c20264c1e264c1c264c22264c24264c28264c26264c2a264c30264c2e264c2c264c34264c36264c32264c38264c3a264c3e264c3c264c40264c42264c44264c46264c48264c4e264c50264c4a264c4c264c52264c56264c58264c54264c5a264c5c264c5e264c60264c64264c6c264c62264c6a264c66264c68264c6e264c70264c72264c7c264c74264c76264c78264c7a264c7e264c80264c86264c82264c84264c88264c8a264c8c264c8e264c92164c90264c94264c96264c98264c9a264c9c264ca0264c9e264ca2264ca4194ca6264ca8074caa084cac184c")\ + X(306 , 1, 0x04D, KeyM , "M" , "m" , 0x6D , 109 , 'u', 'm' , '\x0d', "00324d06324d10324d0e324d14324d16324d02324d0a324d0c324d18324d04324d08324d1a324d12324d20324d1e324d1c324d22324d24324d28324d26324d2a324d30324d2e324d2c324d34324d36324d32324d38324d3a324d3e324d3c324d40324d42324d44324d46324d48324d4e324d50324d4a324d4c324d52324d56324d58324d54324d5a324d5c324d5e324d60324d64324d6c324d62324d6a324d66324d68324d6e324d70324d72324d7c324d74324d76324d78324d7a324d7e324d80324d86324d82324d84324d88324d8a324d8c324d8e324d92324d90324d94324d96274d98274d9a274d9c274da0274d9e274da2324da4324da6254da8084daa074dac284d")\ + X(308 , 1, 0x04E, KeyN , "N" , "n" , 0x6E , 110 , 'u', 'n' , '\x0e', "00314e06314e10314e0e314e14314e16314e02314e0a314e0c314e18314e04314e08314e1a314e12314e20314e1e314e1c314e22314e24314e28314e26314e2a314e30314e2e314e2c314e34314e36314e32314e38314e3a314e3e314e3c314e40314e42314e44314e46314e48314e4e314e50314e4a314e4c314e52314e56314e58314e54314e5a314e5c314e5e314e60314e64314e6c314e62314e6a314e66314e68314e6e314e70314e72314e7c314e74314e76314e78314e7a314e7e314e80314e86314e82314e84314e88314e8a314e8c314e8e314e92244e90314e94314e96314e98314e9a314e9c314ea0314e9e314ea2314ea4264ea6174ea8314eaa314eac274e")\ + X(310 , 1, 0x04F, KeyO , "O" , "o" , 0x6F , 111 , 'u', 'o' , '\x0f', "00184f06184f10184f0e184f14184f16184f02184f0a184f0c184f18184f04184f08184f1a184f12184f20184f1e184f1c184f22184f24184f28184f26184f2a184f30184f2e184f2c184f34184f36184f32184f38184f3a184f3e184f3c184f40184f42184f44184f46184f48184f4e184f50184f4a184f4c184f52184f56184f58184f54184f5a184f5c184f5e184f60184f64184f6c184f62184f6a184f66184f68184f6e184f70184f72184f7c184f74184f76184f78184f7a184f7e184f80184f86184f82184f84184f88184f8a184f8c184f8e184f92274f90184f94184f96184f98184f9a184f9c184fa0184f9e184fa2184fa41f4fa6144fa8144faa174fac134f")\ + X(312 , 1, 0x050, KeyP , "P" , "p" , 0x70 , 112 , 'u', 'p' , '\x10', "0019500619501019500e19501419501619500219500a19500c19501819500419500819501a19501219502019501e19501c19502219502419502819502619502a19503019502e19502c19503419503619503219503819503a19503e19503c19504019504219504419504619504819504e19505019504a19504c19505219505619505819505419505a19505c19505e19506019506419506c19506219506a19506619506819506e19507019507219507c19507419507619507819507a19507e19508019508619508219508419508819508a19508c19508e19509213509019509419509619509819509a19509c1950a019509e1950a21950a41350a61950a80a50aa0550ac1250")\ + X(314 , 1, 0x051, KeyQ , "Q" , "q" , 0x71 , 113 , 'u', 'q' , '\x11', "0010510610511010510e10511410511610510210510a10510c10511810510410510810511a10511210512010511e10511c10512210512410512810512610512a10513010512e10512c10513410513610513210513810513a10513e10513c10514010514210514410514610514810514e10515010514a10514c10515210515610515810515410515a10515c10515e10516010516410516c10516210516a10516610516810516e10517010517210517c10517410517610517810517a10517e10518010518610518210518410518810518a10518c10518e1051921051901051941051961e51981e519a1e519c1e51a01e519e1e51a22bbfa42d51a61a51a81251aa1151ac3251")\ + X(316 , 1, 0x052, KeyR , "R" , "r" , 0x72 , 114 , 'u', 'r' , '\x12', "0013520613521013520e13521413521613520213520a13520c13521813520413520813521a13521213522013521e13521c13522213522413522813522613522a13523013522e13522c13523413523613523213523813523a13523e13523c13524013524213524413524613524813524e13525013524a13524c13525213525613525813525413525a13525c13525e13526013526413526c13526213526a13526613526813526e13527013527213527c13527413527613527813527a13527e13528013528613528213528413528813528a13528c13528e1352921f529013529413529613529813529a13529c1352a013529e1352a21352a41852a61652a81552aa1552ac2652")\ + X(318 , 1, 0x053, KeyS , "S" , "s" , 0x73 , 115 , 'u', 's' , '\x13', "001f53061f53101f530e1f53141f53161f53021f530a1f530c1f53181f53041f53081f531a1f53121f53201f531e1f531c1f53221f53241f53281f53261f532a1f53301f532e1f532c1f53341f53361f53321f53381f533a1f533e1f533c1f53401f53421f53441f53461f53481f534e1f53501f534a1f534c1f53521f53561f53581f53541f535a1f535c1f535e1f53601f53641f536c1f53621f536a1f53661f53681f536e1f53701f53721f537c1f53741f53761f53781f537a1f537e1f53801f53861f53821f53841f53881f538a1f538c1f538e1f53922053901f53941f53961f53981f539a1f539c1f53a01f539e1f53a21f53a42753a63253a81653aa1653ac2553")\ + X(320 , 1, 0x054, KeyT , "T" , "t" , 0x74 , 116 , 'u', 't' , '\x14', "0014540614541014540e14541414541614540214540a14540c14541814540414540814541a14541214542014541e14541c14542214542414542814542614542a14543014542e14542c14543414543614543214543814543a14543e14543c14544014544214544414544614544814544e14545014544a14544c14545214545614545814545414545a14545c14545e14546014546414546c14546214546a14546614546814546e14547014547214547c14547414547614547814547a14547e14548014548614548214548414548814548a14548c14548e14549221549014549414549614549814549a14549c1454a014549e1454a21454a42554a62354a82454aa2254ac2454")\ + X(322 , 1, 0x055, KeyU , "U" , "u" , 0x75 , 117 , 'u', 'u' , '\x15', "0016550616551016550e16551416551616550216550a16550c16551816550416550816551a16551216552016551e16551c16552216552416552816552616552a16553016552e16552c16553416553616553216553816553a16553e16553c16554016554216554416554616554816554e16555016554a16554c16555216555616555816555416555a16555c16555e16556016556416556c16556216556a16556616556816556e16557016557216557c16557416557616557816557a16557e16558016558616558216558416558816558a16558c16558e16559217559016559416559616559816559a16559c1655a016559e1655a21655a42155a61e55a81755aa1455ac1f55")\ + X(324 , 1, 0x056, KeyV , "V" , "v" , 0x76 , 118 , 'u', 'v' , '\x16', "002f56062f56102f560e2f56142f56162f56022f560a2f560c2f56182f56042f56082f561a2f56122f56202f561e2f561c2f56222f56242f56282f56262f562a2f56302f562e2f562c2f56342f56362f56322f56382f563a2f563e2f563c2f56402f56422f56442f56462f56482f564e2f56502f564a2f564c2f56522f56562f56582f56542f565a2f565c2f565e2f56602f56642f566c2f56622f566a2f56662f56682f566e2f56702f56722f567c2f56742f56762f56782f567a2f567e2f56802f56862f56822f56842f56882f568a2f568c2f568e2f56922f56902f56942f56962f56982f569a2f569c2f56a02f569e2f56a22f56a43456a62e56a83356aa2f56ac1656")\ + X(326 , 1, 0x057, KeyW , "W" , "w" , 0x77 , 119 , 'u', 'w' , '\x17', "0011570611571011570e11571411571611570211570a11570c11571811570411570811571a11571211572011571e11571c11572211572411572811572611572a11573011572e11572c11573411573611573211573811573a11573e11573c11574011574211574411574611574811574e11575011574a11574c11575211575611575811575411575a11575c11575e11576011576411576c11576211576a11576611576811576e11577011577211577c11577411577611577811577a11577e11578011578611578211578411578811578a11578c11578e1157921157901157941157962c57982c579a2c579c2c57a02c579e2c57a21bbaa43357a61b57a83257aa3057ac1b57")\ + X(328 , 1, 0x058, KeyX , "X" , "x" , 0x78 , 120 , 'u', 'x' , '\x18', "002d58062d58102d580e2d58142d58162d58022d580a2d580c2d58182d58042d58082d581a2d58122d58202d581e2d581c2d58222d58242d58282d58262d582a2d58302d582e2d582c2d58342d58362d58322d58382d583a2d583e2d583c2d58402d58422d58442d58462d58482d584e2d58502d584a2d584c2d58522d58562d58582d58542d585a2d585c2d585e2d58602d58642d586c2d58622d586a2d58662d58682d586e2d58702d58722d587c2d58742d58762d58782d587a2d587e2d58802d58862d58822d58842d58882d588a2d588c2d588e2d58922d58902d58942d58962d58982d589a2d589c2d58a02d589e2d58a20ddba43058a62b58a82e58aa2d58ac2e58")\ + X(330 , 1, 0x059, KeyY , "Y" , "y" , 0x79 , 121 , 'u', 'y' , '\x19', "0015590615591015590e15591415591615590215590a15590c15591815590415590815591a15591215592015591e15591c15592215592415592815592615592a15593015592e15592c15593415593615593215593815593a15593e15593c1559402c594215594415594615594815594e15595015594a15594c15595215595615595815595415595a15595c15595e15596015596415596c15596215596a15596615596815596e2c59701559722c597c2c59742c59762c59782c597a2c597e2c59802c59862c59822c59842c59882c598a2c598c15598e1559921859902c59942c599615599815599a15599c1559a015599e1559a21559a41459a62759a81859aa1359ac2d59")\ + X(332 , 1, 0x05A, KeyZ , "Z" , "z" , 0x7A , 122 , 'u', 'z' , '\x1a', "002c5a062c5a102c5a0e2c5a142c5a162c5a022c5a0a2c5a0c2c5a182c5a042c5a082c5a1a2c5a122c5a202c5a1e2c5a1c2c5a222c5a242c5a282c5a262c5a2a2c5a302c5a2e2c5a2c2c5a342c5a362c5a322c5a382c5a3a2c5a3e2c5a3c2c5a40155a422c5a442c5a462c5a482c5a4e2c5a502c5a4a2c5a4c2c5a522c5a562c5a582c5a542c5a5a2c5a5c2c5a5e2c5a602c5a642c5a6c2c5a622c5a6a2c5a662c5a682c5a6e155a702c5a72155a7c155a74155a76155a78155a7a155a7e155a80155a86155a82155a84155a88155a8a155a8c2c5a8e2c5a922c5a90155a94155a96115a98115a9a115a9c115aa0115a9e115aa22c5aa4355aa6315aa8205aaa265aac1a5a")\ + X(334 , 1, 0 , AeLigature , "Æ" , "æ" , 0xE6 , 230 , 'u', -1 , -1 , "4e27c04a28de6027c06c27c06628de7027c0")\ + X(336 , 1, 0 , AcuteA , "Á" , "á" , 0xE1 , 225 , 'u', -1 , -1 , "7e28de8e28de")\ + X(338 , 1, 0 , BreveA , "Ă" , "ă" , 0x0103, 259 , 'u', -1 , -1 , "381adb941adb")\ + X(340 , 1, 0 , CircumflexA , "Â" , "â" , 0xE2 , 226 , 'u', -1 , -1 , "382bdc942bdc")\ + X(342 , 1, 0 , GraveA , "À" , "à" , 0xE0 , 224 , 'u', -1 , -1 , "3e2bdc422bdc5a28de5c28de8828dcac2cdd")\ + X(344 , 1, 0 , OgonekA , "Ą" , "ą" , 0x0105, 261 , 'u', -1 , -1 , "7228dea21051")\ + X(346 , 1, 0 , RingA , "Å" , "å" , 0xE5 , 229 , 'u', -1 , -1 , "441add4e1add4a1add4c1add601add6c1add621add661add")\ + X(348 , 1, 0 , TildeA , "Ã" , "ã" , 0xE3 , 227 , 'u', -1 , -1 , "9829de")\ + X(350 , 1, 0 , UmlautA , "Ä" , "ä" , 0xE4 , 228 , 'u', -1 , -1 , "4428de4c28de5628bf581bdd6228de741bdd7628de7828de7a28de8028de8628de8228de8428de8a28dc")\ + X(352 , 1, 0 , AcuteC , "Ć" , "ć" , 0x0107, 263 , 'u', -1 , -1 , "7c28de9028de")\ + X(354 , 1, 0 , CaronC , "Č" , "č" , 0x010D, 269 , 'u', -1 , -1 , "7c27ba9027baa233bc")\ + X(356 , 1, 0 , CedillaC , "Ç" , "ç" , 0xE7 , 231 , 'u', -1 , -1 , "3e1bdd3c27ba401adb421bdd5428de5e27c0682bbf8c34dca630bfac2bdc")\ + X(358 , 1, 0 , DotAboveC , "Ċ" , "ċ" , 0x010B, 267 , 'u', -1 , -1 , "3429c03629c0")\ + X(360 , 1, 0 , AcuteE , "É" , "é" , 0xE9 , 233 , 'u', -1 , -1 , "3a35bf3e35bf4235bf7e27ba8827de8e27baac11ba")\ + X(362 , 1, 0 , CircumflexE , "Ê" , "ê" , 0xEA , 234 , 'u', -1 , -1 , "ac56e2")\ + X(364 , 1, 0 , GraveE , "È" , "è" , 0xE8 , 232 , 'u', -1 , -1 , "3e28c04228c05a1aba5c1aba881abaac14bf")\ + X(366 , 1, 0 , DotAboveE , "Ė" , "ė" , 0x0117, 279 , 'u', -1 , -1 , "a228de")\ + X(368 , 1, 0 , OgonekE , "Ę" , "ę" , 0x0119, 281 , 'u', -1 , -1 , "a235bd")\ + X(370 , 1, 0 , UmlautE , "Ë" , "ë" , 0xEB , 235 , 'u', -1 , -1 , "4027ba")\ + X(372 , 1, 0 , CrossedD , "Đ" , "đ" , 0x0111, 273 , 'u', -1 , -1 , "7c1bdd901bdd")\ + X(374 , 1, 0 , BreveG , "Ğ" , "ğ" , 0x011F, 287 , 'u', -1 , -1 , "8c1adba612ba")\ + X(376 , 1, 0 , DotAboveG , "Ġ" , "ġ" , 0x0121, 289 , 'u', -1 , -1 , "341adb361adb")\ + X(378 , 1, 0 , CrossedH , "Ħ" , "ħ" , 0x0127, 295 , 'u', -1 , -1 , "341bdd361bdd")\ + X(380 , 1, 0 , AcuteI , "Í" , "í" , 0xED , 237 , 'u', -1 , -1 , "7e56e28e29308e56e2")\ + X(382 , 1, 0 , CircumflexI , "Î" , "î" , 0xEE , 238 , 'u', -1 , -1 , "381bdd941bdd")\ + X(384 , 1, 0 , GraveI , "Ì" , "ì" , 0xEC , 236 , 'u', -1 , -1 , "5a0ddd5c0ddd")\ + X(386 , 1, 0 , OgonekI , "Į" , "į" , 0x012F, 303 , 'u', -1 , -1 , "a21add")\ + X(388 , 1, 0 , CrossedL , "Ł" , "ł" , 0x0142, 322 , 'u', -1 , -1 , "7227ba762bbf7a2bbf")\ + X(390 , 1, 0 , CaronN , "Ň" , "ň" , 0x0148, 328 , 'u', -1 , -1 , "582bdc742bdc")\ + X(392 , 1, 0 , TildeN , "Ñ" , "ñ" , 0xF1 , 241 , 'u', -1 , -1 , "5027c05427c06a27c06827c0")\ + X(394 , 1, 0 , AcuteO , "Ó" , "ó" , 0xF3 , 243 , 'u', -1 , -1 , "722bdc7e0dbb8e0dbb981bba")\ + X(396 , 1, 0 , CircumflexO , "Ô" , "ô" , 0xF4 , 244 , 'u', -1 , -1 , "5827ba7427ba")\ + X(398 , 1, 0 , DoubleAcuteO , "Ő" , "ő" , 0x0151, 337 , 'u', -1 , -1 , "7e1adb8e1adb")\ + X(400 , 1, 0 , GraveO , "Ò" , "ò" , 0xF2 , 242 , 'u', -1 , -1 , "5a27c05c27c0")\ + X(402 , 1, 0 , HornO , "Ơ" , "ơ" , 0x01A1, 417 , 'u', -1 , -1 , "321bdd")\ + X(404 , 1, 0 , SlashedO , "Ø" , "ø" , 0xF8 , 248 , 'u', -1 , -1 , "4e28de4a27c06028de6c28de6627c0")\ + X(406 , 1, 0 , TildeO , "Õ" , "õ" , 0xF5 , 245 , 'u', -1 , -1 , "561bdb")\ + X(408 , 1, 0 , UmlautO , "Ö" , "ö" , 0xF6 , 246 , 'u', -1 , -1 , "4427c04c27c05627ba6227c0700cbb7627c07827c07a27c08027c08627c08227c08427c08a27de8c33bfa62ddc")\ + X(410 , 1, 0 , AcuteS , "Ś" , "ś" , 0x015B, 347 , 'u', -1 , -1 , "721bdd")\ + X(412 , 1, 0 , CaronS , "Š" , "š" , 0x0161, 353 , 'u', -1 , -1 , "7c1adb901adba22146")\ + X(414 , 1, 0 , CedillaS , "Ş" , "ş" , 0x015F, 351 , 'u', -1 , -1 , "8c27ba9427baa628de")\ + X(416 , 1, 0 , CommaS , "Ș" , "ș" , 0x0219, 537 , 'u', -1 , -1 , "3827ba")\ + X(418 , 1, 0 , CedillaT , "Ţ" , "ţ" , 0x0163, 355 , 'u', -1 , -1 , "9428de")\ + X(420 , 1, 0 , CommaT , "Ț" , "ț" , 0x021B, 539 , 'u', -1 , -1 , "3828de")\ + X(422 , 1, 0 , AcuteU , "Ú" , "ú" , 0xFA , 250 , 'u', -1 , -1 , "521adb581adb6e1adb741adb7e1bdd8e1bdd")\ + X(424 , 1, 0 , DoubleAcuteU , "Ű" , "ű" , 0x0171, 369 , 'u', -1 , -1 , "7e2bdc8e2bdc")\ + X(426 , 1, 0 , GraveU , "Ù" , "ù" , 0xF9 , 249 , 'u', -1 , -1 , "3e56e24256e25a2bbf5c2bbf9628c09828c09c28c0a028c09e28c0")\ + X(428 , 1, 0 , HornU , "Ư" , "ư" , 0x01B0, 432 , 'u', -1 , -1 , "321adb")\ + X(430 , 1, 0 , MacronU , "Ū" , "ū" , 0x016B, 363 , 'u', -1 , -1 , "a22d58")\ + X(432 , 1, 0 , OgonekU , "Ų" , "ų" , 0x0173, 371 , 'u', -1 , -1 , "a227c0")\ + X(434 , 1, 0 , RingU , "Ů" , "ů" , 0x016F, 367 , 'u', -1 , -1 , "5227ba6e27ba")\ + X(436 , 1, 0 , UmlautU , "Ü" , "ü" , 0xFC , 252 , 'u', -1 , -1 , "561ac0761aba781aba7a1aba7e0cbf801aba861aba821aba841aba8a1aba8c1bdd8e0cbda622dd")\ + X(438 , 1, 0 , CaronZ , "Ž" , "ž" , 0x017E, 382 , 'u', -1 , -1 , "1e0dbb7c2bdc902bdca21157")\ + X(440 , 1, 0 , DotAboveZ , "Ż" , "ż" , 0x017C, 380 , 'u', -1 , -1 , "342bdc3656e2721adb")\ + X(442 , 0, 0x15F, Sleep , "Sleep" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(444 , 0, 0x1B6, AppStart1 , "AppStart1" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(446 , 0, 0x1B7, AppStart2 , "AppStart2" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(448 , 0, 0 , AppNewWindow , "AppNewWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(450 , 0, 0 , AppOpenWindow , "AppOpenWindow" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(452 , 0, 0x02F, AppHelp , "AppHelp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(454 , 0, 0 , AppSave , "AppSave" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(456 , 0, 0 , AppFind , "AppFind" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(458 , 0, 0 , AppPrint , "AppPrint" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(460 , 0, 0 , AppClose , "AppClose" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(462 , 1, 0 , AppCut , "AppCut" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(464 , 0, 0 , AppCopy , "AppCopy" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(466 , 1, 0 , AppPaste , "AppPaste" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(468 , 1, 0 , AppUndo , "AppUndo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(470 , 1, 0 , AppRedo , "AppRedo" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(472 , 0, 0 , AppSpeechMode , "AppSpeechMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(474 , 0, 0 , AppSpeechCorrection, "AppSpeechCorrect" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(476 , 0, 0 , AppSpellCheck , "AppSpellCheck" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(478 , 0, 0 , Calculator , "Calculator" , "" , 0 , 0 , 'u', -1 , -1 , "0121b70721b71121b70f21b71521b71721b70321b70b21b70d21b71921b70521b70921b71b21b71321b72121b71f21b71d21b72321b72521b72921b72721b72b21b73121b72f21b72d21b73521b73721b73321b73921b73b21b73f21b73d21b74121b74321b74521b74721b74921b74f21b75121b74b21b74d21b75321b75721b75921b75521b75b21b75d21b75f21b76121b76521b76d21b76321b76b21b76721b76921b76f21b77121b77321b77d21b77521b77721b77921b77b21b77f21b78121b78721b78321b78521b78921b78b21b78d21b78f21b79321b79121b79521b79721b79921b79b21b79d21b7a121b79f21b7a321b7a521b7a721b7a921b7ab21b7ad21b7")\ + X(480 , 0, 0x1B4, Mail , "Mail" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(482 , 0, 0 , MailSend , "MailSend" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(484 , 0, 0 , MailForward , "MailForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(486 , 0, 0 , MailReply , "MailReply" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(488 , 0, 0 , MediaBassBoost , "MediaBassBoost" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(490 , 0, 0 , MediaBassDown , "MediaBassDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(492 , 0, 0 , MediaBassUp , "MediaBassUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(494 , 0, 0 , MediaChanDown , "MediaChanDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(496 , 0, 0 , MediaChanUp , "MediaChanUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(498 , 0, 0 , MediaTrebleDown , "MediaTrebleDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(500 , 0, 0 , MediaTrebleUp , "MediaTrebleUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(502 , 0, 0x1AD, MediaVolMute , "MediaVolMute" , "" , 0 , 57440, 'u', -1 , -1 , "0120ad0720ad1120ad0f20ad1520ad1720ad0320ad0b20ad0d20ad1920ad0520ad0920ad1b20ad1320ad2120ad1f20ad1d20ad2320ad2520ad2920ad2720ad2b20ad3120ad2f20ad2d20ad3520ad3720ad3320ad3920ad3b20ad3f20ad3d20ad4120ad4320ad4520ad4720ad4920ad4f20ad5120ad4b20ad4d20ad5320ad5720ad5920ad5520ad5b20ad5d20ad5f20ad6120ad6520ad6d20ad6320ad6b20ad6720ad6920ad6f20ad7120ad7320ad7d20ad7520ad7720ad7920ad7b20ad7f20ad8120ad8720ad8320ad8520ad8920ad8b20ad8d20ad8f20ad9320ad9120ad9520ad9720ad9920ad9b20ad9d20ada120ad9f20ada320ada520ada720ada920adab20adad20ad")\ + X(504 , 0, 0x1AE, MediaVolDown , "MediaVolDown" , "" , 0 , 57438, 'u', -1 , -1 , "012eae072eae112eae0f2eae152eae172eae032eae0b2eae0d2eae192eae052eae092eae1b2eae132eae212eae1f2eae1d2eae232eae252eae292eae272eae2b2eae312eae2f2eae2d2eae352eae372eae332eae392eae3b2eae3f2eae3d2eae412eae432eae452eae472eae492eae4f2eae512eae4b2eae4d2eae532eae572eae592eae552eae5b2eae5d2eae5f2eae612eae652eae6d2eae632eae6b2eae672eae692eae6f2eae712eae732eae7d2eae752eae772eae792eae7b2eae7f2eae812eae872eae832eae852eae892eae8b2eae8d2eae8f2eae932eae912eae952eae972eae992eae9b2eae9d2eaea12eae9f2eaea32eaea52eaea72eaea92eaeab2eaead2eae")\ + X(506 , 0, 0x1AF, MediaVolUp , "MediaVolUp" , "" , 0 , 57439, 'u', -1 , -1 , "0130af0730af1130af0f30af1530af1730af0330af0b30af0d30af1930af0530af0930af1b30af1330af2130af1f30af1d30af2330af2530af2930af2730af2b30af3130af2f30af2d30af3530af3730af3330af3930af3b30af3f30af3d30af4130af4330af4530af4730af4930af4f30af5130af4b30af4d30af5330af5730af5930af5530af5b30af5d30af5f30af6130af6530af6d30af6330af6b30af6730af6930af6f30af7130af7330af7d30af7530af7730af7930af7b30af7f30af8130af8730af8330af8530af8930af8b30af8d30af8f30af9330af9130af9530af9730af9930af9b30af9d30afa130af9f30afa330afa530afa730afa930afab30afad30af")\ + X(508 , 0, 0x1B0, MediaNext , "MediaNext" , "" , 0 , 57435, 'u', -1 , -1 , "0119b00719b01119b00f19b01519b01719b00319b00b19b00d19b01919b00519b00919b01b19b01319b02119b01f19b01d19b02319b02519b02919b02719b02b19b03119b02f19b02d19b03519b03719b03319b03919b03b19b03f19b03d19b04119b04319b04519b04719b04919b04f19b05119b04b19b04d19b05319b05719b05919b05519b05b19b05d19b05f19b06119b06519b06d19b06319b06b19b06719b06919b06f19b07119b07319b07d19b07519b07719b07919b07b19b07f19b08119b08719b08319b08519b08919b08b19b08d19b08f19b09319b09119b09519b09719b09919b09b19b09d19b0a119b09f19b0a319b0a519b0a719b0a919b0ab19b0ad19b0")\ + X(510 , 0, 0x1B1, MediaPrev , "MediaPrev" , "" , 0 , 57436, 'u', -1 , -1 , "0110b10710b11110b10f10b11510b11710b10310b10b10b10d10b11910b10510b10910b11b10b11310b12110b11f10b11d10b12310b12510b12910b12710b12b10b13110b12f10b12d10b13510b13710b13310b13910b13b10b13f10b13d10b14110b14310b14510b14710b14910b14f10b15110b14b10b14d10b15310b15710b15910b15510b15b10b15d10b15f10b16110b16510b16d10b16310b16b10b16710b16910b16f10b17110b17310b17d10b17510b17710b17910b17b10b17f10b18110b18710b18310b18510b18910b18b10b18d10b18f10b19310b19110b19510b19710b19910b19b10b19d10b1a110b19f10b1a310b1a510b1a710b1a910b1ab10b1ad10b1")\ + X(512 , 0, 0x1B2, MediaStop , "MediaStop" , "" , 0 , 57432, 'u', -1 , -1 , "0124b20724b21124b20f24b21524b21724b20324b20b24b20d24b21924b20524b20924b21b24b21324b22124b21f24b21d24b22324b22524b22924b22724b22b24b23124b22f24b22d24b23524b23724b23324b23924b23b24b23f24b23d24b24124b24324b24524b24724b24924b24f24b25124b24b24b24d24b25324b25724b25924b25524b25b24b25d24b25f24b26124b26524b26d24b26324b26b24b26724b26924b26f24b27124b27324b27d24b27524b27724b27924b27b24b27f24b28124b28724b28324b28524b28924b28b24b28d24b28f24b29324b29124b29524b29724b29924b29b24b29d24b2a124b29f24b2a324b2a524b2a724b2a924b2ab24b2ad24b2")\ + X(514 , 0, 0 , MediaPause , "MediaPause" , "" , 0 , 57429, 'u', -1 , -1 , "")\ + X(516 , 0, 0x1B3, MediaPlayPause , "MediaPlayPause" , "" , 0 , 57430, 'u', -1 , -1 , "0122b30722b31122b30f22b31522b31722b30322b30b22b30d22b31922b30522b30922b31b22b31322b32122b31f22b31d22b32322b32522b32922b32722b32b22b33122b32f22b32d22b33522b33722b33322b33922b33b22b33f22b33d22b34122b34322b34522b34722b34922b34f22b35122b34b22b34d22b35322b35722b35922b35522b35b22b35d22b35f22b36122b36522b36d22b36322b36b22b36722b36922b36f22b37122b37322b37d22b37522b37722b37922b37b22b37f22b38122b38722b38322b38522b38922b38b22b38d22b38f22b39322b39122b39522b39722b39922b39b22b39d22b3a122b39f22b3a322b3a522b3a722b3a922b3ab22b3ad22b3")\ + X(518 , 0, 0 , MediaPlay , "MediaPlay" , "" , 0 , 57428, 'u', -1 , -1 , "")\ + X(520 , 0, 0x1B5, MediaSelectMode , "MediaSelectMode" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(522 , 0, 0 , MediaReverse , "MediaReverse" , "" , 0 , 57431, 'u', -1 , -1 , "")\ + X(524 , 0, 0 , MediaRecord , "MediaRecord" , "" , 0 , 57437, 'u', -1 , -1 , "")\ + X(526 , 0, 0 , MediaFastForward , "MediaFastForward" , "" , 0 , 57433, 'u', -1 , -1 , "")\ + X(528 , 0, 0 , MediaRewind , "MediaRewind" , "" , 0 , 57434, 'u', -1 , -1 , "")\ + X(530 , 0, 0 , MicAirToggle , "MicAirToggle" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(532 , 0, 0 , MicMute , "MicMute" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(534 , 0, 0 , MicVolUp , "MicVolUp" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(536 , 0, 0 , MicVolDown , "MicVolDown" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(538 , 0, 0x1A6, BrowserBackward , "BrowserBackward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(540 , 0, 0x1A7, BrowserForward , "BrowserForward" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(542 , 0, 0x1A8, BrowserRefresh , "BrowserRefresh" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(544 , 0, 0x1A9, BrowserStop , "BrowserStop" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(546 , 0, 0x1AA, BrowserSearch , "BrowserSearch" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(548 , 0, 0x1AB, BrowserFavorites , "BrowserFavorites" , "" , 0 , 0 , 'u', -1 , -1 , "")\ + X(550 , 0, 0x1AC, BrowserHome , "BrowserHome" , "" , 0 , 0 , 'u', -1 , -1 , "0132ac0732ac1132ac0f32ac1532ac1732ac0332ac0b32ac0d32ac1932ac0532ac0932ac1b32ac1332ac2132ac1f32ac1d32ac2332ac2532ac2932ac2732ac2b32ac3132ac2f32ac2d32ac3532ac3732ac3332ac3932ac3b32ac3f32ac3d32ac4132ac4332ac4532ac4732ac4932ac4f32ac5132ac4b32ac4d32ac5332ac5732ac5932ac5532ac5b32ac5d32ac5f32ac6132ac6532ac6d32ac6332ac6b32ac6732ac6932ac6f32ac7132ac7332ac7d32ac7532ac7732ac7932ac7b32ac7f32ac8132ac8732ac8332ac8532ac8932ac8b32ac8d32ac8f32ac9332ac9132ac9532ac9732ac9932ac9b32ac9d32aca132ac9f32aca332aca532aca732aca932acab32acad32ac")\ + X(552 , 0, 0 , lastKey , "lastKey" , "" , 0 , 0 , 0 , -1 , -1 , "") // Max 12 bits for KeyId. static constexpr auto idbits = 12; @@ -660,11 +661,11 @@ namespace netxs::input static constexpr auto fx_map = [] { - auto m = std::array{}; + auto m = std::array{}; auto fill = [&](si32 KeyId, si32 Vk) { - if (m[Vk]) log("vkey duplicates"); /* It won't compile if collide. */\ - if (Vk) m[Vk] = KeyId; + if (Vk > (si32)m.size() || m[Vk]) log("The Vk value is duplicated or incorrect (vk=%%)", Vk); /* It won't compile if broken. */\ + if (Vk) m[Vk] = (si16)KeyId; }; #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ fill(KeyId, Vk); @@ -1503,6 +1504,7 @@ namespace netxs::input } }; + // input: Tooltip tracker. struct tooltip_t { text string{}; @@ -3005,59 +3007,34 @@ namespace netxs::input default: break; } } - void fix_numpad(auto& sc, bool numlock, bool extflag) + + void fix_right_shift(si32 vk, si32 sc, bool& extflag) // Set extflag for right shift. { - if (!numlock && !extflag - && ((sc >= 0x47 && sc <= 0x49) // 7 8 9 -> Home Up PgUp - || (sc >= 0x4B && sc <= 0x4D) // 4 5 6 -> Left Clear Right - || (sc >= 0x4F && sc <= 0x53))) // 1 2 3 -> End Down PgDn // 0->Ins .->Del + if (vk == input::vkey::shift && sc == input::key::map::data(input::key::RightShift).scan) { - sc = 0x80 | (sc & 0xF); // ala 0x4* -> 0x8* if no numlock + extflag = true; } } - void fix_Numpad_Yen_Slash(auto& vk, auto& sc, bool numlock, bool extflag) + auto xlat(si32 vk, si32 sc, bool extflag, si32 xlayout, si32 layout_fallback, si32& layout_hint) { - if (sc == 0x53/*NumpadDecimal*/ && numlock ) vk = vkey::numpadD; - else if (sc == 0x7D/*IntlYen*/ ) vk = vkey::intl_yen; - else if (numlock && !extflag && sc >= 0x47 && sc <= 0x53) - { - switch (vk) - { - case vkey::home: vk = vkey::numpad7; break; // sc 0x47 - case vkey::up: vk = vkey::numpad8; break; // sc 0x48 - case vkey::pgup: vk = vkey::numpad9; break; // sc 0x49 (Page Up) - case vkey::left: vk = vkey::numpad4; break; // sc 0x4B - case vkey::clear: vk = vkey::numpad5; break; // sc 0x4C (Num 5) - case vkey::right: vk = vkey::numpad6; break; // sc 0x4D - case vkey::end: vk = vkey::numpad1; break; // sc 0x4F - case vkey::down: vk = vkey::numpad2; break; // sc 0x50 - case vkey::pgdn: vk = vkey::numpad3; break; // sc 0x51 (Page Down) - case vkey::insert: vk = vkey::numpad0; break; // sc 0x52 - case vkey::del: vk = vkey::numpadD; break; // sc 0x53 (Dot/Comma) - } - } - else if (extflag && sc == 0x35 && vk != vkey::divide) // Extended Numpad Slash (scan=0xE035) + auto keyid = key::undef; + fix_right_shift(vk, sc, extflag); + auto vk_ex = (vk & 0xFF) | (extflag << 8); + if (auto keycode = input::key::fx_map[vk_ex]) // Fast detection of function keys. { - vk = vkey::divide; + keyid = keycode; + if constexpr (debugmode) log("Fast detection of function keys: ", keyid); } - else fix_numpad(sc, numlock, extflag); - } - auto xlat(si32 vk, si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 layout_fallback, si32& layout_hint) - { - auto keyid = key::undef; - auto numlock = keymod & input::hids::NumLock; - if (xlayout) + else if (xlayout) { auto klid = input::key::is_layout_supported(xlayout) ? xlayout : layout_fallback ? layout_fallback : input::key::latin_klids[0]; - fix_numpad(sc, numlock, extflag); auto hash = input::key::key_hash(klid, sc, extflag); keyid = (si32)input::key::key_map[hash]; } else { - fix_Numpad_Yen_Slash(vk, sc, numlock, extflag); sc |= extflag << 8; auto new_layout_hint = layout_hint; using keyrec = std::decay_t; @@ -3085,20 +3062,21 @@ namespace netxs::input } return keyid; } - auto xlat_direct(si32 virt_ex, si32 sc, bool extflag, si32 keymod, si32 xlayout, si32 layout_fallback) + auto xlat_direct(si32 vk, si32 sc, bool extflag, si32 xlayout, si32 layout_fallback) { auto keyid = key::undef; - auto numlock = keymod & input::hids::NumLock; - if (auto keycode = input::key::fx_map[virt_ex & 0xFF]) + fix_right_shift(vk, sc, extflag); + auto vk_ex = (vk & 0xFF) | (extflag << 8); + if (auto keycode = input::key::fx_map[vk_ex]) // Function keys fast detection. { keyid = keycode; + if constexpr (debugmode) log("Function keys fast detection: ", keyid); } else if (xlayout) { auto klid = input::key::is_layout_supported(xlayout) ? xlayout : layout_fallback ? layout_fallback : input::key::latin_klids[0]; - fix_numpad(sc, numlock, extflag); auto hash = input::key::key_hash(klid, sc, extflag); keyid = (si32)input::key::key_map[hash]; } diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index cb2b1e503d..605727df20 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5247,10 +5247,7 @@ namespace netxs::os { if constexpr (debugmode) log(prompt::tty, "Reading thread started", ' ', utf::to_hex_0x(std::this_thread::get_id())); auto alive = true; - auto layout_hint = -1; - auto layout_fallback = 0; auto gear_id = id_t{ 1 }; // Non-zero id. - auto p_txtdata = text{}; auto chords = input::key::kmap{}; auto m = input::sysmouse{}; auto k = input::syskeybd{}; @@ -5267,12 +5264,13 @@ namespace netxs::os #if defined(_WIN32) + auto layout_hint = -1; + auto layout_fallback = 0; auto accumfp = fp32{}; auto coordfp = fp2d{ fp32nan, fp32nan }; auto items = std::vector{}; auto count = DWORD{}; auto point = utfx{}; - auto toutf = text{}; auto wcopy = wide{}; auto kbmod = si32{}; auto ctrlv = bool{}; @@ -5350,6 +5348,7 @@ namespace netxs::os } if (r.EventType == KEY_EVENT) { + auto modstat = os::nt::modstat(kbmod, r.Event.KeyEvent.dwControlKeyState, r.Event.KeyEvent.wVirtualScanCode, r.Event.KeyEvent.bKeyDown); if (modstat.repeats) continue; // We don't repeat modifiers. else if (modstat.changed) @@ -5368,13 +5367,13 @@ namespace netxs::os } if (utf::to_code(r.Event.KeyEvent.uChar.UnicodeChar, point)) { - if (point) utf::to_utf_from_code(point, toutf); + k.cluster.clear(); + if (point) utf::to_utf_from_code(point, k.cluster); k.extflag = r.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY; k.virtcod = r.Event.KeyEvent.wVirtualKeyCode; k.scancod = r.Event.KeyEvent.wVirtualScanCode; - k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, k.ctlstat, k.xlayout, layout_fallback, layout_hint); + k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, k.xlayout, layout_fallback, layout_hint); k.keystat = r.Event.KeyEvent.bKeyDown ? (chords.exist(k.keycode) ? input::key::repeated : input::key::pressed) : input::key::released; - k.cluster = toutf; chords.build(k); if (r.Event.KeyEvent.wRepeatCount-- > 0) keybd(k); if (k.keystat != input::key::released) while (r.Event.KeyEvent.wRepeatCount-- > 0) @@ -5394,12 +5393,12 @@ namespace netxs::os && utf::to_code(up_2.Event.KeyEvent.uChar.UnicodeChar, point)) { head += 3; - utf::to_utf_from_code(point, toutf); + k.cluster.clear(); + utf::to_utf_from_code(point, k.cluster); k.extflag = r.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY; k.virtcod = r.Event.KeyEvent.wVirtualKeyCode; k.scancod = r.Event.KeyEvent.wVirtualScanCode; - k.cluster = toutf; - k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, k.ctlstat, k.xlayout, layout_fallback, layout_hint); + k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, k.xlayout, layout_fallback, layout_hint); if (r.Event.KeyEvent.wRepeatCount-- > 0) { k.keystat = input::key::pressed; @@ -5417,7 +5416,6 @@ namespace netxs::os } } point = {}; - toutf.clear(); } else if (r.EventType == MENU_EVENT) // Forward console control events. { @@ -5455,14 +5453,13 @@ namespace netxs::os break; case nt::console::event::paste_end: ctrlv = faux; - utf::to_utf(wcopy, p_txtdata); + k.cluster.clear(); + utf::to_utf(wcopy, k.cluster); k.payload = input::keybd::type::keypaste; - k.cluster = p_txtdata; chords.reset(k); keybd(k); k.payload = input::keybd::type::keypress; wcopy.clear(); - p_txtdata.clear(); break; } } @@ -5537,6 +5534,7 @@ namespace netxs::os auto micefd = os::invalid_fd; auto buffer = text(os::pipebuf, '\0'); auto sig_fd = os::signals::fd{}; + auto p_txtdata = text{}; auto input_buffer = text{}; auto paste_not_complete = faux; auto get_kb_state = [] From 3a9dc2dd3cb3b6a07f4687fb0c8b4cce3e72b101 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Wed, 24 Jun 2026 17:13:40 +0500 Subject: [PATCH 51/71] #943 WIP: We now never equate AltGr with Alt (RightAlt) --- doc/vt-input-mode.md | 4 +- src/netxs/desktopio/consrv.hpp | 10 ++-- src/netxs/desktopio/gui.hpp | 53 ++++++++++----------- src/netxs/desktopio/input.hpp | 85 ++++++++++++++++++++-------------- src/netxs/desktopio/system.hpp | 36 +++++++------- 5 files changed, 99 insertions(+), 89 deletions(-) diff --git a/doc/vt-input-mode.md b/doc/vt-input-mode.md index ff0fda9850..15a9b2fe2e 100644 --- a/doc/vt-input-mode.md +++ b/doc/vt-input-mode.md @@ -156,8 +156,8 @@ The state `kbmods=` of keyboard modifiers is the binary OR of all curre ----|--------|------------------------------|-------------- 0 | Left | ⌃ Ctrl | `0x0001` 1 | Right | ⌃ Ctrl | `0x0002` - 2 | Left | ⎇ Alt
⌥ Option | `0x0004` - 3 | Right | ⎇ Alt
⌥ Option
⇮ AltGr | `0x0008` + 2 | Left | ⎇ Alt
⌥ Option | `0x0004` + 3 | Right | ⎇ Alt
⌥ Option
| `0x0008` 4 | Left | ⇧ Shift | `0x0010` 5 | Right | ⇧ Shift | `0x0020` 6 | Left | ⊞ Win
⌘ Command
◆ Meta
❖ Super | `0x0040` diff --git a/src/netxs/desktopio/consrv.hpp b/src/netxs/desktopio/consrv.hpp index 4beac8d3a0..efce8d0e85 100644 --- a/src/netxs/desktopio/consrv.hpp +++ b/src/netxs/desktopio/consrv.hpp @@ -1103,10 +1103,10 @@ struct impl : consrv if (toWIDE.empty()) toWIDE.push_back(0); auto c = toWIDE.front(); - auto altgr_not_released = gear.ctlstat & input::hids::AltGr && (gear.keystat != input::key::released || gear.keycode != input::key::RightAlt); + auto altgr_pressed = input::key::kmap::pressed(gear, input::key::AltGr); auto ctrls = os::nt::ms_kbstate(gear.ctlstat) | (gear.extflag ? ENHANCED_KEY : 0) - | (altgr_not_released ? LEFT_CTRL_PRESSED : 0); + | (altgr_pressed ? LEFT_CTRL_PRESSED | RIGHT_ALT_PRESSED : 0); if (toWIDE.size() > 1) // Surrogate pair special case (not a clipboard paste, see generate(wiew wstr, ui32 s = 0)). { if (gear.keystat) @@ -1127,12 +1127,12 @@ struct impl : consrv } else { - if (gear.ctlstat & input::hids::AltGr && gear.keycode == input::key::RightAlt) // Generate fake LeftCtrl events on AltGr activity. + if (gear.keycode == input::key::AltGr) // Generate fake LeftCtrl events on AltGr activity. { auto lctrl = input::key::map::data(input::key::LeftCtrl); auto pre_ctrls = ctrls; - if (gear.keystat == input::key::pressed ) pre_ctrls &= ~(RIGHT_ALT_PRESSED | ENHANCED_KEY); // AltGr is not pressed yet. - else pre_ctrls = (pre_ctrls & ~ENHANCED_KEY) | RIGHT_ALT_PRESSED; // AltGr is still pressed. + if (gear.keystat == input::key::pressed) pre_ctrls = (pre_ctrls & ~(ENHANCED_KEY | RIGHT_ALT_PRESSED)) | LEFT_CTRL_PRESSED; // AltGr is not pressed yet. + else pre_ctrls = (pre_ctrls & ~(ENHANCED_KEY )) | RIGHT_ALT_PRESSED; // AltGr is still pressed. generate(c, pre_ctrls, lctrl.vkey, gear.keystat, lctrl.scan); // Restore the LeftCtrl+RightAlt state for AltGr. } generate(c, ctrls, gear.virtcod, gear.keystat, gear.scancod); diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index f0c1a0be1d..b005d8c806 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3466,7 +3466,7 @@ namespace netxs::gui regs fields; // winbase: Text input field list. link stream; // winbase: DirectVT event proxy. kmap chords; // winbase: Pressed key table (key chord). - bool fake_ctrl; // winbase: Fake ctrl key event on AltGr press/release (non-US kb layouts). + bool fake_ralt; // winbase: Fake alt/ctrl key events on AltGr press/release (non-US kb layouts). bool wait_ralt; // winbase: Wait RightAlt right after the fake LeftCtrl. si32 last_deadkey_vkey = {}; // winbase: Virtual code for deadkey tracking. si32 xlayout; // winbase: Current keyboard layout (KLID). @@ -3502,7 +3502,7 @@ namespace netxs::gui whlacc{ 0.f }, wdelta{ 24.f }, stream{ *this, *os::dtvt::client }, - fake_ctrl{ faux }, + fake_ralt{ faux }, wait_ralt{ faux }, xlayout{}, klid_fallback{} @@ -4538,40 +4538,33 @@ namespace netxs::gui byte payload = input::keybd::type::keypress) { auto state = 0; - auto cs = 0; - if (extflag) cs |= input::key::ExtendedKey; if (synth) { state = keymod; } else { - if (fake_ctrl && wait_ralt) // RAlt is expected right after the fake LCtrl when AltGr is pressed. + if (fake_ralt && wait_ralt) // RAlt is expected right after the fake LCtrl when AltGr is pressed. { wait_ralt = faux; auto is_ralt = scancod == input::key::map::data(input::key::RightAlt).scan/*0x38*/ && extflag; // RAlt. if (!is_ralt) // If something else comes instead of RAlt, it means that the LCtrl key was actually pressed. { - fake_ctrl = faux; + fake_ralt = faux; keybd_send_state(vkey::ctrl, input::key::pressed, input::key::map::data(input::key::LeftCtrl).scan/*0x1d*/); // Send LCtrl actually pressed. } } - if (fake_ctrl) state |= input::hids::AltGr; // Keep AltGr flag even if RightAlt released. - if (fake_ctrl && keystat == input::key::released && scancod == input::key::map::data(input::key::RightAlt).scan) // Clear the AltGr state. - { - fake_ctrl = faux; - } - if (keybd_test_toggled(vkey::numlock )) { state |= input::hids::NumLock; cs |= input::key::NumLockMode; } - if (keybd_test_toggled(vkey::capslock)) state |= input::hids::CapsLock; - if (keybd_test_toggled(vkey::scrllock)) state |= input::hids::ScrlLock; - if (keybd_test_pressed(vkey::lcontrol) && !fake_ctrl) state |= input::hids::LCtrl; - if (keybd_test_pressed(vkey::rcontrol)) state |= input::hids::RCtrl; - if (keybd_test_pressed(vkey::lalt )) state |= input::hids::LAlt; - if (keybd_test_pressed(vkey::ralt )) state |= input::hids::RAlt; - if (keybd_test_pressed(vkey::lsuper )) state |= input::hids::LSuper; - if (keybd_test_pressed(vkey::rsuper )) state |= input::hids::RSuper; - if (keybd_test_pressed(vkey::ctrl )) mouse_capture(by::keybd); // Capture mouse if Ctrl modifier is pressed (to catch Ctrl+AnyClick outside the window). - else mouse_release(by::keybd); + if (keybd_test_toggled(vkey::numlock ) ) state |= input::hids::NumLock; + if (keybd_test_toggled(vkey::capslock) ) state |= input::hids::CapsLock; + if (keybd_test_toggled(vkey::scrllock) ) state |= input::hids::ScrlLock; + if (keybd_test_pressed(vkey::lcontrol) && !fake_ralt) state |= input::hids::LCtrl; + if (keybd_test_pressed(vkey::rcontrol) ) state |= input::hids::RCtrl; + if (keybd_test_pressed(vkey::lalt ) ) state |= input::hids::LAlt; + if (keybd_test_pressed(vkey::ralt ) && !fake_ralt) state |= input::hids::RAlt; // We never equate AltGr with RAlt. + if (keybd_test_pressed(vkey::lsuper ) ) state |= input::hids::LSuper; + if (keybd_test_pressed(vkey::rsuper ) ) state |= input::hids::RSuper; + if (keybd_test_pressed(vkey::ctrl ) ) mouse_capture(by::keybd); // Capture mouse if Ctrl modifier is pressed (to catch Ctrl+AnyClick outside the window). + else mouse_release(by::keybd); auto old_ls = keymod & input::hids::LShift; auto old_rs = keymod & input::hids::RShift; auto new_ls = keybd_test_pressed(vkey::lshift); @@ -4633,18 +4626,18 @@ namespace netxs::gui if (keystat == input::key::pressed) { //if constexpr (debugmode) log("Fake LeftCtrl pressed"); - fake_ctrl = !(state & input::hids::RAlt) && keybd_read_pressed(vkey::ralt); // Actually AltGr is pressed. + fake_ralt = !fake_ralt && keybd_read_pressed(vkey::ralt); // Actually AltGr is pressed. } else if (keystat == input::key::released) { - //if constexpr (debugmode) log("Fake LeftCtrl released"); - fake_ctrl = (state & input::hids::RAlt) && !keybd_read_pressed(vkey::ralt); // Actually AltGr is released. + if constexpr (debugmode) log("Fake LeftCtrl released"); + fake_ralt = fake_ralt && !keybd_read_pressed(vkey::ralt); // Actually AltGr is released. } - else // Actually AltGr is repeated if fake_ctrl==true. + else // Actually AltGr is repeated if fake_ralt==true. { //if constexpr (debugmode) log("Fake LeftCtrl repeated"); } - if (fake_ctrl) // Filter input::key::repeated events as well. + if (fake_ralt) // Filter input::key::repeated events as well. { if constexpr (debugmode) log("Fake left ctrl key '%%' event filtered", keystat == input::key::pressed ? "pressed" : keystat == input::key::released ? "released" : "repeated"); wait_ralt = keystat != input::key::released; // Zeroize flag on release. @@ -4670,7 +4663,7 @@ namespace netxs::gui gear.virtcod = virtcod; gear.scancod = scancod; keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); - auto keycode = input::key::xlat_direct(virtcod, scancod, extflag, xlayout, klid_fallback); + auto keycode = input::key::xlat_direct(virtcod, scancod, extflag, fake_ralt, xlayout, klid_fallback); if ((gear.keystat == input::key::released || keycode != gear.keycode) && keystat == input::key::repeated) keystat = input::key::pressed; // LeftMod+RightMod press is treated by the OS as a repeated LeftMod. gear.keystat = keystat; gear.keycode = keycode; @@ -4687,6 +4680,10 @@ namespace netxs::gui : chords.build(gear, [&](auto index){ return !keybd_test_pressed(index); }); stream_keybd(gear); } + if (fake_ralt && keystat == input::key::released && scancod == input::key::map::data(input::key::RightAlt).scan) // Clear the AltGr state. + { + fake_ralt = faux; + } } void keybd_send_input(view utf8, byte payload_type) { diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index ddd1419245..0f1d7600dd 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -350,16 +350,16 @@ namespace netxs::input X( 9 , 0, 0x15C, RightSuper , "Super" , "" , 0 , 57450, 'u', -1 , -1 , "015c5c075c5c115c5c0f5c5c155c5c175c5c035c5c0b5c5c0d5c5c195c5c055c5c095c5c1b5c5c135c5c215c5c1f5c5c1d5c5c235c5c255c5c295c5c275c5c2b5c5c315c5c2f5c5c2d5c5c355c5c375c5c335c5c395c5c3b5c5c3f5c5c3d5c5c415c5c435c5c455c5c475c5c495c5c4f5c5c515c5c4b5c5c4d5c5c535c5c575c5c595c5c555c5c5b5c5c5d5c5c5f5c5c615c5c655c5c6d5c5c635c5c6b5c5c675c5c695c5c6f5c5c715c5c735c5c7d5c5c755c5c775c5c795c5c7b5c5c7f5c5c815c5c875c5c835c5c855c5c895c5c8b5c5c8d5c5c8f5c5c935c5c915c5c955c5c975c5c995c5c9b5c5c9d5c5ca15c5c9f5c5ca35c5ca55c5ca75c5ca95c5cab5c5cad5c5c")\ X(10 , 0, 0 , LeftHyper , "Hyper" , "" , 0 , 57445, 'u', -1 , -1 , "")\ X( 11 , 0, 0 , RightHyper , "Hyper" , "" , 0 , 57451, 'u', -1 , -1 , "")\ - X(12 , 0, 0 , AltGR , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ - X(14 , 0, 0x190, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0145900745901145900f45901545901745900345900b45900d45901945900545900945901b45901345902145901f45901d45902345902545902945902745902b45903145902f45902d45903545903745903345903945903b45903f45903d45904145904345904545904745904945904f45905145904b45904d45905345905745905945905545905b45905d45905f45906145906545906d45906345906b45906745906945906f45907145907345907d45907545907745907945907b45907f45908145908745908345908545908945908b45908d45908f45909345909145909545909745909945909b45909d4590a145909f4590a34590a54590a74590a94590ab4590ad4590")\ - X(16 , 0, 0x014, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14063a14103a140e3a14143a14163a14023a140a3a140c3a14183a14043a14083a141a3a14123a14203a141e3a141c3a14223a14243a14283a14263a142a3a14303a142e3a142c3a14343a14363a14323a14383a143a3a143e3a143c3a14403a14423a14443a14463a14483a144e3a14503a144a3a144c3a14523a14563a14583a14543a145a3a145c3a145e3a14603a14643a146c3a14623a146a3a14663a14683a146e3a14703a14723a147c3a14743a14763a14783a147a3a147e3a14803a14863a14823a14843a14883a148a3a148c3a148e3a14923a14903a14943a14963a14983a149a3a149c3a14a03a149e3a14a23a14a43a14a63a14a83a14aa3a14ac3a14")\ - X(18 , 0, 0x091, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046910646911046910e46911446911646910246910a46910c46911846910446910846911a46911246912046911e46911c46912246912446912846912646912a46913046912e46912c46913446913646913246913846913a46913e46913c46914046914246914446914646914846914e46915046914a46914c46915246915646915846915446915a46915c46915e46916046916446916c46916246916a46916646916846916e46917046917246917c46917446917646917846917a46917e46918046918646918246918446918846918a46918c46918e46919246919046919446919646919846919a46919c4691a046919e4691a24691a44691a64691a84691aa4691ac4691")\ - X(20 , 0, 0 , Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0270f2")\ - X(22 , 0, 0 , Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "02791c")\ - X(24 , 0, 0 , Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "027b1d")\ - X(26 , 0, 0x019, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "22f119231d19")\ - X(28 , 0, 0 , Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "22f215233815")\ - X(30 , 0, 0 , IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "431ddf")\ + X(12 , 0, 0x190, NumLock , "NumLock" , "" , 0 , 57360, 'u', -1 , -1 , "0145900745901145900f45901545901745900345900b45900d45901945900545900945901b45901345902145901f45901d45902345902545902945902745902b45903145902f45902d45903545903745903345903945903b45903f45903d45904145904345904545904745904945904f45905145904b45904d45905345905745905945905545905b45905d45905f45906145906545906d45906345906b45906745906945906f45907145907345907d45907545907745907945907b45907f45908145908745908345908545908945908b45908d45908f45909345909145909545909745909945909b45909d4590a145909f4590a34590a54590a74590a94590ab4590ad4590")\ + X(14 , 0, 0x014, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14063a14103a140e3a14143a14163a14023a140a3a140c3a14183a14043a14083a141a3a14123a14203a141e3a141c3a14223a14243a14283a14263a142a3a14303a142e3a142c3a14343a14363a14323a14383a143a3a143e3a143c3a14403a14423a14443a14463a14483a144e3a14503a144a3a144c3a14523a14563a14583a14543a145a3a145c3a145e3a14603a14643a146c3a14623a146a3a14663a14683a146e3a14703a14723a147c3a14743a14763a14783a147a3a147e3a14803a14863a14823a14843a14883a148a3a148c3a148e3a14923a14903a14943a14963a14983a149a3a149c3a14a03a149e3a14a23a14a43a14a63a14a83a14aa3a14ac3a14")\ + X(16 , 0, 0x091, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046910646911046910e46911446911646910246910a46910c46911846910446910846911a46911246912046911e46911c46912246912446912846912646912a46913046912e46912c46913446913646913246913846913a46913e46913c46914046914246914446914646914846914e46915046914a46914c46915246915646915846915446915a46915c46915e46916046916446916c46916246916a46916646916846916e46917046917246917c46917446917646917846917a46917e46918046918646918246918446918846918a46918c46918e46919246919046919446919646919846919a46919c4691a046919e4691a24691a44691a64691a84691aa4691ac4691")\ + X(18 , 0, 0x05E, AltGr , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ + X(20 , 0, 0 , IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "431ddf")\ + X(22 , 0, 0 , Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0270f2")\ + X(24 , 0, 0 , Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "02791c")\ + X(26 , 0, 0 , Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "027b1d")\ + X(28 , 0, 0x019, Hanja , "Hanja" , "" , 0 , 0 , 'u', -1 , -1 , "22f119231d19")\ + X(30 , 0, 0 , Hanguel , "Hanguel" , "" , 0 , 0 , 'u', -1 , -1 , "22f215233815")\ X(32 , 0, 0x15D, Apps , "Apps" , "" , 0 , 57363, 'u', -1 , -1 , "015d5d075d5d115d5d0f5d5d155d5d175d5d035d5d0b5d5d0d5d5d195d5d055d5d095d5d1b5d5d135d5d215d5d1f5d5d1d5d5d235d5d255d5d295d5d275d5d2b5d5d315d5d2f5d5d2d5d5d355d5d375d5d335d5d395d5d3b5d5d3f5d5d3d5d5d415d5d435d5d455d5d475d5d4f5d5d515d5d4b5d5d4d5d5d535d5d575d5d595d5d555d5d5b5d5d5d5d5d5f5d5d615d5d655d5d6d5d5d635d5d6b5d5d675d5d695d5d6f5d5d715d5d735d5d7d5d5d755d5d775d5d795d5d7b5d5d7f5d5d815d5d875d5d835d5d855d5d895d5d8b5d5d8d5d5d935d5d975d5d995d5d9b5d5d9d5d5da15d5d9f5d5da35d5da55d5da75d5da95d5dab5d5dad5d5d")\ X(34 , 0, 0x029, Select , "Select" , "" , 0 , 0 , 'u', -1 , -1 , "")\ X(36 , 0, 0 , Fn , "Fn" , "" , 0 , 0 , 'u', -1 , -1 , "")\ @@ -1552,7 +1552,7 @@ namespace netxs::input LCtrl = 1 << 0, // Left ⌃ Ctrl RCtrl = 1 << 1, // Right ⌃ Ctrl LAlt = 1 << 2, // Left ⎇ Alt, Left ⌥ Option - RAlt = 1 << 3, // Right ⎇ Alt, Right ⌥ Option, ⇮ AltGr + RAlt = 1 << 3, // Right ⎇ Alt, Right ⌥ Option LShift = 1 << 4, // Left ⇧ Shift RShift = 1 << 5, // Right ⇧ Shift LSuper = 1 << 6, // Left ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super @@ -1564,7 +1564,7 @@ namespace netxs::input NumLock = 1 << 12, // ⇭ Num Lock CapsLock = 1 << 13, // ⇪ Caps Lock ScrlLock = 1 << 14, // ⇳ Scroll Lock (⤓) - AltGr = 1 << 15, // AltGr on non-US keyboards + // = 1 << 15, LCtrlAlt = LAlt | LCtrl, anyCtrl = LCtrl | RCtrl, anyAlt = LAlt | RAlt, @@ -2330,7 +2330,7 @@ namespace netxs::input auto c = keybd::cluster.empty() ? 0 : (byte)keybd::cluster.front(); if (v < 0 || v >= input::key::lastKey) v = 0; - if (s & hids::AltGr || (s & hids::LCtrl && s & hids::RAlt)) // This combination is already translated. + if (s & hids::LCtrl && s & hids::RAlt) // Reset AltGr emulation on win32. { s &= ~(hids::LCtrl | hids::RAlt); } @@ -2342,11 +2342,11 @@ namespace netxs::input { if (auto it_shift = shift_key.find(v); it_shift != shift_key.end()) { - auto& mods = *++(it_shift->second.rbegin()); - mods = '1'; - if (shift) mods += 1; - if (alt ) mods += 2; - if (ctrl ) mods += 4; + auto& ctls = *++(it_shift->second.rbegin()); + ctls = '1'; + if (shift) ctls += 1; + if (alt ) ctls += 2; + if (ctrl ) ctls += 4; return it_shift->second; } if (auto crop = input::key::interpret_ctrl(*this, ctrl, shift); crop.size()) @@ -2466,13 +2466,22 @@ namespace netxs::input g_chord += (byte)sign; g_chord += view{ (char*)&event_id, sizeof(event_id) }; } - static void push_keyid(bool ispressed, text& vkchord, si32 keyid) + static auto _vkey_str(si32 keyid, bool ispressed) { keyid &= 0x0FFF; // 12 bit max. - auto hi_12bit_keyid = (byte)(keyid >> 8); - auto lo_12bit_keyid = (byte)(keyid & 0xFF); - vkchord.push_back(hi_12bit_keyid | (byte)(ispressed ? 0x00 : input::key::unpressed_sign)); - vkchord.push_back(lo_12bit_keyid); + auto keyid_str = text(2, '\0'); + keyid_str[0] = (byte)((keyid >> 8) | (ispressed ? 0x00 : input::key::unpressed_sign)); + keyid_str[1] = (byte)(keyid & 0xFF); + return keyid_str; + } + static void push_keyid(bool ispressed, text& vkchord, si32 keyid) + { + vkchord += input::key::kmap::_vkey_str(keyid, ispressed); + } + static auto pressed(auto& k, si32 keyid) + { + auto pressed_keyid = input::key::kmap::_vkey_str(keyid, true); + return k.vkchord.find(pressed_keyid) != text::npos; } static void push_scode(bool ispressed, text& scchord, si32 scode) { @@ -2495,7 +2504,7 @@ namespace netxs::input m_chord += (byte)button_id; } template - void build(auto& k, P test_key_released = {}) + void build(auto& k, P test_if_key_released = {}) { if (k.keystat != input::key::repeated) { @@ -2518,7 +2527,7 @@ namespace netxs::input { auto& [keyid, val] = rec; //log("\tcheck keyid=%%", input::key::map::data(keyid).name); - auto is_released = test_key_released(val.vcode); // Check if it is still pressed. + auto is_released = test_if_key_released(val.vcode); // Check if it is still pressed. auto same = k.keycode == keyid && k.scancod == val.scode && k.virtcod == val.vcode; @@ -2551,16 +2560,15 @@ namespace netxs::input }; auto sign = !!k.keystat; auto shift_state = k.ctlstat & hids::anyShift; - auto altgr_state = k.ctlstat & hids::AltGr; auto has_cluster = k.cluster.size() && k.cluster.front(); - auto has_unshift = k.unshift.size() && valid_codepoint(k.unshift) && !altgr_state && !shift_state; - auto has_shifted = k.shifted.size() && valid_codepoint(k.shifted) && !altgr_state && shift_state; + auto has_unshift = k.unshift.size() && valid_codepoint(k.unshift) && !shift_state; + auto has_shifted = k.shifted.size() && valid_codepoint(k.shifted) && shift_state; if (has_cluster || has_unshift || has_shifted) // Try to keep national key names. { k.chchord = k.vkchord; // The main part of the chchord is the same as in vkchord. - if (has_unshift) push_cluster(sign, k.chchord, k.unshift); - else if (has_shifted) push_cluster(sign, k.chchord, k.shifted); - else push_cluster(sign, k.chchord, k.cluster); + if (has_cluster) push_cluster(sign, k.chchord, k.cluster); + else if (has_unshift) push_cluster(sign, k.chchord, k.unshift); + else push_cluster(sign, k.chchord, k.shifted); } push_keyid(sign, k.vkchord, k.keycode); push_scode(sign, k.scchord, k.scancod | (k.extflag ? 0x100 : 0)); @@ -3008,9 +3016,14 @@ namespace netxs::input } } - void fix_right_shift(si32 vk, si32 sc, bool& extflag) // Set extflag for right shift. + void fix_altgr_and_right_shift(si32& vk, si32 sc, bool& extflag, bool fake_ralt) // Set extflag for right shift. { - if (vk == input::vkey::shift && sc == input::key::map::data(input::key::RightShift).scan) + if (fake_ralt && sc == input::key::map::data(input::key::RightAlt).scan) + { + vk = 0x5E; // Use unassigned VK_ for AltGr. + extflag = faux; + } + else if (vk == input::vkey::shift && sc == input::key::map::data(input::key::RightShift).scan) { extflag = true; } @@ -3018,7 +3031,7 @@ namespace netxs::input auto xlat(si32 vk, si32 sc, bool extflag, si32 xlayout, si32 layout_fallback, si32& layout_hint) { auto keyid = key::undef; - fix_right_shift(vk, sc, extflag); + fix_altgr_and_right_shift(vk, sc, extflag, faux); auto vk_ex = (vk & 0xFF) | (extflag << 8); if (auto keycode = input::key::fx_map[vk_ex]) // Fast detection of function keys. { @@ -3062,10 +3075,10 @@ namespace netxs::input } return keyid; } - auto xlat_direct(si32 vk, si32 sc, bool extflag, si32 xlayout, si32 layout_fallback) + auto xlat_direct(si32 vk, si32 sc, bool extflag, bool fake_ralt, si32 xlayout, si32 layout_fallback) { auto keyid = key::undef; - fix_right_shift(vk, sc, extflag); + fix_altgr_and_right_shift(vk, sc, extflag, fake_ralt); auto vk_ex = (vk & 0xFF) | (extflag << 8); if (auto keycode = input::key::fx_map[vk_ex]) // Function keys fast detection. { diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 605727df20..c636876752 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5876,15 +5876,15 @@ namespace netxs::os for (auto i = 1; i < 8; i++) { - auto mods = '1'; - auto ctls = 0; - if (i & 0b001) { ctls |= hids::LShift; mods += 1; } - if (i & 0b010) { ctls |= hids::LAlt; mods += 2; } - if (i & 0b100) { ctls |= hids::LCtrl; mods += 4; } + auto ctls_str = '1'; + auto ctlstate = 0; + if (i & 0b001) { ctlstate |= hids::LShift; ctls_str += 1; } + if (i & 0b010) { ctlstate |= hids::LAlt; ctls_str += 2; } + if (i & 0b100) { ctlstate |= hids::LCtrl; ctls_str += 4; } for (auto& [key, utf8] : keymask) { - *++(utf8.rbegin()) = mods; - m[utf8] = { "", key | (ctls << key::idbits) }; + *++(utf8.rbegin()) = ctls_str; + m[utf8] = { "", key | (ctlstate << key::idbits) }; } } for (auto i = 0; i <= 'Z' - 'A'; i++) @@ -6018,16 +6018,16 @@ namespace netxs::os k.extflag = {}; k.handled = {}; k.keystat = input::key::pressed; - if (auto mods = std::exchange(k.ctlstat, 0)) + if (auto ctls = std::exchange(k.ctlstat, 0)) { auto cluster = std::exchange(k.cluster, ""s); auto keycode = std::exchange(k.keycode, 0); auto virtcod = std::exchange(k.virtcod, 0); auto scancod = std::exchange(k.scancod, 0); - if (mods & hids::LCtrl) k.ctlstat |= hids::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (mods & hids::LAlt) k.ctlstat |= hids::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (mods & hids::LShift) k.ctlstat |= hids::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (mods & hids::LSuper) k.ctlstat |= hids::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & hids::LCtrl) k.ctlstat |= hids::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & hids::LAlt) k.ctlstat |= hids::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & hids::LShift) k.ctlstat |= hids::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & hids::LSuper) k.ctlstat |= hids::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); std::swap(k.cluster, cluster); std::swap(k.keycode, keycode); std::swap(k.virtcod, virtcod); @@ -6038,17 +6038,17 @@ namespace netxs::os k.keystat = input::key::released; chords.build(k); keybd(k); - if (auto mods = k.ctlstat) + if (auto ctls = k.ctlstat) { auto cluster = std::exchange(k.cluster, ""s); auto keycode = std::exchange(k.keycode, 0); auto virtcod = std::exchange(k.virtcod, 0); auto scancod = std::exchange(k.scancod, 0); - if (mods & hids::LSuper) k.ctlstat &= ~hids::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (mods & hids::LShift) k.ctlstat &= ~hids::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (mods & hids::LAlt ) k.ctlstat &= ~hids::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (mods & hids::LCtrl ) k.ctlstat &= ~hids::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - k.ctlstat = mods; + if (ctls & hids::LSuper) k.ctlstat &= ~hids::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & hids::LShift) k.ctlstat &= ~hids::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & hids::LAlt ) k.ctlstat &= ~hids::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & hids::LCtrl ) k.ctlstat &= ~hids::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + k.ctlstat = ctls; std::swap(k.cluster, cluster); std::swap(k.keycode, keycode); std::swap(k.virtcod, virtcod); From 298daf1054d42de3538392d54ecba411b4c17c71 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Wed, 24 Jun 2026 18:07:37 +0500 Subject: [PATCH 52/71] #943 WIP: Respect AltGr and IsoLevel5Shift state when peeking layout (+show cluster on key release) --- src/netxs/desktopio/consrv.hpp | 3 ++- src/netxs/desktopio/gui.hpp | 42 +++++++++++++++++++--------------- src/netxs/desktopio/input.hpp | 41 +++++++++++++++++++++------------ 3 files changed, 52 insertions(+), 34 deletions(-) diff --git a/src/netxs/desktopio/consrv.hpp b/src/netxs/desktopio/consrv.hpp index efce8d0e85..ce1b26e45d 100644 --- a/src/netxs/desktopio/consrv.hpp +++ b/src/netxs/desktopio/consrv.hpp @@ -1099,7 +1099,8 @@ struct impl : consrv } toWIDE.clear(); - utf::to_utf(gear.cluster, toWIDE); + auto cluster = input::key::get_cluster(gear); + utf::to_utf(cluster, toWIDE); if (toWIDE.empty()) toWIDE.push_back(0); auto c = toWIDE.front(); diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index b005d8c806..a7a8044bc6 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -4251,8 +4251,8 @@ namespace netxs::gui auto state = 0; if (keybd_read_pressed(vkey::lshift )) state |= input::hids::LShift; if (keybd_read_pressed(vkey::rshift )) state |= input::hids::RShift; - if (keybd_read_pressed(vkey::lcontrol)) state |= input::hids::LCtrl; - if (keybd_read_pressed(vkey::rcontrol)) state |= input::hids::RCtrl; + if (keybd_read_pressed(vkey::lctrl )) state |= input::hids::LCtrl; + if (keybd_read_pressed(vkey::rctrl )) state |= input::hids::RCtrl; if (keybd_read_pressed(vkey::lalt )) state |= input::hids::LAlt; if (keybd_read_pressed(vkey::ralt )) state |= input::hids::RAlt; if (keybd_read_pressed(vkey::lsuper )) state |= input::hids::LSuper; @@ -4557,8 +4557,8 @@ namespace netxs::gui if (keybd_test_toggled(vkey::numlock ) ) state |= input::hids::NumLock; if (keybd_test_toggled(vkey::capslock) ) state |= input::hids::CapsLock; if (keybd_test_toggled(vkey::scrllock) ) state |= input::hids::ScrlLock; - if (keybd_test_pressed(vkey::lcontrol) && !fake_ralt) state |= input::hids::LCtrl; - if (keybd_test_pressed(vkey::rcontrol) ) state |= input::hids::RCtrl; + if (keybd_test_pressed(vkey::lctrl ) && !fake_ralt) state |= input::hids::LCtrl; + if (keybd_test_pressed(vkey::rctrl ) ) state |= input::hids::RCtrl; if (keybd_test_pressed(vkey::lalt ) ) state |= input::hids::LAlt; if (keybd_test_pressed(vkey::ralt ) && !fake_ralt) state |= input::hids::RAlt; // We never equate AltGr with RAlt. if (keybd_test_pressed(vkey::lsuper ) ) state |= input::hids::LSuper; @@ -5546,18 +5546,24 @@ namespace netxs::gui auto buf = wide(8, 0); auto flags = extflag ? 1u : 0u; flags |= 2; // ToUnicodeEx will translate scancodes marked as key break events in addition to its usual treatment of key make events. - auto vk_un = std::array{}; - vk_un[vkey::capslock] = vkstat[vkey::capslock]; - auto rc = ::ToUnicodeEx(virtcod, scancod, vk_un.data(), buf.data(), 8, flags, hkl); + auto key_matrix = std::array{}; + if (fake_ralt) // Emulate AltGr pressed. + { + key_matrix[vkey::ctrl ] = 0x80; + key_matrix[vkey::lctrl] = 0x80; + key_matrix[vkey::alt ] = 0x80; + key_matrix[vkey::ralt ] = 0x80; + } + key_matrix[vkey::grselect] = vkstat[vkey::grselect]; // Respect GroupSelect (IsoLevel5Shift) on Canadian layout. + key_matrix[vkey::capslock] = vkstat[vkey::capslock]; + auto rc = ::ToUnicodeEx(virtcod, scancod, key_matrix.data(), buf.data(), 8, flags, hkl); if (rc > 0) { utf::to_utf(buf.data(), rc, unshift); } - auto vk_sh = std::array{}; - vk_sh[vkey::capslock] = vkstat[vkey::capslock]; - vk_sh[vkey::shift ] = 0x80; - vk_sh[vkey::lshift ] = 0x80; - rc = ::ToUnicodeEx(virtcod, scancod, vk_sh.data(), buf.data(), 8, flags, hkl); + key_matrix[vkey::shift ] = 0x80; + key_matrix[vkey::lshift] = 0x80; + rc = ::ToUnicodeEx(virtcod, scancod, key_matrix.data(), buf.data(), 8, flags, hkl); if (rc > 0) { utf::to_utf(buf.data(), rc, shifted); @@ -5679,12 +5685,12 @@ namespace netxs::gui } ::GetKeyboardState(vkstat.data()); // Sync with thread kb state. auto is_deadkey_released = last_deadkey_vkey && (keystat == input::key::released) && (virtcod == last_deadkey_vkey); - auto toUTF8 = utf::to_utf(toWIDE); + auto cluster = utf::to_utf(toWIDE); toWIDE.clear(); if (is_deadkey_released) { //if constexpr (debugmode) log("deadkey released"); - keybd_send_state(virtcod, keystat, scancod, extflag, toUTF8, faux, input::keybd::type::deadkey); + keybd_send_state(virtcod, keystat, scancod, extflag, cluster, faux, input::keybd::type::deadkey); last_deadkey_vkey = {}; } else if (keytype != 2) @@ -5694,22 +5700,22 @@ namespace netxs::gui if (keystat == input::key::released) // Only Alt+Numpad fires on release. { keybd_send_state(virtcod, keystat, scancod, extflag); // Release Alt. Send empty string. - keybd_send_input(toUTF8, input::keybd::type::imeinput); // Send Alt+Numpads result. + keybd_send_input(cluster, input::keybd::type::imeinput); // Send Alt+Numpads result. //print_vkstat("Alt+Numpad"); return true; } } else { - toUTF8.clear(); + cluster.clear(); } - keybd_send_state(virtcod, keystat, scancod, extflag, toUTF8); + keybd_send_state(virtcod, keystat, scancod, extflag, cluster); } else { last_deadkey_vkey = virtcod; //if constexpr (debugmode) log("deadkey pressed"); - keybd_send_state(virtcod, keystat, scancod, extflag, toUTF8, faux, input::keybd::type::deadkey); + keybd_send_state(virtcod, keystat, scancod, extflag, cluster, faux, input::keybd::type::deadkey); } //print_vkstat("keybd_read_input"); return true; diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 0f1d7600dd..a41dd150f5 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -74,12 +74,13 @@ namespace netxs::input static constexpr auto alt = 0x12; // VK_MENU static constexpr auto lshift = 0xA0; // VK_LSHIFT static constexpr auto rshift = 0xA1; // VK_RSHIFT - static constexpr auto lcontrol = 0xA2; // VK_LCONTROL - static constexpr auto rcontrol = 0xA3; // VK_RCONTROL + static constexpr auto lctrl = 0xA2; // VK_LCONTROL + static constexpr auto rctrl = 0xA3; // VK_RCONTROL static constexpr auto lalt = 0xA4; // VK_LMENU static constexpr auto ralt = 0xA5; // VK_RMENU static constexpr auto lsuper = 0x5B; // VK_LWIN static constexpr auto rsuper = 0x5C; // VK_RWIN + static constexpr auto grselect = 0xDF; // VK_OEM_8 GroupSelect (IsoLevel5Shift) on Canadian layout static constexpr auto clear = 0x0C; // VK_CLEAR static constexpr auto enter = 0x0D; // VK_RETURN @@ -2428,6 +2429,26 @@ namespace netxs::input auto is_pressed( byte sign) { return !(sign & input::key::unpressed_sign); } auto is_cluster( byte sign) { return sign & input::key::cluster_sign; } auto is_mouse( byte sign) { return (sign & input::key::generic_sign) == input::key::mouse_sign; } + auto get_cluster(auto& k) + { + auto cluster = text{}; + auto valid_codepoint = [](view utf8) + { + auto codepoint = utf::to_code(utf8); + return codepoint > 0 && (codepoint < 57358 || codepoint > 57454); + }; + auto shift_state = k.ctlstat & hids::anyShift; + auto has_cluster = k.cluster.size() && k.cluster.front(); + auto has_unshift = k.unshift.size() && valid_codepoint(k.unshift) && !shift_state; + auto has_shifted = k.shifted.size() && valid_codepoint(k.shifted) && shift_state; + if (has_cluster || has_unshift || has_shifted) // Try to keep national key names. + { + if (has_cluster) cluster = k.cluster; + else if (has_unshift) cluster = k.unshift; + else cluster = k.shifted; + } + return cluster; + } struct kmap { @@ -2553,22 +2574,12 @@ namespace netxs::input reset(k); return; } - auto valid_codepoint = [](view utf8) - { - auto codepoint = utf::to_code(utf8); - return codepoint > 0 && (codepoint < 57358 || codepoint > 57454); - }; + auto cluster = input::key::get_cluster(k); auto sign = !!k.keystat; - auto shift_state = k.ctlstat & hids::anyShift; - auto has_cluster = k.cluster.size() && k.cluster.front(); - auto has_unshift = k.unshift.size() && valid_codepoint(k.unshift) && !shift_state; - auto has_shifted = k.shifted.size() && valid_codepoint(k.shifted) && shift_state; - if (has_cluster || has_unshift || has_shifted) // Try to keep national key names. + if (cluster.size()) { k.chchord = k.vkchord; // The main part of the chchord is the same as in vkchord. - if (has_cluster) push_cluster(sign, k.chchord, k.cluster); - else if (has_unshift) push_cluster(sign, k.chchord, k.unshift); - else push_cluster(sign, k.chchord, k.shifted); + push_cluster(sign, k.chchord, cluster); } push_keyid(sign, k.vkchord, k.keycode); push_scode(sign, k.scchord, k.scancod | (k.extflag ? 0x100 : 0)); From 0b6875cdc760bf7d94ab2dadc29527214bd32df3 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 25 Jun 2026 16:46:36 +0500 Subject: [PATCH 53/71] #943 WIP: Make key lookups regardless of the layout --- src/netxs/desktopio/consrv.hpp | 4 +- src/netxs/desktopio/directvt.hpp | 2 +- src/netxs/desktopio/gui.hpp | 150 ++++++----- src/netxs/desktopio/input.hpp | 446 ++++++++++++++++++------------- src/netxs/desktopio/system.hpp | 12 +- 5 files changed, 350 insertions(+), 264 deletions(-) diff --git a/src/netxs/desktopio/consrv.hpp b/src/netxs/desktopio/consrv.hpp index ce1b26e45d..6a5bfa974b 100644 --- a/src/netxs/desktopio/consrv.hpp +++ b/src/netxs/desktopio/consrv.hpp @@ -546,7 +546,7 @@ struct impl : consrv hist inputs; // evnt: Input history per process name storage. mbtn dclick; // evnt: Mouse double-click tracker. si32 mstate; // evnt: Mouse button last state. - si32 layout; // evnt: Current keyboard layout id. + ui32 layout; // evnt: Current keyboard layout id. evnt(impl& serv) : server{ serv }, @@ -1094,7 +1094,7 @@ struct impl : consrv if (gear.xlayout != layout) // Sync kb layout. { layout = gear.xlayout; - auto data = nt::console::layout_input{ .klid = layout }; + auto data = nt::console::layout_input{ .layout_id = layout }; stream.emplace_back(*reinterpret_cast(&data)); } diff --git a/src/netxs/desktopio/directvt.hpp b/src/netxs/desktopio/directvt.hpp index 132c3336ad..f154d8a43c 100644 --- a/src/netxs/desktopio/directvt.hpp +++ b/src/netxs/desktopio/directvt.hpp @@ -1037,7 +1037,7 @@ namespace netxs::directvt (si32, scancod) // syskeybd: Scancode. (si32, keystat) // syskeybd: Key state: unknown, pressed, repeated, released. (si32, keycode) // syskeybd: Key id. - (si32, xlayout) // syskeybd: Keyboard layout ID (KLID). + (ui32, xlayout) // syskeybd: Keyboard layout ID (KLID). (byte, payload) // syskeybd: Payload type. (bool, extflag) // syskeybd: Win32 extflag. (bool, handled) // syskeybd: Key event is handled. diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index a7a8044bc6..0d05936cb5 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -3469,8 +3469,9 @@ namespace netxs::gui bool fake_ralt; // winbase: Fake alt/ctrl key events on AltGr press/release (non-US kb layouts). bool wait_ralt; // winbase: Wait RightAlt right after the fake LeftCtrl. si32 last_deadkey_vkey = {}; // winbase: Virtual code for deadkey tracking. - si32 xlayout; // winbase: Current keyboard layout (KLID). - si32 klid_fallback; // winbase: User's latin-based keyboard layout. + ui32 xlayout; // winbase: Current keyboard layout (KLID). + arch hkl_latin; // winbase: User's latin-based keyboard layout. + si32 layout_hint; // winbase: Layout hint for key lookup. winbase(auth& indexer, cfg_t& config, twod grip_cell) : base{ indexer }, @@ -3505,7 +3506,8 @@ namespace netxs::gui fake_ralt{ faux }, wait_ralt{ faux }, xlayout{}, - klid_fallback{} + hkl_latin{}, + layout_hint{ -1 } { } virtual bool layer_create(layer& s, winbase* host_ptr = nullptr, twod win_coord = {}, twod grid_size = {}, dent border_dent = {}, twod cell_size = {}) = 0; @@ -3526,7 +3528,7 @@ namespace netxs::gui stream_keybd(gear); gear.payload = input::keybd::type::keypress; } - virtual void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) = 0; + virtual void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift, arch layout_id, bool apply_modifiers) = 0; virtual void keybd_read_vkstat() = 0; virtual void keybd_wipe_vkstat() = 0; virtual bool keybd_read_input() = 0; @@ -3536,7 +3538,7 @@ namespace netxs::gui virtual bool keybd_read_pressed(si32 virtcod) = 0; virtual bool keybd_test_pressed(si32 virtcod) = 0; virtual si32 keybd_read_media(si16 cmd, ui16 uDevice, ui16 dwKeys) = 0; - virtual void keybd_reset_deadkey() = 0; + virtual void keybd_reset_deadkey(arch hkl = {}) = 0; virtual void mouse_capture(si32 captured_by) = 0; virtual void mouse_release(si32 released_by) = 0; @@ -4662,8 +4664,14 @@ namespace netxs::gui gear.extflag = extflag; gear.virtcod = virtcod; gear.scancod = scancod; - keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift); - auto keycode = input::key::xlat_direct(virtcod, scancod, extflag, fake_ralt, xlayout, klid_fallback); + keybd_peek_layout(virtcod, scancod, extflag, gear.shifted, gear.unshift, 0, true); + auto keycode = input::key::xlat_direct(virtcod, scancod, extflag, fake_ralt, layout_hint, [&] + { + auto latin_shifted = text{}; + auto latin_unshift = text{}; + keybd_peek_layout(virtcod, scancod, extflag, latin_shifted, latin_unshift, hkl_latin, faux); + return std::pair{ latin_shifted, latin_unshift }; + }); if ((gear.keystat == input::key::released || keycode != gear.keycode) && keystat == input::key::repeated) keystat = input::key::pressed; // LeftMod+RightMod press is treated by the OS as a repeated LeftMod. gear.keystat = keystat; gear.keycode = keycode; @@ -4899,6 +4907,7 @@ namespace netxs::gui } else { + //todo check issues with focus keybd_reset_deadkey(); // Force reset deadkey state if it is. Windows doesn't reset deadkey state when refocusing but all other platforms do. if (target_list) // Send to all that the focus is going to lost. { @@ -5430,13 +5439,11 @@ namespace netxs::gui tsfl tslink; // window: TSF link. MSG winmsg; // window: Last OS window message. wide toWIDE; // window: UTF-16 conversion buffer. - bool klid_suppress_tracking; // window: Suppress keyboard layout tracking. window(auto&& ...Args) : winbase{ Args... }, tslink{ *this }, - winmsg{}, - klid_suppress_tracking{} + winmsg{} { auto proc = (LONG(_stdcall*)(si32))::GetProcAddress(::GetModuleHandleA("user32.dll"), "SetProcessDpiAwarenessInternal"); if (proc) proc(2/*PROCESS_PER_MONITOR_DPI_AWARE*/); @@ -5525,48 +5532,55 @@ namespace netxs::gui ::EndDeferWindowPos(lock); } //todo static - void keybd_reset_deadkey() + void keybd_reset_deadkey(arch hkl = {}) { auto uc = L' '; auto ks = std::array{}; auto vk = input::key::map::data(input::key::Space).vkey; auto sc = input::key::map::data(input::key::Space).scan; - ::ToUnicodeEx(vk, sc, ks.data(), &uc, 1, 0, 0); + ::ToUnicodeEx(vk, sc, ks.data(), &uc, 1, 0, (HKL)hkl); } - void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift) + void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift, arch layout_id, bool apply_modifiers) { shifted.clear(); unshift.clear(); auto is_printable = scancod && ((virtcod >= 0x30 && virtcod <= 0x5A) || (virtcod >= 0x60 && virtcod <= 0x6F) || (virtcod >= 0xB8 && virtcod <= 0xE6)); - auto hkl = ::GetKeyboardLayout(0); + auto hkl = layout_id ? (HKL)layout_id : ::GetKeyboardLayout(0); if (is_printable && virtcod != last_deadkey_vkey) // Alphanumeric + punctuation (excluding deadkeys). { auto buf = wide(8, 0); auto flags = extflag ? 1u : 0u; flags |= 2; // ToUnicodeEx will translate scancodes marked as key break events in addition to its usual treatment of key make events. auto key_matrix = std::array{}; - if (fake_ralt) // Emulate AltGr pressed. + if (apply_modifiers) { - key_matrix[vkey::ctrl ] = 0x80; - key_matrix[vkey::lctrl] = 0x80; - key_matrix[vkey::alt ] = 0x80; - key_matrix[vkey::ralt ] = 0x80; + if (fake_ralt) // Emulate AltGr pressed. + { + key_matrix[vkey::ctrl ] = 0x80; + key_matrix[vkey::lctrl] = 0x80; + key_matrix[vkey::alt ] = 0x80; + key_matrix[vkey::ralt ] = 0x80; + } + key_matrix[vkey::grselect] = vkstat[vkey::grselect]; // Respect GroupSelect (IsoLevel5Shift) on Canadian layout. + key_matrix[vkey::capslock] = vkstat[vkey::capslock]; } - key_matrix[vkey::grselect] = vkstat[vkey::grselect]; // Respect GroupSelect (IsoLevel5Shift) on Canadian layout. - key_matrix[vkey::capslock] = vkstat[vkey::capslock]; auto rc = ::ToUnicodeEx(virtcod, scancod, key_matrix.data(), buf.data(), 8, flags, hkl); if (rc > 0) { utf::to_utf(buf.data(), rc, unshift); + key_matrix[vkey::shift ] = 0x80; + key_matrix[vkey::lshift] = 0x80; + rc = ::ToUnicodeEx(virtcod, scancod, key_matrix.data(), buf.data(), 8, flags, hkl); + if (rc > 0) + { + utf::to_utf(buf.data(), rc, shifted); + } } - key_matrix[vkey::shift ] = 0x80; - key_matrix[vkey::lshift] = 0x80; - rc = ::ToUnicodeEx(virtcod, scancod, key_matrix.data(), buf.data(), 8, flags, hkl); - if (rc > 0) + if (rc < 0) { - utf::to_utf(buf.data(), rc, shifted); + keybd_reset_deadkey((arch)hkl); } } } @@ -5771,10 +5785,37 @@ namespace netxs::gui ::SetKeyboardState(vkstat.data()); // Sync thread kb state. //print_vkstat("deactivate"); } + auto is_layout_latin_based(HKL hkl) + { + static constexpr auto all_26_letters = (1 << ('z' - 'a' + 1)) - 1; + auto c = wchr{}; + auto latin_mask = 0; // A-Z (26 bits). + auto key_states = std::array{}; + for (auto ex_bit : { 0x0000, 0xE000 }) + for (auto i = 1u; i < 0x100u; i++) + { + auto sc = i | ex_bit; + if (auto vk = ::MapVirtualKeyExW(sc, MAPVK_VSC_TO_VK, hkl)) + { + auto l = ::ToUnicodeEx(vk, sc, key_states.data(), &c, 1, 0, hkl); + if (l == 1 && (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')) + { + latin_mask |= (1 << ((c & 0x1F) - 1)); + if (latin_mask == all_26_letters) return true; + } + else if (l < 0) // Reset deadkey. + { + key_states[vk] = 0x80; // Double press resets deadkey key. + ::ToUnicodeEx(vk, sc, key_states.data(), &c, 1, 0, hkl); + key_states[vk] = 0x00; + } + } + } + return faux; + } auto keybd_find_layout() // Find any installed latin-based keyboard layout. { - klid_suppress_tracking = true; - auto latin_klid = 0; + auto latin_hkl = HKL{}; auto layout_count = ::GetKeyboardLayoutList(0, nullptr); auto layouts = std::vector(layout_count); ::GetKeyboardLayoutList(layout_count, layouts.data()); @@ -5783,53 +5824,38 @@ namespace netxs::gui log("Installed layouts:"); for (auto hkl : layouts) log(" %%", hkl); } - auto old_hkl = ::GetKeyboardLayout(0); // Save current layout. - for (auto hkl : layouts) // Iterate over existing layouts. + for (auto hkl : layouts) // Iterate over user's layouts. { - ::ActivateKeyboardLayout(hkl, 0); - auto klid_wide = wide(KL_NAMELENGTH - 1/*exclude trailing null*/, '\0'); - if (::GetKeyboardLayoutNameW(klid_wide.data())) + if (is_layout_latin_based(hkl)) { - auto klid = utf::to_int_from_hex_str(klid_wide); - if (input::key::is_layout_supported(klid)) - { - if constexpr (debugmode) log("Latin-based keyboard layout found: ", utf::adjust(utf::to_hex(klid), 8, "0", true)); - latin_klid = klid; - break; - } + latin_hkl = hkl; + break; } } - ::ActivateKeyboardLayout(old_hkl, 0); // Restore user's layout. if constexpr (debugmode) - if (!latin_klid) + if (!latin_hkl) { log("Latin-based keyboard layout not found"); } - klid_suppress_tracking = faux; - return latin_klid; + return (arch)latin_hkl; } void keybd_sync_layout() { - if (klid_suppress_tracking) return; keybd_sync_state(); - auto klid_buf = wide(KL_NAMELENGTH - 1/*exclude trailing null*/, '\0'); - ::GetKeyboardLayoutNameW(klid_buf.data()); - auto klid = utf::to_int_from_hex_str(klid_buf); - if (!klid_fallback) + auto hkl = ::GetKeyboardLayout(0); // Get current layout's hkl. + auto layout_id = (ui32)(arch)hkl; + if (is_layout_latin_based(hkl)) { - if (input::key::is_layout_supported(klid)) - { - klid_fallback = klid; - } - else - { - if constexpr (debugmode) log("Layout %% is unsupported or not latin-based. Looking for klid fallback.", utf::adjust(utf::to_hex(klid), 8, "0", true)); - klid_fallback = keybd_find_layout(); // Looking for klid fallback. - } + hkl_latin = (arch)hkl; + } + else + { + if constexpr (debugmode) log("Layout %% is not latin-based. Looking for klid fallback.", utf::adjust(utf::to_hex(layout_id), 8, "0", true)); + hkl_latin = keybd_find_layout(); // Find hkl fallback. } - if (std::exchange(xlayout, klid) != klid) + if (std::exchange(xlayout, layout_id) != layout_id) { - log("%%Keyboard layout changed to ", prompt::gui, utf::adjust(utf::to_hex(klid), 8, "0", true)); + log("%%Keyboard layout changed to ", prompt::gui, utf::adjust(utf::to_hex(layout_id), 8, "0", true)); winbase::keybd_sync_layout(); } } @@ -6231,9 +6257,9 @@ namespace netxs::gui void keybd_read_vkstat() {} void keybd_send_block(view /*block*/) {} void keybd_sync_layout() {} - void keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, bool /*extflag*/, text& /*shifted*/, text& /*unshift*/) {} + void keybd_peek_layout(si32 /*virtcod*/, si32 /*scancod*/, bool /*extflag*/, text& /*shifted*/, text& /*unshift*/, arch /*layout_id*/, bool /*apply_modifiers*/) {} void keybd_sync_state(si32 /*virtcod*/) {} - void keybd_reset_deadkey() {} + void keybd_reset_deadkey(arch /*hkl*/ = {}) {} bool layer_create(layer& /*s*/, winbase* /*host_ptr*/ = nullptr, twod /*win_coord*/ = {}, twod /*grid_size*/ = {}, dent /*border_dent*/ = {}, twod /*cell_size*/ = {}) { return true; } void layer_move_all() {} void layer_present(layer& /*s*/) {} diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index a41dd150f5..bd03a9ee19 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -198,145 +198,146 @@ namespace netxs::input return layout::qwerty; } - static constexpr auto latin_klids = std::to_array( - { - /*00 500*/ 0x00000409, // US - /*01 360*/ 0x00000411, // Japanese - /*02 360*/ 0x00000415, // Polish (Programmers) - /*03 360*/ 0x00020405, // Czech Programmers - /*04 360*/ 0x00020418, // Romanian (Programmers) - /*05 360*/ 0x00010426, // Latvian (QWERTY) - /*06 360*/ 0x00020426, // Latvian (Standard) - /*07 360*/ 0x00050408, // Greek Latin - /*08 360*/ 0x00004009, // English (India) - /*09 360*/ 0x0000046a, // Yoruba - /*0A 360*/ 0x00000468, // Hausa - /*0B 360*/ 0x00000470, // Igbo - /*0C 360*/ 0x00000481, // Maori - /*0D 360*/ 0x0000046c, // Sesotho sa Leboa - /*0E 353*/ 0x00020409, // United States-International - /*0F 353*/ 0x00010427, // Lithuanian - /*10 353*/ 0x00000475, // Hawaiian - /*11 348*/ 0x00000412, // Korean - /*12 346*/ 0x00050409, // US English Table for IBM Arabic 238_L - /*13 344*/ 0x0001045d, // Inuktitut - Naqittaut - /*14 344*/ 0x0000085d, // Inuktitut - Latin - /*15 343*/ 0x00000452, // United Kingdom Extended - /*16 336*/ 0x00000809, // United Kingdom - /*17 336*/ 0x00011809, // Scottish Gaelic - /*18 336*/ 0x00001809, // Irish - /*19 332*/ 0x0000042a, // Vietnamese - /*1A 332*/ 0x0000043a, // Maltese 47-Key - /*1B 332*/ 0x0001043a, // Maltese 48-Key - /*1C 318*/ 0x00010418, // Romanian (Standard) - /*1D 313*/ 0x00001009, // Canadian French - /*1E 311*/ 0x00000416, // Portuguese (Brazil ABNT) - /*1F 311*/ 0x00000c0c, // Canadian French (Legacy) - /*20 308*/ 0x0000041c, // Albanian - /*21 305*/ 0x00011009, // Canadian Multilingual Standard - /*22 299*/ 0x0001083b, // Finnish with Sami - /*23 299*/ 0x00030408, // Greek (220) Latin - /*24 299*/ 0x00040408, // Greek (319) Latin - /*25 299*/ 0x0000043b, // Norwegian with Sami - /*26 299*/ 0x0000041d, // Swedish - /*27 299*/ 0x0000046f, // Greenlandic - /*28 299*/ 0x00000474, // Guarani - /*29 297*/ 0x00010405, // Czech (QWERTY) - /*2A 297*/ 0x0001040a, // Spanish Variation - /*2B 297*/ 0x00000425, // Estonian - /*2C 297*/ 0x0001041b, // Slovak (QWERTY) - /*2D 294*/ 0x00000410, // Italian - /*2E 294*/ 0x00010410, // Italian (142) - /*2F 294*/ 0x00000816, // Portuguese - /*30 292*/ 0x00000406, // Danish - /*31 292*/ 0x0000040b, // Finnish - /*32 292*/ 0x00000413, // Dutch - /*33 292*/ 0x00000414, // Norwegian - /*34 292*/ 0x0000040a, // Spanish - /*35 292*/ 0x0000080a, // Latin American - /*36 292*/ 0x00000438, // Faeroese - /*37 291*/ 0x00000405, // Czech - /*38 290*/ 0x0000040f, // Icelandic - /*39 289*/ 0x00010415, // Polish (214) - /*3A 289*/ 0x0000041b, // Slovak - /*3B 289*/ 0x0001042e, // Sorbian Extended - /*3C 289*/ 0x0002042e, // Sorbian Standard - /*3D 289*/ 0x0000042e, // Sorbian Standard (Legacy) - /*3E 289*/ 0x0000081a, // Serbian (Latin) - /*3F 285*/ 0x0000040e, // Hungarian - /*40 282*/ 0x00000407, // German - /*41 282*/ 0x00020407, // German Extended (E1) - /*42 282*/ 0x00030407, // German Extended (E2) - /*43 282*/ 0x00010407, // German (IBM) - /*44 282*/ 0x0000046e, // Luxembourgish - /*45 282*/ 0x00000807, // Swiss German - /*46 282*/ 0x0000041f, // Turkish Q - /*47 277*/ 0x0001040e, // Hungarian 101-key - /*48 275*/ 0x00000424, // Slovenian - /*49 275*/ 0x00060409, // Colemak - /*4A 273*/ 0x00000418, // Romanian (Legacy) - /*4B 267*/ 0x0000085f, // Central Atlas Tamazight - /*4C 267*/ 0x00000488, // Wolof - /*4D 266*/ 0x0001040c, // French (Standard, AZERTY) - /*4E 260*/ 0x0000040c, // French (Legacy, AZERTY) - /*4F 257*/ 0x00000813, // Belgian (Period) - /*50 257*/ 0x0001080c, // Belgian (Comma) - /*51 256*/ 0x00020427, // Lithuanian Standard - /*52 188*/ 0x00010409, // United States-Dvorak - /*53 172*/ 0x0001041f, // Turkish F - /*54 165*/ 0x00040409, // United States-Dvorak for right hand - /*55 160*/ 0x00030409, // United States-Dvorak for left hand - /*56 155*/ 0x0002040c, // French (Standard, BÉPO) - }); - static constexpr auto klid_hash(si32 klid) - { - auto iter = std::ranges::find(latin_klids, klid); - if (iter != latin_klids.end()) - { - return (si32)std::distance(latin_klids.begin(), iter); - } - else - return 0; - } - static constexpr auto supported_klids = [] // This won't compile if there are collisions. - { - struct layout - { - si32 klid; - si32 index; - }; - auto index = 0; - auto klids = std::array{}; - for (auto klid : input::key::latin_klids) // Check hash collisions. - { - klids[index] = { (si32)klid, index }; - index++; - } - return klids; - }(); - static constexpr auto is_layout_supported(si32 klid) - { - return input::key::supported_klids[input::key::klid_hash(klid)].klid == klid; - } - // 15 9 8 7 0 - // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ - // | L L L L L L L | E | S S S S S S S S | - // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ - // \_________________________/ | \_____________________________/ - // 7 bit Layout Index | 8 bit Base Scancode - // (0 - 93) | (0 - 255) - // Extended Bit (0 or 1) - auto key_hash(si32 klid, si32 scan, bool extflag) - { - assert(input::key::supported_klids[input::key::klid_hash(klid)].klid == klid); - auto hash = (ui16)((scan & 0xFF) | ((si32)extflag << 8) | (input::key::klid_hash(klid) << 9)); - return hash; - } + //static constexpr auto latin_klids = std::to_array( + //{ + // /*00 500*/ 0x00000409, // US + // /*01 360*/ 0x00000411, // Japanese + // /*02 360*/ 0x00000415, // Polish (Programmers) + // /*03 360*/ 0x00020405, // Czech Programmers + // /*04 360*/ 0x00020418, // Romanian (Programmers) + // /*05 360*/ 0x00010426, // Latvian (QWERTY) + // /*06 360*/ 0x00020426, // Latvian (Standard) + // /*07 360*/ 0x00050408, // Greek Latin + // /*08 360*/ 0x00004009, // English (India) + // /*09 360*/ 0x0000046a, // Yoruba + // /*0A 360*/ 0x00000468, // Hausa + // /*0B 360*/ 0x00000470, // Igbo + // /*0C 360*/ 0x00000481, // Maori + // /*0D 360*/ 0x0000046c, // Sesotho sa Leboa + // /*0E 353*/ 0x00020409, // United States-International + // /*0F 353*/ 0x00010427, // Lithuanian + // /*10 353*/ 0x00000475, // Hawaiian + // /*11 348*/ 0x00000412, // Korean + // /*12 346*/ 0x00050409, // US English Table for IBM Arabic 238_L + // /*13 344*/ 0x0001045d, // Inuktitut - Naqittaut + // /*14 344*/ 0x0000085d, // Inuktitut - Latin + // /*15 343*/ 0x00000452, // United Kingdom Extended + // /*16 336*/ 0x00000809, // United Kingdom + // /*17 336*/ 0x00011809, // Scottish Gaelic + // /*18 336*/ 0x00001809, // Irish + // /*19 332*/ 0x0000042a, // Vietnamese + // /*1A 332*/ 0x0000043a, // Maltese 47-Key + // /*1B 332*/ 0x0001043a, // Maltese 48-Key + // /*1C 318*/ 0x00010418, // Romanian (Standard) + // /*1D 313*/ 0x00001009, // Canadian French + // /*1E 311*/ 0x00000416, // Portuguese (Brazil ABNT) + // /*1F 311*/ 0x00000c0c, // Canadian French (Legacy) + // /*20 308*/ 0x0000041c, // Albanian + // /*21 305*/ 0x00011009, // Canadian Multilingual Standard + // /*22 299*/ 0x0001083b, // Finnish with Sami + // /*23 299*/ 0x00030408, // Greek (220) Latin + // /*24 299*/ 0x00040408, // Greek (319) Latin + // /*25 299*/ 0x0000043b, // Norwegian with Sami + // /*26 299*/ 0x0000041d, // Swedish + // /*27 299*/ 0x0000046f, // Greenlandic + // /*28 299*/ 0x00000474, // Guarani + // /*29 297*/ 0x00010405, // Czech (QWERTY) + // /*2A 297*/ 0x0001040a, // Spanish Variation + // /*2B 297*/ 0x00000425, // Estonian + // /*2C 297*/ 0x0001041b, // Slovak (QWERTY) + // /*2D 294*/ 0x00000410, // Italian + // /*2E 294*/ 0x00010410, // Italian (142) + // /*2F 294*/ 0x00000816, // Portuguese + // /*30 292*/ 0x00000406, // Danish + // /*31 292*/ 0x0000040b, // Finnish + // /*32 292*/ 0x00000413, // Dutch + // /*33 292*/ 0x00000414, // Norwegian + // /*34 292*/ 0x0000040a, // Spanish + // /*35 292*/ 0x0000080a, // Latin American + // /*36 292*/ 0x00000438, // Faeroese + // /*37 291*/ 0x00000405, // Czech + // /*38 290*/ 0x0000040f, // Icelandic + // /*39 289*/ 0x00010415, // Polish (214) + // /*3A 289*/ 0x0000041b, // Slovak + // /*3B 289*/ 0x0001042e, // Sorbian Extended + // /*3C 289*/ 0x0002042e, // Sorbian Standard + // /*3D 289*/ 0x0000042e, // Sorbian Standard (Legacy) + // /*3E 289*/ 0x0000081a, // Serbian (Latin) + // /*3F 285*/ 0x0000040e, // Hungarian + // /*40 282*/ 0x00000407, // German + // /*41 282*/ 0x00020407, // German Extended (E1) + // /*42 282*/ 0x00030407, // German Extended (E2) + // /*43 282*/ 0x00010407, // German (IBM) + // /*44 282*/ 0x0000046e, // Luxembourgish + // /*45 282*/ 0x00000807, // Swiss German + // /*46 282*/ 0x0000041f, // Turkish Q + // /*47 277*/ 0x0001040e, // Hungarian 101-key + // /*48 275*/ 0x00000424, // Slovenian + // /*49 275*/ 0x00060409, // Colemak + // /*4A 273*/ 0x00000418, // Romanian (Legacy) + // /*4B 267*/ 0x0000085f, // Central Atlas Tamazight + // /*4C 267*/ 0x00000488, // Wolof + // /*4D 266*/ 0x0001040c, // French (Standard, AZERTY) + // /*4E 260*/ 0x0000040c, // French (Legacy, AZERTY) + // /*4F 257*/ 0x00000813, // Belgian (Period) + // /*50 257*/ 0x0001080c, // Belgian (Comma) + // /*51 256*/ 0x00020427, // Lithuanian Standard + // /*52 188*/ 0x00010409, // United States-Dvorak + // /*53 172*/ 0x0001041f, // Turkish F + // /*54 165*/ 0x00040409, // United States-Dvorak for right hand + // /*55 160*/ 0x00030409, // United States-Dvorak for left hand + // /*56 155*/ 0x0002040c, // French (Standard, BÉPO) + //}); + //static constexpr auto klid_hash(si32 klid) + //{ + // auto iter = std::ranges::find(latin_klids, klid); + // if (iter != latin_klids.end()) + // { + // return (si32)std::distance(latin_klids.begin(), iter); + // } + // else + // return 0; + //} + //static constexpr auto supported_klids = [] // This won't compile if there are collisions. + //{ + // struct layout + // { + // si32 klid; + // si32 index; + // }; + // auto index = 0; + // auto klids = std::array{}; + // for (auto klid : input::key::latin_klids) // Check hash collisions. + // { + // klids[index] = { (si32)klid, index }; + // index++; + // } + // return klids; + //}(); + //static constexpr auto is_layout_supported(si32 klid) + //{ + // return input::key::supported_klids[input::key::klid_hash(klid)].klid == klid; + //} + //auto key_hash(si32 klid, si32 scan, bool extflag) + //{ + // assert(input::key::supported_klids[input::key::klid_hash(klid)].klid == klid); + // auto hash = (ui16)((scan & 0xFF) | ((si32)extflag << 8) | (input::key::klid_hash(klid) << 9)); + // return hash; + //} // Notes: // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. // Shift: We normalize the left and right shifts: right shift = VK_SHIFT+ExtFlag. + // PhysicalCode: + // 15 9 8 7 0 7 0 + // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+ + // | L L L L L L L | E | S S S S S S S S | | S S S S S S S S | + // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+ + // \_________________________/ | \_____________________________/ \_____________________________/ + // 7 bit Layout Index | 8 bit Base Scancode 8 bit Base Virtcode + // (0 - 93) | (0 - 255) (0 - 255) + // Extended Bit (0 or 1) #define key_list \ /* ID Input Ex_Vk Name Generic Literal Uc KKPdef KKPsuffix KKPascii wCtl PhysicalCode */\ X(0 , 1, 0 , undef , "undef" , "" , 0 , 0 , 'u', -1 , -1 , "")\ @@ -660,39 +661,68 @@ namespace netxs::input key_list #undef X - static constexpr auto fx_map = [] + static constexpr auto uc_map = [] { - auto m = std::array{}; - auto fill = [&](si32 KeyId, si32 Vk) + constexpr auto total_uc_count = [] { - if (Vk > (si32)m.size() || m[Vk]) log("The Vk value is duplicated or incorrect (vk=%%)", Vk); /* It won't compile if broken. */\ - if (Vk) m[Vk] = (si16)KeyId; + auto total_uc_count = 0; + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + if constexpr (Uc && (KeyId & 1) == 0) total_uc_count++; + key_list + #undef X + return total_uc_count; + }(); + struct uc_key_t + { + si16 keyid; + utfx uc; + }; + auto m = std::array{}; + auto i = 0; + auto fill = [&](si16 KeyId, utfx Uc) + { + if (Uc && (KeyId & 1) == 0) m[i++] = { .keyid = KeyId, .uc = Uc }; }; #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ - fill(KeyId, Vk); + fill(KeyId, Uc); key_list #undef X + std::ranges::sort(m, {}, &uc_key_t::uc); return m; }(); - static constexpr auto key_map = [] + static constexpr auto fx_map = [] { - auto m = std::array{}; - auto fill = [&](si32 KeyId, qiew codes) + auto m = std::array{}; + auto fill = [&](si32 KeyId, si32 Vk) { - while (codes) - { - auto hash = codes.pop_front(6); - auto key_hash = utf::to_int_from_hex_str(hash) >> 8; - if (m[key_hash]) log("Key %KeyId% is duplicated (hash=%hash%)", KeyId, hash); // It won't compile if collide. - m[key_hash] = (si16)KeyId; - } + if (Vk > (si32)m.size() || m[Vk]) log("The Vk value is duplicated or incorrect (vk=%%)", Vk); // It won't compile if broken. + if (Vk) m[Vk] = (si16)KeyId; }; #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ - fill(KeyId, qiew{ PhysicalCode }); + fill(KeyId, Vk); key_list #undef X return m; }(); + //static constexpr auto key_map = [] + //{ + // auto m = std::array{}; + // auto fill = [&](si32 KeyId, qiew codes) + // { + // while (codes) + // { + // auto hash = codes.pop_front(6); + // auto key_hash = utf::to_int_from_hex_str(hash) >> 8; + // if (m[key_hash]) log("Key %KeyId% is duplicated (hash=%hash%)", KeyId, hash); // It won't compile if collide. + // m[key_hash] = (si16)KeyId; + // } + // }; + // #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + // fill(KeyId, qiew{ PhysicalCode }); + // key_list + // #undef X + // return m; + //}(); static constexpr auto vk_map = [] { struct keyrec @@ -1317,7 +1347,7 @@ namespace netxs::input si32 virtcod{}; si32 scancod{}; si32 keycode{}; - si32 xlayout{}; + ui32 xlayout{}; bool extflag{}; bool handled{}; si64 touched{}; @@ -3039,7 +3069,36 @@ namespace netxs::input extflag = true; } } - auto xlat(si32 vk, si32 sc, bool extflag, si32 xlayout, si32 layout_fallback, si32& layout_hint) + auto _find_abstract_key(si32 vk, si32 sc, bool extflag, si32& layout_hint) + { + auto keyid = input::key::undef; + auto new_layout_hint = layout_hint; + using keyrec = std::decay_t; + auto [head, tail] = std::equal_range(input::key::vk_map.begin(), input::key::vk_map.end(), vk, keyrec::cmp{}); + sc |= extflag << 8; + while (head != tail) + { + auto& r = *head++; + if (r.scan == sc) + { + if (new_layout_hint == layout_hint && r.klid != layout_hint) // Best effort. + { + keyid = r.code; + new_layout_hint = r.klid; + if (layout_hint == -1) break; // If there are no hints, then a match with the scancode is enough. + } + else if (r.klid == layout_hint) // Exact match. + { + keyid = r.code; + new_layout_hint = r.klid; + break; + } + } + } + layout_hint = new_layout_hint; + return keyid; + } + auto xlat(si32 vk, si32 sc, bool extflag, si32& layout_hint) { auto keyid = key::undef; fix_altgr_and_right_shift(vk, sc, extflag, faux); @@ -3049,44 +3108,21 @@ namespace netxs::input keyid = keycode; if constexpr (debugmode) log("Fast detection of function keys: ", keyid); } - else if (xlayout) - { - auto klid = input::key::is_layout_supported(xlayout) ? xlayout - : layout_fallback ? layout_fallback - : input::key::latin_klids[0]; - auto hash = input::key::key_hash(klid, sc, extflag); - keyid = (si32)input::key::key_map[hash]; - } + //else if (xlayout) + //{ + // auto klid = input::key::is_layout_supported(xlayout) ? xlayout + // : layout_fallback ? layout_fallback + // : input::key::latin_klids[0]; + // auto hash = input::key::key_hash(klid, sc, extflag); + // keyid = (si32)input::key::key_map[hash]; + //} else { - sc |= extflag << 8; - auto new_layout_hint = layout_hint; - using keyrec = std::decay_t; - auto [head, tail] = std::equal_range(input::key::vk_map.begin(), input::key::vk_map.end(), vk, keyrec::cmp{}); - while (head != tail) - { - auto& r = *head++; - if (r.scan == sc) - { - if (new_layout_hint == layout_hint && r.klid != layout_hint) // Best effort. - { - keyid = r.code; - new_layout_hint = r.klid; - if (layout_hint == -1) break; // If there are no hints, then a match with the scancode is enough. - } - else if (r.klid == layout_hint) // Exact match. - { - keyid = r.code; - new_layout_hint = r.klid; - break; - } - } - } - layout_hint = new_layout_hint; + keyid = _find_abstract_key(vk, sc, extflag, layout_hint); } return keyid; } - auto xlat_direct(si32 vk, si32 sc, bool extflag, bool fake_ralt, si32 xlayout, si32 layout_fallback) + auto xlat_direct(si32 vk, si32 sc, bool extflag, bool fake_ralt, si32& layout_hint, auto get_shifted_unshifted_char_pair) { auto keyid = key::undef; fix_altgr_and_right_shift(vk, sc, extflag, fake_ralt); @@ -3096,13 +3132,39 @@ namespace netxs::input keyid = keycode; if constexpr (debugmode) log("Function keys fast detection: ", keyid); } - else if (xlayout) + else { - auto klid = input::key::is_layout_supported(xlayout) ? xlayout - : layout_fallback ? layout_fallback - : input::key::latin_klids[0]; - auto hash = input::key::key_hash(klid, sc, extflag); - keyid = (si32)input::key::key_map[hash]; + auto [latin_shifted, latin_unshift] = get_shifted_unshifted_char_pair(); + if (latin_shifted.size() && latin_unshift.size()) + { + auto shifted_uc = utf::to_code(latin_shifted); + auto unshift_uc = utf::to_code(latin_unshift); + if (unshift_uc >= '0' && unshift_uc <= '9') // Check digits row. + { + keyid = input::key::Key0 + (unshift_uc - '0') * 2; + } + else if (shifted_uc >= '0' && shifted_uc <= '9') // Check digits row. + { + keyid = input::key::Key0 + (shifted_uc - '0') * 2; + } + else if (unshift_uc >= 'a' && unshift_uc <= 'z') // Fast check latin letters. + { + keyid = input::key::KeyA + (unshift_uc - 'a') * 2; + } + else + { + using keyrec = std::decay_t; + auto [head, tail] = std::ranges::equal_range(input::key::uc_map, unshift_uc, {}, &keyrec::uc); + if (head != tail) + { + keyid = head->keyid; + } + } + } + if (keyid == input::key::undef) + { + keyid = input::key::_find_abstract_key(vk, sc, extflag, layout_hint); + } } return keyid; } diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index c636876752..1d28ba3959 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -574,7 +574,7 @@ namespace netxs::os { ui32 EventType = MENU_EVENT; ui32 id = event::custom | event::kb_layout; - si32 klid; // Keyboard layout id. + ui32 layout_id = 0u; // Keyboard layout id (HKL). }; namespace op { @@ -5265,7 +5265,6 @@ namespace netxs::os #if defined(_WIN32) auto layout_hint = -1; - auto layout_fallback = 0; auto accumfp = fp32{}; auto coordfp = fp2d{ fp32nan, fp32nan }; auto items = std::vector{}; @@ -5372,7 +5371,7 @@ namespace netxs::os k.extflag = r.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY; k.virtcod = r.Event.KeyEvent.wVirtualKeyCode; k.scancod = r.Event.KeyEvent.wVirtualScanCode; - k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, k.xlayout, layout_fallback, layout_hint); + k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, layout_hint); k.keystat = r.Event.KeyEvent.bKeyDown ? (chords.exist(k.keycode) ? input::key::repeated : input::key::pressed) : input::key::released; chords.build(k); if (r.Event.KeyEvent.wRepeatCount-- > 0) keybd(k); @@ -5398,7 +5397,7 @@ namespace netxs::os k.extflag = r.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY; k.virtcod = r.Event.KeyEvent.wVirtualKeyCode; k.scancod = r.Event.KeyEvent.wVirtualScanCode; - k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, k.xlayout, layout_fallback, layout_hint); + k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, layout_hint); if (r.Event.KeyEvent.wRepeatCount-- > 0) { k.keystat = input::key::pressed; @@ -5434,10 +5433,9 @@ namespace netxs::os break; case nt::console::event::kb_layout: { - auto new_layout = reinterpret_cast(&r)->klid; - if (std::exchange(k.xlayout, new_layout) != new_layout) + auto new_layout_id = reinterpret_cast(&r)->layout_id; + if (std::exchange(k.xlayout, new_layout_id) != new_layout_id) { - if (input::key::is_layout_supported(k.xlayout)) layout_fallback = k.xlayout; k.payload = input::keybd::type::kblayout; chords.reset(k, faux); // faux: Keep pressed key state. keybd(k); From 1fb38d2e044f2ef55778072d75f8a8055d9adae4 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 25 Jun 2026 17:21:37 +0500 Subject: [PATCH 54/71] #943 WIP: Drop commented code (key_map, key_hash, latin_klids) --- src/netxs/desktopio/input.hpp | 154 ---------------------------------- 1 file changed, 154 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index bd03a9ee19..8732470d9b 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -198,133 +198,6 @@ namespace netxs::input return layout::qwerty; } - //static constexpr auto latin_klids = std::to_array( - //{ - // /*00 500*/ 0x00000409, // US - // /*01 360*/ 0x00000411, // Japanese - // /*02 360*/ 0x00000415, // Polish (Programmers) - // /*03 360*/ 0x00020405, // Czech Programmers - // /*04 360*/ 0x00020418, // Romanian (Programmers) - // /*05 360*/ 0x00010426, // Latvian (QWERTY) - // /*06 360*/ 0x00020426, // Latvian (Standard) - // /*07 360*/ 0x00050408, // Greek Latin - // /*08 360*/ 0x00004009, // English (India) - // /*09 360*/ 0x0000046a, // Yoruba - // /*0A 360*/ 0x00000468, // Hausa - // /*0B 360*/ 0x00000470, // Igbo - // /*0C 360*/ 0x00000481, // Maori - // /*0D 360*/ 0x0000046c, // Sesotho sa Leboa - // /*0E 353*/ 0x00020409, // United States-International - // /*0F 353*/ 0x00010427, // Lithuanian - // /*10 353*/ 0x00000475, // Hawaiian - // /*11 348*/ 0x00000412, // Korean - // /*12 346*/ 0x00050409, // US English Table for IBM Arabic 238_L - // /*13 344*/ 0x0001045d, // Inuktitut - Naqittaut - // /*14 344*/ 0x0000085d, // Inuktitut - Latin - // /*15 343*/ 0x00000452, // United Kingdom Extended - // /*16 336*/ 0x00000809, // United Kingdom - // /*17 336*/ 0x00011809, // Scottish Gaelic - // /*18 336*/ 0x00001809, // Irish - // /*19 332*/ 0x0000042a, // Vietnamese - // /*1A 332*/ 0x0000043a, // Maltese 47-Key - // /*1B 332*/ 0x0001043a, // Maltese 48-Key - // /*1C 318*/ 0x00010418, // Romanian (Standard) - // /*1D 313*/ 0x00001009, // Canadian French - // /*1E 311*/ 0x00000416, // Portuguese (Brazil ABNT) - // /*1F 311*/ 0x00000c0c, // Canadian French (Legacy) - // /*20 308*/ 0x0000041c, // Albanian - // /*21 305*/ 0x00011009, // Canadian Multilingual Standard - // /*22 299*/ 0x0001083b, // Finnish with Sami - // /*23 299*/ 0x00030408, // Greek (220) Latin - // /*24 299*/ 0x00040408, // Greek (319) Latin - // /*25 299*/ 0x0000043b, // Norwegian with Sami - // /*26 299*/ 0x0000041d, // Swedish - // /*27 299*/ 0x0000046f, // Greenlandic - // /*28 299*/ 0x00000474, // Guarani - // /*29 297*/ 0x00010405, // Czech (QWERTY) - // /*2A 297*/ 0x0001040a, // Spanish Variation - // /*2B 297*/ 0x00000425, // Estonian - // /*2C 297*/ 0x0001041b, // Slovak (QWERTY) - // /*2D 294*/ 0x00000410, // Italian - // /*2E 294*/ 0x00010410, // Italian (142) - // /*2F 294*/ 0x00000816, // Portuguese - // /*30 292*/ 0x00000406, // Danish - // /*31 292*/ 0x0000040b, // Finnish - // /*32 292*/ 0x00000413, // Dutch - // /*33 292*/ 0x00000414, // Norwegian - // /*34 292*/ 0x0000040a, // Spanish - // /*35 292*/ 0x0000080a, // Latin American - // /*36 292*/ 0x00000438, // Faeroese - // /*37 291*/ 0x00000405, // Czech - // /*38 290*/ 0x0000040f, // Icelandic - // /*39 289*/ 0x00010415, // Polish (214) - // /*3A 289*/ 0x0000041b, // Slovak - // /*3B 289*/ 0x0001042e, // Sorbian Extended - // /*3C 289*/ 0x0002042e, // Sorbian Standard - // /*3D 289*/ 0x0000042e, // Sorbian Standard (Legacy) - // /*3E 289*/ 0x0000081a, // Serbian (Latin) - // /*3F 285*/ 0x0000040e, // Hungarian - // /*40 282*/ 0x00000407, // German - // /*41 282*/ 0x00020407, // German Extended (E1) - // /*42 282*/ 0x00030407, // German Extended (E2) - // /*43 282*/ 0x00010407, // German (IBM) - // /*44 282*/ 0x0000046e, // Luxembourgish - // /*45 282*/ 0x00000807, // Swiss German - // /*46 282*/ 0x0000041f, // Turkish Q - // /*47 277*/ 0x0001040e, // Hungarian 101-key - // /*48 275*/ 0x00000424, // Slovenian - // /*49 275*/ 0x00060409, // Colemak - // /*4A 273*/ 0x00000418, // Romanian (Legacy) - // /*4B 267*/ 0x0000085f, // Central Atlas Tamazight - // /*4C 267*/ 0x00000488, // Wolof - // /*4D 266*/ 0x0001040c, // French (Standard, AZERTY) - // /*4E 260*/ 0x0000040c, // French (Legacy, AZERTY) - // /*4F 257*/ 0x00000813, // Belgian (Period) - // /*50 257*/ 0x0001080c, // Belgian (Comma) - // /*51 256*/ 0x00020427, // Lithuanian Standard - // /*52 188*/ 0x00010409, // United States-Dvorak - // /*53 172*/ 0x0001041f, // Turkish F - // /*54 165*/ 0x00040409, // United States-Dvorak for right hand - // /*55 160*/ 0x00030409, // United States-Dvorak for left hand - // /*56 155*/ 0x0002040c, // French (Standard, BÉPO) - //}); - //static constexpr auto klid_hash(si32 klid) - //{ - // auto iter = std::ranges::find(latin_klids, klid); - // if (iter != latin_klids.end()) - // { - // return (si32)std::distance(latin_klids.begin(), iter); - // } - // else - // return 0; - //} - //static constexpr auto supported_klids = [] // This won't compile if there are collisions. - //{ - // struct layout - // { - // si32 klid; - // si32 index; - // }; - // auto index = 0; - // auto klids = std::array{}; - // for (auto klid : input::key::latin_klids) // Check hash collisions. - // { - // klids[index] = { (si32)klid, index }; - // index++; - // } - // return klids; - //}(); - //static constexpr auto is_layout_supported(si32 klid) - //{ - // return input::key::supported_klids[input::key::klid_hash(klid)].klid == klid; - //} - //auto key_hash(si32 klid, si32 scan, bool extflag) - //{ - // assert(input::key::supported_klids[input::key::klid_hash(klid)].klid == klid); - // auto hash = (ui16)((scan & 0xFF) | ((si32)extflag << 8) | (input::key::klid_hash(klid) << 9)); - // return hash; - //} - // Notes: // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. @@ -704,25 +577,6 @@ namespace netxs::input #undef X return m; }(); - //static constexpr auto key_map = [] - //{ - // auto m = std::array{}; - // auto fill = [&](si32 KeyId, qiew codes) - // { - // while (codes) - // { - // auto hash = codes.pop_front(6); - // auto key_hash = utf::to_int_from_hex_str(hash) >> 8; - // if (m[key_hash]) log("Key %KeyId% is duplicated (hash=%hash%)", KeyId, hash); // It won't compile if collide. - // m[key_hash] = (si16)KeyId; - // } - // }; - // #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ - // fill(KeyId, qiew{ PhysicalCode }); - // key_list - // #undef X - // return m; - //}(); static constexpr auto vk_map = [] { struct keyrec @@ -3108,14 +2962,6 @@ namespace netxs::input keyid = keycode; if constexpr (debugmode) log("Fast detection of function keys: ", keyid); } - //else if (xlayout) - //{ - // auto klid = input::key::is_layout_supported(xlayout) ? xlayout - // : layout_fallback ? layout_fallback - // : input::key::latin_klids[0]; - // auto hash = input::key::key_hash(klid, sc, extflag); - // keyid = (si32)input::key::key_map[hash]; - //} else { keyid = _find_abstract_key(vk, sc, extflag, layout_hint); From 977acc7e42c984dc9b37c206031c0bfebe2d1afd Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 25 Jun 2026 17:55:02 +0500 Subject: [PATCH 55/71] #943 WIP: Add a workaround for the RightAlt extflag in native win32 console api reports --- src/netxs/desktopio/input.hpp | 2 +- src/netxs/desktopio/system.hpp | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 8732470d9b..aeb50204e1 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -2361,7 +2361,7 @@ namespace netxs::input keyout = {}; } } - auto exist(si32 keyid) + auto pressed(si32 keyid) { auto iter = pushed.find(keyid); return iter != pushed.end(); diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 1d28ba3959..37af6c4b48 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5282,6 +5282,20 @@ namespace netxs::os oldval = newval; } }; + auto fix_right_alt = [&](auto& r) // Fix extflag for RightAlt in unpress report (it is missed for unknown reason). + { + if (r.Event.KeyEvent.wVirtualKeyCode == input::vkey::alt) + { + auto ef = r.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY; + auto sc = r.Event.KeyEvent.wVirtualScanCode; + auto kd = r.Event.KeyEvent.bKeyDown; + if (sc == input::key::map::data(input::key::RightAlt).scan && !kd && !ef + && chords.pressed(input::key::RightAlt)) + { + r.Event.KeyEvent.dwControlKeyState |= ENHANCED_KEY; + } + } + }; auto waits = os::stdin_fd != os::invalid_fd ? std::vector{ (fd_t)os::signals::alarm, (fd_t)alarm, os::stdin_fd } : std::vector{ (fd_t)os::signals::alarm, (fd_t)alarm }; while (alive) @@ -5347,7 +5361,6 @@ namespace netxs::os } if (r.EventType == KEY_EVENT) { - auto modstat = os::nt::modstat(kbmod, r.Event.KeyEvent.dwControlKeyState, r.Event.KeyEvent.wVirtualScanCode, r.Event.KeyEvent.bKeyDown); if (modstat.repeats) continue; // We don't repeat modifiers. else if (modstat.changed) @@ -5366,13 +5379,14 @@ namespace netxs::os } if (utf::to_code(r.Event.KeyEvent.uChar.UnicodeChar, point)) { + fix_right_alt(r); k.cluster.clear(); if (point) utf::to_utf_from_code(point, k.cluster); k.extflag = r.Event.KeyEvent.dwControlKeyState & ENHANCED_KEY; k.virtcod = r.Event.KeyEvent.wVirtualKeyCode; k.scancod = r.Event.KeyEvent.wVirtualScanCode; k.keycode = input::key::xlat(k.virtcod, k.scancod, k.extflag, layout_hint); - k.keystat = r.Event.KeyEvent.bKeyDown ? (chords.exist(k.keycode) ? input::key::repeated : input::key::pressed) : input::key::released; + k.keystat = r.Event.KeyEvent.bKeyDown ? (chords.pressed(k.keycode) ? input::key::repeated : input::key::pressed) : input::key::released; chords.build(k); if (r.Event.KeyEvent.wRepeatCount-- > 0) keybd(k); if (k.keystat != input::key::released) while (r.Event.KeyEvent.wRepeatCount-- > 0) From cb9cc0f12a9056a4dccd302ae14c02f4549976f7 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 25 Jun 2026 19:01:39 +0500 Subject: [PATCH 56/71] #943 WIP: Exclude Shift/AltGr/Level5Shift keys from literal chords (+control characters filter) --- src/netxs/desktopio/consrv.hpp | 2 +- src/netxs/desktopio/input.hpp | 39 +++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/netxs/desktopio/consrv.hpp b/src/netxs/desktopio/consrv.hpp index 6a5bfa974b..c8ab2a78d5 100644 --- a/src/netxs/desktopio/consrv.hpp +++ b/src/netxs/desktopio/consrv.hpp @@ -1099,7 +1099,7 @@ struct impl : consrv } toWIDE.clear(); - auto cluster = input::key::get_cluster(gear); + auto cluster = input::key::get_cluster(gear, faux); utf::to_utf(cluster, toWIDE); if (toWIDE.empty()) toWIDE.push_back(0); auto c = toWIDE.front(); diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index aeb50204e1..4b8c1ebf52 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -2313,7 +2313,7 @@ namespace netxs::input auto is_pressed( byte sign) { return !(sign & input::key::unpressed_sign); } auto is_cluster( byte sign) { return sign & input::key::cluster_sign; } auto is_mouse( byte sign) { return (sign & input::key::generic_sign) == input::key::mouse_sign; } - auto get_cluster(auto& k) + auto get_cluster(auto& k, bool literal) { auto cluster = text{}; auto valid_codepoint = [](view utf8) @@ -2327,9 +2327,19 @@ namespace netxs::input auto has_shifted = k.shifted.size() && valid_codepoint(k.shifted) && shift_state; if (has_cluster || has_unshift || has_shifted) // Try to keep national key names. { - if (has_cluster) cluster = k.cluster; - else if (has_unshift) cluster = k.unshift; - else cluster = k.shifted; + if (literal) + { + if (has_cluster && k.cluster.front() > 0x1f) cluster = k.cluster; // Filter control characters when alternatives are available. + else if (has_unshift) cluster = k.unshift; + else if (has_shifted) cluster = k.shifted; + else cluster = k.cluster; + } + else + { + if (has_cluster) cluster = k.cluster; + else if (has_unshift) cluster = k.unshift; + else cluster = k.shifted; + } } return cluster; } @@ -2379,9 +2389,11 @@ namespace netxs::input keyid_str[1] = (byte)(keyid & 0xFF); return keyid_str; } - static void push_keyid(bool ispressed, text& vkchord, si32 keyid) + static auto push_keyid(bool ispressed, text& vkchord, si32 keyid) { - vkchord += input::key::kmap::_vkey_str(keyid, ispressed); + auto vkey_str = input::key::kmap::_vkey_str(keyid, ispressed); + vkchord += vkey_str; + return vkey_str; } static auto pressed(auto& k, si32 keyid) { @@ -2446,7 +2458,15 @@ namespace netxs::input { if (keyid <= input::key::invalid) vk_valid = faux; if (val.scode == 0) sc_valid = faux; - if (vk_valid) push_keyid(true, k.vkchord, keyid); + if (vk_valid) + { + auto vkey_str = push_keyid(true, k.vkchord, keyid); + auto generic_keyid = keyid & -2; + if (generic_keyid > input::key::IsoLevel5Shift || (generic_keyid != input::key::LeftShift && generic_keyid != input::key::AltGr && generic_keyid != input::key::IsoLevel5Shift)) // The main part of the chchord is the same as in vkchord excluding (Shift/AltGr/Level5Shift). + { + k.chchord += vkey_str; + } + } if (sc_valid) push_scode(true, k.scchord, val.scode); } } @@ -2458,13 +2478,12 @@ namespace netxs::input reset(k); return; } - auto cluster = input::key::get_cluster(k); auto sign = !!k.keystat; - if (cluster.size()) + if (auto cluster = input::key::get_cluster(k, true); cluster.size()) { - k.chchord = k.vkchord; // The main part of the chchord is the same as in vkchord. push_cluster(sign, k.chchord, cluster); } + else k.chchord.clear(); // No cluster - no chord. push_keyid(sign, k.vkchord, k.keycode); push_scode(sign, k.scchord, k.scancod | (k.extflag ? 0x100 : 0)); if (!vk_valid) k.vkchord.clear(); From d0e7b9c17fc9f3682b7dbc274851bf6e9cadcf2e Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 25 Jun 2026 21:21:14 +0500 Subject: [PATCH 57/71] #943 WIP: Fix focus at startup (keybd_sync_layout call breaks it) --- src/netxs/desktopio/gui.hpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 0d05936cb5..dcd69f3ec9 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -2987,6 +2987,7 @@ namespace netxs::gui X(expose_win) /* Order to expose window. */ \ X(make_ontop) /* Order to make window topmost. */ \ X(set_normal) /* Order to make window notopmost. */ \ + X(get_layout) /* Order to get user keybd layout. */ \ X(no_command) /* Noop. Just to update. */ \ X(cmd_w_data) /* Command with payload. */ static constexpr auto _base = 99900; @@ -3469,7 +3470,7 @@ namespace netxs::gui bool fake_ralt; // winbase: Fake alt/ctrl key events on AltGr press/release (non-US kb layouts). bool wait_ralt; // winbase: Wait RightAlt right after the fake LeftCtrl. si32 last_deadkey_vkey = {}; // winbase: Virtual code for deadkey tracking. - ui32 xlayout; // winbase: Current keyboard layout (KLID). + ui32 xlayout; // winbase: Current keyboard layout (HKL). arch hkl_latin; // winbase: User's latin-based keyboard layout. si32 layout_hint; // winbase: Layout hint for key lookup. @@ -3522,11 +3523,12 @@ namespace netxs::gui virtual void keybd_sync_layout() { auto& gear = *stream.gears; - gear.payload = input::keybd::type::kblayout; + auto temp = std::exchange(gear.payload, input::keybd::type::kblayout); gear.xlayout = xlayout; chords.reset(gear, faux); // faux: Keep pressed key state. stream_keybd(gear); - gear.payload = input::keybd::type::keypress; + gear.payload = temp; + if constexpr (debugmode) log("Sync kb layout: xlayout=%%", utf::to_hex(xlayout)); } virtual void keybd_peek_layout(si32 virtcod, si32 scancod, bool extflag, text& shifted, text& unshift, arch layout_id, bool apply_modifiers) = 0; virtual void keybd_read_vkstat() = 0; @@ -4892,6 +4894,10 @@ namespace netxs::gui { window_make_topmost(faux); } + else if (command == ipc::get_layout) + { + keybd_sync_layout(); + } else command = 0; return command; } @@ -4907,7 +4913,6 @@ namespace netxs::gui } else { - //todo check issues with focus keybd_reset_deadkey(); // Force reset deadkey state if it is. Windows doesn't reset deadkey state when refocusing but all other platforms do. if (target_list) // Send to all that the focus is going to lost. { @@ -6040,7 +6045,7 @@ namespace netxs::gui ::AddClipboardFormatListener((HWND)master.hWnd); // It posts WM_CLIPBOARDUPDATE to sync clipboard anyway. sync_clipboard(); // Clipboard should be in sync at (before) startup. window_make_foreground(); - keybd_sync_layout(); // Sync keyboad layout id. + window_post_command(master.hWnd, ipc::get_layout); // Schedule keyboard layout synchronization (direct keybd_sync_layout call breaks initial focus). } //todo static From fb6c3eda1e09c672d29108ee874414b0be5b86d9 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Thu, 25 Jun 2026 21:56:24 +0500 Subject: [PATCH 58/71] #943 WIP: Fix race between focus and layout lookup at startup --- src/netxs/desktopio/gui.hpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index dcd69f3ec9..ef8975feff 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -2987,7 +2987,6 @@ namespace netxs::gui X(expose_win) /* Order to expose window. */ \ X(make_ontop) /* Order to make window topmost. */ \ X(set_normal) /* Order to make window notopmost. */ \ - X(get_layout) /* Order to get user keybd layout. */ \ X(no_command) /* Noop. Just to update. */ \ X(cmd_w_data) /* Command with payload. */ static constexpr auto _base = 99900; @@ -4851,7 +4850,15 @@ namespace netxs::gui base::enqueue([&](auto& /*boss*/) { base::signal(tier::release, input::events::focus::set::on, { .gear_id = stream.gears->id, .focus_type = solo::on }); - if (mfocus.wheel) window_post_command(ipc::sync_state); + if (!xlayout) // The first focus event - sync keybd layout. + { + keybd_sync_layout(); + } + if (mfocus.wheel) + { + //todo share keybd layout between group focused windows + window_post_command(ipc::sync_state); + } }); } } @@ -4894,10 +4901,6 @@ namespace netxs::gui { window_make_topmost(faux); } - else if (command == ipc::get_layout) - { - keybd_sync_layout(); - } else command = 0; return command; } @@ -6045,7 +6048,6 @@ namespace netxs::gui ::AddClipboardFormatListener((HWND)master.hWnd); // It posts WM_CLIPBOARDUPDATE to sync clipboard anyway. sync_clipboard(); // Clipboard should be in sync at (before) startup. window_make_foreground(); - window_post_command(master.hWnd, ipc::get_layout); // Schedule keyboard layout synchronization (direct keybd_sync_layout call breaks initial focus). } //todo static From 0253cf5dcd4acb30f2a31eb37fa11d2f21a02378 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 26 Jun 2026 00:03:42 +0500 Subject: [PATCH 59/71] #943 WIP: Make keyboard modifiers global --- src/netxs/apps/calc.hpp | 4 +- src/netxs/apps/desk.hpp | 10 +- src/netxs/apps/tile.hpp | 4 +- src/netxs/desktopio/ansivt.hpp | 12 +- src/netxs/desktopio/controls.hpp | 14 +- src/netxs/desktopio/gui.hpp | 67 ++++---- src/netxs/desktopio/input.hpp | 114 +++++-------- src/netxs/desktopio/intmath.hpp | 28 +++ src/netxs/desktopio/system.hpp | 284 +++++++++++++++---------------- src/netxs/desktopio/terminal.hpp | 14 +- src/vtm.hpp | 12 +- 11 files changed, 283 insertions(+), 280 deletions(-) diff --git a/src/netxs/apps/calc.hpp b/src/netxs/apps/calc.hpp index 9816da9233..4970f7cadc 100644 --- a/src/netxs/apps/calc.hpp +++ b/src/netxs/apps/calc.hpp @@ -136,7 +136,7 @@ namespace netxs::ui auto& g = take(gear); if (g.region.size) { - if (gear.meta(hids::anyCtrl)) g.region.size = gear.coord - g.region.coor; + if (gear.meta(mods::anyCtrl)) g.region.size = gear.coord - g.region.coor; else g.region.size = dot_00; } recalc(); @@ -175,7 +175,7 @@ namespace netxs::ui { auto& g = take(gear); g.calc(boss, gear.click); - if (g.grab(gear.click, gear.meta(hids::anyCtrl))) + if (g.grab(gear.click, gear.meta(mods::anyCtrl))) { gear.dismiss(); } diff --git a/src/netxs/apps/desk.hpp b/src/netxs/apps/desk.hpp index 78d9acdf5b..9af995ebb5 100644 --- a/src/netxs/apps/desk.hpp +++ b/src/netxs/apps/desk.hpp @@ -107,7 +107,7 @@ namespace netxs::app::desk { auto check_gear_id = gear.id; window.base::signal(tier::request, e2::form::prop::window::accesslock, check_gear_id); - if (gear.meta(hids::anyAlt) && check_gear_id) // Pull window. + if (gear.meta(mods::anyAlt) && check_gear_id) // Pull window. { window.base::riseup(tier::preview, e2::form::layout::expose); auto viewport = gear.owner.base::signal(tier::request, e2::form::prop::viewport); @@ -126,7 +126,7 @@ namespace netxs::app::desk }); boss.on(tier::mouserelease, input::key::LeftClick, [&](hids& gear) { - if (gear.meta(hids::anyCtrl)) // Toggle group focus. + if (gear.meta(mods::anyCtrl)) // Toggle group focus. { if (pro::focus::test(window, gear)) { @@ -143,7 +143,7 @@ namespace netxs::app::desk } gear.dismiss(true); // Suppress double click. } - else if (gear.meta(hids::anyAlt)) // Skip it and wait for Alt+Dblclick. + else if (gear.meta(mods::anyAlt)) // Skip it and wait for Alt+Dblclick. { gear.dismiss(); } @@ -344,9 +344,9 @@ namespace netxs::app::desk }); boss.on(tier::mouserelease, input::key::LeftClick, [&, inst_id, group_focus = faux](hids& gear) mutable { - if (gear.meta(hids::anyCtrl | hids::anyAlt | hids::anyShift | hids::anySuper | hids::anyHyper)) // Not supported with any modifier but Ctrl. + if (gear.meta(mods::anyCtrl | mods::anyAlt | mods::anyShift | mods::anySuper | mods::anyHyper)) // Not supported with any modifier but Ctrl. { - if (gear.meta(hids::anyCtrl)) // Toggle group focus. + if (gear.meta(mods::anyCtrl)) // Toggle group focus. { group_focus = !group_focus; if (group_focus) boss.base::riseup(tier::release, desk::events::ui::focus::set, gear); diff --git a/src/netxs/apps/tile.hpp b/src/netxs/apps/tile.hpp index 7f63886aa6..55ad4af7f7 100644 --- a/src/netxs/apps/tile.hpp +++ b/src/netxs/apps/tile.hpp @@ -344,7 +344,7 @@ namespace netxs::app::tile mouse_subs(boss); boss.on(tier::mouserelease, input::key::MouseWheel, [&](hids& gear) { - if (gear.meta(hids::anyCtrl)) + if (gear.meta(mods::anyCtrl)) { boss.move_slider(gear.whlsi); gear.dismiss(); @@ -643,7 +643,7 @@ namespace netxs::app::tile if (ratio == min_ratio) { node->set_ratio(saved_ratio); - pro::focus::set(boss.This(), gear.id, gear.meta(hids::anyCtrl) ? solo::off : solo::on, true); + pro::focus::set(boss.This(), gear.id, gear.meta(mods::anyCtrl) ? solo::off : solo::on, true); } else { diff --git a/src/netxs/desktopio/ansivt.hpp b/src/netxs/desktopio/ansivt.hpp index 4b561efad7..f297e85c59 100644 --- a/src/netxs/desktopio/ansivt.hpp +++ b/src/netxs/desktopio/ansivt.hpp @@ -728,9 +728,9 @@ namespace netxs::ansi static constexpr auto wheel_rt = si32{ 67 }; auto ctrl = si32{}; - if (gear.m_sys.ctlstat & hids::anyShift) ctrl |= 0x04; - if (gear.m_sys.ctlstat & hids::anyAlt ) ctrl |= 0x08; - if (gear.m_sys.ctlstat & hids::anyCtrl ) ctrl |= 0x10; + if (gear.m_sys.ctlstat & mods::anyShift) ctrl |= 0x04; + if (gear.m_sys.ctlstat & mods::anyAlt ) ctrl |= 0x08; + if (gear.m_sys.ctlstat & mods::anyCtrl ) ctrl |= 0x10; auto m_bttn = std::bitset<8>{ (ui32)gear.m_sys.buttons }; auto s_bttn = std::bitset<8>{ (ui32)gear.m_sav.buttons }; @@ -803,9 +803,9 @@ namespace netxs::ansi static constexpr auto wheel_rt = si32{ 67 }; auto ctrl = si32{}; - if (gear.m_sys.ctlstat & hids::anyShift) ctrl |= 0x04; - if (gear.m_sys.ctlstat & hids::anyAlt ) ctrl |= 0x08; - if (gear.m_sys.ctlstat & hids::anyCtrl ) ctrl |= 0x10; + if (gear.m_sys.ctlstat & mods::anyShift) ctrl |= 0x04; + if (gear.m_sys.ctlstat & mods::anyAlt ) ctrl |= 0x08; + if (gear.m_sys.ctlstat & mods::anyCtrl ) ctrl |= 0x10; auto m_bttn = std::bitset<8>{ (ui32)gear.m_sys.buttons }; auto s_bttn = std::bitset<8>{ (ui32)gear.m_sav.buttons }; diff --git a/src/netxs/desktopio/controls.hpp b/src/netxs/desktopio/controls.hpp index 2c5bcbeb8a..a78ae90585 100644 --- a/src/netxs/desktopio/controls.hpp +++ b/src/netxs/desktopio/controls.hpp @@ -901,7 +901,7 @@ namespace netxs::ui // Drop it in favor of changing the cell size in GUI mode. //boss.on(tier::mouserelease, input::key::MouseWheel, memo, [&](hids& gear) //{ - // if (gear.meta(hids::anyCtrl) && !gear.meta(hids::ScrlLock) && gear.whlsi) + // if (gear.meta(mods::anyCtrl) && !gear.meta(mods::ScrollLock) && gear.whlsi) // { // auto& g = gears.take(gear); // if (!g.zoomon)// && g.inside) @@ -979,7 +979,7 @@ namespace netxs::ui boss.on(tier::mouserelease, input::key::MouseMove, memo, [&](hids& gear) { auto& g = gears.take(gear); - if (g.zoomon && !gear.meta(hids::anyCtrl)) + if (g.zoomon && !gear.meta(mods::anyCtrl)) { g.zoomon = faux; gear.setfree(); @@ -1014,7 +1014,7 @@ namespace netxs::ui auto& g = gears.take(gear); if (g.seized) { - auto zoom = gear.meta(hids::anyCtrl); + auto zoom = gear.meta(mods::anyCtrl); auto area = boss.base::area(); auto coor = area.coor + gear.coord; auto [preview_area, size_delta] = g.drag(area, coor, outer, zoom); @@ -2175,7 +2175,7 @@ namespace netxs::ui if (focus_on_click) boss.on(tier::mouserelease, input::key::LeftClick, memo, [&](hids& gear) { if (!gear) return; - if (gear.meta(hids::anyCtrl)) + if (gear.meta(mods::anyCtrl)) { if (pro::focus::test(boss, gear)) { @@ -4520,10 +4520,10 @@ namespace netxs::ui }; on(tier::mouserelease, input::key::MouseWheel, [&](hids& gear) { - if (gear.meta(hids::anyCtrl)) return; // Ctrl+Wheel is reserved for zooming. + if (gear.meta(mods::anyCtrl)) return; // Ctrl+Wheel is reserved for zooming. if (gear.whlsi) { - auto hz = (permit[X] && (gear.hzwhl || gear.meta(hids::anyAlt | hids::anyShift))) + auto hz = (permit[X] && (gear.hzwhl || gear.meta(mods::anyAlt | mods::anyShift))) || (permit == xy(axes::X_only)); if (hz) wheels(gear.whlsi); else wheels(gear.whlsi); @@ -5062,7 +5062,7 @@ namespace netxs::ui }; base::on(tier::mouserelease, input::key::MouseWheel, [&](hids& gear) { - if (gear.meta(hids::anyCtrl)) return; // Ctrl+Wheel is reserved for zooming. + if (gear.meta(mods::anyCtrl)) return; // Ctrl+Wheel is reserved for zooming. if (gear.whlsi) { auto delta = gear.whlsi > 0 ? 1 : -1; diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index ef8975feff..37a87613c6 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -4252,17 +4252,17 @@ namespace netxs::gui else { auto state = 0; - if (keybd_read_pressed(vkey::lshift )) state |= input::hids::LShift; - if (keybd_read_pressed(vkey::rshift )) state |= input::hids::RShift; - if (keybd_read_pressed(vkey::lctrl )) state |= input::hids::LCtrl; - if (keybd_read_pressed(vkey::rctrl )) state |= input::hids::RCtrl; - if (keybd_read_pressed(vkey::lalt )) state |= input::hids::LAlt; - if (keybd_read_pressed(vkey::ralt )) state |= input::hids::RAlt; - if (keybd_read_pressed(vkey::lsuper )) state |= input::hids::LSuper; - if (keybd_read_pressed(vkey::rsuper )) state |= input::hids::RSuper; - if (keybd_read_toggled(vkey::capslock)) state |= input::hids::CapsLock; - if (keybd_read_toggled(vkey::scrllock)) state |= input::hids::ScrlLock; - if (keybd_read_toggled(vkey::numlock )) state |= input::hids::NumLock; + if (keybd_read_pressed(vkey::lshift )) state |= mods::LShift; + if (keybd_read_pressed(vkey::rshift )) state |= mods::RShift; + if (keybd_read_pressed(vkey::lctrl )) state |= mods::LCtrl; + if (keybd_read_pressed(vkey::rctrl )) state |= mods::RCtrl; + if (keybd_read_pressed(vkey::lalt )) state |= mods::LAlt; + if (keybd_read_pressed(vkey::ralt )) state |= mods::RAlt; + if (keybd_read_pressed(vkey::lsuper )) state |= mods::LSuper; + if (keybd_read_pressed(vkey::rsuper )) state |= mods::RSuper; + if (keybd_read_toggled(vkey::capslock)) state |= mods::CapsLock; + if (keybd_read_toggled(vkey::scrllock)) state |= mods::ScrollLock; + if (keybd_read_toggled(vkey::numlock )) state |= mods::NumLock; return state; } } @@ -4337,7 +4337,7 @@ namespace netxs::gui stream.m.changed++; stream.m.timecod = datetime::now(); stream.m.enabled = hids::stat::halt; - if (!mfocus.focused()) stream.m.ctlstat &= input::hids::NumLock | input::hids::CapsLock | input::hids::ScrlLock; + if (!mfocus.focused()) stream.m.ctlstat &= mods::NumLock | mods::CapsLock | mods::ScrollLock; if (std::exchange(stream.gears->tooltip.visible, faux)) // Hide all active tooltips on mouse leave. { update_tooltip(); @@ -4557,19 +4557,19 @@ namespace netxs::gui keybd_send_state(vkey::ctrl, input::key::pressed, input::key::map::data(input::key::LeftCtrl).scan/*0x1d*/); // Send LCtrl actually pressed. } } - if (keybd_test_toggled(vkey::numlock ) ) state |= input::hids::NumLock; - if (keybd_test_toggled(vkey::capslock) ) state |= input::hids::CapsLock; - if (keybd_test_toggled(vkey::scrllock) ) state |= input::hids::ScrlLock; - if (keybd_test_pressed(vkey::lctrl ) && !fake_ralt) state |= input::hids::LCtrl; - if (keybd_test_pressed(vkey::rctrl ) ) state |= input::hids::RCtrl; - if (keybd_test_pressed(vkey::lalt ) ) state |= input::hids::LAlt; - if (keybd_test_pressed(vkey::ralt ) && !fake_ralt) state |= input::hids::RAlt; // We never equate AltGr with RAlt. - if (keybd_test_pressed(vkey::lsuper ) ) state |= input::hids::LSuper; - if (keybd_test_pressed(vkey::rsuper ) ) state |= input::hids::RSuper; + if (keybd_test_toggled(vkey::numlock ) ) state |= mods::NumLock; + if (keybd_test_toggled(vkey::capslock) ) state |= mods::CapsLock; + if (keybd_test_toggled(vkey::scrllock) ) state |= mods::ScrollLock; + if (keybd_test_pressed(vkey::lctrl ) && !fake_ralt) state |= mods::LCtrl; + if (keybd_test_pressed(vkey::rctrl ) ) state |= mods::RCtrl; + if (keybd_test_pressed(vkey::lalt ) ) state |= mods::LAlt; + if (keybd_test_pressed(vkey::ralt ) && !fake_ralt) state |= mods::RAlt; // We never equate AltGr with RAlt. + if (keybd_test_pressed(vkey::lsuper ) ) state |= mods::LSuper; + if (keybd_test_pressed(vkey::rsuper ) ) state |= mods::RSuper; if (keybd_test_pressed(vkey::ctrl ) ) mouse_capture(by::keybd); // Capture mouse if Ctrl modifier is pressed (to catch Ctrl+AnyClick outside the window). else mouse_release(by::keybd); - auto old_ls = keymod & input::hids::LShift; - auto old_rs = keymod & input::hids::RShift; + auto old_ls = keymod & mods::LShift; + auto old_rs = keymod & mods::RShift; auto new_ls = keybd_test_pressed(vkey::lshift); auto new_rs = keybd_test_pressed(vkey::rshift); //log("old_ls=%% old_rs=%% new_ls=%% new_rs=%% keymod=%%", (si32)old_ls, (si32)old_rs, (si32)new_ls, (si32)new_rs, utf::to_hex(keymod)); @@ -4583,12 +4583,12 @@ namespace netxs::gui //if (old_rs && !new_rs) // RightShift released. { layer_timer_stop(master, timers::rightshift); // Stop catching RightShift release. - keymod &= ~input::hids::RShift; + keymod &= ~mods::RShift; keybd_send_state(vkey::shift, input::key::released, input::key::map::data(input::key::RightShift).scan, {}, {}, true); } //if (old_ls && !new_ls) // LeftShift released. { - keymod &= ~input::hids::LShift; + keymod &= ~mods::LShift; keybd_send_state(vkey::shift, input::key::released, input::key::map::data(input::key::LeftShift).scan, {}, {}, true); } } @@ -4596,24 +4596,24 @@ namespace netxs::gui { if (old_ls && !new_ls) // LeftShift released. { - keymod &= ~input::hids::LShift; + keymod &= ~mods::LShift; keybd_send_state(vkey::shift, input::key::released, input::key::map::data(input::key::LeftShift).scan, {}, {}, true); } if (old_rs && !new_rs) // RightShift released. { layer_timer_stop(master, timers::rightshift); // Stop catching RightShift release. - keymod &= ~input::hids::RShift; + keymod &= ~mods::RShift; keybd_send_state(vkey::shift, input::key::released, input::key::map::data(input::key::RightShift).scan, {}, {}, true); } } if (!old_ls && new_ls) // LeftShift pressed. { - keymod |= input::hids::LShift; + keymod |= mods::LShift; keybd_send_state(vkey::shift, input::key::pressed, input::key::map::data(input::key::LeftShift).scan, {}, {}, true); } if (!old_rs && new_rs) // RightShift pressed. { - keymod |= input::hids::RShift; + keymod |= mods::RShift; keybd_send_state(vkey::shift, input::key::pressed, input::key::map::data(input::key::RightShift).scan, {}, {}, true); } if (new_ls && new_rs) // Two Shifts pressed. @@ -4939,9 +4939,9 @@ namespace netxs::gui layer_timer_stop(master, timers::rightshift); keybd_sync_state(); //::GetKeyboardState(vkstat.data()); // Sync with thread kb state. - //if (keymod & input::hids::RShift) + //if (keymod & mods::RShift) //{ - // keymod &= ~input::hids::RShift; + // keymod &= ~mods::RShift; // keybd_send_state(vkey::shift, input::key::released, input::key::map::data(input::key::RightShift).scan, {}, {}, true); //} } @@ -5874,9 +5874,12 @@ namespace netxs::gui switch (uDevice) { case FAPPCOMMAND_KEY: // 0 User pressed a key. - case FAPPCOMMAND_MOUSE: // 0x8000 User clicked a mouse button. case FAPPCOMMAND_OEM: // 0x1000 An unidentified hardware source generated the event. It could be a mouse or a keyboard event. + //todo we only need to forward these events back into the system when they return untouched + //return TRUE; break; + case FAPPCOMMAND_MOUSE: // 0x8000 User clicked a mouse button. + return FALSE; } switch (cmd) { diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 4b8c1ebf52..d750ca9c16 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -127,6 +127,17 @@ namespace netxs::input static constexpr auto packet = 0xE7; // VK_PACKET } + namespace kkp + { + static constexpr auto shift = 0b1; // 1 + static constexpr auto alt = 0b10; // 2 + static constexpr auto ctrl = 0b100; // 4 + static constexpr auto super = 0b1000; // 8 + static constexpr auto hyper = 0b10000; // 16 + static constexpr auto meta = 0b100000; // 32 + static constexpr auto caps_lock = 0b1000000; // 64 + static constexpr auto num_lock = 0b10000000; // 128 + } namespace key { static constexpr auto ExtendedKey = 0x0100; // ENHANCED_KEY @@ -1432,45 +1443,6 @@ namespace netxs::input static constexpr auto classname = basename::gear; - enum modifiers - { - LCtrl = 1 << 0, // Left ⌃ Ctrl - RCtrl = 1 << 1, // Right ⌃ Ctrl - LAlt = 1 << 2, // Left ⎇ Alt, Left ⌥ Option - RAlt = 1 << 3, // Right ⎇ Alt, Right ⌥ Option - LShift = 1 << 4, // Left ⇧ Shift - RShift = 1 << 5, // Right ⇧ Shift - LSuper = 1 << 6, // Left ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super - RSuper = 1 << 7, // Right ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super - LHyper = 1 << 8, // Left Hyper - RHyper = 1 << 9, // Right Hyper - // = 1 << 10, - // = 1 << 11, - NumLock = 1 << 12, // ⇭ Num Lock - CapsLock = 1 << 13, // ⇪ Caps Lock - ScrlLock = 1 << 14, // ⇳ Scroll Lock (⤓) - // = 1 << 15, - LCtrlAlt = LAlt | LCtrl, - anyCtrl = LCtrl | RCtrl, - anyAlt = LAlt | RAlt, - anyShift = LShift | RShift, - anyCtrlAlt = anyAlt | anyCtrl, - anySuper = LSuper | RSuper, - anyHyper = LHyper | RHyper, - anyMod = anyAlt | anyCtrl | anyShift | anySuper | anyHyper, - }; - struct kkp - { - static constexpr auto shift = 0b1; // 1 - static constexpr auto alt = 0b10; // 2 - static constexpr auto ctrl = 0b100; // 4 - static constexpr auto super = 0b1000; // 8 - static constexpr auto hyper = 0b10000; // 16 - static constexpr auto meta = 0b100000; // 32 - static constexpr auto caps_lock = 0b1000000; // 64 - static constexpr auto num_lock = 0b10000000; // 128 - }; - static auto build_alone_key() { return std::unordered_map @@ -1536,28 +1508,28 @@ namespace netxs::input { return std::unordered_map { - { key::KeyEnter | (hids::anyCtrl << key::idbits), { "\x0a" }}, - { key::Backspace | (hids::anyCtrl << key::idbits), { "\x08" }}, - { key::Backspace | (hids::anyAlt << key::idbits), { "\033\x7f" }}, - { key::Backspace | (hids::anyCtrlAlt << key::idbits), { "\033\x08" }}, - { key::Tab | (hids::anyCtrl << key::idbits), { "\t" }}, - { key::Tab | (hids::anyShift << key::idbits), { "\033[Z" }}, - { key::Tab | (hids::anyAlt << key::idbits), { "\033\t" }}, - { key::Esc | (hids::anyAlt << key::idbits), { "\033\033" }}, - { key::Key1 | (hids::anyCtrl << key::idbits), { "1" }}, - { key::Key2 | (hids::anyCtrl << key::idbits), { "\x00" }}, - { key::Key3 | (hids::anyCtrl << key::idbits), { "\x1b" }}, - { key::Key4 | (hids::anyCtrl << key::idbits), { "\x1c" }}, - { key::Key5 | (hids::anyCtrl << key::idbits), { "\x1d" }}, - { key::Key6 | (hids::anyCtrl << key::idbits), { "\x1e" }}, - { key::Key7 | (hids::anyCtrl << key::idbits), { "\x1f" }}, - { key::Key8 | (hids::anyCtrl << key::idbits), { "\x7f" }}, - { key::Key9 | (hids::anyCtrl << key::idbits), { "9" }}, - { key::KeySlash | (hids::anyCtrl << key::idbits), { "\x1f" }}, - { slash | (hids::anyCtrlAlt << key::idbits), { "\033\x1f" }}, - { slash | (hids::anyCtrl << key::idbits), { "\x1f" }}, - { quest | (hids::anyCtrlAlt << key::idbits), { "\033\x7f" }}, - { quest | (hids::anyCtrl << key::idbits), { "\x7f" }}, + { key::KeyEnter | (mods::anyCtrl << key::idbits), { "\x0a" }}, + { key::Backspace | (mods::anyCtrl << key::idbits), { "\x08" }}, + { key::Backspace | (mods::anyAlt << key::idbits), { "\033\x7f" }}, + { key::Backspace | (mods::anyCtrlAlt << key::idbits), { "\033\x08" }}, + { key::Tab | (mods::anyCtrl << key::idbits), { "\t" }}, + { key::Tab | (mods::anyShift << key::idbits), { "\033[Z" }}, + { key::Tab | (mods::anyAlt << key::idbits), { "\033\t" }}, + { key::Esc | (mods::anyAlt << key::idbits), { "\033\033" }}, + { key::Key1 | (mods::anyCtrl << key::idbits), { "1" }}, + { key::Key2 | (mods::anyCtrl << key::idbits), { "\x00" }}, + { key::Key3 | (mods::anyCtrl << key::idbits), { "\x1b" }}, + { key::Key4 | (mods::anyCtrl << key::idbits), { "\x1c" }}, + { key::Key5 | (mods::anyCtrl << key::idbits), { "\x1d" }}, + { key::Key6 | (mods::anyCtrl << key::idbits), { "\x1e" }}, + { key::Key7 | (mods::anyCtrl << key::idbits), { "\x1f" }}, + { key::Key8 | (mods::anyCtrl << key::idbits), { "\x7f" }}, + { key::Key9 | (mods::anyCtrl << key::idbits), { "9" }}, + { key::KeySlash | (mods::anyCtrl << key::idbits), { "\x1f" }}, + { slash | (mods::anyCtrlAlt << key::idbits), { "\033\x1f" }}, + { slash | (mods::anyCtrl << key::idbits), { "\x1f" }}, + { quest | (mods::anyCtrlAlt << key::idbits), { "\033\x7f" }}, + { quest | (mods::anyCtrl << key::idbits), { "\x7f" }}, }; } @@ -1729,7 +1701,7 @@ namespace netxs::input alive{ faux }, timer{ base::plugin() }, gear_index{ indexer.take_gear_available_index(use_index) }, - other_key{ build_other_key(key::KeySlash, key::KeySlash | (hids::anyShift << key::idbits)) }, // Defaults for US layout. + other_key{ build_other_key(key::KeySlash, key::KeySlash | (mods::anyShift << key::idbits)) }, // Defaults for US layout. multihome{ owner.base::property("multihome") } { mouse::prime = dot_mx; @@ -1840,9 +1812,9 @@ namespace netxs::input if (m.wheelsi) { auto s = m.ctlstat; - auto alt = s & hids::anyAlt ? 1 : 0; - auto l_ctrl = s & hids::LCtrl ? 1 : 0; - auto r_ctrl = s & hids::RCtrl ? 1 : 0; + auto alt = s & mods::anyAlt ? 1 : 0; + auto l_ctrl = s & mods::LCtrl ? 1 : 0; + auto r_ctrl = s & mods::RCtrl ? 1 : 0; if (l_ctrl && alt) { netxs::_k2 += m.wheelsi > 0 ? 1 : -1; log("_k2=", _k2); } // LCtrl+Alt+Wheel. else if (l_ctrl) { netxs::_k0 += m.wheelsi > 0 ? 1 : -1; log("_k0=", _k0); } // LCtrl+Wheel. else if (alt) { netxs::_k1 += m.wheelsi > 0 ? 1 : -1; log("_k1=", _k1); } // Alt+Wheel. @@ -2215,14 +2187,14 @@ namespace netxs::input auto c = keybd::cluster.empty() ? 0 : (byte)keybd::cluster.front(); if (v < 0 || v >= input::key::lastKey) v = 0; - if (s & hids::LCtrl && s & hids::RAlt) // Reset AltGr emulation on win32. + if (s & mods::LCtrl && s & mods::RAlt) // Reset AltGr emulation on win32. { - s &= ~(hids::LCtrl | hids::RAlt); + s &= ~(mods::LCtrl | mods::RAlt); } - auto shift = s & hids::anyShift ? hids::anyShift : 0; - auto alt = s & hids::anyAlt ? hids::anyAlt : 0; - auto ctrl = s & hids::anyCtrl ? hids::anyCtrl : 0; + auto shift = s & mods::anyShift ? mods::anyShift : 0; + auto alt = s & mods::anyAlt ? mods::anyAlt : 0; + auto ctrl = s & mods::anyCtrl ? mods::anyCtrl : 0; if (shift || alt || ctrl) { if (auto it_shift = shift_key.find(v); it_shift != shift_key.end()) @@ -2321,7 +2293,7 @@ namespace netxs::input auto codepoint = utf::to_code(utf8); return codepoint > 0 && (codepoint < 57358 || codepoint > 57454); }; - auto shift_state = k.ctlstat & hids::anyShift; + auto shift_state = k.ctlstat & mods::anyShift; auto has_cluster = k.cluster.size() && k.cluster.front(); auto has_unshift = k.unshift.size() && valid_codepoint(k.unshift) && !shift_state; auto has_shifted = k.shifted.size() && valid_codepoint(k.shifted) && shift_state; diff --git a/src/netxs/desktopio/intmath.hpp b/src/netxs/desktopio/intmath.hpp index 3fe72274b5..7aaf9ea5e8 100644 --- a/src/netxs/desktopio/intmath.hpp +++ b/src/netxs/desktopio/intmath.hpp @@ -189,6 +189,34 @@ namespace netxs static constexpr auto on = 1; // Set a unique focus. }; + namespace mods + { + static constexpr auto LCtrl = 1 << 0; // Left ⌃ Ctrl + static constexpr auto RCtrl = 1 << 1; // Right ⌃ Ctrl + static constexpr auto LAlt = 1 << 2; // Left ⎇ Alt, Left ⌥ Option + static constexpr auto RAlt = 1 << 3; // Right ⎇ Alt, Right ⌥ Option + static constexpr auto LShift = 1 << 4; // Left ⇧ Shift + static constexpr auto RShift = 1 << 5; // Right ⇧ Shift + static constexpr auto LSuper = 1 << 6; // Left ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super + static constexpr auto RSuper = 1 << 7; // Right ⊞ Win, ◆ Meta, ⌘ Cmd (Apple key), ❖ Super + static constexpr auto LHyper = 1 << 8; // Left Hyper + static constexpr auto RHyper = 1 << 9; // Right Hyper + // = 1 << 10; + // = 1 << 11; + static constexpr auto NumLock = 1 << 12; // ⇭ Num Lock + static constexpr auto CapsLock = 1 << 13; // ⇪ Caps Lock + static constexpr auto ScrollLock = 1 << 14; // ⇳ Scroll Lock (⤓) + // = 1 << 15; + static constexpr auto LCtrlAlt = LAlt | LCtrl; + static constexpr auto anyCtrl = LCtrl | RCtrl; + static constexpr auto anyAlt = LAlt | RAlt; + static constexpr auto anyShift = LShift | RShift; + static constexpr auto anyCtrlAlt = anyAlt | anyCtrl; + static constexpr auto anySuper = LSuper | RSuper; + static constexpr auto anyHyper = LHyper | RHyper; + static constexpr auto anyMod = anyAlt | anyCtrl | anyShift | anySuper | anyHyper; + } + constexpr auto operator & (axes l, axes r) { return static_cast(l) & static_cast(r); } template diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 37af6c4b48..38d4f9d5c4 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -982,44 +982,44 @@ namespace netxs::os auto prevstate = modstate; if (scancode == 0x2a) { - if (pressed) modstate |= input::hids::LShift; - else modstate &=~input::hids::LShift; + if (pressed) modstate |= mods::LShift; + else modstate &=~mods::LShift; } else if (scancode == 0x36) { - if (pressed) modstate |= input::hids::RShift; - else modstate &=~input::hids::RShift; + if (pressed) modstate |= mods::RShift; + else modstate &=~mods::RShift; } else if (scancode == 0x5b && extflag) { - if (pressed) modstate |= input::hids::LSuper; - else modstate &=~input::hids::LSuper; + if (pressed) modstate |= mods::LSuper; + else modstate &=~mods::LSuper; } else if (scancode == 0x5c && extflag) { - if (pressed) modstate |= input::hids::RSuper; - else modstate &=~input::hids::RSuper; + if (pressed) modstate |= mods::RSuper; + else modstate &=~mods::RSuper; } else if (scancode == 0x5b && !extflag) { - if (pressed) modstate |= input::hids::LHyper; - else modstate &=~input::hids::LHyper; + if (pressed) modstate |= mods::LHyper; + else modstate &=~mods::LHyper; } else if (scancode == 0x5c && !extflag) { - if (pressed) modstate |= input::hids::RHyper; - else modstate &=~input::hids::RHyper; + if (pressed) modstate |= mods::RHyper; + else modstate &=~mods::RHyper; } - if (!(modstate & input::hids::anyShift) && ms_ctrls & SHIFT_PRESSED) // Restore Shift after refocusing. + if (!(modstate & mods::anyShift) && ms_ctrls & SHIFT_PRESSED) // Restore Shift after refocusing. { - modstate |= input::hids::LShift; + modstate |= mods::LShift; } - auto lshift = modstate & input::hids::LShift; - auto rshift = modstate & input::hids::RShift; - auto lsuper = modstate & input::hids::LSuper; - auto rsuper = modstate & input::hids::RSuper; - auto lhyper = modstate & input::hids::LHyper; - auto rhyper = modstate & input::hids::RHyper; + auto lshift = modstate & mods::LShift; + auto rshift = modstate & mods::RShift; + auto lsuper = modstate & mods::LSuper; + auto rsuper = modstate & mods::RSuper; + auto lhyper = modstate & mods::LHyper; + auto rhyper = modstate & mods::RHyper; bool lalt = ms_ctrls & LEFT_ALT_PRESSED; bool ralt = ms_ctrls & RIGHT_ALT_PRESSED; bool lctrl = ms_ctrls & LEFT_CTRL_PRESSED; @@ -1028,19 +1028,19 @@ namespace netxs::os bool caps = ms_ctrls & CAPSLOCK_ON; bool scrl = ms_ctrls & SCROLLLOCK_ON; auto state = si32{}; - if (lshift) state |= input::hids::LShift; - if (rshift) state |= input::hids::RShift; - if (lalt ) state |= input::hids::LAlt; - if (ralt ) state |= input::hids::RAlt; - if (lctrl ) state |= input::hids::LCtrl; - if (rctrl ) state |= input::hids::RCtrl; - if (lsuper) state |= input::hids::LSuper; - if (rsuper) state |= input::hids::RSuper; - if (lhyper) state |= input::hids::LHyper; - if (rhyper) state |= input::hids::RHyper; - if (nums ) state |= input::hids::NumLock; - if (caps ) state |= input::hids::CapsLock; - if (scrl ) state |= input::hids::ScrlLock; + if (lshift) state |= mods::LShift; + if (rshift) state |= mods::RShift; + if (lalt ) state |= mods::LAlt; + if (ralt ) state |= mods::RAlt; + if (lctrl ) state |= mods::LCtrl; + if (rctrl ) state |= mods::RCtrl; + if (lsuper) state |= mods::LSuper; + if (rsuper) state |= mods::RSuper; + if (lhyper) state |= mods::LHyper; + if (rhyper) state |= mods::RHyper; + if (nums ) state |= mods::NumLock; + if (caps ) state |= mods::CapsLock; + if (scrl ) state |= mods::ScrollLock; auto changed = prevstate != state; modstate = state; return changed; @@ -1057,20 +1057,20 @@ namespace netxs::os if (!pressed) return stat; if (stat.changed) return stat; scancode |= ms_ctrls & ENHANCED_KEY; - stat.repeats = scancode == 0x002a // input::hids::LShift - || scancode == 0x0036 // input::hids::RShift (Windows command prompt) - || scancode == 0x0136 // input::hids::RShift (Windows terminal) - || scancode == 0x015b // input::hids::LSuper - || scancode == 0x015c // input::hids::RSuper - || scancode == 0x005b // input::hids::LHyper - || scancode == 0x005c // input::hids::RHyper - || scancode == 0x001d // input::hids::LCtrl - || scancode == 0x011d // input::hids::RCtrl - || scancode == 0x0038 // input::hids::LAlt - || scancode == 0x0138 // input::hids::RAlt - || scancode == 0x0145 // input::hids::NumLock - || scancode == 0x003a // input::hids::CapsLock - || scancode == 0x0046; // input::hids::ScrlLock + stat.repeats = scancode == 0x002a // mods::LShift + || scancode == 0x0036 // mods::RShift (Windows command prompt) + || scancode == 0x0136 // mods::RShift (Windows terminal) + || scancode == 0x015b // mods::LSuper + || scancode == 0x015c // mods::RSuper + || scancode == 0x005b // mods::LHyper + || scancode == 0x005c // mods::RHyper + || scancode == 0x001d // mods::LCtrl + || scancode == 0x011d // mods::RCtrl + || scancode == 0x0038 // mods::LAlt + || scancode == 0x0138 // mods::RAlt + || scancode == 0x0145 // mods::NumLock + || scancode == 0x003a // mods::CapsLock + || scancode == 0x0046; // mods::ScrollLock return stat; } auto ms_kbstate() @@ -1088,15 +1088,15 @@ namespace netxs::os } auto ms_kbstate(si32 ctrls) { - bool lshift = ctrls & input::hids::LShift; - bool rshift = ctrls & input::hids::RShift; - bool lalt = ctrls & input::hids::LAlt; - bool ralt = ctrls & input::hids::RAlt; - bool lctrl = ctrls & input::hids::LCtrl; - bool rctrl = ctrls & input::hids::RCtrl; - bool nums = ctrls & input::hids::NumLock; - bool caps = ctrls & input::hids::CapsLock; - bool scrl = ctrls & input::hids::ScrlLock; + bool lshift = ctrls & mods::LShift; + bool rshift = ctrls & mods::RShift; + bool lalt = ctrls & mods::LAlt; + bool ralt = ctrls & mods::RAlt; + bool lctrl = ctrls & mods::LCtrl; + bool rctrl = ctrls & mods::RCtrl; + bool nums = ctrls & mods::NumLock; + bool caps = ctrls & mods::CapsLock; + bool scrl = ctrls & mods::ScrollLock; auto state = ui32{}; if (lshift || rshift) state |= SHIFT_PRESSED; @@ -1114,9 +1114,9 @@ namespace netxs::os { struct vkey { si16 key, vkey; si32 base; }; static auto x = ::VkKeyScanW(C); - static auto k = vkey{ x, x & 0xff, x & 0xff |((x & 0x0100 ? input::hids::anyShift : 0) - | (x & 0x0200 ? input::hids::anyCtrl : 0) - | (x & 0x0400 ? input::hids::anyAlt : 0)) << 8 }; + static auto k = vkey{ x, x & 0xff, x & 0xff |((x & 0x0100 ? mods::anyShift : 0) + | (x & 0x0200 ? mods::anyCtrl : 0) + | (x & 0x0400 ? mods::anyAlt : 0)) << 8 }; return k; } auto is_wow64() @@ -5566,12 +5566,12 @@ namespace netxs::os auto shift = shift_state & (1 << KG_SHIFT ); auto rshift = shift_state & (1 << KG_SHIFTR); auto lshift = shift_state & (1 << KG_SHIFTL) || (!rshift && shift); - if (lalt ) state |= input::hids::LAlt; - if (ralt ) state |= input::hids::RAlt; - if (lctrl ) state |= input::hids::LCtrl; - if (rctrl ) state |= input::hids::RCtrl; - if (lshift) state |= input::hids::LShift; - if (rshift) state |= input::hids::RShift; + if (lalt ) state |= mods::LAlt; + if (ralt ) state |= mods::RAlt; + if (lctrl ) state |= mods::LCtrl; + if (rctrl ) state |= mods::RCtrl; + if (lshift) state |= mods::LShift; + if (rshift) state |= mods::RShift; } else { @@ -5584,9 +5584,9 @@ namespace netxs::os _k2 = led_state; _k3 = 0; // CapsLock can always be 0 due to poorly coded drivers. - if (led_state & LED_NUM) state |= input::hids::NumLock; - if (led_state & LED_CAP) state |= input::hids::CapsLock; - if (led_state & LED_SCR) state |= input::hids::ScrlLock; + if (led_state & LED_NUM) state |= mods::NumLock; + if (led_state & LED_CAP) state |= mods::CapsLock; + if (led_state & LED_SCR) state |= mods::ScrollLock; } else { @@ -5787,38 +5787,38 @@ namespace netxs::os }; auto m = utf::unordered_map> { - //{ "\033\x7f" , { "\x08", key::Backspace | (hids::LAlt << key::idbits) }}, - { "\033\x7f" , { "", key::KeySlash |((hids::LCtrl | hids::LAlt | hids::LShift) << key::idbits) }}, - { "\033\x00"s , { "", key::Space | (hids::LCtrlAlt << key::idbits) }}, - { "\x00"s , { " ", key::Space | (hids::LCtrl << key::idbits) }}, - { "\x08" , { "\x7f", key::Backspace | (hids::LCtrl << key::idbits) }}, - { "\033\x08" , { "", key::Backspace | (hids::LCtrlAlt << key::idbits) }}, - { "\033[Z" , { "", key::Tab | (hids::LShift << key::idbits) }}, //todo: revise Alt+Shift+Z ? - { "\033[1;3I" , { "", key::Tab | (hids::LAlt << key::idbits) }}, - { "\033\033" , { "", key::Esc | (hids::LAlt << key::idbits) }}, + //{ "\033\x7f" , { "\x08", key::Backspace | (mods::LAlt << key::idbits) }}, + { "\033\x7f" , { "", key::KeySlash |((mods::LCtrl | mods::LAlt | mods::LShift) << key::idbits) }}, + { "\033\x00"s , { "", key::Space | (mods::LCtrlAlt << key::idbits) }}, + { "\x00"s , { " ", key::Space | (mods::LCtrl << key::idbits) }}, + { "\x08" , { "\x7f", key::Backspace | (mods::LCtrl << key::idbits) }}, + { "\033\x08" , { "", key::Backspace | (mods::LCtrlAlt << key::idbits) }}, + { "\033[Z" , { "", key::Tab | (mods::LShift << key::idbits) }}, //todo: revise Alt+Shift+Z ? + { "\033[1;3I" , { "", key::Tab | (mods::LAlt << key::idbits) }}, + { "\033\033" , { "", key::Esc | (mods::LAlt << key::idbits) }}, { "\x7f" , { "\x08", key::Backspace }}, { "\x09" , { "\x09", key::Tab }}, { "\x0d" , { "\x0d", key::KeyEnter }}, - { "\x0a" , { "\x0a", key::KeyEnter | (hids::LCtrl << key::idbits) }}, + { "\x0a" , { "\x0a", key::KeyEnter | (mods::LCtrl << key::idbits) }}, //{ "\x1a" , { "", key::Pause }}, - //{ "\x1a" , { "\x1a", key::KeyZ | (hids::LCtrl << key::idbits) }}, + //{ "\x1a" , { "\x1a", key::KeyZ | (mods::LCtrl << key::idbits) }}, { "\033" , { "\033", key::Esc }}, - { "\x1c" , { "", key::Key4 | (hids::LCtrl << key::idbits) }}, - { "\x1d" , { "", key::Key5 | (hids::LCtrl << key::idbits) }}, - { "\x1e" , { "", key::Key6 | (hids::LCtrl << key::idbits) }}, - { "\x1f" , { "", key::KeySlash | (hids::LCtrl << key::idbits) }}, - { "\033\x1f" , { "", key::KeySlash | (hids::LCtrlAlt << key::idbits) }}, + { "\x1c" , { "", key::Key4 | (mods::LCtrl << key::idbits) }}, + { "\x1d" , { "", key::Key5 | (mods::LCtrl << key::idbits) }}, + { "\x1e" , { "", key::Key6 | (mods::LCtrl << key::idbits) }}, + { "\x1f" , { "", key::KeySlash | (mods::LCtrl << key::idbits) }}, + { "\033\x1f" , { "", key::KeySlash | (mods::LCtrlAlt << key::idbits) }}, { "\x20" , { " ", key::Space }}, - { "\x21" , { "!", key::Key1 | (hids::LShift << key::idbits) }}, - { "\x22" , { "\"", key::SingleQuote | (hids::LShift << key::idbits) }}, - { "\x23" , { "#", key::Key3 | (hids::LShift << key::idbits) }}, - { "\x24" , { "$", key::Key4 | (hids::LShift << key::idbits) }}, - { "\x25" , { "%", key::Key5 | (hids::LShift << key::idbits) }}, - { "\x26" , { "&", key::Key7 | (hids::LShift << key::idbits) }}, + { "\x21" , { "!", key::Key1 | (mods::LShift << key::idbits) }}, + { "\x22" , { "\"", key::SingleQuote | (mods::LShift << key::idbits) }}, + { "\x23" , { "#", key::Key3 | (mods::LShift << key::idbits) }}, + { "\x24" , { "$", key::Key4 | (mods::LShift << key::idbits) }}, + { "\x25" , { "%", key::Key5 | (mods::LShift << key::idbits) }}, + { "\x26" , { "&", key::Key7 | (mods::LShift << key::idbits) }}, { "\x27" , { "'", key::SingleQuote }}, - { "\x28" , { "(", key::Key9 | (hids::LShift << key::idbits) }}, - { "\x29" , { ")", key::Key0 | (hids::LShift << key::idbits) }}, + { "\x28" , { "(", key::Key9 | (mods::LShift << key::idbits) }}, + { "\x29" , { ")", key::Key0 | (mods::LShift << key::idbits) }}, { "\x2a" , { "*", key::KeyMultiply }}, { "\x2b" , { "+", key::KeyPlus }}, { "\x2c" , { ",", key::KeyComma }}, @@ -5826,25 +5826,25 @@ namespace netxs::os { "\x2e" , { ".", key::KeyPeriod }}, { "\x2f" , { "/", key::KeySlash }}, - { "\x3a" , { ":", key::Semicolon | (hids::LShift << key::idbits) }}, + { "\x3a" , { ":", key::Semicolon | (mods::LShift << key::idbits) }}, { "\x3b" , { ";", key::Semicolon }}, - { "\x3c" , { "<", key::KeyComma | (hids::LShift << key::idbits) }}, + { "\x3c" , { "<", key::KeyComma | (mods::LShift << key::idbits) }}, { "\x3d" , { "=", key::KeyEqual }}, - { "\x3e" , { ">", key::KeyPeriod | (hids::LShift << key::idbits) }}, - { "\x3f" , { "?", key::KeySlash | (hids::LShift << key::idbits) }}, - { "\x40" , { "@", key::Key2 | (hids::LShift << key::idbits) }}, + { "\x3e" , { ">", key::KeyPeriod | (mods::LShift << key::idbits) }}, + { "\x3f" , { "?", key::KeySlash | (mods::LShift << key::idbits) }}, + { "\x40" , { "@", key::Key2 | (mods::LShift << key::idbits) }}, { "\x5b" , { "[", key::OpenSquareBracket }}, { "\x5c" , { "\\", key::BackSlash }}, { "\x5d" , { "]", key::CloseSquareBracket }}, - { "\x5e" , { "^", key::Key6 | (hids::LShift << key::idbits) }}, - { "\x5f" , { "_", key::KeyMinus | (hids::LShift << key::idbits) }}, + { "\x5e" , { "^", key::Key6 | (mods::LShift << key::idbits) }}, + { "\x5f" , { "_", key::KeyMinus | (mods::LShift << key::idbits) }}, { "\x60" , { "`", key::BackQuote }}, - { "\x7b" , { "{", key::OpenSquareBracket | (hids::LShift << key::idbits) }}, - { "\x7c" , { "|", key::BackSlash | (hids::LShift << key::idbits) }}, - { "\x7d" , { "}", key::CloseSquareBracket | (hids::LShift << key::idbits) }}, - { "\x7e" , { "~", key::BackQuote | (hids::LShift << key::idbits) }}, + { "\x7b" , { "{", key::OpenSquareBracket | (mods::LShift << key::idbits) }}, + { "\x7c" , { "|", key::BackSlash | (mods::LShift << key::idbits) }}, + { "\x7d" , { "}", key::CloseSquareBracket | (mods::LShift << key::idbits) }}, + { "\x7e" , { "~", key::BackQuote | (mods::LShift << key::idbits) }}, { "\033[5~" , { "", key::KeyPageUp }}, { "\033[6~" , { "", key::KeyPageDown }}, @@ -5876,23 +5876,23 @@ namespace netxs::os { "\033[[C" , { "", key::F3 }}, { "\033[[D" , { "", key::F4 }}, { "\033[[E" , { "", key::F5 }}, - { "\033[25~" , { "", key::F1 | (hids::LShift << key::idbits) }}, - { "\033[26~" , { "", key::F2 | (hids::LShift << key::idbits) }}, - { "\033[28~" , { "", key::F3 | (hids::LShift << key::idbits) }}, - { "\033[29~" , { "", key::F4 | (hids::LShift << key::idbits) }}, - { "\033[31~" , { "", key::F5 | (hids::LShift << key::idbits) }}, - { "\033[32~" , { "", key::F6 | (hids::LShift << key::idbits) }}, - { "\033[33~" , { "", key::F7 | (hids::LShift << key::idbits) }}, - { "\033[34~" , { "", key::F8 | (hids::LShift << key::idbits) }}, + { "\033[25~" , { "", key::F1 | (mods::LShift << key::idbits) }}, + { "\033[26~" , { "", key::F2 | (mods::LShift << key::idbits) }}, + { "\033[28~" , { "", key::F3 | (mods::LShift << key::idbits) }}, + { "\033[29~" , { "", key::F4 | (mods::LShift << key::idbits) }}, + { "\033[31~" , { "", key::F5 | (mods::LShift << key::idbits) }}, + { "\033[32~" , { "", key::F6 | (mods::LShift << key::idbits) }}, + { "\033[33~" , { "", key::F7 | (mods::LShift << key::idbits) }}, + { "\033[34~" , { "", key::F8 | (mods::LShift << key::idbits) }}, }; for (auto i = 1; i < 8; i++) { auto ctls_str = '1'; auto ctlstate = 0; - if (i & 0b001) { ctlstate |= hids::LShift; ctls_str += 1; } - if (i & 0b010) { ctlstate |= hids::LAlt; ctls_str += 2; } - if (i & 0b100) { ctlstate |= hids::LCtrl; ctls_str += 4; } + if (i & 0b001) { ctlstate |= mods::LShift; ctls_str += 1; } + if (i & 0b010) { ctlstate |= mods::LAlt; ctls_str += 2; } + if (i & 0b100) { ctlstate |= mods::LCtrl; ctls_str += 4; } for (auto& [key, utf8] : keymask) { *++(utf8.rbegin()) = ctls_str; @@ -5901,7 +5901,7 @@ namespace netxs::os } for (auto i = 0; i <= 'Z' - 'A'; i++) { - m[text(1, i + 'A')] = { text(1, i + 'A'), (key::KeyA + i * 2) | (hids::LShift << key::idbits) }; + m[text(1, i + 'A')] = { text(1, i + 'A'), (key::KeyA + i * 2) | (mods::LShift << key::idbits) }; m[text(1, i + 'a')] = { text(1, i + 'a'), key::KeyA + i * 2 }; } for (auto i = 0; i < 10; i++) @@ -5966,7 +5966,7 @@ namespace netxs::os k.keycode = code; k.virtcod = rec.vkey; k.scancod = rec.scan; - k.ctlstat = hids::LCtrl; + k.ctlstat = mods::LCtrl; } else // Unknown byte { @@ -5989,7 +5989,7 @@ namespace netxs::os k.keycode = code; k.virtcod = rec.vkey; k.scancod = rec.scan; - k.ctlstat = hids::LCtrl | hids::LAlt; + k.ctlstat = mods::LCtrl | mods::LAlt; } else // Alt+cluster { @@ -6003,7 +6003,7 @@ namespace netxs::os k.keycode = code; k.virtcod = rec.vkey; k.scancod = rec.scan; - k.ctlstat = hids::LAlt | (keys >> 8); + k.ctlstat = mods::LAlt | (keys >> 8); } else { @@ -6013,7 +6013,7 @@ namespace netxs::os k.keycode = code; k.virtcod = rec.vkey; k.scancod = rec.scan; - k.ctlstat = hids::LAlt; + k.ctlstat = mods::LAlt; } } } @@ -6036,10 +6036,10 @@ namespace netxs::os auto keycode = std::exchange(k.keycode, 0); auto virtcod = std::exchange(k.virtcod, 0); auto scancod = std::exchange(k.scancod, 0); - if (ctls & hids::LCtrl) k.ctlstat |= hids::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (ctls & hids::LAlt) k.ctlstat |= hids::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (ctls & hids::LShift) k.ctlstat |= hids::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (ctls & hids::LSuper) k.ctlstat |= hids::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & mods::LCtrl) k.ctlstat |= mods::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & mods::LAlt) k.ctlstat |= mods::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & mods::LShift) k.ctlstat |= mods::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & mods::LSuper) k.ctlstat |= mods::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); std::swap(k.cluster, cluster); std::swap(k.keycode, keycode); std::swap(k.virtcod, virtcod); @@ -6056,10 +6056,10 @@ namespace netxs::os auto keycode = std::exchange(k.keycode, 0); auto virtcod = std::exchange(k.virtcod, 0); auto scancod = std::exchange(k.scancod, 0); - if (ctls & hids::LSuper) k.ctlstat &= ~hids::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (ctls & hids::LShift) k.ctlstat &= ~hids::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (ctls & hids::LAlt ) k.ctlstat &= ~hids::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); - if (ctls & hids::LCtrl ) k.ctlstat &= ~hids::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & mods::LSuper) k.ctlstat &= ~mods::LSuper, k.keycode = input::key::LeftSuper, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & mods::LShift) k.ctlstat &= ~mods::LShift, k.keycode = input::key::LeftShift, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & mods::LAlt ) k.ctlstat &= ~mods::LAlt, k.keycode = input::key::LeftAlt, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); + if (ctls & mods::LCtrl ) k.ctlstat &= ~mods::LCtrl, k.keycode = input::key::LeftCtrl, k.virtcod = input::key::map::data(k.keycode).vkey, k.scancod = input::key::map::data(k.keycode).scan, chords.build(k), keybd(k); k.ctlstat = ctls; std::swap(k.cluster, cluster); std::swap(k.keycode, keycode); @@ -6139,14 +6139,14 @@ namespace netxs::os if (ctlstat) { ctlstat--; - if (ctlstat & hids::kkp::shift ) k.ctlstat |= hids::LShift; - if (ctlstat & hids::kkp::alt ) k.ctlstat |= hids::LAlt; - if (ctlstat & hids::kkp::ctrl ) k.ctlstat |= hids::LCtrl; - if (ctlstat & hids::kkp::super ) k.ctlstat |= hids::LSuper; - if (ctlstat & hids::kkp::hyper ) k.ctlstat |= hids::LHyper; - if (ctlstat & hids::kkp::meta ) k.ctlstat |= hids::LAlt; - if (ctlstat & hids::kkp::caps_lock) k.ctlstat |= hids::CapsLock; - if (ctlstat & hids::kkp::num_lock ) k.ctlstat |= hids::NumLock; + if (ctlstat & input::kkp::shift ) k.ctlstat |= mods::LShift; + if (ctlstat & input::kkp::alt ) k.ctlstat |= mods::LAlt; + if (ctlstat & input::kkp::ctrl ) k.ctlstat |= mods::LCtrl; + if (ctlstat & input::kkp::super ) k.ctlstat |= mods::LSuper; + if (ctlstat & input::kkp::hyper ) k.ctlstat |= mods::LHyper; + if (ctlstat & input::kkp::meta ) k.ctlstat |= mods::LAlt; + if (ctlstat & input::kkp::caps_lock) k.ctlstat |= mods::CapsLock; + if (ctlstat & input::kkp::num_lock ) k.ctlstat |= mods::NumLock; } auto traits = (suffix << 16) | base_key; auto iter = kkp2key.find(traits); @@ -6176,24 +6176,24 @@ namespace netxs::os } if (k.cluster.empty() && suffix == 'u') // Form cluster. { - if (auto crop = input::key::interpret_ctrl(k, k.ctlstat & hids::anyCtrl, k.ctlstat & hids::anyShift); crop.size()) + if (auto crop = input::key::interpret_ctrl(k, k.ctlstat & mods::anyCtrl, k.ctlstat & mods::anyShift); crop.size()) { k.cluster = crop; } else { auto& rec = input::key::map::data(k.keycode); - if (k.ctlstat & hids::anyCtrl && rec.KKPCtl != -1) + if (k.ctlstat & mods::anyCtrl && rec.KKPCtl != -1) { k.cluster = text(1, (char)rec.KKPCtl); } - else if (k.ctlstat & hids::anyCtrl && unshift_code > 0 && unshift_code < 128) + else if (k.ctlstat & mods::anyCtrl && unshift_code > 0 && unshift_code < 128) { k.cluster = text(1, (char)(unshift_code & 31)); } else if (unshift_code > 0 && unshift_code < 57358) // Exclude any function keys. { - utf::to_utf_from_code(k.ctlstat & hids::CapsLock ? unshift_code : shifted_code, k.cluster); + utf::to_utf_from_code(k.ctlstat & mods::CapsLock ? unshift_code : shifted_code, k.cluster); } } } @@ -6353,9 +6353,9 @@ namespace netxs::os // │ │││ ││ // │ |││ └----- button number // │ └--------- ctl state - if (ctl & 0x04) m.ctlstat |= input::hids::LShift; - if (ctl & 0x08) m.ctlstat |= input::hids::LAlt; - if (ctl & 0x10) m.ctlstat |= input::hids::LCtrl; + if (ctl & 0x04) m.ctlstat |= mods::LShift; + if (ctl & 0x08) m.ctlstat |= mods::LAlt; + if (ctl & 0x10) m.ctlstat |= mods::LCtrl; ctl &= ~0b00011100; k.ctlstat = m.ctlstat; diff --git a/src/netxs/desktopio/terminal.hpp b/src/netxs/desktopio/terminal.hpp index e67ae5a7dc..b03840c5ae 100644 --- a/src/netxs/desktopio/terminal.hpp +++ b/src/netxs/desktopio/terminal.hpp @@ -474,7 +474,7 @@ namespace netxs::ui if (gear_test.second == 0) { if (pro::focus::test(owner, gear)) pro::focus::off(owner.This(), gear.id); - else pro::focus::set(owner.This(), gear.id, gear.meta(hids::anyCtrl) ? solo::off : solo::on); + else pro::focus::set(owner.This(), gear.id, gear.meta(mods::anyCtrl) ? solo::off : solo::on); } owner.base::riseup(tier::preview, e2::form::layout::expose); } @@ -9683,7 +9683,7 @@ namespace netxs::ui { _copy(gear, data); } - auto ctrl_pressed = gear.meta(hids::anyCtrl); + auto ctrl_pressed = gear.meta(mods::anyCtrl); if (onesht != mime::disabled && !ctrl_pressed) { selection_oneshot(mime::disabled); @@ -9758,7 +9758,7 @@ namespace netxs::ui void selection_lclick(hids& gear) { auto& console = *target; - auto go_on = gear.meta(hids::anyCtrl); + auto go_on = gear.meta(mods::anyCtrl); if (go_on && console.selection_active()) { console.selection_follow(gear.coord, go_on); @@ -9788,8 +9788,8 @@ namespace netxs::ui void selection_create(hids& gear) { auto& console = *target; - auto boxed = selalt ^ !!gear.meta(hids::anyAlt); - auto go_on = gear.meta(hids::anyCtrl); + auto boxed = selalt ^ !!gear.meta(mods::anyAlt); + auto go_on = gear.meta(mods::anyCtrl); console.selection_follow(gear.click, go_on); if (go_on) console.selection_extend(gear.click, boxed); else console.selection_create(gear.click, boxed); @@ -9816,7 +9816,7 @@ namespace netxs::ui { // Check bounds and scroll if needed. auto& console = *target; - auto boxed = selalt ^ !!gear.meta(hids::anyAlt); + auto boxed = selalt ^ !!gear.meta(mods::anyAlt); auto coord = twod{ gear.coord }; auto vport = rect{ -origin, console.panel }; auto delta = dot_00; @@ -9880,7 +9880,7 @@ namespace netxs::ui } else { - if (gear.meta(hids::anyCtrl)) return; // Ctrl+Wheel is reserved for zooming. + if (gear.meta(mods::anyCtrl)) return; // Ctrl+Wheel is reserved for zooming. if (altscr && target != &normal) { if (gear.whlsi) diff --git a/src/vtm.hpp b/src/vtm.hpp index 6cbdbd1eb2..5c5594f6ad 100644 --- a/src/vtm.hpp +++ b/src/vtm.hpp @@ -155,7 +155,7 @@ namespace netxs::app::vtm }; boss.LISTEN(tier::release, e2::form::upon::dragged, gear, memo) { - if (gear.meta(hids::anyCtrl)) + if (gear.meta(mods::anyCtrl)) { robo.actify(gear.fader>(2s), [&](auto delta) { @@ -279,7 +279,7 @@ namespace netxs::app::vtm void check_modifiers(hids& gear) { auto& data = slots[gear.id]; - auto state = !!gear.meta(hids::anyCtrl); + auto state = !!gear.meta(mods::anyCtrl); if (data.ctrl != state) { data.ctrl = state; @@ -294,7 +294,7 @@ namespace netxs::app::vtm auto& slot = data.slot; auto& init = data.init; auto& step = data.step; - data.ctrl = gear.meta(hids::anyCtrl); + data.ctrl = gear.meta(mods::anyCtrl); slot.coor = init = step = gear.click + gear.owner.coor(); slot.size = dot_00; boss.base::deface(slot); @@ -338,7 +338,7 @@ namespace netxs::app::vtm { gear.slot = data.slot; gear.slot_forced = true; - if (gear.meta(hids::anyCtrl)) + if (gear.meta(mods::anyCtrl)) { log(prompt::hall, "Area copied to clipboard ", gear.slot); gear.owner.base::signal(tier::release, e2::command::printscreen, gear); @@ -475,7 +475,7 @@ namespace netxs::app::vtm } auto action_allowed(hids& gear) { - auto allowed = !gear.meta(hids::anyMod); + auto allowed = !gear.meta(mods::anyMod); return allowed; } @@ -740,7 +740,7 @@ namespace netxs::app::vtm if (base::hidden) // Restore if it is hidden. { base::hidden = faux; - pro::focus::set(window_ptr, gear.id, gear.meta(hids::anyCtrl) ? solo::off : solo::on, true); + pro::focus::set(window_ptr, gear.id, gear.meta(mods::anyCtrl) ? solo::off : solo::on, true); } else // Hide if visible and refocus. { From 0a7644540019a7fcb171b471ccb09898027cc0c6 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 26 Jun 2026 11:46:18 +0500 Subject: [PATCH 60/71] #943 WIP: Fix deadkey detection (+extflag in ToUnicodeEx) --- src/netxs/desktopio/gui.hpp | 22 ++++++++++------------ src/netxs/desktopio/input.hpp | 6 +++--- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 37a87613c6..3d573032b2 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -5558,9 +5558,8 @@ namespace netxs::gui auto hkl = layout_id ? (HKL)layout_id : ::GetKeyboardLayout(0); if (is_printable && virtcod != last_deadkey_vkey) // Alphanumeric + punctuation (excluding deadkeys). { + if (extflag) scancod |= ENHANCED_KEY; auto buf = wide(8, 0); - auto flags = extflag ? 1u : 0u; - flags |= 2; // ToUnicodeEx will translate scancodes marked as key break events in addition to its usual treatment of key make events. auto key_matrix = std::array{}; if (apply_modifiers) { @@ -5574,22 +5573,20 @@ namespace netxs::gui key_matrix[vkey::grselect] = vkstat[vkey::grselect]; // Respect GroupSelect (IsoLevel5Shift) on Canadian layout. key_matrix[vkey::capslock] = vkstat[vkey::capslock]; } - auto rc = ::ToUnicodeEx(virtcod, scancod, key_matrix.data(), buf.data(), 8, flags, hkl); - if (rc > 0) + auto rc = ::ToUnicodeEx(virtcod, scancod, key_matrix.data(), buf.data(), 8, 0, hkl); + if (rc != 0) { - utf::to_utf(buf.data(), rc, unshift); + utf::to_utf(buf.data(), rc > 0 ? rc : 1, unshift); + if (rc < 0) keybd_reset_deadkey((arch)hkl); key_matrix[vkey::shift ] = 0x80; key_matrix[vkey::lshift] = 0x80; - rc = ::ToUnicodeEx(virtcod, scancod, key_matrix.data(), buf.data(), 8, flags, hkl); - if (rc > 0) + rc = ::ToUnicodeEx(virtcod, scancod, key_matrix.data(), buf.data(), 8, 0, hkl); + if (rc != 0) { - utf::to_utf(buf.data(), rc, shifted); + utf::to_utf(buf.data(), rc > 0 ? rc : 1, shifted); + if (rc < 0) keybd_reset_deadkey((arch)hkl); } } - if (rc < 0) - { - keybd_reset_deadkey((arch)hkl); - } } } void layer_present(layer& s) @@ -5805,6 +5802,7 @@ namespace netxs::gui auto sc = i | ex_bit; if (auto vk = ::MapVirtualKeyExW(sc, MAPVK_VSC_TO_VK, hkl)) { + sc = ex_bit ? (i | ENHANCED_KEY) : i; auto l = ::ToUnicodeEx(vk, sc, key_states.data(), &c, 1, 0, hkl); if (l == 1 && (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')) { diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index d750ca9c16..59f0bc1a2d 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -2953,9 +2953,9 @@ namespace netxs::input keyid = keycode; if constexpr (debugmode) log("Fast detection of function keys: ", keyid); } - else + else if (vk && sc) { - keyid = _find_abstract_key(vk, sc, extflag, layout_hint); + keyid = input::key::_find_abstract_key(vk, sc, extflag, layout_hint); } return keyid; } @@ -2998,7 +2998,7 @@ namespace netxs::input } } } - if (keyid == input::key::undef) + if (vk && sc && keyid == input::key::undef) { keyid = input::key::_find_abstract_key(vk, sc, extflag, layout_hint); } From 4b21038ca471a4d3f438d392fe48fa258c0db804 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 26 Jun 2026 15:51:51 +0500 Subject: [PATCH 61/71] #943 WIP: Fix Pause/Break/PrintScreen/SysReq press/release simulation --- src/netxs/desktopio/gui.hpp | 37 ++++++++++++++++++++++++++++------- src/netxs/desktopio/input.hpp | 15 ++++++++++---- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 3d573032b2..92707d3c90 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -4576,6 +4576,8 @@ namespace netxs::gui state |= old_ls | old_rs; if (new_ls != !!old_ls || new_rs != !!old_rs) // MS Windows Shift+Shift bug workaround. { + auto& rshift = input::key::map::data(input::key::RightShift); + auto& lshift = input::key::map::data(input::key::LeftShift); keymod = state; //todo unify if (!new_ls && !new_rs && old_ls && old_rs && chords.pushed[input::key::LeftShift].stamp < chords.pushed[input::key::RightShift].stamp) // Respect release order. @@ -4584,12 +4586,12 @@ namespace netxs::gui { layer_timer_stop(master, timers::rightshift); // Stop catching RightShift release. keymod &= ~mods::RShift; - keybd_send_state(vkey::shift, input::key::released, input::key::map::data(input::key::RightShift).scan, {}, {}, true); + keybd_send_state(vkey::shift, input::key::released, rshift.scan, rshift.extflag, {}, true); } //if (old_ls && !new_ls) // LeftShift released. { keymod &= ~mods::LShift; - keybd_send_state(vkey::shift, input::key::released, input::key::map::data(input::key::LeftShift).scan, {}, {}, true); + keybd_send_state(vkey::shift, input::key::released, lshift.scan, lshift.extflag, {}, true); } } else @@ -4597,24 +4599,24 @@ namespace netxs::gui if (old_ls && !new_ls) // LeftShift released. { keymod &= ~mods::LShift; - keybd_send_state(vkey::shift, input::key::released, input::key::map::data(input::key::LeftShift).scan, {}, {}, true); + keybd_send_state(vkey::shift, input::key::released, lshift.scan, lshift.extflag, {}, true); } if (old_rs && !new_rs) // RightShift released. { layer_timer_stop(master, timers::rightshift); // Stop catching RightShift release. keymod &= ~mods::RShift; - keybd_send_state(vkey::shift, input::key::released, input::key::map::data(input::key::RightShift).scan, {}, {}, true); + keybd_send_state(vkey::shift, input::key::released, rshift.scan, rshift.extflag, {}, true); } } if (!old_ls && new_ls) // LeftShift pressed. { keymod |= mods::LShift; - keybd_send_state(vkey::shift, input::key::pressed, input::key::map::data(input::key::LeftShift).scan, {}, {}, true); + keybd_send_state(vkey::shift, input::key::pressed, lshift.scan, lshift.extflag, {}, true); } if (!old_rs && new_rs) // RightShift pressed. { keymod |= mods::RShift; - keybd_send_state(vkey::shift, input::key::pressed, input::key::map::data(input::key::RightShift).scan, {}, {}, true); + keybd_send_state(vkey::shift, input::key::pressed, rshift.scan, rshift.extflag, {}, true); } if (new_ls && new_rs) // Two Shifts pressed. { @@ -4647,6 +4649,27 @@ namespace netxs::gui return; } } + if (virtcod == vkey::ctrl && keystat == input::key::released && chords.pressed(input::key::Break)) // Ctrl released before Pause. Forcing simulation of Break KeyUp. + { + auto& break_key = input::key::map::data(input::key::Break); + keybd_send_state(vkey::cancel, input::key::released, break_key.scan, break_key.extflag, {}, true); + if constexpr (debugmode) log("Fake Pause 'release' key event generated"); + } + if (virtcod == vkey::prntscrn && keystat == input::key::released) // Simulates a PrintScreen/SysReq key press if the os suppresses it. + { + auto& prntscrn_key = input::key::map::data(input::key::PrintScreen); + auto& sysreq_key = input::key::map::data(input::key::SysReq); + if (extflag == prntscrn_key.extflag && !chords.pressed(input::key::PrintScreen)) + { + keybd_send_state(virtcod, input::key::pressed, prntscrn_key.scan, prntscrn_key.extflag, {}, true); + if constexpr (debugmode) log("Fake PrintScreen 'pressed' key event generated"); + } + else if (extflag == sysreq_key.extflag && !chords.pressed(input::key::SysReq)) + { + keybd_send_state(virtcod, input::key::pressed, sysreq_key.scan, sysreq_key.extflag, {}, true); + if constexpr (debugmode) log("Fake SysReq 'pressed' key event generated"); + } + } } auto changed = std::exchange(keymod, state) != keymod || synth; auto& gear = *stream.gears; @@ -5856,7 +5879,7 @@ namespace netxs::gui } else { - if constexpr (debugmode) log("Layout %% is not latin-based. Looking for klid fallback.", utf::adjust(utf::to_hex(layout_id), 8, "0", true)); + if constexpr (debugmode) log("The %% layout is not latin-based. Looking for a fallback layout.", utf::adjust(utf::to_hex(layout_id), 8, "0", true)); hkl_latin = keybd_find_layout(); // Find hkl fallback. } if (std::exchange(xlayout, layout_id) != layout_id) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 59f0bc1a2d..124be22afb 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -82,6 +82,8 @@ namespace netxs::input static constexpr auto rsuper = 0x5C; // VK_RWIN static constexpr auto grselect = 0xDF; // VK_OEM_8 GroupSelect (IsoLevel5Shift) on Canadian layout + static constexpr auto prntscrn = 0x2C; // VK_SNAPSHOT (SysReq, Alt+PrntScrn) + static constexpr auto cancel = 0x03; // VK_CANCEL (Break, Ctrl+Pause) static constexpr auto clear = 0x0C; // VK_CLEAR static constexpr auto enter = 0x0D; // VK_RETURN static constexpr auto pgup = 0x21; // VK_PRIOR @@ -284,10 +286,10 @@ namespace netxs::input X(102 , 0, 0 , F33 , "F33" , "" , 0 , 57396, 'u', -1 , -1 , "")\ X(104 , 0, 0 , F34 , "F34" , "" , 0 , 57397, 'u', -1 , -1 , "")\ X(106 , 0, 0 , F35 , "F35" , "" , 0 , 57398, 'u', -1 , -1 , "")\ - X(108 , 0, 0 , PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "01372c07372c11372c0f372c15372c17372c03372c0b372c0d372c19372c05372c09372c1b372c13372c21372c1f372c1d372c23372c25372c29372c27372c2b372c31372c2f372c2d372c35372c37372c33372c39372c3b372c3f372c3d372c41372c43372c45372c47372c49372c4f372c51372c4b372c4d372c53372c57372c59372c55372c5b372c5d372c5f372c61372c65372c6d372c63372c6b372c67372c69372c6f372c71372c73372c7d372c75372c77372c79372c7b372c7f372c81372c87372c83372c85372c89372c8b372c8d372c8f372c93372c91372c95372c97372c99372c9b372c9d372ca1372c9f372ca3372ca5372ca7372ca9372cab372cad372c")\ + X(108 , 0, 0x12C, PrintScreen , "PrintScreen" , "" , 0 , 57361, 'u', -1 , -1 , "01372c07372c11372c0f372c15372c17372c03372c0b372c0d372c19372c05372c09372c1b372c13372c21372c1f372c1d372c23372c25372c29372c27372c2b372c31372c2f372c2d372c35372c37372c33372c39372c3b372c3f372c3d372c41372c43372c45372c47372c49372c4f372c51372c4b372c4d372c53372c57372c59372c55372c5b372c5d372c5f372c61372c65372c6d372c63372c6b372c67372c69372c6f372c71372c73372c7d372c75372c77372c79372c7b372c7f372c81372c87372c83372c85372c89372c8b372c8d372c8f372c93372c91372c95372c97372c99372c9b372c9d372ca1372c9f372ca3372ca5372ca7372ca9372cab372cad372c")\ X(110 , 0, 0x013, Pause , "Pause" , "" , 0 , 57362, 'u', '\x1a', '\x03', "0045900645901045900e45901445901645900245900a45900c45901845900445900845901a45901245902045901e45901c45902245902445902845902645902a45903045902e45902c45903445903645903245903845903a45903e45903c45904045904245904445904645904845904e45905045904a45904c45905245905645905845905445905a45905c45905e45906045906445906c45906245906a45906645906845906e45907045907245907c45907445907645907845907a45907e45908045908645908245908445908845908a45908c45908e45909245909045909445909645909845909a45909c4590a045909e4590a24590a44590a64590a84590aa4590ac4590")\ - X(112 , 1, 0 , Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0146030746031146030f46031546031746030346030b46030d46031946030546030946031b46031346032146031f46031d46032346032546032946032746032b46033146032f46032d46033546033746033346033946033b46033f46033d46034146034346034546034746034946034f46035146034b46034d46035346035746035946035546035b46035d46035f46036146036546036d46036346036b46036746036946036f46037146037346037d46037546037746037946037b46037f46038146038746038346038546038946038b46038d46038f46039346039146039546039746039946039b46039d4603a146039f4603a34603a54603a74603a94603ab4603ad4603")\ - X(114 , 1, 0 , SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c06542c10542c0e542c14542c16542c02542c0a542c0c542c18542c04542c08542c1a542c12542c20542c1e542c22542c24542c28542c26542c2a542c34542c36542c38542c3c542c40542c44542c46542c48542c4e542c50542c4a542c4c542c52542c56542c58542c6e542c72542c7c542c74542c76542c78542c7a542c7e542c8c542c8e542c92542c90542c94542c96542c98542ca2542ca6542ca8542caa542c")\ + X(112 , 1, 0x103, Break , "Break" , "\x03", 0x03 , 3 , 'u', '\x03', '\x03', "0146030746031146030f46031546031746030346030b46030d46031946030546030946031b46031346032146031f46031d46032346032546032946032746032b46033146032f46032d46033546033746033346033946033b46033f46033d46034146034346034546034746034946034f46035146034b46034d46035346035746035946035546035b46035d46035f46036146036546036d46036346036b46036746036946036f46037146037346037d46037546037746037946037b46037f46038146038746038346038546038946038b46038d46038f46039346039146039546039746039946039b46039d4603a146039f4603a34603a54603a74603a94603ab4603ad4603")\ + X(114 , 1, 0x02C, SysReq , "SysReq" , "" , 0 , 0 , 'u', -1 , '\x03', "00542c06542c10542c0e542c14542c16542c02542c0a542c0c542c18542c04542c08542c1a542c12542c20542c1e542c22542c24542c28542c26542c2a542c34542c36542c38542c3c542c40542c44542c46542c48542c4e542c50542c4a542c4c542c52542c56542c58542c6e542c72542c7c542c74542c76542c78542c7a542c7e542c8c542c8e542c92542c90542c94542c96542c98542ca2542ca6542ca8542caa542c")\ X(116 , 1, 0x01B, Esc , "Esc" , "\x1B", 0x1b , 27 , 'u', '\x1b', '\x1b', "00011b06011b10011b0e011b14011b16011b02011b0a011b0c011b18011b04011b08011b1a011b12011b20011b1e011b1c011b22011b24011b28011b26011b2a011b30011b2e011b2c011b34011b36011b32011b38011b3a011b3e011b3c011b40011b42011b44011b46011b48011b4e011b50011b4a011b4c011b52011b56011b58011b54011b5a011b5c011b5e011b60011b64011b6c011b62011b6a011b66011b68011b6e011b70011b72011b7c011b74011b76011b78011b7a011b7e011b80011b86011b82011b84011b88011b8a011b8c011b8e011b92011b90011b94011b96011b98011b9a011b9c011ba0011b9e011ba2011ba4011ba6011ba8011baa011bac011b")\ X(118 , 1, 0x009, Tab , "Tab" , "\x09", 0x09 , 9 , 'u', '\x09', '\x09', "000f09060f09100f090e0f09140f09160f09020f090a0f090c0f09180f09040f09080f091a0f09120f09200f091e0f091c0f09220f09240f09280f09260f092a0f09300f092e0f092c0f09340f09360f09320f09380f093a0f093e0f093c0f09400f09420f09440f09460f09480f094e0f09500f094a0f094c0f09520f09560f09580f09540f095a0f095c0f095e0f09600f09640f096c0f09620f096a0f09660f09680f096e0f09700f09720f097c0f09740f09760f09780f097a0f097e0f09800f09860f09820f09840f09880f098a0f098c0f098e0f09920f09900f09940f09960f09980f099a0f099c0f09a00f099e0f09a20f09a40f09a60f09a80f09aa0f09ac0f09")\ X(120 , 1, 0x008, Backspace , "Backspace" , "\x08", 0x08 , 127 , 'u', '\x7f', '\x08', "000e08060e08100e080e0e08140e08160e08020e080a0e080c0e08180e08040e08080e081a0e08120e08200e081e0e081c0e08220e08240e08280e08260e082a0e08300e082e0e082c0e08340e08360e08320e08380e083a0e083e0e083c0e08400e08420e08440e08460e08480e084e0e08500e084a0e084c0e08520e08560e08580e08540e085a0e085c0e085e0e08600e08640e086c0e08620e086a0e08660e08680e086e0e08700e08720e087c0e08740e08760e08780e087a0e087e0e08800e08860e08820e08840e08880e088a0e088c0e088e0e08920e08900e08940e08960e08980e089a0e089c0e08a00e089e0e08a20e08a40e08a60e08a80e08aa0e08ac0e08")\ @@ -658,6 +660,7 @@ namespace netxs::input view generic; si32 vkey; si32 scan; + bool extflag; si32 klid; si32 edit; si32 KKPDef; @@ -672,7 +675,7 @@ namespace netxs::input map(si32 vk, si32 sc, si32 cs, si32 klid) : hash{ (si64)(mask(vk) & (vk | (sc << 8) | (klid << 16) | ((si64)cs << 36))) } { } - map(si32 vk, si32 sc, si32 klid, si32 cs, si64 keymask, view keyname, view generic_keyname, si32 doinput, si32 id, + map(si32 vk, si32 sc, bool extflag, si32 klid, si32 cs, si64 keymask, view keyname, view generic_keyname, si32 doinput, si32 id, si32 KKPDef, si32 KKPSuffix, si32 KKPAscii, si32 KKPCtl) { mask(vk) = keymask; @@ -680,6 +683,7 @@ namespace netxs::input .generic = generic_keyname, .vkey = vk, .scan = sc, + .extflag = extflag, .klid = klid, .edit = doinput, .KKPDef = KKPDef, @@ -692,18 +696,21 @@ namespace netxs::input { auto vk = 0; auto sc = 0; + auto extflag = faux; auto klid = 0; if (PhysicalCode) { auto v = utf::to_int_from_hex_str(qiew{ PhysicalCode }.substr(0, 6)); vk = v & 0xFF; sc = (v >> 8) & 0xFF; + extflag = v & 0x010000; klid = v >> 17; } data(id) = { .name = specific_keyname, .generic = generic_keyname, .vkey = vk, .scan = sc, + .extflag = extflag, .klid = klid, .edit = doinput, .KKPDef = KKPdef, From a2f3544b61d252aa695b6a52a218171b0e1e32a1 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 26 Jun 2026 16:12:16 +0500 Subject: [PATCH 62/71] #943 WIP: Fix Literal key chords for keys like Esc/Enter/Space/BSpc/Tab --- src/netxs/desktopio/gui.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/netxs/desktopio/gui.hpp b/src/netxs/desktopio/gui.hpp index 92707d3c90..a60b2ea849 100644 --- a/src/netxs/desktopio/gui.hpp +++ b/src/netxs/desktopio/gui.hpp @@ -5575,8 +5575,10 @@ namespace netxs::gui { shifted.clear(); unshift.clear(); - auto is_printable = scancod && ((virtcod >= 0x30 && virtcod <= 0x5A) + auto is_printable = scancod && ((virtcod <= 0x20) + || (virtcod >= 0x30 && virtcod <= 0x5A) || (virtcod >= 0x60 && virtcod <= 0x6F) + || (virtcod == 0x92) // Numpad equal. || (virtcod >= 0xB8 && virtcod <= 0xE6)); auto hkl = layout_id ? (HKL)layout_id : ::GetKeyboardLayout(0); if (is_printable && virtcod != last_deadkey_vkey) // Alphanumeric + punctuation (excluding deadkeys). From 4b68af31524708e1f8dfba4c36560a07dacf6de5 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Fri, 26 Jun 2026 17:38:36 +0500 Subject: [PATCH 63/71] #943 WIP: Simplify IsoLevel5Shift detection --- src/netxs/desktopio/input.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index 124be22afb..cd1029cde2 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -242,7 +242,7 @@ namespace netxs::input X(14 , 0, 0x014, CapsLock , "CapsLock" , "" , 0 , 57358, 'u', -1 , -1 , "003a14063a14103a140e3a14143a14163a14023a140a3a140c3a14183a14043a14083a141a3a14123a14203a141e3a141c3a14223a14243a14283a14263a142a3a14303a142e3a142c3a14343a14363a14323a14383a143a3a143e3a143c3a14403a14423a14443a14463a14483a144e3a14503a144a3a144c3a14523a14563a14583a14543a145a3a145c3a145e3a14603a14643a146c3a14623a146a3a14663a14683a146e3a14703a14723a147c3a14743a14763a14783a147a3a147e3a14803a14863a14823a14843a14883a148a3a148c3a148e3a14923a14903a14943a14963a14983a149a3a149c3a14a03a149e3a14a23a14a43a14a63a14a83a14aa3a14ac3a14")\ X(16 , 0, 0x091, ScrollLock , "ScrollLock" , "" , 0 , 57359, 'u', -1 , -1 , "0046910646911046910e46911446911646910246910a46910c46911846910446910846911a46911246912046911e46911c46912246912446912846912646912a46913046912e46912c46913446913646913246913846913a46913e46913c46914046914246914446914646914846914e46915046914a46914c46915246915646915846915446915a46915c46915e46916046916446916c46916246916a46916646916846916e46917046917246917c46917446917646917846917a46917e46918046918646918246918446918846918a46918c46918e46919246919046919446919646919846919a46919c4691a046919e4691a24691a44691a64691a84691aa4691ac4691")\ X(18 , 0, 0x05E, AltGr , "AltGr" , "" , 0 , 57453, 'u', -1 , -1 , "")\ - X(20 , 0, 0 , IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "431ddf")\ + X(20 , 0, 0x1DF, IsoLevel5Shift , "IsoLevel5Shift" , "" , 0 , 57454, 'u', -1 , -1 , "431ddf")\ X(22 , 0, 0 , Kana , "Kana" , "" , 0 , 0 , 'u', -1 , -1 , "0270f2")\ X(24 , 0, 0 , Henkan , "Henkan" , "" , 0 , 0 , 'u', -1 , -1 , "02791c")\ X(26 , 0, 0 , Muhenkan , "Muhenkan" , "" , 0 , 0 , 'u', -1 , -1 , "027b1d")\ From 290d31b3a2778816a4f36e436b2f01ee7d2fb231 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sat, 27 Jun 2026 01:39:31 +0500 Subject: [PATCH 64/71] #943 WIP: Implement KKP->ALL mapping --- src/netxs/desktopio/input.hpp | 327 ++++++--------------------------- src/netxs/desktopio/system.hpp | 148 +++++++-------- 2 files changed, 120 insertions(+), 355 deletions(-) diff --git a/src/netxs/desktopio/input.hpp b/src/netxs/desktopio/input.hpp index cd1029cde2..cfdce2e4e9 100644 --- a/src/netxs/desktopio/input.hpp +++ b/src/netxs/desktopio/input.hpp @@ -157,60 +157,6 @@ namespace netxs::input static constexpr auto cluster_sign = 0x20; static constexpr auto mouse_sign = 0x10; - //todo drop - struct layout - { - static constexpr auto _counter = __COUNTER__ + 1; - static constexpr auto undef = __COUNTER__ - _counter; - static constexpr auto qwerty = __COUNTER__ - _counter; - static constexpr auto qwertz = __COUNTER__ - _counter; - static constexpr auto azerty = __COUNTER__ - _counter; - static constexpr auto dvorak = __COUNTER__ - _counter; - static constexpr auto colemak = __COUNTER__ - _counter; - static constexpr auto bepo = __COUNTER__ - _counter; - }; - //todo drop - struct klid // Latin-based Keyboard Layouts (20 klids). - { - static constexpr auto k00000409 = 0x00000409; // English (US) | United States Standard | `qwerty` - static constexpr auto k00000407 = 0x00000407; // German (Germany) | Germany Standard | `qwertz` - static constexpr auto k00010407 = 0x00010407; // German (Germany) | Germany (IBM) | `qwertz` - static constexpr auto k00000C07 = 0x00000C07; // German (Austria) | Austrian Standard | `qwertz` - static constexpr auto k0000040C = 0x0000040C; // French (France) | France Standard | `azerty` - static constexpr auto k0000080C = 0x0000080C; // French (Belgium) | Belgian Standard | `azerty` - static constexpr auto k0005040C = 0x0005040C; // French (France) | French BÉPO Layout | `bepo` - static constexpr auto k00010409 = 0x00010409; // English (US) | United States-Dvorak | `dvorak` - static constexpr auto k00020409 = 0x00020409; // English (US) | United States-Dvorak (Left hand) | `dvorak` - static constexpr auto k00030409 = 0x00030409; // English (US) | United States-Dvorak (Right hand) | `dvorak` - static constexpr auto k00060409 = 0x00060409; // English (US) | Colemak NATIVE (Win 11 24H2+) | `colemak` - static constexpr auto k00000405 = 0x00000405; // Czech (Czechia) | Czech QWERTZ | `qwertz` - static constexpr auto k00010405 = 0x00010405; // Czech (Czechia) | Czech QWERTY | `qwerty` - static constexpr auto k0000041B = 0x0000041B; // Slovak (Slovakia) | Slovak QWERTZ | `qwertz` - static constexpr auto k0001041B = 0x0001041B; // Slovak (Slovakia) | Slovak QWERTY | `qwerty` - static constexpr auto k0000040E = 0x0000040E; // Hungarian (Hungary) | Hungarian Standard | `qwertz` - static constexpr auto k0000041A = 0x0000041A; // Croatian | Croatian Standard (South Slavic) | `qwertz` - static constexpr auto k00000424 = 0x00000424; // Slovenian | Slovenian Standard (South Slavic) | `qwertz` - static constexpr auto k00000415 = 0x00000415; // Polish (Poland) | Polish (Programmers) | `qwerty` - static constexpr auto k00000418 = 0x00000418; // Romanian | Romanian Standard | `qwertz` - }; - //todo drop - auto get_layout_type(si32 klid) - { - if (klid == 0x00000409 || klid == 0) return layout::qwerty; - if (klid == 0x00010409) return layout::dvorak; // US Dvorak Standard - if (klid == 0x00020409) return layout::dvorak; // US Dvorak Left-Hand - if (klid == 0x00030409) return layout::dvorak; // US Dvorak Right-Hand - if (klid == 0x00000419) return layout::undef; - if (klid == 0x00000405 || klid == 0x00010405) return layout::qwertz; // Czech - if (klid == 0x00000407 || klid == 0x00010407) return layout::qwertz; // German (Austria) - if (klid == 0x0000040c || klid == 0x0000080c) return layout::azerty; // French (Belgium) - if (klid == 0x0005040c) return layout::bepo; // French BEPO - if (klid == 0x0000040e) return layout::qwertz; // Hungarian - if (klid == 0x0000041a) return layout::qwertz; // Croatian - if (klid == 0x0000041b) return layout::qwertz; // Slovak - return layout::qwerty; - } - // Notes: // IsoLevel5Shift: 5th-level of kb layout (mathematical signs, Greek letters). Physical keyboards don't have this key; in Linux, it's usually remapped to Caps Lock or the right Ctrl key. // Hyper: Users specifically create Hyper (for example, by remapping Caps Lock) to bind hotkeys, which are guaranteed to not interact with anything. @@ -729,30 +675,45 @@ namespace netxs::input }; }; - static const auto keymap = std::unordered_map - { - #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ - { map{ 0,0,0,0 }, KeyId }, - key_list - #undef X - }; - static const auto _init0 = [] { - //todo move it to std::array + //todo reimplement, move it to std::array #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ map::set(KeyId, Input, #Name, Generic, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode); key_list #undef X return true; }(); - static const auto kkpmap = std::unordered_map + static constexpr auto kkpmap = [] { + struct keyrec_t + { + si16 keyid; + si32 kkp_trait; + }; + constexpr auto total_kkp_key_count = [] + { + auto total_kkp_key_count = 0; + #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ + if constexpr (KKPdef) total_kkp_key_count++; + key_list + #undef X + return total_kkp_key_count; + }(); + auto m = std::array{}; + auto i = 0; + auto fill = [&](si16 KeyId, si32 KKPdef, si32 KKPsuffix) + { + if (KKPdef) m[i++] = { .keyid = KeyId, .kkp_trait = KKPdef | (KKPsuffix << 16) }; + }; #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ - { KKPdef | (KKPsuffix << 16), KeyId }, + fill(KeyId, KKPdef, KKPsuffix); key_list #undef X - }; + std::ranges::sort(m, {}, &keyrec_t::kkp_trait); + return m; + }(); + //todo move it to std::array, make utf::to_lower constexpr static const auto specific_names = utf::unordered_map { #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ @@ -760,6 +721,7 @@ namespace netxs::input key_list #undef X }; + //todo move it to std::array, make utf::to_lower constexpr static const auto generic_names = utf::unordered_map { #define X(KeyId, Input, Vk, Name, Generic, Literal, Uc, KKPdef, KKPsuffix, KKPascii, wCtl, PhysicalCode) \ @@ -2718,197 +2680,32 @@ namespace netxs::input return crop; } }; - //todo use lut - auto detect_layout(si32 unshift, si32 base) + auto find_abstract_uc(utfx shifted_uc, utfx unshift_uc) { - // QWERTY: - if (unshift == base) + auto keyid = input::key::undef; + if (unshift_uc >= '0' && unshift_uc <= '9') // Check digits row. + { + keyid = input::key::Key0 + (unshift_uc - '0') * 2; + } + else if (shifted_uc >= '0' && shifted_uc <= '9') // Check digits row. { - if ((unshift >= 'a' && unshift <= 'z') || unshift == ',' || unshift == '.' || unshift == '-' - || (unshift >= '1' && unshift <= '9')) + keyid = input::key::Key0 + (shifted_uc - '0') * 2; + } + else if (unshift_uc >= 'a' && unshift_uc <= 'z') // Fast check latin letters. + { + keyid = input::key::KeyA + (unshift_uc - 'a') * 2; + } + else + { + using keyrec = std::decay_t; + auto [head, tail] = std::ranges::equal_range(input::key::uc_map, unshift_uc, {}, &keyrec::uc); + if (head != tail) { - if (unshift != 'a' && unshift != 'm' && unshift != 'u' - && unshift != 'i' && unshift != 'o' && unshift != 'p' - && unshift != 'h' && unshift != 'j' && unshift != 'k' && unshift != 'l') - { - return layout::qwerty; - } + keyid = head->keyid; } } - // QWERTZ: - if (unshift == 'z' && base == 'y') return layout::qwertz; - if (unshift == 'y' && base == 'z') return layout::qwertz; - if (unshift == '+' && base == ']') return layout::qwertz; - if (unshift == '-' && base == '/') return layout::qwertz; - if (unshift == '^' && base == '`') return layout::qwertz; - if (unshift == '#' && base =='\\') return layout::qwertz; // # <- \ // - if (unshift == 180 && base == '=') return layout::qwertz; // ´ <- = Deadkey - if (unshift == 228 && base =='\'') return layout::qwertz; // ä <- ' - if (unshift == 223 && base == '-') return layout::qwertz; // ß <- - - if (unshift == 252 && base == '[') return layout::qwertz; // ü <- [ - if (unshift == 367 && base == ';') return layout::qwertz; // ů <- ; Czech QWERTZ - if (unshift == 246 && base == ';') return layout::qwertz; // ö <- ; - if (unshift == 337 && base == '4') return layout::qwertz; // ő <- 4 Hungarian - // AZERTY: - if (unshift == 'a' && base == 'q') return layout::azerty; - if (unshift == 'q' && base == 'a') return layout::azerty; - if (unshift == 'w' && base == 'z') return layout::azerty; - if (unshift == 'z' && base == 'w') return layout::azerty; - if (unshift == 'm' && base == ';') return layout::azerty; - if (unshift == '&' && base == '1') return layout::azerty; - if (unshift == 233 && base == '2') return layout::azerty; // é - if (unshift == '"' && base == '3') return layout::azerty; - if (unshift =='\'' && base == '4') return layout::azerty; - if (unshift == '(' && base == '5') return layout::azerty; - if (unshift == ')' && base == '-') return layout::azerty; - if (unshift == '-' && base == '6') return layout::azerty; - if (unshift == 232 && base == '7') return layout::azerty; // è - if (unshift == '_' && base == '8') return layout::azerty; - if (unshift == 231 && base == '9') return layout::azerty; // ç - if (unshift == 224 && base == '0') return layout::azerty; // à - // DVORAK: - if (unshift == ',' && base == 'w') return layout::dvorak; - if (unshift == '.' && base == 'e') return layout::dvorak; - if (unshift == 'p' && base == 'r') return layout::dvorak; - if (unshift == 'o' && base == 's') return layout::dvorak; - if (unshift == 'e' && base == 'd') return layout::dvorak; - if (unshift == 'u' && base == 'f') return layout::dvorak; - if (unshift == 'i' && base == 'g') return layout::dvorak; - if (unshift == 'd' && base == 'h') return layout::dvorak; - if (unshift =='\'' && base == 'q') return layout::dvorak; - // BEPO: - if (unshift == '"' && base == '1') return layout::bepo; - if (unshift == 171 && base == '2') return layout::bepo; // « - if (unshift == 187 && base == '3') return layout::bepo; // » - if (unshift == '(' && base == '4') return layout::bepo; - if (unshift == ')' && base == '5') return layout::bepo; - if (unshift == '@' && base == '6') return layout::bepo; - if (unshift == '+' && base == '7') return layout::bepo; - if (unshift == '-' && base == '8') return layout::bepo; - if (unshift == '/' && base == '9') return layout::bepo; - if (unshift == '*' && base == '0') return layout::bepo; - if (unshift == '=' && base == '-') return layout::bepo; - if (unshift == '%' && base == '=') return layout::bepo; - if (unshift == 'w' && base == ']') return layout::bepo; // ']' -> 'w' - if (unshift == 'b' && base == 'q') return layout::bepo; // 'Q' -> 'b' - if (unshift == 233 && base == 'w') return layout::bepo; // 'W' -> 'é' - if (unshift == 'p' && base == 'e') return layout::bepo; // 'E' -> 'p' - if (unshift == 'o' && base == 'r') return layout::bepo; // 'R' -> 'o' - if (unshift == 232 && base == 't') return layout::bepo; // 'T' -> 'è' - if (unshift == 'v' && base == 'u') return layout::bepo; // 'U' -> 'v' - if (unshift == 'u' && base == 'i') return layout::bepo; // 'I' -> 'u' - if (unshift == 'i' && base == 'd') return layout::bepo; // 'D' -> 'i' - if (unshift == 234 && base == 'z') return layout::bepo; // 'Z' -> 'ê' - if (unshift == 224 && base == 'x') return layout::bepo; // 'X' -> 'à' - if (unshift == 'y' && base == 'c') return layout::bepo; // 'C' -> 'y' - if (unshift == 'x' && base == 'v') return layout::bepo; // 'V' -> 'x' - if (unshift == 'k' && base == 'b') return layout::bepo; // 'B' -> 'k' - return layout::undef; - } - void remap_bepo(si32& base) - { - switch (base) - { - // Digit row (punctuation.) - case '1': base = '"'; break; - case '2': base = 171; break; // « - case '3': base = 187; break; // » - case '4': base = '('; break; - case '5': base = ')'; break; - case '6': base = '@'; break; - case '7': base = '+'; break; - case '8': base = '-'; break; - case '9': base = '/'; break; - case '0': base = '*'; break; - case '-': base = '='; break; - case '=': base = '%'; break; - // Top row - case 'q': base = 'b'; break; - case 'w': base = 233; break; // é - case 'e': base = 'p'; break; - case 'r': base = 'o'; break; - case 't': base = 232; break; // è - case 'y': base = '!'; break; - case 'u': base = 'v'; break; - case 'i': base = 'd'; break; - case 'o': base = 'l'; break; - case 'p': base = 'j'; break; - case '[': base = 'z'; break; - case ']': base = 'w'; break; - // Home Row - //case 'a': base = 'a'; break; // same - case 's': base = 'u'; break; - case 'd': base = 'i'; break; - case 'f': base = 'e'; break; - case 'g': base = ','; break; - case 'h': base = 't'; break; - case 'j': base = 's'; break; - case 'k': base = 'r'; break; - case 'l': base = 'n'; break; - case ';': base = 'm'; break; - case '\'': base = 231; break; // ç (ANSI) - case '\\': base = 231; break; // ç (ISO) - // Bottom row - case 'z': base = 234; break; // ê - case 'x': base = 224; break; // à - case 'c': base = 'y'; break; - case 'v': base = 'x'; break; - case 'b': base = 'k'; break; - case 'n': base = '\''; break; - case 'm': base = 'q'; break; - case ',': base = 'g'; break; - case '.': base = 'h'; break; - case '/': base = 'f'; break; - default: break; - } - } - void remap_dvorak(si32& base) - { - switch (base) - { - // Digits - case '-': base = '['; break; - case '=': base = ']'; break; - // Top - case 'q': base = '\''; break; - case 'w': base = ','; break; - case 'e': base = '.'; break; - case 'r': base = 'p'; break; - case 't': base = 'y'; break; - case 'y': base = 'f'; break; - case 'u': base = 'g'; break; - case 'i': base = 'c'; break; - case 'o': base = 'r'; break; - case 'p': base = 'l'; break; - case '[': base = '/'; break; - case ']': base = '='; break; - // Home Row - //case 'a': base = 'a'; break; // same - case 's': base = 'o'; break; - case 'd': base = 'e'; break; - case 'f': base = 'u'; break; - case 'g': base = 'i'; break; - case 'h': base = 'd'; break; - case 'j': base = 'h'; break; - case 'k': base = 't'; break; - case 'l': base = 'n'; break; - case ';': base = 's'; break; - case '\'': base = '-'; break; - // Bottom row - case 'z': base = ';'; break; - case 'x': base = 'q'; break; - case 'c': base = 'j'; break; - case 'v': base = 'k'; break; - case 'b': base = 'x'; break; - case 'n': base = 'b'; break; - //case 'm': base = 'm'; break; // same - case ',': base = 'w'; break; - case '.': base = 'v'; break; - case '/': base = 'z'; break; - default: break; - } + return keyid; } - void fix_altgr_and_right_shift(si32& vk, si32 sc, bool& extflag, bool fake_ralt) // Set extflag for right shift. { if (fake_ralt && sc == input::key::map::data(input::key::RightAlt).scan) @@ -2921,7 +2718,7 @@ namespace netxs::input extflag = true; } } - auto _find_abstract_key(si32 vk, si32 sc, bool extflag, si32& layout_hint) + auto find_abstract_vkey(si32 vk, si32 sc, bool extflag, si32& layout_hint) { auto keyid = input::key::undef; auto new_layout_hint = layout_hint; @@ -2962,7 +2759,7 @@ namespace netxs::input } else if (vk && sc) { - keyid = input::key::_find_abstract_key(vk, sc, extflag, layout_hint); + keyid = input::key::find_abstract_vkey(vk, sc, extflag, layout_hint); } return keyid; } @@ -2983,31 +2780,11 @@ namespace netxs::input { auto shifted_uc = utf::to_code(latin_shifted); auto unshift_uc = utf::to_code(latin_unshift); - if (unshift_uc >= '0' && unshift_uc <= '9') // Check digits row. - { - keyid = input::key::Key0 + (unshift_uc - '0') * 2; - } - else if (shifted_uc >= '0' && shifted_uc <= '9') // Check digits row. - { - keyid = input::key::Key0 + (shifted_uc - '0') * 2; - } - else if (unshift_uc >= 'a' && unshift_uc <= 'z') // Fast check latin letters. - { - keyid = input::key::KeyA + (unshift_uc - 'a') * 2; - } - else - { - using keyrec = std::decay_t; - auto [head, tail] = std::ranges::equal_range(input::key::uc_map, unshift_uc, {}, &keyrec::uc); - if (head != tail) - { - keyid = head->keyid; - } - } + keyid = input::key::find_abstract_uc(shifted_uc, unshift_uc); } if (vk && sc && keyid == input::key::undef) { - keyid = input::key::_find_abstract_key(vk, sc, extflag, layout_hint); + keyid = input::key::find_abstract_vkey(vk, sc, extflag, layout_hint); } } return keyid; diff --git a/src/netxs/desktopio/system.hpp b/src/netxs/desktopio/system.hpp index 38d4f9d5c4..319283c1f2 100644 --- a/src/netxs/desktopio/system.hpp +++ b/src/netxs/desktopio/system.hpp @@ -5910,25 +5910,24 @@ namespace netxs::os } return m; }(); - static auto kkp2key = [] - { - using namespace input; - auto extra_defs = std::to_array>( - { - // base key CSI-suffix input::key - { 57446 | ('u' << 16), key::LeftAlt }, // LEFT_META - { 57452 | ('u' << 16), key::RightAlt }, // RIGHT_META - { 1 | ('H' << 16), key::KeyHome }, - { 1 | ('F' << 16), key::KeyEnd }, - { 1 | ('P' << 16), key::F1 }, - { 1 | ('Q' << 16), key::F2 }, - { 1 | ('S' << 16), key::F4 }, + static constexpr auto kkp2key = [] + { + using keyrec_t = std::decay_t; + auto extra_defs = std::to_array( + { + //input::key base key CSI-suffix + { input::key::LeftAlt , 57446 | ('u' << 16) }, // LEFT_META + { input::key::RightAlt, 57452 | ('u' << 16) }, // RIGHT_META + { input::key::KeyHome , 1 | ('H' << 16) }, + { input::key::KeyEnd , 1 | ('F' << 16) }, + { input::key::F1 , 1 | ('P' << 16) }, + { input::key::F2 , 1 | ('Q' << 16) }, + { input::key::F4 , 1 | ('S' << 16) }, }); - auto m = input::key::kkpmap; - for (auto [KKPDef, keycode] : extra_defs) - { - m[KKPDef] = keycode; - } + auto m = std::array{}; + std::copy(input::key::kkpmap.begin(), input::key::kkpmap.end(), m.begin()); + std::copy(extra_defs.begin() , extra_defs.end() , m.begin() + input::key::kkpmap.size()); + std::ranges::sort(m, {}, &keyrec_t::kkp_trait); return m; }(); @@ -6067,10 +6066,20 @@ namespace netxs::os std::swap(k.scancod, scancod); } }; - auto current_layout = input::key::layout::undef; + auto find_kkp_key = [&](si32 trait) + { + auto keyid = input::key::undef; + auto iter = std::lower_bound(kkp2key.begin(), kkp2key.end(), trait, [](auto const& r, si32 t){ return r.kkp_trait < t; }); + if (iter != kkp2key.end() && iter->kkp_trait == trait) + { + keyid = iter->keyid; + } + return keyid; + }; auto detect_kkp = [&](qiew sequence) { - // ESC [ unshift_code:shifted_code:base_key ; ctlstat:evtype ; codepoints suffix + // ESC [ unshift_uc:shifted_uc:base_key ; ctlstat:evtype ; codepoints suffix + // Note: xrdp+"Hyper-V Enhanced Session" breaks keyboard input: they erroneously reverse the order of press/release events! if constexpr (debugmode) log("KKP: ", ansi::hi(utf::debase(sequence))); using namespace input; sequence.remove_prefix(2); // Pop ESC [ @@ -6078,51 +6087,27 @@ namespace netxs::os auto q = ansi::fifo32{ ansi::ccc_nop }; // Reserve for the command type. ansi::read_CSI(sequence, q, noop{}); - auto suffix = q(ansi::ccc_nop); - auto unshift_code = q(1); // Unshifted code. - auto shifted_code = q.subarg(unshift_code); - auto base_key = q.subarg(unshift_code); - auto ctlstat = q(1); - auto evtype = q.subarg(1); - auto codepoint = q(0); - - // Fix for custom kb layouts (QWERTZ, AZERTY, Dvorak, BEPO). - auto detected = input::key::detect_layout(unshift_code, base_key); - if (detected != input::key::layout::undef) - { - current_layout = detected; - } - switch (current_layout) - { - case input::key::layout::undef: - case input::key::layout::qwerty: - break; - case input::key::layout::qwertz: - if (unshift_code == 'z' && base_key == 'y') base_key = unshift_code; - else if (unshift_code == 'y' && base_key == 'z') base_key = unshift_code; - else if (unshift_code == '+' && base_key == ']') base_key = unshift_code; - else if (unshift_code == '-' && base_key == '/') base_key = unshift_code; - else if (unshift_code == '^' && base_key == '`') base_key = unshift_code; - else if (unshift_code == '#' && base_key =='\\') base_key = unshift_code; // # <- \ // - else if (unshift_code == 180 && base_key == '=') base_key = unshift_code; // ´ <- = - else if (unshift_code == 228 && base_key =='\'') base_key = unshift_code; // ä <- ' - else if (unshift_code == 223 && base_key == '-') base_key = unshift_code; // ß <- - - else if (unshift_code == 252 && base_key == '[') base_key = unshift_code; // ü <- [ - else if (unshift_code == 367 && base_key == ';') base_key = unshift_code; // ů <- ; Czech QWERTZ - else if (unshift_code == 246 && base_key == ';') base_key = unshift_code; // ö <- ; - else if (unshift_code == 337 && base_key == '4') base_key = unshift_code; // ő <- 4 Hungarian - break; - case input::key::layout::azerty: - if (base_key == 'q') base_key = 'a'; - else if (base_key == 'a') base_key = 'q'; - else if (base_key == 'z') base_key = 'w'; - break; - case input::key::layout::dvorak: - input::key::remap_dvorak(base_key); - break; - case input::key::layout::bepo: - input::key::remap_bepo(base_key); - break; + auto suffix = q(ansi::ccc_nop); + auto unshift_uc = 0; + auto shifted_uc = 0; + auto base_key = 0; + auto ctlstat = 0; + auto evtype = 0; + auto codepoint = 0; + if (suffix == 'u') + { + unshift_uc = q(1); // Unshifted code. + shifted_uc = q.subarg(unshift_uc); + base_key = q.subarg(unshift_uc); + ctlstat = q(1); + evtype = q.subarg(1); + codepoint = q(0); + } + else + { + base_key = q(1); // Just Fx id. + ctlstat = q(1); + evtype = q.subarg(1); } k.cluster = {}; @@ -6148,26 +6133,28 @@ namespace netxs::os if (ctlstat & input::kkp::caps_lock) k.ctlstat |= mods::CapsLock; if (ctlstat & input::kkp::num_lock ) k.ctlstat |= mods::NumLock; } - auto traits = (suffix << 16) | base_key; - auto iter = kkp2key.find(traits); - if (iter != kkp2key.end()) + + k.keycode = input::key::find_abstract_uc(shifted_uc, unshift_uc); // Try to lookup using uc. + if (k.keycode == input::key::undef) // Try to lookup using traits. { - auto code = iter->second; - auto& rec = key::map::data(code); - k.keycode = code; + auto traits = (suffix << 16) | base_key; + k.keycode = find_kkp_key(traits); + } + if (k.keycode != input::key::undef) // Map if something detected. + { + auto& rec = key::map::data(k.keycode); k.virtcod = rec.vkey; k.scancod = rec.scan; } else { - k.keycode = input::key::undef; - k.virtcod = base_key; + k.virtcod = suffix == 'u' ? base_key : 0; k.scancod = {}; } if (suffix == 'u') { - k.shifted = utf::to_utf_from_code(shifted_code); - k.unshift = utf::to_utf_from_code(unshift_code); + k.shifted = utf::to_utf_from_code(shifted_uc); + k.unshift = utf::to_utf_from_code(unshift_uc); } else { @@ -6187,17 +6174,18 @@ namespace netxs::os { k.cluster = text(1, (char)rec.KKPCtl); } - else if (k.ctlstat & mods::anyCtrl && unshift_code > 0 && unshift_code < 128) + else if (k.ctlstat & mods::anyCtrl && unshift_uc > 0 && unshift_uc < 128) { - k.cluster = text(1, (char)(unshift_code & 31)); + k.cluster = text(1, (char)(unshift_uc & 31)); } - else if (unshift_code > 0 && unshift_code < 57358) // Exclude any function keys. + else if (unshift_uc > 0 && unshift_uc < 57358) // Exclude any function keys. { - utf::to_utf_from_code(k.ctlstat & mods::CapsLock ? unshift_code : shifted_code, k.cluster); + auto shifted = !(k.ctlstat & mods::CapsLock) != !(k.ctlstat & mods::anyShift); + utf::to_utf_from_code(shifted ? shifted_uc : unshift_uc, k.cluster); } } } - if constexpr (debugmode) log(" suffix='%%' unshift_code=%% shifted_code=%% base_key=%% ctlstat=%% evtype=%% cluster=%%", (char)suffix, unshift_code, shifted_code, base_key, ctlstat, evtype, ansi::hi(utf::debase(k.cluster))); + if constexpr (debugmode) log(" suffix='%%' unshift_uc=%% shifted_uc=%% base_key=%% ctlstat=%% evtype=%% cluster=%%", (char)suffix, unshift_uc, shifted_uc, base_key, ctlstat, evtype, ansi::hi(utf::debase(k.cluster))); k.handled = {}; chords.build(k); keybd(k); From ffcf53159c1754196807d470d0fff6069bf0511c Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sat, 27 Jun 2026 16:28:50 +0500 Subject: [PATCH 65/71] #943 WIP: Update vt-input-mode.md --- doc/vt-input-mode.md | 514 ++++++++++++++++++++++++++++--------------- 1 file changed, 336 insertions(+), 178 deletions(-) diff --git a/doc/vt-input-mode.md b/doc/vt-input-mode.md index 15a9b2fe2e..1b1230b7b3 100644 --- a/doc/vt-input-mode.md +++ b/doc/vt-input-mode.md @@ -156,14 +156,14 @@ The state `kbmods=` of keyboard modifiers is the binary OR of all curre ----|--------|------------------------------|-------------- 0 | Left | ⌃ Ctrl | `0x0001` 1 | Right | ⌃ Ctrl | `0x0002` - 2 | Left | ⎇ Alt
⌥ Option | `0x0004` - 3 | Right | ⎇ Alt
⌥ Option
| `0x0008` + 2 | Left | ⎇ Alt
◆ Meta
⌥ Option | `0x0004` + 3 | Right | ⎇ Alt
◆ Meta
⌥ Option
| `0x0008` 4 | Left | ⇧ Shift | `0x0010` 5 | Right | ⇧ Shift | `0x0020` - 6 | Left | ⊞ Win
⌘ Command
◆ Meta
❖ Super | `0x0040` - 7 | Right | ⊞ Win
⌘ Command
◆ Meta
❖ Super | `0x0080` - 8 | | reserved | `0x0100` - 9 | | reserved | `0x0200` + 6 | Left | ⊞ Win
⌘ Command
❖ Super | `0x0040` + 7 | Right | ⊞ Win
⌘ Command
❖ Super | `0x0080` + 8 | Left | Hyper | `0x0100` + 9 | Right | Hyper | `0x0200` 10 | | reserved | `0x0400` 11 | | reserved | `0x0800` 12 | | ⇭ NumLock Mode | `0x1000` @@ -182,186 +182,344 @@ AZERTY: "Z" = 11 "Q" = 1E "S" = 1F "D" = 20 Dvorak: "," = 11 "A" = 1E "O" = 1F "E" = 20 ``` -Scan codes for the keys on a standard 104-key keyboard: +Scan codes for the keys of the abstract 112-key keyboard: ``` -┌────┐ ┌────╥────╥────╥────┐ ┌────╥────╥────╥────┐ ┌────╥────╥────╥────┐ ┌────╥────╥────┐ -| 01 │ | 3B ║ 3C ║ 3D ║ 3E | | 3F ║ 40 ║ 41 ║ 42 | | 43 ║ 44 ║ 57 ║ 58 | |E037║ 46 ║E045| -└────┘ └────╨────╨────╨────┘ └────╨────╨────╨────┘ └────╨────╨────╨────┘ └────╨────╨────┘ -┌────╥────╥────╥────╥────╥────╥────╥────╥────╥────╥────╥────╥────╥────────┐ ┌────╥────╥────┐ ┌────╥────╥────╥────┐ -| 29 ║ 02 ║ 03 ║ 04 ║ 05 ║ 06 ║ 07 ║ 08 ║ 09 ║ 0A ║ 0B ║ 0C ║ 0D ║ 0E | |E052║E047║E049| | 45 ║E035║ 37 ║ 4A | -╞════╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══════╡ ╞════╬════╬════╡ ╞════╬════╬════╬════╡ -| 0F ║ 10 ║ 11 ║ 12 ║ 13 ║ 14 ║ 15 ║ 16 ║ 17 ║ 18 ║ 19 ║ 1A ║ 1B ║ 2B | |E053║E04F║E051| | 47 ║ 48 ║ 49 ║ | -╞══════╩╦═══╩╦═══╩╦═══╩╦═══╩╦═══╩╦═══╩╦═══╩╦═══╩╦═══╩╦═══╩╦═══╩╦═══╩══════╡ └────╨────╨────┘ ╞════╬════╬════╣ 4E | -| 3A ║ 1E ║ 1F ║ 20 ║ 21 ║ 22 ║ 23 ║ 24 ║ 25 ║ 26 ║ 27 ║ 28 ║ 1C | | 4B ║ 4C ║ 4D ║ | -╞═══════╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩══════════╡ ┌────┐ ╞════╬════╬════╬════╡ -| 2A ║ 2C ║ 2D ║ 2E ║ 2F ║ 30 ║ 31 ║ 32 ║ 33 ║ 34 ║ 35 ║ 36 | |E048| | 4F ║ 50 ║ 51 ║ | -╞══════╦══╩═╦══╩═══╦╩════╩════╩════╩════╩════╩════╩╦═══╩╦═══╩╦═════╦══════╡ ┌────┼────┼────┐ ╞════╩════╬════╣E01C| -| 1D ║ 5B ║ 38 ║ 39 ║E038║ 5C ║ 5D ║ E01D | |E04B|E050|E04D| | 52 ║ 53 ║ | -└──────╨────╨──────╨───────────────────────────────╨────╨────╨─────╨──────┘ └────┴────┴────┘ └─────────╨────╨────┘ + ┌────┐ ┌────┐ + | 54 | |E046| 2 keys (SysReq=Alt+PrintScreen, Break=Ctrl+Pause) + └────┘ └────┘ +┌────┐ ┌────╥────╥────╥────┐ ┌────╥────╥────╥────┐ ┌────╥────╥────╥────┐ ┌────╥────╥────┐ +| 01 │ | 3B ║ 3C ║ 3D ║ 3E | | 3F ║ 40 ║ 41 ║ 42 | | 43 ║ 44 ║ 57 ║ 58 | |E037║ 46 ║ 45 | 16 keys +└────┘ └────╨────╨────╨────┘ └────╨────╨────╨────┘ └────╨────╨────╨────┘ └────╨────╨────┘ +┌────╥────╥────╥────╥────╥────╥────╥────╥────╥────╥────╥────╥────╥────╥─────┐ ┌────╥────╥────┐ ┌────╥────╥────╥────┐ +| 29 ║ 02 ║ 03 ║ 04 ║ 05 ║ 06 ║ 07 ║ 08 ║ 09 ║ 0A ║ 0B ║ 0C ║ 0D ║ 7D ║ 0E | |E052║E047║E049| |E045║E035║ 37 ║ 4A | 22 keys +╞════╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═════╡ ╞════╬════╬════╡ ╞════╬════╬════╬════╡ +| 0F ║ 10 ║ 11 ║ 12 ║ 13 ║ 14 ║ 15 ║ 16 ║ 17 ║ 18 ║ 19 ║ 1A ║ 1B ║ 2B | |E053║E04F║E051| | 47 ║ 48 ║ 49 ║ 4E | 21 keys +╞══════╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩════════╡ └────╨────╨────┘ ╞════╬════╬════╬════╣ +| 3A ║ 1E ║ 1F ║ 20 ║ 21 ║ 22 ║ 23 ║ 24 ║ 25 ║ 26 ║ 27 ║ 28 ║ 1C | | 4B ║ 4C ║ 4D ║ 7E | 17 keys +╞═════╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦══╩═╦═════════╡ ┌────┐ ╞════╬════╬════╬════╡ +| 2A ║ 56 ║ 2C ║ 2D ║ 2E ║ 2F ║ 30 ║ 31 ║ 32 ║ 33 ║ 34 ║ 35 ║ 73 ║ 36 | |E048| | 4F ║ 50 ║ 51 ║ | 19 keys +╞═════╩═╦══╩═╦══╩═══╦╩═══╦╩════╩════╩════╩════╩╦═══╩╦═══╩╦═══╩╦═══╩═╦═══════╡ ┌────┼────┼────┐ ╞════╩════╬════╣E01C| +| 1D ║ 5B ║ 38 ║ 7B ║ 39 ║ 70 ║E038║ 5C ║ 5D ║ E01D | |E04B|E050|E04D| | 52 ║ 53 ║ | 15 keys +└───────╨────╨──────╨────╨─────────────────────╨────╨────╨────╨─────╨───────┘ └────┴────┴────┘ └─────────╨────╨────┘ ``` #### Physical keys The `` is incremented by 2 for each generic key, providing two `` placeholders for each physical key to distinguish between Left and Right (or Numpad) in the last bit. Ignore the last bit of `` for tracking generic keys. -Key ID | Name | Generic Name | Scan Code | Notes --------|--------------------|--------------------|-----------|------ -0 | `undef` | `undef` | `0x0000` | -1 | `config` | `config` | `0x00FF` | -2 | `LeftCtrl` | `Ctrl` | `0x001D` | -3 | `RightCtrl` | `Ctrl` | `0x011D` | -4 | `LeftAlt` | `Alt` | `0x0038` | -5 | `RightAlt` | `Alt` | `0x0138` | -6 | `LeftShift` | `Shift` | `0x002A` | -7 | `RightShift` | `Shift` | `0x0036` | -8 | `LeftSuper` | `Super` | `0x015B` | -9 | `RightSuper` | `Super` | `0x015C` | -10 | `Apps` | `Apps` | `0x015D` | -12 | `NumLock` | `NumLock` | `0x0045` | -14 | `CapsLock` | `CapsLock` | `0x003A` | -16 | `ScrollLock` | `ScrollLock` | `0x0045` | -18 | `Esc` | `Esc` | `0x0001` | -20 | `Space` | `Space` | `0x0039` | -22 | `Backspace` | `Backspace` | `0x000E` | -24 | `Tab` | `Tab` | `0x000F` | -26 | `Break` | `Break` | `0x0046` | Ctrl + Pause -28 | `Pause` | `Pause` | `0x0045` | -30 | `Select` | `Select` | `0x0000` | -32 | `SysRq` | `SysRq` | `0x0054` | Alt + PrintScreen -34 | `PrintScreen` | `PrintScreen` | `0x0137` | -36 | `KeyEnter` | `Enter` | `0x001C` | -37 | `NumpadEnter` | `Enter` | `0x011C` | -38 | `KeyPageUp` | `PageUp` | `0x0149` | -39 | `NumpadPageUp` | `PageUp` | `0x0049` | -40 | `KeyPageDown` | `PageDown` | `0x0151` | -41 | `NumpadPageDown` | `PageDown` | `0x0051` | -42 | `KeyEnd` | `End` | `0x014F` | -43 | `NumpadEnd` | `End` | `0x004F` | -44 | `KeyHome` | `Home` | `0x0147` | -45 | `NumpadHome` | `Home` | `0x0047` | -46 | `KeyLeftArrow` | `LeftArrow` | `0x014B` | -47 | `NumpadLeftArrow` | `LeftArrow` | `0x004B` | -48 | `KeyUpArrow` | `UpArrow` | `0x0148` | -49 | `NumpadUpArrow` | `UpArrow` | `0x0048` | -50 | `KeyRightArrow` | `RightArrow` | `0x014D` | -51 | `NumpadRightArrow` | `RightArrow` | `0x004D` | -52 | `KeyDownArrow` | `DownArrow` | `0x0150` | -53 | `NumpadDownArrow` | `DownArrow` | `0x0050` | -54 | `Key0` | `0` | `0x000B` | -55 | `Numpad0` | `0` | `0x0052` | -56 | `Key1` | `1` | `0x0002` | -57 | `Numpad1` | `1` | `0x004F` | -58 | `Key2` | `2` | `0x0003` | -59 | `Numpad2` | `2` | `0x0050` | -60 | `Key3` | `3` | `0x0004` | -61 | `Numpad3` | `3` | `0x0051` | -62 | `Key4` | `4` | `0x0005` | -63 | `Numpad4` | `4` | `0x004B` | -64 | `Key5` | `5` | `0x0006` | -65 | `Numpad5` | `5` | `0x004C` | -66 | `Key6` | `6` | `0x0007` | -67 | `Numpad6` | `6` | `0x004D` | -68 | `Key7` | `7` | `0x0008` | -69 | `Numpad7` | `7` | `0x0047` | -70 | `Key8` | `8` | `0x0009` | -71 | `Numpad8` | `8` | `0x0048` | -72 | `Key9` | `9` | `0x000A` | -73 | `Numpad9` | `9` | `0x0049` | -74 | `KeyInsert` | `Insert` | `0x0152` | -75 | `NumpadInsert` | `Insert` | `0x0052` | -76 | `KeyDelete` | `Delete` | `0x0153` | -77 | `NumpadDelete` | `Delete` | `0x0055` | -78 | `KeyClear` | `Clear` | `0x014C` | -79 | `NumpadClear` | `Clear` | `0x004C` | Numpad 5 -80 | `KeyMultiply` | `*` | `0x0009` | -81 | `NumpadMultiply` | `*` | `0x0037` | -82 | `KeyPlus` | `Plus` | `0x000D` | -83 | `NumpadPlus` | `Plus` | `0x004E` | -84 | `KeySeparator` | `Separator` | `0x0000` | -85 | `NumpadSeparator` | `Separator` | `0x0000` | -86 | `KeyMinus` | `Minus` | `0x000C` | -87 | `NumpadMinus` | `Minus` | `0x004A` | -88 | `KeyPeriod` | `.` | `0x0034` | -89 | `NumpadDecimal` | `.` | `0x0053` | -90 | `KeySlash` | `/` | `0x0035` | -91 | `NumpadSlash` | `/` | `0x0135` | -92 | `BackSlash` | `BackSlash` | `0x002B` | -94 | `OpenBracket` | `[` | `0x001A` | -96 | `ClosedBracket` | `]` | `0x001B` | -98 | `Equal` | `=` | `0x000D` | -100 | `BackQuote` | `` ` `` | `0x0029` | -102 | `SingleQuote` | `'` | `0x0028` | -104 | `Comma` | `,` | `0x0033` | -106 | `Semicolon` | `;` | `0x0027` | -108 | `F1` | `F1` | `0x003B` | -110 | `F2` | `F2` | `0x003C` | -112 | `F3` | `F3` | `0x003D` | -114 | `F4` | `F4` | `0x003E` | -116 | `F5` | `F5` | `0x003F` | -118 | `F6` | `F6` | `0x0040` | -120 | `F7` | `F7` | `0x0041` | -122 | `F8` | `F8` | `0x0042` | -124 | `F9` | `F9` | `0x0043` | -126 | `F10` | `F10` | `0x0044` | -128 | `F11` | `F11` | `0x0057` | -130 | `F12` | `F12` | `0x005B` | -132 | `F13` | `F13` | `0x0000` | -134 | `F14` | `F14` | `0x0000` | -136 | `F15` | `F15` | `0x0000` | -138 | `F16` | `F16` | `0x0000` | -140 | `F17` | `F17` | `0x0000` | -142 | `F18` | `F18` | `0x0000` | -144 | `F19` | `F19` | `0x0000` | -146 | `F20` | `F20` | `0x0000` | -148 | `F21` | `F21` | `0x0000` | -150 | `F22` | `F22` | `0x0000` | -152 | `F23` | `F23` | `0x0000` | -154 | `F24` | `F24` | `0x0000` | -156 | `KeyA` | `A` | `0x0000` | -158 | `KeyB` | `B` | `0x0000` | -160 | `KeyC` | `C` | `0x0000` | -162 | `KeyD` | `D` | `0x0000` | -164 | `KeyE` | `E` | `0x0000` | -166 | `KeyF` | `F` | `0x0000` | -168 | `KeyG` | `G` | `0x0000` | -170 | `KeyH` | `H` | `0x0000` | -172 | `KeyI` | `I` | `0x0000` | -174 | `KeyJ` | `J` | `0x0000` | -176 | `KeyK` | `K` | `0x0000` | -178 | `KeyL` | `L` | `0x0000` | -180 | `KeyM` | `M` | `0x0000` | -182 | `KeyN` | `N` | `0x0000` | -184 | `KeyO` | `O` | `0x0000` | -186 | `KeyP` | `P` | `0x0000` | -188 | `KeyQ` | `Q` | `0x0000` | -190 | `KeyR` | `R` | `0x0000` | -192 | `KeyS` | `S` | `0x0000` | -194 | `KeyT` | `T` | `0x0000` | -196 | `KeyU` | `U` | `0x0000` | -198 | `KeyV` | `V` | `0x0000` | -200 | `KeyW` | `W` | `0x0000` | -202 | `KeyX` | `X` | `0x0000` | -204 | `KeyY` | `Y` | `0x0000` | -206 | `KeyZ` | `Z` | `0x0000` | -208 | `Sleep` | `Sleep` | `0x0000` | -210 | `Calculator` | `Calculator` | `0x0000` | -212 | `Mail` | `Mail` | `0x0000` | -214 | `MediaVolMute` | `MediaVolMute` | `0x0000` | -216 | `MediaVolDown` | `MediaVolDown` | `0x0000` | -218 | `MediaVolUp` | `MediaVolUp` | `0x0000` | -220 | `MediaNext` | `MediaNext` | `0x0000` | -222 | `MediaPrev` | `MediaPrev` | `0x0000` | -224 | `MediaStop` | `MediaStop` | `0x0000` | -226 | `MediaPlayPause` | `MediaPlayPause` | `0x0000` | -228 | `MediaSelect` | `MediaSelect` | `0x0000` | -230 | `BrowserBack` | `BrowserBack` | `0x0000` | -232 | `BrowserForward` | `BrowserForward` | `0x0000` | -234 | `BrowserRefresh` | `BrowserRefresh` | `0x0000` | -236 | `BrowserStop` | `BrowserStop` | `0x0000` | -238 | `BrowserSearch` | `BrowserSearch` | `0x0000` | -240 | `BrowserFavorites` | `BrowserFavorites` | `0x0000` | -242 | `BrowserHome` | `BrowserHome` | `0x0000` | +Key ID | Name | Generic Name | Literal Code | Unicode Code | Nodes +-------|--------------------|--------------------|--------------|--------------|------ + 0 | undef | "undef" | "" | 0 | Any unknown key + 2 | LeftCtrl | "Ctrl" | "" | 0 + 3 | RightCtrl | "Ctrl" | "" | 0 + 4 | LeftAlt | "Alt" | "" | 0 + 5 | RightAlt | "Alt" | "" | 0 + 6 | LeftShift | "Shift" | "" | 0 + 7 | RightShift | "Shift" | "" | 0 + 8 | LeftSuper | "Super" | "" | 0 | LeftWin on Windows + 9 | RightSuper | "Super" | "" | 0 | RightWin on Windows + 10 | LeftHyper | "Hyper" | "" | 0 + 11 | RightHyper | "Hyper" | "" | 0 + 12 | NumLock | "NumLock" | "" | 0 + 14 | CapsLock | "CapsLock" | "" | 0 + 16 | ScrollLock | "ScrollLock" | "" | 0 + 18 | AltGr | "AltGr" | "" | 0 | aka IsoLevel3Shift + 20 | IsoLevel5Shift | "IsoLevel5Shift" | "" | 0 | GroupSelect on Canadian Multilingual Standard layout + 22 | Kana | "Kana" | "" | 0 + 24 | Henkan | "Henkan" | "" | 0 + 26 | Muhenkan | "Muhenkan" | "" | 0 + 28 | Hanja | "Hanja" | "" | 0 + 30 | Hanguel | "Hanguel" | "" | 0 + 32 | Apps | "Apps" | "" | 0 + 34 | Select | "Select" | "" | 0 + 36 | Fn | "Fn" | "" | 0 | macOS/Linux specific + 38 | F1 | "F1" | "" | 0 + 40 | F2 | "F2" | "" | 0 + 42 | F3 | "F3" | "" | 0 + 44 | F4 | "F4" | "" | 0 + 46 | F5 | "F5" | "" | 0 + 48 | F6 | "F6" | "" | 0 + 50 | F7 | "F7" | "" | 0 + 52 | F8 | "F8" | "" | 0 + 54 | F9 | "F9" | "" | 0 + 56 | F10 | "F10" | "" | 0 + 58 | F11 | "F11" | "" | 0 + 60 | F12 | "F12" | "" | 0 + 62 | F13 | "F13" | "" | 0 + 64 | F14 | "F14" | "" | 0 + 66 | F15 | "F15" | "" | 0 + 68 | F16 | "F16" | "" | 0 + 70 | F17 | "F17" | "" | 0 + 72 | F18 | "F18" | "" | 0 + 74 | F19 | "F19" | "" | 0 + 76 | F20 | "F20" | "" | 0 + 78 | F21 | "F21" | "" | 0 + 80 | F22 | "F22" | "" | 0 + 82 | F23 | "F23" | "" | 0 + 84 | F24 | "F24" | "" | 0 + 86 | F25 | "F25" | "" | 0 + 88 | F26 | "F26" | "" | 0 + 90 | F27 | "F27" | "" | 0 + 92 | F28 | "F28" | "" | 0 + 94 | F29 | "F29" | "" | 0 + 96 | F30 | "F30" | "" | 0 + 98 | F31 | "F31" | "" | 0 + 100 | F32 | "F32" | "" | 0 + 102 | F33 | "F33" | "" | 0 + 104 | F34 | "F34" | "" | 0 + 106 | F35 | "F35" | "" | 0 + 108 | PrintScreen | "PrintScreen" | "" | 0 + 110 | Pause | "Pause" | "" | 0 + 112 | Break | "Break" | "\x03" | 0x03 + 114 | SysReq | "SysReq" | "" | 0 + 116 | Esc | "Esc" | "\x1B" | 0x1b + 118 | Tab | "Tab" | "\x09" | 0x09 + 120 | Backspace | "Backspace" | "\x08" | 0x08 + 122 | Space | "Space" | "\x20" | 0x20 + 124 | KeyEnter | "Enter" | "\x0D" | 0x0d + 125 | NumpadEnter | "Enter" | "\x0D" | 0x0d + 126 | KeyInsert | "Insert" | "" | 0 + 127 | NumpadInsert | "Insert" | "" | 0 + 128 | KeyDelete | "Delete" | "" | 0 + 129 | NumpadDelete | "Delete" | "" | 0 + 130 | KeyClear | "Clear" | "" | 0 + 131 | NumpadClear | "Clear" | "" | 0 + 132 | KeyPageUp | "PageUp" | "" | 0 + 133 | NumpadPageUp | "PageUp" | "" | 0 + 134 | KeyPageDown | "PageDown" | "" | 0 + 135 | NumpadPageDown | "PageDown" | "" | 0 + 136 | KeyHome | "Home" | "" | 0 + 137 | NumpadHome | "Home" | "" | 0 + 138 | KeyEnd | "End" | "" | 0 + 139 | NumpadEnd | "End" | "" | 0 + 140 | KeyLeftArrow | "LeftArrow" | "" | 0 + 141 | NumpadLeftArrow | "LeftArrow" | "" | 0 + 142 | KeyRightArrow | "RightArrow" | "" | 0 + 143 | NumpadRightArrow | "RightArrow" | "" | 0 + 144 | KeyUpArrow | "UpArrow" | "" | 0 + 145 | NumpadUpArrow | "UpArrow" | "" | 0 + 146 | KeyDownArrow | "DownArrow" | "" | 0 + 147 | NumpadDownArrow | "DownArrow" | "" | 0 + 148 | Key0 | "0" | "0" | 0x30 + 149 | Numpad0 | "0" | "0" | 0x30 + 150 | Key1 | "1" | "1" | 0x31 + 151 | Numpad1 | "1" | "1" | 0x31 + 152 | Key2 | "2" | "2" | 0x32 + 153 | Numpad2 | "2" | "2" | 0x32 + 154 | Key3 | "3" | "3" | 0x33 + 155 | Numpad3 | "3" | "3" | 0x33 + 156 | Key4 | "4" | "4" | 0x34 + 157 | Numpad4 | "4" | "4" | 0x34 + 158 | Key5 | "5" | "5" | 0x35 + 159 | Numpad5 | "5" | "5" | 0x35 + 160 | Key6 | "6" | "6" | 0x36 + 161 | Numpad6 | "6" | "6" | 0x36 + 162 | Key7 | "7" | "7" | 0x37 + 163 | Numpad7 | "7" | "7" | 0x37 + 164 | Key8 | "8" | "8" | 0x38 + 165 | Numpad8 | "8" | "8" | 0x38 + 166 | Key9 | "9" | "9" | 0x39 + 167 | Numpad9 | "9" | "9" | 0x39 + 168 | KeyMultiply | "*" | "*" | 0x2A + 169 | NumpadMultiply | "*" | "*" | 0x2A + 170 | KeySlash | "/" | "/" | 0x2F + 171 | NumpadDivide | "/" | "/" | 0x2F + 172 | KeyPlus | "Plus" | "+" | 0x2B + 173 | NumpadPlus | "Plus" | "+" | 0x2B + 174 | KeyMinus | "Minus" | "-" | 0x2D + 175 | NumpadMinus | "Minus" | "-" | 0x2D + 176 | KeyEqual | "=" | "=" | 0x3D + 177 | NumpadEqual | "=" | "=" | 0x3D + 178 | KeyPeriod | "." | "." | 0x2E + 179 | NumpadDecimal | "." | "." | 0x2E + 180 | KeyComma | "," | "," | 0x2C + 181 | NumpadPoint | "," | "," | 0x2C + 182 | Colon | ":" | ":" | 0x3A + 184 | Semicolon | ";" | ";" | 0x3B + 186 | TurnedComma | "ʻ" | "ʻ" | 0x02BB + 188 | OpenSquareBracket | "[" | "[" | 0x5B + 190 | CloseSquareBracket | "]" | "]" | 0x5D + 192 | OpenCurlyBracket | "{" | "{" | 0x7B + 194 | CloseCurlyBracket | "}" | "}" | 0x7D + 196 | CloseRoundBracket | ")" | ")" | 0x29 + 198 | LessThan | "<" | "<" | 0x3C + 200 | BackSlash | "\\" | "\\" | 0x5C + 202 | Underscore | "_" | "_" | 0x5F + 204 | VerticalBar | "\|" | "\|" | 0x7C + 206 | DivisionSign | "÷" | "÷" | 0xF7 + 208 | OneHalf | "½" | "½" | 0xBD + 210 | SuperscriptTwo | "²" | "²" | 0xB2 + 212 | DegreeSign | "°" | "°" | 0xB0 + 214 | NumeroSign | "º" | "º" | 0xBA + 216 | Acute | "´" | "´" | 0xB4 + 218 | Caron | "ˇ" | "ˇ" | 0x02C7 + 220 | Cedilla | "¸" | "¸" | 0xB8 + 222 | Circumflex | "^" | "^" | 0x5E + 224 | Ogonek | "˛" | "˛" | 0x02DB + 226 | Cross | "˟" | "˟" | 0x02DF + 228 | Tilde | "~" | "~" | 0x7E + 230 | Tonos | "΄" | "΄" | 0x0384 + 232 | Umlaut | "¨" | "¨" | 0xA8 + 234 | BackQuote | "`" | "`" | 0x60 + 236 | SingleQuote | "'" | "'" | 0x27 + 238 | DoubleQuote | "\"" | "\"" | 0x22 + 240 | SingleRightQuote | "’" | "’" | 0x2019 + 242 | SingleLowQuote | "‚" | "‚" | 0x201A + 244 | DoubleLowQuote | "„" | "„" | 0x201E + 246 | LeftGuillemet | "«" | "«" | 0xAB + 248 | Hash | "#" | "#" | 0x23 + 250 | AtSign | "@" | "@" | 0x40 + 252 | Exclamation | "!" | "!" | 0x21 + 254 | InvertedExclamation| "¡" | "¡" | 0xA1 + 256 | QuestionMark | "?" | "?" | 0x3F + 258 | InvertedQuestion | "¿" | "¿" | 0xBF + 260 | Paragraph | "§" | "§" | 0xA7 + 262 | Ampersand | "&" | "&" | 0x26 + 264 | Dollar | "$" | "$" | 0x24 + 266 | Percent | "%" | "%" | 0x25 + 268 | Dong | "₫" | "₫" | 0x20AB + 270 | Yen | "¥" | "¥" | 0xA5 + 272 | DotlessI | "ı" | "ı" | 0x0131 + 274 | MicroSign | "µ" | "µ" | 0xB5 + 276 | Eth | "ð" | "ð" | 0xF0 + 278 | Thorn | "þ" | "þ" | 0xFE + 280 | Eszett | "ẞ" | "ß" | 0xDF + 282 | KeyA | "A" | "a" | 0x61 + 284 | KeyB | "B" | "b" | 0x62 + 286 | KeyC | "C" | "c" | 0x63 + 288 | KeyD | "D" | "d" | 0x64 + 290 | KeyE | "E" | "e" | 0x65 + 292 | KeyF | "F" | "f" | 0x66 + 294 | KeyG | "G" | "g" | 0x67 + 296 | KeyH | "H" | "h" | 0x68 + 298 | KeyI | "I" | "i" | 0x69 + 300 | KeyJ | "J" | "j" | 0x6A + 302 | KeyK | "K" | "k" | 0x6B + 304 | KeyL | "L" | "l" | 0x6C + 306 | KeyM | "M" | "m" | 0x6D + 308 | KeyN | "N" | "n" | 0x6E + 310 | KeyO | "O" | "o" | 0x6F + 312 | KeyP | "P" | "p" | 0x70 + 314 | KeyQ | "Q" | "q" | 0x71 + 316 | KeyR | "R" | "r" | 0x72 + 318 | KeyS | "S" | "s" | 0x73 + 320 | KeyT | "T" | "t" | 0x74 + 322 | KeyU | "U" | "u" | 0x75 + 324 | KeyV | "V" | "v" | 0x76 + 326 | KeyW | "W" | "w" | 0x77 + 328 | KeyX | "X" | "x" | 0x78 + 330 | KeyY | "Y" | "y" | 0x79 + 332 | KeyZ | "Z" | "z" | 0x7A + 334 | AeLigature | "Æ" | "æ" | 0xE6 + 336 | AcuteA | "Á" | "á" | 0xE1 + 338 | BreveA | "Ă" | "ă" | 0x0103 + 340 | CircumflexA | "Â" | "â" | 0xE2 + 342 | GraveA | "À" | "à" | 0xE0 + 344 | OgonekA | "Ą" | "ą" | 0x0105 + 346 | RingA | "Å" | "å" | 0xE5 + 348 | TildeA | "Ã" | "ã" | 0xE3 + 350 | UmlautA | "Ä" | "ä" | 0xE4 + 352 | AcuteC | "Ć" | "ć" | 0x0107 + 354 | CaronC | "Č" | "č" | 0x010D + 356 | CedillaC | "Ç" | "ç" | 0xE7 + 358 | DotAboveC | "Ċ" | "ċ" | 0x010B + 360 | AcuteE | "É" | "é" | 0xE9 + 362 | CircumflexE | "Ê" | "ê" | 0xEA + 364 | GraveE | "È" | "è" | 0xE8 + 366 | DotAboveE | "Ė" | "ė" | 0x0117 + 368 | OgonekE | "Ę" | "ę" | 0x0119 + 370 | UmlautE | "Ë" | "ë" | 0xEB + 372 | CrossedD | "Đ" | "đ" | 0x0111 + 374 | BreveG | "Ğ" | "ğ" | 0x011F + 376 | DotAboveG | "Ġ" | "ġ" | 0x0121 + 378 | CrossedH | "Ħ" | "ħ" | 0x0127 + 380 | AcuteI | "Í" | "í" | 0xED + 382 | CircumflexI | "Î" | "î" | 0xEE + 384 | GraveI | "Ì" | "ì" | 0xEC + 386 | OgonekI | "Į" | "į" | 0x012F + 388 | CrossedL | "Ł" | "ł" | 0x0142 + 390 | CaronN | "Ň" | "ň" | 0x0148 + 392 | TildeN | "Ñ" | "ñ" | 0xF1 + 394 | AcuteO | "Ó" | "ó" | 0xF3 + 396 | CircumflexO | "Ô" | "ô" | 0xF4 + 398 | DoubleAcuteO | "Ő" | "ő" | 0x0151 + 400 | GraveO | "Ò" | "ò" | 0xF2 + 402 | HornO | "Ơ" | "ơ" | 0x01A1 + 404 | SlashedO | "Ø" | "ø" | 0xF8 + 406 | TildeO | "Õ" | "õ" | 0xF5 + 408 | UmlautO | "Ö" | "ö" | 0xF6 + 410 | AcuteS | "Ś" | "ś" | 0x015B + 412 | CaronS | "Š" | "š" | 0x0161 + 414 | CedillaS | "Ş" | "ş" | 0x015F + 416 | CommaS | "Ș" | "ș" | 0x0219 + 418 | CedillaT | "Ţ" | "ţ" | 0x0163 + 420 | CommaT | "Ț" | "ț" | 0x021B + 422 | AcuteU | "Ú" | "ú" | 0xFA + 424 | DoubleAcuteU | "Ű" | "ű" | 0x0171 + 426 | GraveU | "Ù" | "ù" | 0xF9 + 428 | HornU | "Ư" | "ư" | 0x01B0 + 430 | MacronU | "Ū" | "ū" | 0x016B + 432 | OgonekU | "Ų" | "ų" | 0x0173 + 434 | RingU | "Ů" | "ů" | 0x016F + 436 | UmlautU | "Ü" | "ü" | 0xFC + 438 | CaronZ | "Ž" | "ž" | 0x017E + 440 | DotAboveZ | "Ż" | "ż" | 0x017C + 442 | Sleep | "Sleep" | "" | 0 + 444 | AppStart1 | "AppStart1" | "" | 0 + 446 | AppStart2 | "AppStart2" | "" | 0 + 448 | AppNewWindow | "AppNewWindow" | "" | 0 + 450 | AppOpenWindow | "AppOpenWindow" | "" | 0 + 452 | AppHelp | "AppHelp" | "" | 0 + 454 | AppSave | "AppSave" | "" | 0 + 456 | AppFind | "AppFind" | "" | 0 + 458 | AppPrint | "AppPrint" | "" | 0 + 460 | AppClose | "AppClose" | "" | 0 + 462 | AppCut | "AppCut" | "" | 0 + 464 | AppCopy | "AppCopy" | "" | 0 + 466 | AppPaste | "AppPaste" | "" | 0 + 468 | AppUndo | "AppUndo" | "" | 0 + 470 | AppRedo | "AppRedo" | "" | 0 + 472 | AppSpeechMode | "AppSpeechMode" | "" | 0 + 474 | AppSpeechCorrection| "AppSpeechCorrect" | "" | 0 + 476 | AppSpellCheck | "AppSpellCheck" | "" | 0 + 478 | Calculator | "Calculator" | "" | 0 + 480 | Mail | "Mail" | "" | 0 + 482 | MailSend | "MailSend" | "" | 0 + 484 | MailForward | "MailForward" | "" | 0 + 486 | MailReply | "MailReply" | "" | 0 + 488 | MediaBassBoost | "MediaBassBoost" | "" | 0 + 490 | MediaBassDown | "MediaBassDown" | "" | 0 + 492 | MediaBassUp | "MediaBassUp" | "" | 0 + 494 | MediaChanDown | "MediaChanDown" | "" | 0 + 496 | MediaChanUp | "MediaChanUp" | "" | 0 + 498 | MediaTrebleDown | "MediaTrebleDown" | "" | 0 + 500 | MediaTrebleUp | "MediaTrebleUp" | "" | 0 + 502 | MediaVolMute | "MediaVolMute" | "" | 0 + 504 | MediaVolDown | "MediaVolDown" | "" | 0 + 506 | MediaVolUp | "MediaVolUp" | "" | 0 + 508 | MediaNext | "MediaNext" | "" | 0 + 510 | MediaPrev | "MediaPrev" | "" | 0 + 512 | MediaStop | "MediaStop" | "" | 0 + 514 | MediaPause | "MediaPause" | "" | 0 + 516 | MediaPlayPause | "MediaPlayPause" | "" | 0 + 518 | MediaPlay | "MediaPlay" | "" | 0 + 520 | MediaSelectMode | "MediaSelectMode" | "" | 0 + 522 | MediaReverse | "MediaReverse" | "" | 0 + 524 | MediaRecord | "MediaRecord" | "" | 0 + 526 | MediaFastForward | "MediaFastForward" | "" | 0 + 528 | MediaRewind | "MediaRewind" | "" | 0 + 530 | MicAirToggle | "MicAirToggle" | "" | 0 + 532 | MicMute | "MicMute" | "" | 0 + 534 | MicVolUp | "MicVolUp" | "" | 0 + 536 | MicVolDown | "MicVolDown" | "" | 0 + 538 | BrowserBackward | "BrowserBackward" | "" | 0 + 540 | BrowserForward | "BrowserForward" | "" | 0 + 542 | BrowserRefresh | "BrowserRefresh" | "" | 0 + 544 | BrowserStop | "BrowserStop" | "" | 0 + 546 | BrowserSearch | "BrowserSearch" | "" | 0 + 548 | BrowserFavorites | "BrowserFavorites" | "" | 0 + 550 | BrowserHome | "BrowserHome" | "" | 0 ### Mouse From dd8215e8c9213b7c3ed1d81ccd262c03d958f0e7 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sat, 27 Jun 2026 16:34:04 +0500 Subject: [PATCH 66/71] Fix Win32 builds --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de9e29d9ac..d4fa1208b9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,7 +44,7 @@ jobs: arch: x86 cxx: cl cc: cl - flags: '-DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded" -DCMAKE_EXE_LINKER_FLAGS_RELEASE="/DEBUG /OPT:REF /OPT:ICF" -DCMAKE_CXX_FLAGS_RELEASE="/MT /O2 /DNDEBUG /Zi /Zc:preprocessor /W4 /EHsc /bigobj /utf-8 /Zc:preprocessor" -A ' + flags: '-DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded" -DCMAKE_EXE_LINKER_FLAGS_RELEASE="/DEBUG /OPT:REF /OPT:ICF" -DCMAKE_CXX_FLAGS_RELEASE="/MT /O2 /DNDEBUG /Zi /Zc:preprocessor /W4 /EHsc /bigobj /utf-8 /constexpr:steps 10000000" -A ' triplet: x86-windows-static - os: windows-latest cxx: cl @@ -85,7 +85,7 @@ jobs: - os: ubuntu-22.04 flags: '-DCMAKE_CXX_FLAGS_RELEASE="-static -s -DNDEBUG -Wall -Wextra -Wno-missing-field-initializers -Wno-psabi -Werror -Wno-unknown-pragmas"' - os: windows-latest - flags: '-DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded" -DCMAKE_EXE_LINKER_FLAGS_RELEASE="/DEBUG /OPT:REF /OPT:ICF" -DCMAKE_CXX_FLAGS_RELEASE="/MT /O2 /DNDEBUG /Zi /Zc:preprocessor /W4 /EHsc /bigobj /utf-8 /Zc:preprocessor" -A ' + flags: '-DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded" -DCMAKE_EXE_LINKER_FLAGS_RELEASE="/DEBUG /OPT:REF /OPT:ICF" -DCMAKE_CXX_FLAGS_RELEASE="/MT /O2 /DNDEBUG /Zi /Zc:preprocessor /W4 /EHsc /bigobj /utf-8 /constexpr:steps 10000000" -A ' - os: ubuntu-22.04 platform: linux From 8b6129fe565e447547dd4bbdd2622bd2edf5bfe0 Mon Sep 17 00:00:00 2001 From: Dmitry Sapozhnikov <11535558+o-sdn-o@users.noreply.github.com> Date: Sat, 27 Jun 2026 17:04:40 +0500 Subject: [PATCH 67/71] #943 WIP: Replace the Alt+Z/Alt+Shift+B key bindings with Esc+F1/Ctrl-Alt on Unix-like platforms --- doc/architecture.md | 1 + doc/settings.md | 9 ++++----- src/vtm.xml | 24 ++++-------------------- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/doc/architecture.md b/doc/architecture.md index 7ffa800db4..c221f36fff 100644 --- a/doc/architecture.md +++ b/doc/architecture.md @@ -298,6 +298,7 @@ In Classic VT mode, a vtm process parses input from multiple standard sources an - SGR mouse reporting sequences `\x1b[ - @@ -1161,7 +1161,6 @@ Notes -