spiegel-keyman/linux/mcompile/keymap/keymap.h

537 lines
No EOL
16 KiB
C++
Executable file

// In ths program we use a 3D-Vector Vector[language][Keys][Shiftstates]
#pragma once
#ifndef KEYMAP_H
#define KEYMAP_H
#include <X11/XKBlib.h>
#include <X11/Xlib.h>
#include <gdk/gdk.h>
#include <map>
#include <algorithm>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>
#include "mc_kmxfile.h"
#include "kmx_file.h"
#include "mc_savekeyboard.h"
#include "u16.h"
typedef std::vector<std::string> v_str_1D;
typedef std::vector<KMX_DWORD> v_dw_1D;
typedef std::vector<std::vector<KMX_DWORD> > v_dw_2D;
typedef std::vector<std::vector<std::vector<KMX_DWORD> > > 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. <AD06>) 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*/