// In ths program we use a 3D-Vector Vector[language][Keys][Shiftstates] #pragma once #ifndef KEYMAP_H #define KEYMAP_H #include #include #include #include #include #include #include #include #include #include #include "mc_kmxfile.h" #include "kmx_file.h" #include "mc_savekeyboard.h" #include "u16.h" typedef std::vector v_str_1D; typedef std::vector v_dw_1D; typedef std::vector > v_dw_2D; typedef std::vector > > v_dw_3D; enum ShiftState { Base = 0, // 0 Shft = 1, // 1 Ctrl = 2, // 2 ShftCtrl = Shft | Ctrl, // 3 Menu = 4, // 4 -- NOT USED ShftMenu = Shft | Menu, // 5 -- NOT USED MenuCtrl = Menu | Ctrl, // 6 ShftMenuCtrl = Shft | Menu | Ctrl, // 7 Xxxx = 8, // 8 ShftXxxx = Shft | Xxxx, // 9 }; // Map of all US English virtual key codes that we can translate const KMX_DWORD KMX_VKMap[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', VK_SPACE, /* 32 */ VK_ACCENT, /* 192 VK_OEM_3 */ VK_HYPHEN, /* - 189 VK_OEM_MINUS */ VK_EQUAL, /* = 187 VK_OEM_PLUS */ VK_LBRKT, /* [ 219 VK_OEM_4 */ VK_RBRKT, /* ] 221 VK_OEM_6 */ VK_BKSLASH, /* \ 220 VK_OEM_5 */ VK_COLON, /* ; 186 VK_OEM_1 or ö */ VK_QUOTE, /* ' 222 VK_OEM_7 or Ä */ VK_COMMA, /* , 188 VK_OEM_COMMA */ VK_PERIOD, /* . 190 VK_OEM_PERIOD */ VK_SLASH, /* / 191 VK_OEM_2 */ VK_xDF, /* ß (?) 223*/ VK_OEM_102, /* < > | 226 */ 0 }; static KMX_DWORD returnIfCharInvalid = 0; static KMX_DWORD deadkey_min = 0xfe50; static KMX_DWORD deadkey_max = 0xfe93; int map_VKShiftState_to_Lin(int VKShiftState); // takes a std::wstring (=contents of line symbols-file ) and returns the (int) value of the character KMX_DWORD convertNamesToIntegerValue(std::wstring tok_wstr); // create a Vector with all entries of both keymaps+ keymap int createOneVectorFromBothKeyboards(v_dw_3D &All_Vector,GdkKeymap *keymap); //int createOneVectorFromBothKeyboards(v_dw_3D &All_Vector); // read configuration file, split and write to 3D-Vector (Data for US on [0][ ][ ] ) int write_US_ToVector(v_dw_3D &vec, std::string language, const char *text); // 1. step: read complete Row of Configuration file US bool createCompleteRow_US(v_str_1D &complete_List, FILE *fpp, const char *text, std::string language); // replace Name of Key (e.g. ) wih Keycode ( e.g. 0x15 ) int replace_KeyName_with_Keycode(std::string in); // 2nd step: write contents to 3D vector int split_US_To_3D_Vector(v_dw_3D &all_US, v_str_1D completeList); // create an empty 2D vector containing "--" in all fields v_dw_2D create_empty_2D_Vector(int dim_rows, int dim_shifts); // append characters using GDK to 3D-Vector (Data for Other Language on [1][ ][ ] ) int append_other_ToVector(v_dw_3D &All_Vector, GdkKeymap *keymap); // initialize GDK bool InitializeGDK(GdkKeymap **keymap,int argc, gchar *argv[]); //------------------------------ const UINT USVirtualKeyToScanCode[256] = { 0x00, // L"K_?00", // &H0 0x00, // L"K_LBUTTON", // &H1 0x00, // L"K_RBUTTON", // &H2 0x46, // L"K_CANCEL", // &H3 0x00, // L"K_MBUTTON", // &H4 0x00, // L"K_?05", // &H5 0x00, // L"K_?06", // &H6 0x00, // L"K_?07", // &H7 0x0E, // L"K_BKSP", // &H8 0x0F, // L"K_TAB", // &H9 0x00, // L"K_?0A", // &HA 0x00, // L"K_?0B", // &HB 0x4C, // L"K_KP5", // &HC 0x1C, // L"K_ENTER", // &HD 0x00, // L"K_?0E", // &HE 0x00, // L"K_?0F", // &HF 0x2A, // L"K_SHIFT", // &H10 0x1D, // L"K_CONTRO0x00, // L", // &H11 0x38, // L"K_ALT", // &H12 0x00, // L"K_PAUSE", // &H13 0x3A, // L"K_CAPS", // &H14 0x00, // L"K_KANJI?15", // &H15 0x00, // L"K_KANJI?16", // &H16 0x00, // L"K_KANJI?17", // &H17 0x00, // L"K_KANJI?18", // &H18 0x00, // L"K_KANJI?19", // &H19 0x00, // L"K_?1A", // &H1A 0x01, // L"K_ESC", // &H1B 0x00, // L"K_KANJI?1C", // &H1C 0x00, // L"K_KANJI?1D", // &H1D 0x00, // L"K_KANJI?1E", // &H1E 0x00, // L"K_KANJI?1F", // &H1F 0x39, // L"K_SPACE", // &H20 0x49, // L"K_PGUP", // &H21 0x51, // L"K_PGDN", // &H22 0x4F, // L"K_END", // &H23 0x47, // L"K_HOME", // &H24 0x4B, // L"K_LEFT", // &H25 0x48, // L"K_UP", // &H26 0x4D, // L"K_RIGHT", // &H27 0x50, // L"K_DOWN", // &H28 0x00, // L"K_SEL", // &H29 0x00, // L"K_PRINT", // &H2A 0x00, // L"K_EXEC", // &H2B 0x54, // L"K_PRTSCN", // &H2C 0x52, // L"K_INS", // &H2D 0x53, // L"K_DEL", // &H2E 0x63, // L"K_HELP", // &H2F 0x0B, // L"K_0", // &H30 0x02, // L"K_1", // &H31 0x03, // L"K_2", // &H32 0x04, // L"K_3", // &H33 0x05, // L"K_4", // &H34 0x06, // L"K_5", // &H35 0x07, // L"K_6", // &H36 0x08, // L"K_7", // &H37 0x09, // L"K_8", // &H38 0x0A, // L"K_9", // &H39 0x00, // L"K_?3A", // &H3A 0x00, // L"K_?3B", // &H3B 0x00, // L"K_?3C", // &H3C 0x00, // L"K_?3D", // &H3D 0x00, // L"K_?3E", // &H3E 0x00, // L"K_?3F", // &H3F 0x00, // L"K_?40", // &H40 0x1E, // L"K_A", // &H41 0x30, // L"K_B", // &H42 0x2E, // L"K_C", // &H43 0x20, // L"K_D", // &H44 0x12, // L"K_E", // &H45 0x21, // L"K_F", // &H46 0x22, // L"K_G", // &H47 0x23, // L"K_H", // &H48 0x17, // L"K_I", // &H49 0x24, // L"K_J", // &H4A 0x25, // L"K_K", // &H4B 0x26, // L"K_L", // &H4C 0x32, // L"K_M", // &H4D 0x31, // L"K_N", // &H4E 0x18, // L"K_O", // &H4F 0x19, // L"K_P", // &H50 0x10, // L"K_Q", // &H51 0x13, // L"K_R", // &H52 0x1F, // L"K_S", // &H53 0x14, // L"K_T", // &H54 0x16, // L"K_U", // &H55 0x2F, // L"K_V", // &H56 0x11, // L"K_W", // &H57 0x2D, // L"K_X", // &H58 0x15, // L"K_Y", // &H59 0x2C, // L"K_Z", // &H5A 0x5B, // L"K_?5B", // &H5B 0x5C, // L"K_?5C", // &H5C 0x5D, // L"K_?5D", // &H5D 0x00, // L"K_?5E", // &H5E 0x5F, // L"K_?5F", // &H5F 0x52, // L"K_NP0", // &H60 0x4F, // L"K_NP1", // &H61 0x50, // L"K_NP2", // &H62 0x51, // L"K_NP3", // &H63 0x4B, // L"K_NP4", // &H64 0x4C, // L"K_NP5", // &H65 0x4D, // L"K_NP6", // &H66 0x47, // L"K_NP7", // &H67 0x48, // L"K_NP8", // &H68 0x49, // L"K_NP9", // &H69 0x37, // L"K_NPSTAR", // &H6A 0x4E, // L"K_NPPLUS", // &H6B 0x7E, // L"K_SEPARATOR", // &H6C // MCD 01-11-02: Brazilian Fix, 00 -> 7E 0x4A, // L"K_NPMINUS", // &H6D 0x53, // L"K_NPDOT", // &H6E 0x135, // L"K_NPSLASH", // &H6F 0x3B, // L"K_F1", // &H70 0x3C, // L"K_F2", // &H71 0x3D, // L"K_F3", // &H72 0x3E, // L"K_F4", // &H73 0x3F, // L"K_F5", // &H74 0x40, // L"K_F6", // &H75 0x41, // L"K_F7", // &H76 0x42, // L"K_F8", // &H77 0x43, // L"K_F9", // &H78 0x44, // L"K_F10", // &H79 0x57, // L"K_F11", // &H7A 0x58, // L"K_F12", // &H7B 0x64, // L"K_F13", // &H7C 0x65, // L"K_F14", // &H7D 0x66, // L"K_F15", // &H7E 0x67, // L"K_F16", // &H7F 0x68, // L"K_F17", // &H80 0x69, // L"K_F18", // &H81 0x6A, // L"K_F19", // &H82 0x6B, // L"K_F20", // &H83 0x6C, // L"K_F21", // &H84 0x6D, // L"K_F22", // &H85 0x6E, // L"K_F23", // &H86 0x76, // L"K_F24", // &H87 0x00, // L"K_?88", // &H88 0x00, // L"K_?89", // &H89 0x00, // L"K_?8A", // &H8A 0x00, // L"K_?8B", // &H8B 0x00, // L"K_?8C", // &H8C 0x00, // L"K_?8D", // &H8D 0x00, // L"K_?8E", // &H8E 0x00, // L"K_?8F", // &H8F 0x45, // L"K_NUMLOCK", // &H90 0x46, // L"K_SCROL0x00, // L", // &H91 0x00, // L"K_?92", // &H92 0x00, // L"K_?93", // &H93 0x00, // L"K_?94", // &H94 0x00, // L"K_?95", // &H95 0x00, // L"K_?96", // &H96 0x00, // L"K_?97", // &H97 0x00, // L"K_?98", // &H98 0x00, // L"K_?99", // &H99 0x00, // L"K_?9A", // &H9A 0x00, // L"K_?9B", // &H9B 0x00, // L"K_?9C", // &H9C 0x00, // L"K_?9D", // &H9D 0x00, // L"K_?9E", // &H9E 0x00, // L"K_?9F", // &H9F 0x2A, // L"K_?A0", // &HA0 0x36, // L"K_?A1", // &HA1 0x1D, // L"K_?A2", // &HA2 0x1D, // L"K_?A3", // &HA3 0x38, // L"K_?A4", // &HA4 0x38, // L"K_?A5", // &HA5 0x6A, // L"K_?A6", // &HA6 0x69, // L"K_?A7", // &HA7 0x67, // L"K_?A8", // &HA8 0x68, // L"K_?A9", // &HA9 0x65, // L"K_?AA", // &HAA 0x66, // L"K_?AB", // &HAB 0x32, // L"K_?AC", // &HAC 0x20, // L"K_?AD", // &HAD 0x2E, // L"K_?AE", // &HAE 0x30, // L"K_?AF", // &HAF 0x19, // L"K_?B0", // &HB0 0x10, // L"K_?B1", // &HB1 0x24, // L"K_?B2", // &HB2 0x22, // L"K_?B3", // &HB3 0x6C, // L"K_?B4", // &HB4 0x6D, // L"K_?B5", // &HB5 0x6B, // L"K_?B6", // &HB6 0x21, // L"K_?B7", // &HB7 0x00, // L"K_?B8", // &HB8 0x00, // L"K_?B9", // &HB9 0x27, // L"K_COLON", // &HBA 0x0D, // L"K_EQUA0x00, // L", // &HBB 0x33, // L"K_COMMA", // &HBC 0x0C, // L"K_HYPHEN", // &HBD 0x34, // L"K_PERIOD", // &HBE 0x35, // L"K_SLASH", // &HBF 0x29, // L"K_BKQUOTE", // &HC0 0x73, // L"K_?C1", // &HC1 0x7E, // L"K_?C2", // &HC2 0x00, // L"K_?C3", // &HC3 0x00, // L"K_?C4", // &HC4 0x00, // L"K_?C5", // &HC5 0x00, // L"K_?C6", // &HC6 0x00, // L"K_?C7", // &HC7 0x00, // L"K_?C8", // &HC8 0x00, // L"K_?C9", // &HC9 0x00, // L"K_?CA", // &HCA 0x00, // L"K_?CB", // &HCB 0x00, // L"K_?CC", // &HCC 0x00, // L"K_?CD", // &HCD 0x00, // L"K_?CE", // &HCE 0x00, // L"K_?CF", // &HCF 0x00, // L"K_?D0", // &HD0 0x00, // L"K_?D1", // &HD1 0x00, // L"K_?D2", // &HD2 0x00, // L"K_?D3", // &HD3 0x00, // L"K_?D4", // &HD4 0x00, // L"K_?D5", // &HD5 0x00, // L"K_?D6", // &HD6 0x00, // L"K_?D7", // &HD7 0x00, // L"K_?D8", // &HD8 0x00, // L"K_?D9", // &HD9 0x00, // L"K_?DA", // &HDA 0x1A, // L"K_LBRKT", // &HDB 0x2B, // L"K_BKSLASH", // &HDC 0x1B, // L"K_RBRKT", // &HDD 0x28, // L"K_QUOTE", // &HDE 0x73, // L"K_oDF", // &HDF // MCD 01-11-02: Brazilian fix: 00 -> 73 0x00, // L"K_oE0", // &HE0 0x00, // L"K_oE1", // &HE1 0x56, // L"K_oE2", // &HE2 0x00, // L"K_oE3", // &HE3 0x00, // L"K_oE4", // &HE4 0x00, // L"K_?E5", // &HE5 0x00, // L"K_oE6", // &HE6 0x00, // L"K_?E7", // &HE7 0x00, // L"K_?E8", // &HE8 0x71, // L"K_oE9", // &HE9 0x5C, // L"K_oEA", // &HEA 0x7B, // L"K_oEB", // &HEB 0x00, // L"K_oEC", // &HEC 0x6F, // L"K_oED", // &HED 0x5A, // L"K_oEE", // &HEE 0x00, // L"K_oEF", // &HEF 0x00, // L"K_oF0", // &HF0 0x5B, // L"K_oF1", // &HF1 0x00, // L"K_oF2", // &HF2 0x5F, // L"K_oF3", // &HF3 0x00, // L"K_oF4", // &HF4 0x5E, // L"K_oF5", // &HF5 0x00, // L"K_?F6", // &HF6 0x00, // L"K_?F7", // &HF7 0x00, // L"K_?F8", // &HF8 0x5D, // L"K_?F9", // &HF9 0x00, // L"K_?FA", // &HFA 0x62, // L"K_?FB", // &HFB 0x00, // L"K_?FC", // &HFC 0x00, // L"K_?FD", // &HFD 0x00, // L"K_?FE", // &HFE 0x00 // L"K_?FF" // &HFF }; const UINT ScanCodeToUSVirtualKey[128] = { 0x01, // 0x00 => K_LBUTTON 0x1b, // 0x01 => K_ESC 0x31, // 0x02 => K_1 0x32, // 0x03 => K_2 0x33, // 0x04 => K_3 0x34, // 0x05 => K_4 0x35, // 0x06 => K_5 0x36, // 0x07 => K_6 0x37, // 0x08 => K_7 0x38, // 0x09 => K_8 0x39, // 0x0a => K_9 0x30, // 0x0b => K_0 0xbd, // 0x0c => K_HYPHEN 0xbb, // 0x0d => K_EQUAL 0x08, // 0x0e => K_BKSP 0x09, // 0x0f => K_TAB 0x51, // 0x10 => K_Q 0x57, // 0x11 => K_W 0x45, // 0x12 => K_E 0x52, // 0x13 => K_R 0x54, // 0x14 => K_T 20 0x59, // 0x15 => K_Y 0x55, // 0x16 => K_U 0x49, // 0x17 => K_I 0x4f, // 0x18 => K_O 0x50, // 0x19 => K_P 0xdb, // 0x1a => K_LBRKT 0xdd, // 0x1b => K_RBRKT 0x0d, // 0x1c => K_ENTER 0x11, // 0x1d => K_CONTROL 0x41, // 0x1e => K_A 0x53, // 0x1f => K_S 0x44, // 0x20 => K_D 0x46, // 0x21 => K_F 0x47, // 0x22 => K_G 0x48, // 0x23 => K_H 0x4a, // 0x24 => K_J 0x4b, // 0x25 => K_K 0x4c, // 0x26 => K_L 0xba, // 0x27 => K_COLON 39 0xde, // 0x28 => K_QUOTE 0xc0, // 0x29 => K_BKQUOTE 0x10, // 0x2a => K_SHIFT 0xdc, // 0x2b => K_BKSLASH 0x5a, // 0x2c => K_Z 0x58, // 0x2d => K_X 0x43, // 0x2e => K_C 0x56, // 0x2f => K_V 0x42, // 0x30 => K_B 0x4e, // 0x31 => K_N 0x4d, // 0x32 => K_M 0xbc, // 0x33 => K_COMMA 0xbe, // 0x34 => K_PERIOD 0xbf, // 0x35 => K_SLASH 0xa1, // 0x36 => K_?A1 0x6a, // 0x37 => K_NPSTAR 0x12, // 0x38 => K_ALT 0x20, // 0x39 => K_SPACE 0x14, // 0x3a => K_CAPS 0x70, // 0x3b => K_F1 59 0x71, // 0x3c => K_F2 0x72, // 0x3d => K_F3 0x73, // 0x3e => K_F4 0x74, // 0x3f => K_F5 0x75, // 0x40 => K_F6 0x76, // 0x41 => K_F7 0x77, // 0x42 => K_F8 0x78, // 0x43 => K_F9 0x79, // 0x44 => K_F10 0x90, // 0x45 => K_NUMLOCK 0x03, // 0x46 => K_CANCEL 0x24, // 0x47 => K_HOME 0x26, // 0x48 => K_UP 0x21, // 0x49 => K_PGUP 0x6d, // 0x4a => K_NPMINUS 0x25, // 0x4b => K_LEFT 0x0c, // 0x4c => K_KP5 0x27, // 0x4d => K_RIGHT 0x6b, // 0x4e => K_NPPLUS 0x23, // 0x4f => K_END 0x28, // 0x50 => K_DOWN 0x22, // 0x51 => K_PGDN 0x2d, // 0x52 => K_INS 0x2e, // 0x53 => K_DEL 0x2c, // 0x54 => K_PRTSCN 0x00, // 0x55 => No match 0xe2, // 0x56 => K_oE2 0x7a, // 0x57 => K_F11 0x7b, // 0x58 => K_F12 0x00, // 0x59 => No match 0xee, // 0x5a => K_oEE 0x5b, // 0x5b => K_?5B 0x5c, // 0x5c => K_?5C 0x5d, // 0x5d => K_?5D 0xf5, // 0x5e => K_oF5 0x5f, // 0x5f => K_?5F 0x00, // 0x60 => No match 0x00, // 0x61 => No match 0xfb, // 0x62 => K_?FB 0x2f, // 0x63 => K_HELP 0x7c, // 0x64 => K_F13 0x7d, // 0x65 => K_F14 0x7e, // 0x66 => K_F15 0x7f, // 0x67 => K_F16 0x80, // 0x68 => K_F17 0x81, // 0x69 => K_F18 0x82, // 0x6a => K_F19 0x83, // 0x6b => K_F20 0x84, // 0x6c => K_F21 0x85, // 0x6d => K_F22 0x86, // 0x6e => K_F23 0xed, // 0x6f => K_oED 0x00, // 0x70 => No match 0xe9, // 0x71 => K_oE9 0x00, // 0x72 => No match 0xc1, // 0x73 => K_?C1 0x00, // 0x74 => No match 0x00, // 0x75 => No match 0x87, // 0x76 => K_F24 0x00, // 0x77 => No match 0x00, // 0x78 => No match 0x00, // 0x79 => No match 0x00, // 0x7a => No match 0xeb, // 0x7b => K_oEB 0x00, // 0x7c => No match 0x00, // 0x7d => No match 0x6c, // 0x7e => K_SEPARATOR 0x00 // 0x7f => No match }; bool IsKeymanUsedKeyVal(std::wstring Keyval); bool IsKeymanUsedKeyVal(std::u16string Keyval); // take deadkey-value (e.g.65106) and return wstring (e.g. '^' ) std::wstring convert_DeadkeyValues_ToChar(int in); // take deadkey-value (e.g.65106) and return u16string (e.g. '^' ) std::u16string convert_DeadkeyValues_To_U16str(int in); // find Keyvals to fill into 2D-Vector of Other Language KMX_DWORD KMX_get_KeyvalsUnderlying_From_KeyCodeUnderlying_GDK(GdkKeymap *keymap, guint keycode, int shift_state_pos); KMX_DWORD KMX_get_KeyvalsUnderlying_From_KeyCodeUnderlying_GDK(GdkKeymap *keymap, guint keycode, int shift_state_pos, PKMX_WCHAR &dky); // returns KeySyms for a given key (for unshifted: finds the Keysym according to Shiftstate e.g. a;A or 1;! ) std::wstring KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK(GdkKeymap *keymap, guint VK, ShiftState ss, int caps); // returns KeySyms for a given key (for unshifted: finds the Keysym according to Shiftstate e.g. a;A or 1;! ) std::u16string KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK_16(GdkKeymap *keymap, guint keycode, ShiftState ss, int caps); // returns KeySyms for a given key (for unshifted: finds the Keysym according to Shiftstate e.g. a;A or 1;! ) KMX_DWORD KMX_get_CharsUnderlying_according_to_keycode_and_Shiftstate_GDK_dw(GdkKeymap *keymap, guint keycode, ShiftState ss, int caps); // return the VirtualKey of the Other Keyboard for given Scancode using GDK KMX_DWORD KMX_get_VKUS_From_KeyCodeUnderlying_GDK( GdkKeymap *keymap, KMX_DWORD scanCode); // return the Keycode of the Other Keyboard for given VK_US KMX_DWORD KMX_get_KeyCodeUnderlying_From_VKUS( KMX_DWORD VK_US); // return the Keycode of the Other Keyboard for given VK_US using GDK KMX_DWORD KMX_get_KeyCodeUnderlying_From_KeycodeUS_GDK(GdkKeymap *keymap, v_dw_3D &All_Vector,KMX_DWORD KC_US, ShiftState ss, int caps); // converts codePoint to wstring std::wstring CodePointToWString(unsigned int codepoint); // converts codePoint to u16string std::u16string CodePointToString_16(unsigned int codepoint); # endif /*KEYMAP_H*/