1 module scone.input.os.windows.input.key_event_record_converter;
2 
3 version (Windows)
4 {
5     import core.sys.windows.windows;
6     import scone.input.scone_control_key : SCK;
7     import scone.input.scone_key : SK;
8     import scone.core.flags : hasFlag, withFlag;
9 
10     final class KeyEventRecordConverter
11     {
12         private KEY_EVENT_RECORD keyEventRecord;
13 
14         this(KEY_EVENT_RECORD keyEventRecord)
15         {
16             this.keyEventRecord = keyEventRecord;
17         }
18 
19         SK sconeKey()
20         {
21             switch (this.keyEventRecord.wVirtualKeyCode)
22             {
23             default:
24                 return SK.unknown;
25             case WindowsKeyCode.K_0:
26                 return SK.key_0;
27             case WindowsKeyCode.K_1:
28                 return SK.key_1;
29             case WindowsKeyCode.K_2:
30                 return SK.key_2;
31             case WindowsKeyCode.K_3:
32                 return SK.key_3;
33             case WindowsKeyCode.K_4:
34                 return SK.key_4;
35             case WindowsKeyCode.K_5:
36                 return SK.key_5;
37             case WindowsKeyCode.K_6:
38                 return SK.key_6;
39             case WindowsKeyCode.K_7:
40                 return SK.key_7;
41             case WindowsKeyCode.K_8:
42                 return SK.key_8;
43             case WindowsKeyCode.K_9:
44                 return SK.key_9;
45             case WindowsKeyCode.K_A:
46                 return SK.a;
47             case WindowsKeyCode.K_B:
48                 return SK.b;
49             case WindowsKeyCode.K_C:
50                 return SK.c;
51             case WindowsKeyCode.K_D:
52                 return SK.d;
53             case WindowsKeyCode.K_E:
54                 return SK.e;
55             case WindowsKeyCode.K_F:
56                 return SK.f;
57             case WindowsKeyCode.K_G:
58                 return SK.g;
59             case WindowsKeyCode.K_H:
60                 return SK.h;
61             case WindowsKeyCode.K_I:
62                 return SK.i;
63             case WindowsKeyCode.K_J:
64                 return SK.j;
65             case WindowsKeyCode.K_K:
66                 return SK.k;
67             case WindowsKeyCode.K_L:
68                 return SK.l;
69             case WindowsKeyCode.K_M:
70                 return SK.m;
71             case WindowsKeyCode.K_N:
72                 return SK.n;
73             case WindowsKeyCode.K_O:
74                 return SK.o;
75             case WindowsKeyCode.K_P:
76                 return SK.p;
77             case WindowsKeyCode.K_Q:
78                 return SK.q;
79             case WindowsKeyCode.K_R:
80                 return SK.r;
81             case WindowsKeyCode.K_S:
82                 return SK.s;
83             case WindowsKeyCode.K_T:
84                 return SK.t;
85             case WindowsKeyCode.K_U:
86                 return SK.u;
87             case WindowsKeyCode.K_V:
88                 return SK.v;
89             case WindowsKeyCode.K_W:
90                 return SK.w;
91             case WindowsKeyCode.K_X:
92                 return SK.x;
93             case WindowsKeyCode.K_Y:
94                 return SK.y;
95             case WindowsKeyCode.K_Z:
96                 return SK.z;
97             case VK_F1:
98                 return SK.f1;
99             case VK_F2:
100                 return SK.f2;
101             case VK_F3:
102                 return SK.f3;
103             case VK_F4:
104                 return SK.f4;
105             case VK_F5:
106                 return SK.f5;
107             case VK_F6:
108                 return SK.f6;
109             case VK_F7:
110                 return SK.f7;
111             case VK_F8:
112                 return SK.f8;
113             case VK_F9:
114                 return SK.f9;
115             case VK_F10:
116                 return SK.f10;
117             case VK_F11:
118                 return SK.f11;
119             case VK_F12:
120                 return SK.f12;
121             case VK_F13:
122                 return SK.f13;
123             case VK_F14:
124                 return SK.f14;
125             case VK_F15:
126                 return SK.f15;
127             case VK_F16:
128                 return SK.f16;
129             case VK_F17:
130                 return SK.f17;
131             case VK_F18:
132                 return SK.f18;
133             case VK_F19:
134                 return SK.f19;
135             case VK_F20:
136                 return SK.f20;
137             case VK_F21:
138                 return SK.f21;
139             case VK_F22:
140                 return SK.f22;
141             case VK_F23:
142                 return SK.f23;
143             case VK_F24:
144                 return SK.f24;
145             case VK_NUMPAD0:
146                 return SK.numpad_0;
147             case VK_NUMPAD1:
148                 return SK.numpad_1;
149             case VK_NUMPAD2:
150                 return SK.numpad_2;
151             case VK_NUMPAD3:
152                 return SK.numpad_3;
153             case VK_NUMPAD4:
154                 return SK.numpad_4;
155             case VK_NUMPAD5:
156                 return SK.numpad_5;
157             case VK_NUMPAD6:
158                 return SK.numpad_6;
159             case VK_NUMPAD7:
160                 return SK.numpad_7;
161             case VK_NUMPAD8:
162                 return SK.numpad_8;
163             case VK_NUMPAD9:
164                 return SK.numpad_9;
165             case VK_BACK:
166                 return SK.backspace;
167             case VK_TAB:
168                 return SK.tab;
169             case VK_ESCAPE:
170                 return SK.escape;
171             case VK_SPACE:
172                 return SK.space;
173             case VK_PRIOR:
174                 return SK.page_up;
175             case VK_NEXT:
176                 return SK.page_down;
177             case VK_END:
178                 return SK.end;
179             case VK_HOME:
180                 return SK.home;
181             case VK_LEFT:
182                 return SK.left;
183             case VK_RIGHT:
184                 return SK.right;
185             case VK_UP:
186                 return SK.up;
187             case VK_DOWN:
188                 return SK.down;
189             case VK_DELETE:
190                 return SK.del;
191             case VK_SEPARATOR:
192                 return SK.enter;
193             case VK_ADD:
194                 return SK.plus;
195             case VK_OEM_PLUS:
196                 return SK.plus;
197             case VK_SUBTRACT:
198                 return SK.minus;
199             case VK_OEM_MINUS:
200                 return SK.minus;
201             case VK_OEM_PERIOD:
202                 return SK.period;
203             case VK_OEM_COMMA:
204                 return SK.comma;
205             case VK_DECIMAL:
206                 return SK.comma;
207             case VK_MULTIPLY:
208                 return SK.asterisk;
209             case VK_DIVIDE:
210                 return SK.divide;
211             case VK_OEM_1:
212                 return SK.oem_1;
213             case VK_OEM_2:
214                 return SK.oem_2;
215             case VK_OEM_3:
216                 return SK.oem_3;
217             case VK_OEM_4:
218                 return SK.oem_4;
219             case VK_OEM_5:
220                 return SK.oem_5;
221             case VK_OEM_6:
222                 return SK.oem_6;
223             case VK_OEM_7:
224                 return SK.oem_7;
225             case VK_OEM_8:
226                 return SK.oem_8;
227             case VK_OEM_102:
228                 return SK.oem_102;
229             case VK_RETURN:
230                 return SK.enter;
231 
232                 /+
233         case VK_CLEAR: return SK.clear;
234         case VK_SHIFT: return SK.shift;
235         case VK_CONTROL: return SK.control;
236         case VK_MENU: return SK.alt;
237         case VK_CAPITAL: return SK.capslock;
238         case VK_SELECT: return SK.select;
239         case VK_PRINT: return SK.print;
240         case VK_EXECUTE: return SK.execute;
241         case VK_SNAPSHOT: return SK.print_screen;
242         case VK_INSERT: return SK.insert;
243         case VK_HELP: return SK.help;
244         case VK_LWIN: return SK.windows_left;
245         case VK_RWIN: return SK.windows_right;
246         case VK_APPS: return SK.apps;
247         case VK_SLEEP: return SK.sleep;
248         case VK_NUMLOCK: return SK.numlock;
249         case VK_SCROLL: return SK.scroll_lock;
250         case VK_LSHIFT: return SK.shift_left;
251         case VK_RSHIFT: return SK.shift_right;
252         case VK_LCONTROL: return SK.control_left;
253         case VK_RCONTROL: return SK.control_right;
254         case VK_LMENU: return SK.menu_left;
255         case VK_RMENU: return SK.menu_right;
256         case VK_BROWSER_BACK: return SK.browser_back;
257         case VK_BROWSER_FORWARD: return SK.browser_forward;
258         case VK_BROWSER_REFRESH: return SK.browser_refresh;
259         case VK_BROWSER_STOP: return SK.browser_stop;
260         case VK_BROWSER_SEARCH: return SK.browser_search;
261         case VK_BROWSER_FAVORITES: return SK.browser_favorites;
262         case VK_BROWSER_HOME: return SK.browser_home;
263         case VK_VOLUME_MUTE: return SK.volume_mute;
264         case VK_VOLUME_DOWN: return SK.volume_down;
265         case VK_VOLUME_UP: return SK.volume_up;
266         case VK_MEDIA_NEXT_TRACK: return SK.media_next;
267         case VK_MEDIA_PREV_TRACK: return SK.media_prev;
268         case VK_MEDIA_STOP: return SK.media_stop;
269         case VK_MEDIA_PLAY_PAUSE: return SK.media_play_pause;
270         case VK_LAUNCH_MAIL: return SK.launch_mail;
271         case VK_LAUNCH_MEDIA_SELECT: return SK.launch_media_select;
272         case VK_LAUNCH_APP1: return SK.launch_app_1;
273         case VK_LAUNCH_APP2: return SK.launch_app_2;case VK_PACKET: return SK.packet;
274         case VK_ATTN: return SK.attn;
275         case VK_CRSEL: return SK.crsel;
276         case VK_EXSEL: return SK.exsel;
277         case VK_EREOF: return SK.ereof;
278         case VK_PLAY: return SK.play;
279         case VK_ZOOM: return SK.zoom;
280         case VK_OEM_CLEAR: return SK.oem_clear;
281         case VK_PAUSE: return SK.pause;
282         case VK_CANCEL: return SK.cancel;
283         +/
284             }
285         }
286 
287         SCK sconeControlKey()
288         {
289             SCK sck;
290 
291             DWORD controlKeyState = this.keyEventRecord.dwControlKeyState;
292 
293             if (controlKeyState.hasFlag(CAPSLOCK_ON))
294             {
295                 sck = sck.withFlag(SCK.capslock);
296             }
297             if (controlKeyState.hasFlag(SCROLLLOCK_ON))
298             {
299                 sck = sck.withFlag(SCK.scrolllock);
300             }
301             if (controlKeyState.hasFlag(SHIFT_PRESSED))
302             {
303                 sck = sck.withFlag(SCK.shift);
304             }
305             if (controlKeyState.hasFlag(ENHANCED_KEY))
306             {
307                 sck = sck.withFlag(SCK.enhanced);
308             }
309             if (controlKeyState.hasFlag(LEFT_ALT_PRESSED))
310             {
311                 sck = sck.withFlag(SCK.alt);
312             }
313             if (controlKeyState.hasFlag(RIGHT_ALT_PRESSED))
314             {
315                 sck = sck.withFlag(SCK.alt);
316             }
317             if (controlKeyState.hasFlag(LEFT_CTRL_PRESSED))
318             {
319                 sck = sck.withFlag(SCK.ctrl);
320             }
321             if (controlKeyState.hasFlag(RIGHT_CTRL_PRESSED))
322             {
323                 sck = sck.withFlag(SCK.ctrl);
324             }
325             if (controlKeyState.hasFlag(NUMLOCK_ON))
326             {
327                 sck = sck.withFlag(SCK.numlock);
328             }
329 
330             return sck;
331         }
332 
333         bool pressed()
334         {
335             return cast(bool) keyEventRecord.bKeyDown;
336         }
337 
338         private enum WindowsKeyCode
339         {
340             K_0 = 0x30,
341             K_1 = 0x31,
342             K_2 = 0x32,
343             K_3 = 0x33,
344             K_4 = 0x34,
345             K_5 = 0x35,
346             K_6 = 0x36,
347             K_7 = 0x37,
348             K_8 = 0x38,
349             K_9 = 0x39,
350             K_A = 0x41,
351             K_B = 0x42,
352             K_C = 0x43,
353             K_D = 0x44,
354             K_E = 0x45,
355             K_F = 0x46,
356             K_G = 0x47,
357             K_H = 0x48,
358             K_I = 0x49,
359             K_J = 0x4A,
360             K_K = 0x4B,
361             K_L = 0x4C,
362             K_M = 0x4D,
363             K_N = 0x4E,
364             K_O = 0x4F,
365             K_P = 0x50,
366             K_Q = 0x51,
367             K_R = 0x52,
368             K_S = 0x53,
369             K_T = 0x54,
370             K_U = 0x55,
371             K_V = 0x56,
372             K_W = 0x57,
373             K_X = 0x58,
374             K_Y = 0x59,
375             K_Z = 0x5A,
376         }
377     }
378 }