summaryrefslogtreecommitdiff
path: root/hammer/keyboard.h
blob: 88b1ec858dc1bc3e9f91fbf29f90add232fe90cb (plain) (blame)
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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#ifndef KEYBOARD_H
#define KEYBOARD_H
#ifdef _WIN32
#pragma once
#endif


#define KEY_MOD_SHIFT				0x0001
#define KEY_MOD_CONTROL				0x0002
#define KEY_MOD_ALT					0x0004


//
// Defines the maximum number of physical keys. These physical keys correspond to
// the windows virtual key codes shown below. Missing key codes may be up for grabs,
// but it is probably safer to add to the end of the list.
//
#define MAX_PHYSICAL_KEYS			256

//
// VK_LBUTTON        0x01
// VK_RBUTTON        0x02
// VK_CANCEL         0x03
// VK_MBUTTON        0x04
// ?				 0x04
// ?				 0x05
// ?				 0x06
// ?				 0x07
// VK_BACK           0x08
// VK_TAB            0x09
// ?				 0x0A
// ?				 0x0B
// VK_CLEAR          0x0C
// VK_RETURN         0x0D
// ?				 0x0E
// ?				 0x0F
// VK_SHIFT          0x10
// VK_CONTROL        0x11
// VK_MENU           0x12
// VK_PAUSE          0x13
// VK_CAPITAL        0x14
// VK_KANA           0x15
// VK_HANGUL         0x15
// VK_JUNJA          0x17
// VK_FINAL          0x18
// VK_KANJI          0x19
// ?				 0x1A
// VK_ESCAPE         0x1B
// VK_CONVERT        0x1C
// VK_NONCONVERT     0x1D
// VK_ACCEPT         0x1E
// VK_MODECHANGE     0x1F
// VK_SPACE          0x20
// VK_PRIOR          0x21
// VK_NEXT           0x22
// VK_END            0x23
// VK_HOME           0x24
// VK_LEFT           0x25
// VK_UP             0x26
// VK_RIGHT          0x27
// VK_DOWN           0x28
// VK_SELECT         0x29
// VK_PRINT          0x2A
// VK_EXECUTE        0x2B
// VK_SNAPSHOT       0x2C
// VK_INSERT         0x2D
// VK_DELETE         0x2E
// VK_HELP           0x2F
//
// VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
//
// VK_0			0x30
// VK_1			0x31
// VK_2			0x32
// VK_3			0x33
// VK_4			0x34
// VK_5			0x35
// VK_6			0x36
// VK_7			0x37
// VK_8			0x38
// VK_9			0x39
// ?			0x40
//
// VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
//
// VK_A			0X41
// VK_B			0X42
// VK_C			0X43
// VK_D			0X44
// VK_E			0X45
// VK_F			0X46
// VK_G			0X47
// VK_H			0X48
// VK_I			0X49
// VK_J			0X4A
// VK_K			0X4B
// VK_L			0X4C
// VK_M			0X4D
// VK_N			0X4E
// VK_O			0X4F
// VK_P			0X50
// VK_Q			0X51
// VK_R			0X52
// VK_S			0X53
// VK_T			0X54
// VK_U			0X55
// VK_V			0X56
// VK_W			0X57
// VK_X			0X58
// VK_Y			0X59
// VK_Z			0X5A
// VK_LWIN      0x5B
// VK_RWIN      0x5C
// VK_APPS      0x5D
// ?			0x5E
// ?			0x5F
// VK_NUMPAD0   0x60
// VK_NUMPAD1   0x61
// VK_NUMPAD2   0x62
// VK_NUMPAD3   0x63
// VK_NUMPAD4   0x64
// VK_NUMPAD5   0x65
// VK_NUMPAD6   0x66
// VK_NUMPAD7   0x67
// VK_NUMPAD8   0x68
// VK_NUMPAD9   0x69
// VK_MULTIPLY  0x6A
// VK_ADD       0x6B
// VK_SEPARATOR 0x6C
// VK_SUBTRACT  0x6D
// VK_DECIMAL   0x6E
// VK_DIVIDE    0x6F
//
// Function keys
//
// VK_F1        0x70
// VK_F2        0x71
// VK_F3        0x72
// VK_F4        0x73
// VK_F5        0x74
// VK_F6        0x75
// VK_F7        0x76
// VK_F8        0x77
// VK_F9        0x78
// VK_F10       0x79
// VK_F11       0x7A
// VK_F12       0x7B
// VK_F13       0x7C
// VK_F14       0x7D
// VK_F15       0x7E
// VK_F16       0x7F
// VK_F17       0x80
// VK_F18       0x81
// VK_F19       0x82
// VK_F20       0x83
// VK_F21       0x84
// VK_F22       0x85
// VK_F23       0x86
// VK_F24       0x87
// ?			0x88
// ?			0x89
// ?			0x8A
// ?			0x8B
// ?			0x8C
// ?			0x8D
// ?			0x8E
// ?			0x8F
// VK_NUMLOCK   0x90
// VK_SCROLL    0x91
// ?			0x92
// ?			0x93
// ?			0x94
// ?			0x95
// ?			0x96
// ?			0x97
// ?			0x98
// ?			0x99
// ?			0x9A
// ?			0x9B
// ?			0x9C
// ?			0x9D
// ?			0x9E
// ?			0x9F
//
// VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
// Used only as parameters to GetAsyncKeyState() and GetKeyState().
// No other API or message will distinguish left and right keys in this way.
//
// VK_LSHIFT    0xA0
// VK_RSHIFT    0xA1
// VK_LCONTROL  0xA2
// VK_RCONTROL  0xA3
// VK_LMENU     0xA4
// VK_RMENU     0xA5
// VK_PROCESSKEY 0xE5
// VK_ATTN      0xF6
// VK_CRSEL     0xF7
// VK_EXSEL     0xF8
// VK_EREOF     0xF9
// VK_PLAY      0xFA
// VK_ZOOM      0xFB
// VK_NONAME    0xFC
// VK_PA1       0xFD
// VK_OEM_CLEAR 0xFE
//


//
// Defines the maximum number of logical keys. Logical keys are application-specific
// values that are associated with physical keys via AddKeyMap.
//
#define MAX_LOGICAL_KEYS			256


//
// Defines the maximum number of unique key bindings.
//
#define MAX_KEYMAPS					256


typedef struct
{
	unsigned int uChar;
	unsigned int uModifierKeys;
	unsigned int uLogicalKey;
} KeyMap_t;


class CKeyboard
{
	public:
			
		CKeyboard(void);
		~CKeyboard(void);

		void AddKeyMap(unsigned int uChar, unsigned int uModifierKeys, unsigned int uLogicalKey);
		void ClearImpulseFlags(void);
		void ClearKeyStates(void);
		float GetKeyScale(unsigned int uLogicalKey);

		void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
		void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);

		void RemoveAllKeyMaps(void);

	protected:

		bool IsKeyPressed(unsigned int uChar, unsigned int uModifierKeys);
		bool IsModifierKey(unsigned int uChar);

		unsigned int GetModifierKeyBit(unsigned int uChar);

		void UpdateLogicalKeys(unsigned int uChar, bool bPressed);

		unsigned int g_uPhysicalKeyState[MAX_PHYSICAL_KEYS];
		unsigned int g_uLogicalKeyState[MAX_LOGICAL_KEYS];

		KeyMap_t g_uKeyMap[MAX_KEYMAPS];
		unsigned int g_uKeyMaps;
};


#endif // KEYBOARD_H