2025-04-27 07:49:33 -04:00

755 lines
20 KiB
C++

//
// Copyright(c) 1997 - 1999. Microsoft Corporation.
//
#include "precomp.hxx"
#define NUM_OFFSET 0
#define ALPHA_OFFSET 10
#define BA_OFFSET 36
#define DB_OFFSET 43
typedef struct kbd KBD, *PKBD;
struct kbd {
unsigned short *pcharMap;
unsigned short *pshiftCharMap;
unsigned short *pctrlCharMap;
unsigned short *paltGrCharMap;
unsigned short *pshiftAltGrCharMap;
};
unsigned short nullMap[][4] = {
{0, 0, 0, 0},// 0
{0, 0, 0, 0},// 1
{0, 0, 0, 0},// 2
{0, 0, 0, 0},// 3
{0, 0, 0, 0},// 4
{0, 0, 0, 0},// 5
{0, 0, 0, 0},// 6
{0, 0, 0, 0},// 7
{0, 0, 0, 0},// 8
{0, 0, 0, 0},// 9 - 10 entries
{0, 0, 0, 0},// A
{0, 0, 0, 0},// B
{0, 0, 0, 0},// C
{0, 0, 0, 0},// D
{0, 0, 0, 0},// E
{0, 0, 0, 0},// F
{0, 0, 0, 0},// G
{0, 0, 0, 0},// H
{0, 0, 0, 0},// I
{0, 0, 0, 0},// J
{0, 0, 0, 0},// K
{0, 0, 0, 0},// L
{0, 0, 0, 0},// M
{0, 0, 0, 0},// N
{0, 0, 0, 0},// O
{0, 0, 0, 0},// P
{0, 0, 0, 0},// Q
{0, 0, 0, 0},// R
{0, 0, 0, 0},// S
{0, 0, 0, 0},// T
{0, 0, 0, 0},// U
{0, 0, 0, 0},// V
{0, 0, 0, 0},// W
{0, 0, 0, 0},// X
{0, 0, 0, 0},// Y
{0, 0, 0, 0},// Z - 36 entries (not used)
{0, 0, 0, 0},// ;(0xba)
{0, 0, 0, 0},// =(0xbb)
{0, 0, 0, 0},// ,(0xbc)
{0, 0, 0, 0},// -(0xbd)
{0, 0, 0, 0},// .(0xbe)
{0, 0, 0, 0},// /(0xbf)
{0, 0, 0, 0},// `(0xc0) - 43 entries
{0, 0, 0, 0},// [(0xdb)
{0, 0, 0, 0},// \(0xdc)
{0, 0, 0, 0},// ](0xdd)
{0, 0, 0, 0}// '(0xde) - 47 entries
};
unsigned short ctrlCharMap[][4] = {
{0, 0, 0, 0},// 0
{1, 0x200d, 0, 0},// 1 ZWJ
{1, 0x200c, 0, 0},// 2 ZWNJ
{0, 0, 0, 0},// 3
{0, 0, 0, 0},// 4
{0, 0, 0, 0},// 5
{0, 0, 0, 0},// 6
{0, 0, 0, 0},// 7
{0, 0, 0, 0},// 8
{0, 0, 0, 0},// 9 - 10 entries
{0, 0, 0, 0},// A
{0, 0, 0, 0},// B
{0, 0, 0, 0},// C
{0, 0, 0, 0},// D
{0, 0, 0, 0},// E
{0, 0, 0, 0},// F
{0, 0, 0, 0},// G
{0, 0, 0, 0},// H
{0, 0, 0, 0},// I
{0, 0, 0, 0},// J
{0, 0, 0, 0},// K
{0, 0, 0, 0},// L
{0, 0, 0, 0},// M
{0, 0, 0, 0},// N
{0, 0, 0, 0},// O
{0, 0, 0, 0},// P
{0, 0, 0, 0},// Q
{0, 0, 0, 0},// R
{0, 0, 0, 0},// S
{0, 0, 0, 0},// T
{0, 0, 0, 0},// U
{0, 0, 0, 0},// V
{0, 0, 0, 0},// W
{0, 0, 0, 0},// X
{0, 0, 0, 0},// Y
{0, 0, 0, 0},// Z - 36 entries (not used)
{0, 0, 0, 0},// ;(0xba)
{0, 0, 0, 0},// =(0xbb)
{0, 0, 0, 0},// ,(0xbc)
{0, 0, 0, 0},// -(0xbd)
{0, 0, 0, 0},// .(0xbe)
{0, 0, 0, 0},// /(0xbf)
{0, 0, 0, 0},// `(0xc0) - 43 entries
{0, 0, 0, 0},// [(0xdb)
{0, 0, 0, 0},// \(0xdc)
{0, 0, 0, 0},// ](0xdd)
{0, 0, 0, 0}// '(0xde) - 47 entries
};
unsigned short devCharMap[][4] = {
{1, 0x0030, 0, 0},// 0
{1, 0x0031, 0, 0},// 1
{1, 0x0032, 0, 0},// 2
{1, 0x0033, 0, 0},// 3
{1, 0x0034, 0, 0},// 4
{1, 0x0035, 0, 0},// 5
{1, 0x0036, 0, 0},// 6
{1, 0x0037, 0, 0},// 7
{1, 0x0038, 0, 0},// 8
{1, 0x0039, 0, 0},// 9 - 10 entries
{1, 0x094b, 0, 0},// A
{1, 0x0935, 0, 0},// B
{1, 0x092e, 0, 0},// C
{1, 0x094d, 0, 0},// D
{1, 0x093e, 0, 0},// E
{1, 0x093f, 0, 0},// F
{1, 0x0941, 0, 0},// G
{1, 0x092a, 0, 0},// H
{1, 0x0917, 0, 0},// I
{1, 0x0930, 0, 0},// J
{1, 0x0915, 0, 0},// K
{1, 0x0924, 0, 0},// L
{1, 0x0938, 0, 0},// M
{1, 0x0932, 0, 0},// N
{1, 0x0926, 0, 0},// O
{1, 0x091c, 0, 0},// P
{1, 0x094c, 0, 0},// Q
{1, 0x0940, 0, 0},// R
{1, 0x0947, 0, 0},// S
{1, 0x0942, 0, 0},// T
{1, 0x0939, 0, 0},// U
{1, 0x0928, 0, 0},// V
{1, 0x0948, 0, 0},// W
{1, 0x0902, 0, 0},// X
{1, 0x092c, 0, 0},// Y
{1, 0x0946, 0, 0},// Z - 36 entries
{1, 0x091a, 0, 0},// ;(0xba)
{1, 0x0943, 0, 0},// =(0xbb)
{0, 0, 0, 0},// ,(0xbc)
{1, 0X002D, 0, 0},// -(0xbd)
{1, 0X002E, 0, 0},// .(0xbe)
{1, 0x092f, 0, 0},// /(0xbf)
{1, 0x094a, 0, 0},// `(0xc0) - 43 entries
{1, 0x0921, 0, 0},// [(0xdb)
{1, 0x0949, 0, 0},// \(0xdc)
{1, 0x093c, 0, 0},// ](0xdd)
{1, 0x091f, 0, 0}// '(0xde) - 47 entries
};
unsigned short devShiftCharMap[][4] = {
{1, 0X0029, 0, 0},// 0
{1, 0x090d, 0, 0},// 1
{1, 0x0945, 0, 0},// 2
{2, 0x094d, 0x0930, 0},// 3
{2, 0x0930, 0x094d, 0},// 4
{3, 0x091c, 0x094d, 0x091e},// 5
{3, 0x0924, 0x094d, 0x0930},// 6
{3, 0x0915, 0x094d, 0x0937},// 7
{3, 0x0936, 0x094d, 0x0930},// 8
{1, 0X0028, 0, 0},// 9
{1, 0x0913, 0, 0},// A
{1, 0X0934, 0, 0},// B
{1, 0x0923, 0, 0},// C
{1, 0x0905, 0, 0},// D
{1, 0x0906, 0, 0},// E
{1, 0x0907, 0, 0},// F
{1, 0x0909, 0, 0},// G
{1, 0x092b, 0, 0},// H
{1, 0x0918, 0, 0},// I
{1, 0x0931, 0, 0},// J
{1, 0x0916, 0, 0},// K
{1, 0x0925, 0, 0},// L
{1, 0x0936, 0, 0},// M
{1, 0x0933, 0, 0},// N
{1, 0x0927, 0, 0},// O
{1, 0x091d, 0, 0},// P
{1, 0x0914, 0, 0},// Q
{1, 0x0908, 0, 0},// R
{1, 0x090f, 0, 0},// S
{1, 0x090a, 0, 0},// T
{1, 0x0919, 0, 0},// U
{1, 0X0929, 0, 0},// V
{1, 0x0910, 0, 0},// W
{1, 0x0901, 0, 0},// X
{1, 0x092d, 0, 0},// Y
{1, 0x90E, 0, 0},// Z - 36 entries (not used)
{1, 0x091b, 0, 0},// ;(0xba)
{1, 0x090b, 0, 0},// =(0xbb)
{1, 0x0937, 0, 0},// ,(0xbc)
{1, 0x0903, 0, 0},// -(0xbd)
{1, 0x0964, 0, 0},// .(0xbe)
{1, 0X095f, 0, 0},// /(0xbf)
{1, 0x0912, 0, 0},// `(0xc0) - 43 entries
{1, 0x0922, 0, 0},// [(0xdb)
{1, 0x0911, 0, 0},// \(0xdc)
{1, 0x091e, 0, 0},// ](0xdd)
{1, 0x0920, 0, 0}// '(0xde) - 47 entries
};
unsigned short devAltGrCharMap[][4] = {
{1, 0x0966, 0, 0},// 0
{1, 0x0967, 0, 0},// 1
{1, 0x0968, 0, 0},// 2
{1, 0x0969, 0, 0},// 3
{1, 0x096a, 0, 0},// 4
{1, 0x096b, 0, 0},// 5
{1, 0x096c, 0, 0},// 6
{1, 0x096d, 0, 0},// 7
{1, 0x096e, 0, 0},// 8
{1, 0x096f, 0, 0},// 9 - 10 entries
{0, 0, 0, 0},// A
{0, 0, 0, 0},// B
{1, 0X0954, 0, 0},// C
{0, 0, 0, 0},// D
{0, 0, 0, 0},// E
{1, 0x0962, 0, 0},// F
{0, 0, 0, 0},// G
{0, 0, 0, 0},// H
{1, 0x095a, 0, 0},// I
{0, 0, 0, 0},// J
{1, 0x0958, 0, 0},// K
{0, 0, 0, 0},// L
{0, 0, 0, 0},// M
{0, 0, 0, 0},// N
{0, 0, 0, 0},// O
{1, 0x095b, 0, 0},// P
{0, 0, 0, 0},// Q
{1, 0x0963, 0, 0},// R
{0, 0, 0, 0},// S
{0, 0, 0, 0},// T
{0, 0, 0, 0},// U
{0, 0, 0, 0},// V
{0, 0, 0, 0},// W
{0, 0, 0, 0},// X
{0, 0, 0, 0},// Y
{1, 0X0953, 0, 0},// Z - 36 entries (not used)
{1, 0x0952, 0, 0},// ;(0xba)
{1, 0x0944, 0, 0},// =(0xbb)
{1, 0x0970, 0, 0},// ,(0xbc)
{0, 0, 0, 0},// -(0xbd)
{1, 0X0965, 0, 0},// .(0xbe)
{0, 0, 0, 0},// /(0xbf)
{0, 0, 0, 0},// `(0xc0) - 43 entries
{1, 0x095c, 0, 0},// [(0xdb)
{0, 0, 0, 0},// \(0xdc)
{0, 0, 0, 0},// ](0xdd)
{0, 0, 0, 0}// '(0xde) - 47 entries
};
unsigned short devShiftAltGrCharMap[][4] = {
{0, 0, 0, 0},// 0
{0, 0, 0, 0},// 1
{0, 0, 0, 0},// 2
{0, 0, 0, 0},// 3
{0, 0, 0, 0},// 4
{0, 0, 0, 0},// 5
{0, 0, 0, 0},// 6
{0, 0, 0, 0},// 7
{0, 0, 0, 0},// 8
{0, 0, 0, 0},// 9
{0, 0, 0, 0},// A
{0, 0, 0, 0},// B
{0, 0, 0, 0},// C
{0, 0, 0, 0},// D
{0, 0, 0, 0},// E
{1, 0x090c, 0, 0},// F
{0, 0, 0, 0},// G
{1, 0x095e, 0, 0},// H
{0, 0, 0, 0},// I
{0, 0, 0, 0},// J
{1, 0x0959, 0, 0},// K
{0, 0, 0, 0},// L
{0, 0, 0, 0},// M
{0, 0, 0, 0},// N
{0, 0, 0, 0},// O
{0, 0, 0, 0},// P
{0, 0, 0, 0},// Q
{1, 0x0961, 0, 0},// R
{0, 0, 0, 0},// S
{0, 0, 0, 0},// T
{0, 0, 0, 0},// U
{0, 0, 0, 0},// V
{0, 0, 0, 0},// W
{1, 0x0950, 0, 0},// X
{0, 0, 0, 0},// Y
{0, 0, 0, 0},// Z - 36 entries (not used)
{0, 0, 0, 0},// ;(0xba)
{1, 0x0960, 0, 0},// =(0xbb)
{0, 0, 0, 0},// ,(0xbc)
{0, 0, 0, 0},// -(0xbd)
{1, 0x093d, 0, 0},// .(0xbe)
{0, 0, 0, 0},// /(0xbf)
{0, 0, 0, 0},// `(0xc0) - 43 entries
{1, 0x095d, 0, 0},// [(0xdb)
{0, 0, 0, 0},// \(0xdc)
{0, 0, 0, 0},// ](0xdd)
{1, 0x0951, 0, 0}// '(0xde) - 47 entries
};
unsigned short tamCharMap[][4] = {
{1, 0x0030, 0, 0},// 0
{1, 0x0031, 0, 0},// 1
{1, 0x0032, 0, 0},// 2
{1, 0x0033, 0, 0},// 3
{1, 0x0034, 0, 0},// 4
{1, 0x0035, 0, 0},// 5
{1, 0x0036, 0, 0},// 6
{1, 0x0037, 0, 0},// 7
{1, 0x0038, 0, 0},// 8
{1, 0x0039, 0, 0},// 9 - 10 entries
{1, 0x0bcb, 0, 0},// A
{1, 0x0bb5, 0, 0},// B
{1, 0x0bae, 0, 0},// C
{1, 0x0bcd, 0, 0},// D
{1, 0x0bbe, 0, 0},// E
{1, 0x0bbf, 0, 0},// F
{1, 0x0bc1, 0, 0},// G
{1, 0x0baa, 0, 0},// H
{1, 0x0b95, 0, 0},// I
{1, 0x0bb0, 0, 0},// J
{1, 0x0b95, 0, 0},// K
{1, 0x0ba4, 0, 0},// L
{1, 0x0bb8, 0, 0},// M
{1, 0x0bb2, 0, 0},// N
{1, 0x0ba4, 0, 0},// O
{1, 0x0b9c, 0, 0},// P
{1, 0x0bcc, 0, 0},// Q
{1, 0x0bc0, 0, 0},// R
{1, 0x0bc7, 0, 0},// S
{1, 0x0bc2, 0, 0},// T
{1, 0x0bb9, 0, 0},// U
{1, 0x0ba8, 0, 0},// V
{1, 0x0bc8, 0, 0},// W
{0, 0, 0, 0},// X
{1, 0x0baa, 0, 0},// Y
{1, 0x0bc6, 0, 0},// Z - 36 entries
{1, 0x0b9b, 0, 0},// ;(0xba)
{3, 0x0bcd, 0x0bb0, 0x0bbf},// =(0xbb)
{0, 0, 0, 0},// ,(0xbc)
{1, 0X0b83, 0, 0},// -(0xbd)
{1, 0X002E, 0, 0},// .(0xbe)
{1, 0x0baf, 0, 0},// /(0xbf)
{1, 0x0bca, 0, 0},// `(0xc0) - 43 entries
{1, 0x0b9f, 0, 0},// [(0xdb)
{1, 0x0b86, 0, 0},// \(0xdc)
{1, 0x0b9e, 0, 0},// ](0xdd)
{1, 0x0b9f, 0, 0}// '(0xde) - 47 entries
};
unsigned short tamShiftCharMap[][4] = {
{1, 0X0029, 0, 0},// 0
{0, 0, 0, 0},// 1
{1, 0xbbe, 0, 0},// 2
{0, 0, 0, 0},// 3
{0, 0, 0, 0},// 4
{0, 0, 0, 0},// 5
{3, 0x0ba4, 0x0bcd, 0x0bb0},// 6
{3, 0x0b95, 0x0bcd, 0x0bb7},// 7
{3, 0x0bb7, 0x0bcd, 0x0bb0},// 8
{1, 0X0028, 0, 0},// 9
{1, 0x0b93, 0, 0},// A
{1, 0X0bb4, 0, 0},// B
{1, 0x0ba3, 0, 0},// C
{1, 0x0b85, 0, 0},// D
{1, 0x0b86, 0, 0},// E
{1, 0x0b87, 0, 0},// F
{1, 0x0b89, 0, 0},// G
{1, 0x0baa, 0, 0},// H
{1, 0x0b95, 0, 0},// I
{1, 0x0bb1, 0, 0},// J
{1, 0x0b95, 0, 0},// K
{1, 0x0ba4, 0, 0},// L
{1, 0x0bb7, 0, 0},// M
{1, 0x0bb3, 0, 0},// N
{1, 0x0ba4, 0, 0},// O
{1, 0x0b9a, 0, 0},// P
{1, 0x0b94, 0, 0},// Q
{1, 0x0b88, 0, 0},// R
{1, 0x0b8f, 0, 0},// S
{1, 0x0b8a, 0, 0},// T
{1, 0x0b99, 0, 0},// U
{1, 0X0ba9, 0, 0},// V
{1, 0x0b90, 0, 0},// W
{0, 0, 0, 0},// X
{1, 0x092d, 0, 0},// Y
{1, 0xb8E, 0, 0},// Z - 36 entries (not used)
{1, 0x0b9a, 0, 0},// ;(0xba)
{0, 0, 0, 0},// =(0xbb)
{1, 0x0bb7, 0, 0},// ,(0xbc)
{0, 0, 0, 0},// -(0xbd)
{1, 0x002e, 0, 0},// .(0xbe)
{1, 0X0baf, 0, 0},// /(0xbf)
{1, 0x0b92, 0, 0},// `(0xc0) - 43 entries
{1, 0x0b9f, 0, 0},// [(0xdb)
{1, 0x0bbe, 0, 0},// \(0xdc)
{1, 0x093c, 0, 0},// ](0xdd)
{0, 0, 0, 0}// '(0xde) - 47 entries
};
unsigned short tamAltGrCharMap[][4] = {
{0, 0, 0, 0},// 0
{0, 0x0be7, 0, 0},// 1
{1, 0x0be8, 0, 0},// 2
{1, 0x0be9, 0, 0},// 3
{1, 0x0bea, 0, 0},// 4
{1, 0x0beb, 0, 0},// 5
{1, 0x0bec, 0, 0},// 6
{1, 0x0bed, 0, 0},// 7
{1, 0x0bee, 0, 0},// 8
{1, 0x0bef, 0, 0},// 9
{0, 0, 0, 0},// A
{0, 0, 0, 0},// B
{0, 0, 0, 0},// C
{0, 0, 0, 0},// D
{0, 0, 0, 0},// E
{0, 0, 0, 0},// F
{0, 0, 0, 0},// G
{0, 0, 0, 0},// H
{0, 0, 0, 0},// I
{0, 0, 0, 0},// J
{0, 0, 0, 0},// K
{0, 0, 0, 0},// L
{0, 0, 0, 0},// M
{0, 0, 0, 0},// N
{0, 0, 0, 0},// O
{0, 0, 0, 0},// P
{0, 0, 0, 0},// Q
{0, 0, 0, 0},// R
{0, 0, 0, 0},// S
{0, 0, 0, 0},// T
{0, 0, 0, 0},// U
{0, 0, 0, 0},// V
{0, 0, 0, 0},// W
{0, 0, 0, 0},// X
{0, 0, 0, 0},// Y
{0, 0, 0, 0},// Z - 36 entries (not used)
{0, 0, 0, 0},// ;(0xba)
{0, 0, 0, 0},// =(0xbb)
{0, 0, 0, 0},// ,(0xbc)
{0, 0, 0, 0},// -(0xbd)
{0, 0, 0, 0},// .(0xbe)
{0, 0, 0, 0},// /(0xbf)
{0, 0, 0, 0},// `(0xc0) - 43 entries
{0, 0, 0, 0},// [(0xdb)
{0, 0, 0, 0},// \(0xdc)
{0, 0, 0, 0},// ](0xdd)
{0, 0, 0, 0}// '(0xde) - 47 entries
};
unsigned short telCharMap[][4] = {
{1, 0x0030, 0, 0},// 0
{1, 0x0031, 0, 0},// 1
{1, 0x0032, 0, 0},// 2
{1, 0x0033, 0, 0},// 3
{1, 0x0034, 0, 0},// 4
{1, 0x0035, 0, 0},// 5
{1, 0x0036, 0, 0},// 6
{1, 0x0037, 0, 0},// 7
{1, 0x0038, 0, 0},// 8
{1, 0x0039, 0, 0},// 9 - 10 entries
{1, 0x0c4b, 0, 0},// A
{1, 0x0c35, 0, 0},// B
{1, 0x0c2e, 0, 0},// C
{1, 0x0c4d, 0, 0},// D
{1, 0x0c3e, 0, 0},// E
{1, 0x0c3f, 0, 0},// F
{1, 0x0c41, 0, 0},// G
{1, 0x0c2a, 0, 0},// H
{1, 0x0c17, 0, 0},// I
{1, 0x0c30, 0, 0},// J
{1, 0x0c15, 0, 0},// K
{1, 0x0c24, 0, 0},// L
{1, 0x0c38, 0, 0},// M
{1, 0x0c32, 0, 0},// N
{1, 0x0c26, 0, 0},// O
{1, 0x0c1c, 0, 0},// P
{1, 0x0c4c, 0, 0},// Q
{1, 0x0c40, 0, 0},// R
{1, 0x0c47, 0, 0},// S
{1, 0x0c42, 0, 0},// T
{1, 0x0c39, 0, 0},// U
{1, 0x0c28, 0, 0},// V
{1, 0x0c48, 0, 0},// W
{1, 0x0c02, 0, 0},// X
{1, 0x0c2c, 0, 0},// Y
{1, 0x0c46, 0, 0},// Z - 36 entries
{1, 0x0c1a, 0, 0},// ;(0xba)
{1, 0x0C43, 0, 0},// =(0xbb)
{0, 0, 0, 0},// ,(0xbc)
{1, 0X002D, 0, 0},// -(0xbd)
{1, 0X002E, 0, 0},// .(0xbe)
{0, 0, 0, 0},// /(0xbf)
{1, 0x0c4a, 0, 0},// `(0xc0) - 43 entries
{1, 0x0c21, 0, 0},// [(0xdb)
{1, 0x0c49, 0, 0},// \(0xdc)
{0, 0, 0, 0},// ](0xdd)
{1, 0X0c1f, 0, 0}// '(0xde) - 47 entries
};
unsigned short telShiftCharMap[][4] = {
{1, 0X0029, 0, 0},// 0
{0, 0x0, 0, 0},// 1
{0, 0x0, 0, 0},// 2
{2, 0x0c4d, 0x0c30, 0},// 3
{0, 0, 0, 0},// 4
{3, 0x0c1c, 0x0c4d, 0x0c1e},// 5
{3, 0x0c24, 0x0c4d, 0x0c30},// 6
{3, 0x0c15, 0x0c4d, 0x0c37},// 7
{3, 0x0c36, 0x0c4d, 0x0c30},// 8
{1, 0X0028, 0, 0},// 9
{1, 0x0c13, 0, 0},// A
{0, 0, 0, 0},// B
{1, 0x0c23, 0, 0},// C
{1, 0x0c05, 0, 0},// D
{1, 0x0c06, 0, 0},// E
{1, 0x0c07, 0, 0},// F
{1, 0x0c09, 0, 0},// G
{1, 0x0c2b, 0, 0},// H
{1, 0x0c18, 0, 0},// I
{1, 0x0c31, 0, 0},// J
{1, 0x0c16, 0, 0},// K
{1, 0x0c25, 0, 0},// L
{1, 0x0c36, 0, 0},// M
{1, 0x0c33, 0, 0},// N
{1, 0x0c27, 0, 0},// O
{1, 0x0c1d, 0, 0},// P
{1, 0x0c14, 0, 0},// Q
{1, 0x0c08, 0, 0},// R
{1, 0x0c0f, 0, 0},// S
{1, 0x0c0a, 0, 0},// T
{1, 0x0c19, 0, 0},// U
{1, 0x0c28, 0, 0},// V
{1, 0x0c10, 0, 0},// W
{1, 0x0c01, 0, 0},// X
{0, 0, 0, 0},// Y
{1, 0x0c0E, 0, 0},// Z - 36 entries (not used)
{1, 0x0c1b, 0, 0},// ;(0xba)
{1, 0x0c0b, 0, 0},// =(0xbb)
{1, 0x0c37, 0, 0},// ,(0xbc)
{1, 0x029, 0, 0},// -(0xbd)
{0, 0, 0, 0},// .(0xbe)
{1, 0x0c2f, 0, 0},// /(0xbf)
{1, 0x0c12, 0, 0},// `(0xc0) - 43 entries
{1, 0x0c22, 0, 0},// [(0xdb)
{1, 0x0c2f, 0, 0},// \(0xdc)
{1, 0x0c1e, 0, 0},// ](0xdd)
{1, 0x0c20, 0, 0}// '(0xde) - 47 entries
};
unsigned short telAltGrCharMap[][4] = {
{1, 0x0c66, 0, 0},// 0
{1, 0x0c67, 0, 0},// 1
{1, 0x0c68, 0, 0},// 2
{1, 0x0c69, 0, 0},// 3
{1, 0x0c6a, 0, 0},// 4
{1, 0x0c6b, 0, 0},// 5
{1, 0x0c6c, 0, 0},// 6
{1, 0x0c6d, 0, 0},// 7
{1, 0x0c6e, 0, 0},// 8
{1, 0x0c6f, 0, 0},// 9 - 10 entries
{0, 0, 0, 0},// A
{0, 0, 0, 0},// B
{0, 0x0, 0, 0},// C
{0, 0, 0, 0},// D
{0, 0, 0, 0},// E
{1, 0x0c0c, 0, 0},// F
{0, 0, 0, 0},// G
{0, 0, 0, 0},// H
{0, 0, 0, 0},// I
{0, 0, 0, 0},// J
{0, 0, 0, 0},// K
{0, 0, 0, 0},// L
{0, 0, 0, 0},// M
{0, 0, 0, 0},// N
{0, 0, 0, 0},// O
{0, 0, 0, 0},// P
{0, 0, 0, 0},// Q
{1, 0x0c61, 0, 0},// R
{0, 0, 0, 0},// S
{0, 0, 0, 0},// T
{0, 0, 0, 0},// U
{0, 0, 0, 0},// V
{1, 0x0c56, 0, 0},// W
{0, 0, 0, 0},// X
{0, 0, 0, 0},// Y
{0, 0, 0, 0},// Z - 36 entries (not used)
{0, 0, 0, 0},// ;(0xba)
{1, 0x0c44, 0, 0},// =(0xbb)
{0, 0, 0, 0},// ,(0xbc)
{0, 0, 0, 0},// -(0xbd)
{0, 0, 0, 0},// .(0xbe)
{0, 0, 0, 0},// /(0xbf)
{0, 0, 0, 0},// `(0xc0) - 43 entries
{0, 0, 0, 0},// [(0xdb)
{0, 0, 0, 0},// \(0xdc)
{0, 0, 0, 0},// ](0xdd)
{0, 0, 0, 0}// '(0xde) - 47 entries
};
KBD devKbd = {
(unsigned short *)devCharMap,
(unsigned short *)devShiftCharMap,
(unsigned short *)ctrlCharMap,
(unsigned short *)devAltGrCharMap,
(unsigned short *)devShiftAltGrCharMap
};
KBD tamKbd = {
(unsigned short *)tamCharMap,
(unsigned short *)tamShiftCharMap,
(unsigned short *)ctrlCharMap,
(unsigned short *)tamAltGrCharMap,
(unsigned short *)nullMap
};
KBD telKbd = {
(unsigned short *)telCharMap,
(unsigned short *)telShiftCharMap,
(unsigned short *)ctrlCharMap,
(unsigned short *)telAltGrCharMap,
(unsigned short *)nullMap
};
PKBD pKbd = &devKbd;
BOOL IndicTranslate(CONST MSG *lpMsg){
unsigned short shiftKey;
unsigned short capsKey;
unsigned short altGr;
unsigned short ctrl;
unsigned short *ptrMap;
unsigned short keyCode;
int offset;
int msgCount;
int i;
// Translate only WM_KEYDOWN messages
switch(lpMsg->message){
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
break;
default:
return FALSE;
}
//Check shift key state
capsKey = (unsigned short)(0x1 & GetKeyState(VK_CAPITAL));
if (!capsKey){
return FALSE;
}
//Check altGr key state
altGr = (unsigned short)(0x8000 & GetKeyState(VK_RMENU));
if (lpMsg->message == WM_SYSKEYDOWN && !altGr){
return FALSE;
}
//Retrieve key code
keyCode = (unsigned short)lpMsg->wParam;
//Check ctrl key state
ctrl = (unsigned short)(0x8000 & GetKeyState(VK_CONTROL));
//Check shift key state
shiftKey = (unsigned short)(0x8000 & GetKeyState(VK_SHIFT));
if(ctrl && shiftKey)
{
switch(keyCode){
case '1':
pKbd = &devKbd;
break;
case '2':
pKbd = &tamKbd;
break;
case '3':
pKbd = &telKbd;
break;
}
return TRUE;
}
//Choose appropriate mapping table
if(shiftKey){
if (altGr){
ptrMap = pKbd->pshiftAltGrCharMap;
}
else {
ptrMap = pKbd->pshiftCharMap;
}
}
else if (altGr){
ptrMap = pKbd->paltGrCharMap;
}
else if (ctrl){
ptrMap = pKbd->pctrlCharMap;
}
else{
ptrMap = pKbd->pcharMap;
}
//Index into selected mapping table and generate WM_CHAR Messages
if(0xdb <= keyCode && 0xde >= keyCode){
offset = DB_OFFSET + keyCode - 0xdb;
}
else if (0xba <= keyCode && 0xc0 >= keyCode){
offset = BA_OFFSET + keyCode - 0xba;
}
else if (0x41 <= keyCode && 0x5a >= keyCode){
offset = ALPHA_OFFSET + keyCode - 0x41;
}
else if (0x30 <= keyCode && 0x39 >= keyCode){
offset = NUM_OFFSET + keyCode - 0x30;
}
else{
return FALSE;
}
offset *= 4;//pre-calculate one dimensional index
msgCount = ptrMap[offset];
//if this key cannot be translated
if(msgCount == 0){
MessageBeep(0xFFFFFFFF);
return TRUE;
}
//translate key
for (i=1; i<= msgCount; i++)
PostMessage(lpMsg->hwnd, WM_CHAR, ptrMap[offset+i], lpMsg->lParam);
return TRUE;
}