summaryrefslogtreecommitdiff
path: root/rhtvision/include/tv/gkey.h
blob: 57d21ceacd6d021dbdeec9168bf1a5b08bfdc6f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/* Keyboard handler routines header.
   Copyright by Salvador E. Tropea (SET) (1998,1999,2001)
   Covered by the GPL license. */
#ifndef GKEY_HEADER_INCLUDED
#define GKEY_HEADER_INCLUDED
// A type for the BIOS ASCII/Scan
typedef union
{
 unsigned short full;
 struct
 {
   #ifdef TV_BIG_ENDIAN
   unsigned char scan;
   unsigned char ascii;
   #else
   unsigned char ascii;
   unsigned char scan;
   #endif
 } b;
} KeyType;

// Shift constants
const ushort
      kbShiftCode=0x080,
      kbCtrlCode =0x100,
      kbAltRCode =0x400,
      kbAltLCode =0x200,
      kbKeyMask  =0x07F;

#ifdef Uses_FullSingleKeySymbols
// Key constants, basically they are from the US keyboard, but all of them
// are standard ASCII and not extended.
const ushort
kbUnkNown=0,
kbA= 1,kbB= 2,kbC= 3,kbD= 4,kbE= 5,kbF= 6,kbG= 7,kbH= 8,kbI= 9,kbJ=10,kbK=11,
kbL=12,kbM=13,kbN=14,kbO=15,kbP=16,kbQ=17,kbR=18,kbS=19,kbT=20,kbU=21,kbV=22,
kbW=23,kbX=24,kbY=25,kbZ=26,
kbOpenBrace=27,kbBackSlash=28,kbCloseBrace=29,kbPause=30,kbEsc=31,
kb0=32,kb1=33,kb2=34,kb3=35,kb4=36,kb5=37,kb6=38,kb7=39,kb8=40,kb9=41,
kbBackSpace=42,kbTab=43,kbEnter=44,kbColon=45,kbQuote=46,kbGrave=47,
kbComma=48,kbStop=49,kbSlash=50,kbAsterisk=51,kbSpace=52,kbMinus=53,
kbPlus=54,kbPrnScr=55,kbEqual=56,kbF1=57,kbF2=58,kbF3=59,kbF4=60,kbF5=61,
kbF6=62,kbF7=63,kbF8=64,kbF9=65,kbF10=66,kbF11=67,kbF12=68,kbHome=69,
kbUp=70,kbPgUp=71,kbLeft=72,kbRight=73,kbEnd=74,kbDown=75,kbPgDn=76,
kbInsert=77,kbDelete=78,kbCaret=79,kbAdmid=80,kbDobleQuote=81,
kbNumeral=82,kbDolar=83,kbPercent=84,kbAmper=85,kbOpenPar=86,
kbClosePar=87,kbDoubleDot=88,kbLessThan=89,kbGreaterThan=90,
kbQuestion=91,kbA_Roba=92,kbOr=93,kbUnderLine=94,kbOpenCurly=95,
kbCloseCurly=96,kbTilde=97,kbMacro=98,kbWinLeft=99,kbWinRight=100,
kbWinSel=101,
kbMouse=102,kbEterm=103
;
#endif

/* IBM BIOS flags, not all implemented in most platforms */
/*
bit 15: SysReq key pressed;
bit 14: Caps lock key currently down;
bit 13: Num lock key currently down;
bit 12: Scroll lock key currently down;
bit 11: Right alt key is down;
bit 10: Right ctrl key is down;
bit 9: Left alt key is down;
bit 8: Left ctrl key is down;
bit 7: Insert toggle;
bit 6: Caps lock toggle;
bit 5: Num lock toggle;
bit 4: Scroll lock toggle;
bit 3: Either alt key is down (some machines, left only);
bit 2: Either ctrl key is down;
bit 1: Left shift key is down;
bit 0: Right shift key is down
*/
const unsigned
 kbSysReqPress     =0x8000,
 kbCapsLockDown    =0x4000,
 kbNumLockDown     =0x2000,
 kbScrollLockDown  =0x1000,
 kbRightAltDown    =0x0800,
 kbRightCtrlDown   =0x0400,
 kbLeftAltDown     =0x0200,
 kbLeftCtrlDown    =0x0100,
 kbInsertToggle    =0x0080,
 kbCapsLockToggle  =0x0040,
 kbNumLockToggle   =0x0020,
 kbScrollLockToggle=0x0010,
 kbAltDown         =0x0008,
 kbCtrlDown        =0x0004,
 kbLeftShiftDown   =0x0002,
 kbRightShiftDown  =0x0001;


struct TEvent;

// A class to encapsulate the globals, all is static!
class CLY_EXPORT TGKey
{
public:
 TGKey() { resume(); };

 static void       suspend();
 static void       resume();
 static void     (*Suspend)();
 static void     (*Resume)();

 static int      (*kbhit)();
 static void     (*clear)();
 static ushort   (*gkey)();
 // This is optional. Some platforms doesn't support it and the returned value
 // can be outdated.
 static unsigned (*getShiftState)();
 static void     (*fillTEvent)(TEvent &e);

 // Very used by: menues and hotkeys (buttons, status bar, etc).
 // Get the ascii associated to Alt+key, example Alt+A => A
 static char     GetAltChar(unsigned short keyCode, uchar ascii);
 // The reverse (know the alt code when we know the ASCII)
 static ushort   GetAltCode(uchar ch);
 // Find the code for the name of a key
 static ushort   KeyNameToNumber(char *s);
 static const
           char *NumberToKeyName(unsigned val);

 // Alt keys interpretation
 static ushort   GetAltSettings(void) { return AltSet; }
 static void     SetAltSettings(ushort altSet) { AltSet=altSet; }

 // Special functions when we must deal with international stuff like a
 // shortcut in greek or cyrilic.
 // When a key character is over 128 and we want to know the ascii of
 // the key that generates it.
 static uchar  (*NonASCII2ASCII)(uchar val);
 // Compares two values according to the associated ASCII.
 static int    (*CompareASCII)(uchar val, uchar code);
 // Finds the Alt that generated it.
 static int    (*AltInternat2ASCII)(TEvent &event);

 // Routine to setup the input code page
 static int    (*SetCodePage)(int id);

 enum keyMode
 {
  // Linux styles
  linuxDisableKeyPatch=1,
  linuxEnableKeyPatch=2,
  // DOS
  // Should be incorporated to the remapping but I need volunteers
  //dosUS=0,
  //dosGreek737=20, No longer used
  dosUseBIOS=21,
  dosUseDirect=22,
  dosTranslateKeypad=23,
  dosNormalKeypad=24,
  // UNIX styles
  unixXterm=40,
  unixNoXterm=41,
  unixEterm=42
 };
 static void   (*SetKbdMapping)(int version);
 static int    (*GetKbdMapping)(int version);

protected:
 static uchar    defaultNonASCII2ASCII(uchar val);
 static int      defaultCompareASCII(uchar val, uchar code);
 static void     defaultSetKbdMapping(int version);
 static int      defaultGetKbdMapping(int version);
 static int      defaultKbhit(void);
 static void     defaultClear(void);
 static ushort   defaultGkey(void);
 static unsigned defaultGetShiftState();
 static void     defaultFillTEvent(TEvent &e);
 static void     defaultSuspend();
 static void     defaultResume();
 static int      defaultSetCodePage(int id);
 static int      defaultAltInternat2ASCII(TEvent &event);

 // Greek table
 static stIntCodePairs GreekKeyboard[];
 // Russian table
 static stIntCodePairs RussianKeyboard[];
 // Generic tables
 static uchar KeyMap[128];
 static const uchar
              kbByASCII[128];
 static void  FillKeyMapForCP(int id, stIntCodePairs *keyboard, size_t szKb);
 static uchar Generic_NonASCII2ASCII(uchar ascii);
 static int   Generic_CompareASCII(uchar val, uchar code);
 static int   Generic_AltInternat2ASCII(TEvent &e);

 // Needed for configuration.
 static const char *KeyNames[];
 // 0 => Left alt is used
 // 1 => Right alt is used
 // 2 => Both alts are the same
 static ushort   AltSet;
 static char     suspended;

 //static KeyType rawCode;
 // SetKbdMapping:
 static int      Mode;
};

extern unsigned short getshiftstate();
extern unsigned short __tv_getshiftstate();
extern unsigned short __tv_GetRaw();
extern int __tv_kbhit();
extern void __tv_clear();
#endif // GKEY_HEADER_INCLUDED