1 module nudsfml.window.keyboard;
2 
3 import bindbc.sfml.window;
4 
5 final abstract class Keyboard {
6     /// Key codes.
7     enum Key {
8         /// Unhandled key
9         Unknown = -1,
10         /// The A key
11         A = 0,
12         /// The B key
13         B,
14         /// The C key
15         C,
16         /// The D key
17         D,
18         /// The E key
19         E,
20         /// The F key
21         F,
22         /// The G key
23         G,
24         /// The H key
25         H,
26         /// The I key
27         I,
28         /// The J key
29         J,
30         /// The K key
31         K,
32         /// The L key
33         L,
34         /// The M key
35         M,
36         /// The N key
37         N,
38         /// The O key
39         O,
40         /// The P key
41         P,
42         /// The Q key
43         Q,
44         /// The R key
45         R,
46         /// The S key
47         S,
48         /// The T key
49         T,
50         /// The U key
51         U,
52         /// The V key
53         V,
54         /// The W key
55         W,
56         /// The X key
57         X,
58         /// The Y key
59         Y,
60         /// The Z key
61         Z,
62         /// The 0 key
63         Num0,
64         /// The 1 key
65         Num1,
66         /// The 2 key
67         Num2,
68         /// The 3 key
69         Num3,
70         /// The 4 key
71         Num4,
72         /// The 5 key
73         Num5,
74         /// The 6 key
75         Num6,
76         /// The 7 key
77         Num7,
78         /// The 8 key
79         Num8,
80         /// The 9 key
81         Num9,
82         /// The Escape key
83         Escape,
84         /// The left Control key
85         LControl,
86         /// The left Shift key
87         LShift,
88         /// The left Alt key
89         LAlt,
90         /// The left OS specific key: window (Windows and Linux), apple (MacOS X), ...
91         LSystem,
92         /// The right Control key
93         RControl,
94         /// The right Shift key
95         RShift,
96         /// The right Alt key
97         RAlt,
98         /// The right OS specific key: window (Windows and Linux), apple (MacOS X), ...
99         RSystem,
100         /// The Menu key
101         Menu,
102         /// The [ key
103         LBracket,
104         /// The ] key
105         RBracket,
106         /// The ; key
107         SemiColon,
108         /// The , key
109         Comma,
110         /// The . key
111         Period,
112         /// The ' key
113         Quote,
114         /// The / key
115         Slash,
116         /// The \ key
117         BackSlash,
118         /// The ~ key
119         Tilde,
120         /// The = key
121         Equal,
122         /// The - key
123         Dash,
124         /// The Space key
125         Space,
126         /// The Return key
127         Return,
128         /// The Backspace key
129         BackSpace,
130         /// The Tabulation key
131         Tab,
132         /// The Page up key
133         PageUp,
134         /// The Page down key
135         PageDown,
136         /// The End key
137         End,
138         /// The Home key
139         Home,
140         /// The Insert key
141         Insert,
142         /// The Delete key
143         Delete,
144         /// The + key
145         Add,
146         /// The - key
147         Subtract,
148         /// The * key
149         Multiply,
150         /// The / key
151         Divide,
152         /// Left arrow
153         Left,
154         /// Right arrow
155         Right,
156         /// Up arrow
157         Up,
158         /// Down arrow
159         Down,
160         /// The numpad 0 key
161         Numpad0,
162         /// The numpad 1 key
163         Numpad1,
164         /// The numpad 2 key
165         Numpad2,
166         /// The numpad 3 key
167         Numpad3,
168         /// The numpad 4 key
169         Numpad4,
170         /// The numpad 5 key
171         Numpad5,
172         /// The numpad 6 key
173         Numpad6,
174         /// The numpad 7 key
175         Numpad7,
176         /// The numpad 8 key
177         Numpad8,
178         /// The numpad 9 key
179         Numpad9,
180         /// The F1 key
181         F1,
182         /// The F2 key
183         F2,
184         /// The F3 key
185         F3,
186         /// The F4 key
187         F4,
188         /// The F5 key
189         F5,
190         /// The F6 key
191         F6,
192         /// The F7 key
193         F7,
194         /// The F8 key
195         F8,
196         /// The F9 key
197         F9,
198         /// The F10 key
199         F10,
200         /// The F11 key
201         F11,
202         /// The F12 key
203         F12,
204         /// The F13 key
205         F13,
206         /// The F14 key
207         F14,
208         /// The F15 key
209         F15,
210         /// The Pause key
211         Pause,
212 
213         /// Keep last -- the total number of keyboard keys
214         KeyCount
215     }
216 
217     /**
218      * Check if a key is pressed.
219      *
220      * Params:
221      * 		key = Key to check
222      *
223      * Returns: true if the key is pressed, false otherwise.
224      */
225     static bool isKeyPressed(Key key) {
226         sfKeyCode code = cast(sfKeyCode)key;
227         return (sfKeyboard_isKeyPressed(code)) > 0;
228     }
229 }
230 
231 //known bugs:
232 //cannot press two keys at once for this unit test
233 unittest {
234     version(DSFML_Unittest_Window) {
235         import std.stdio;
236 
237         writeln("Unit test for Keyboard realtime input");
238 
239         bool running = true;
240 
241         writeln("Press any key for real time input. Press esc to exit.");
242 
243         string[int] keys;
244         //in its own scope for code folding
245         {
246             keys[-1] = "Unknown";
247             keys[0] = 	"A";
248             keys[1] =	"B";
249             keys[2] =	"C";
250             keys[3] =	"D";
251             keys[4] =	"E";
252             keys[5] =	"F";
253             keys[6] =	"G";
254             keys[7] =	"H";
255             keys[8] =	"I";
256             keys[9] =	"J";
257             keys[10] =	"K";
258             keys[11] =	"L";
259             keys[12] =	"M";
260             keys[13] =	"N";
261             keys[14] =	"O";
262             keys[15] =	"P";
263             keys[16] =	"Q";
264             keys[17] =	"R";
265             keys[18] =	"S";
266             keys[19] =	"T";
267             keys[20] =	"U";
268             keys[21] =	"V";
269             keys[22] =	"W";
270             keys[23] =	"X";
271             keys[24] =	"Y";
272             keys[25] =	"Z";
273             keys[26] =	"Num0";
274             keys[26] =	"Num1";
275             keys[28] =	"Num2";
276             keys[29] =	"Num3";
277             keys[30] =	"Num4";
278             keys[31] =	"Num5";
279             keys[32] =	"Num6";
280             keys[33] =	"Num7";
281             keys[34] =	"Num8";
282             keys[35] =	"Num9";
283             keys[36] =	"Escape";
284             keys[37] =	"LControl";
285             keys[38] =	"LShift";
286             keys[39] =	"LAlt";
287             keys[40] =	"LSystem";
288             keys[41] =	"RControl";
289             keys[42] =	"RShift";
290             keys[43] =	"RAlt";
291             keys[44] =	"RSystem";
292             keys[45] =	"Menu";
293             keys[46] =	"LBracket";
294             keys[47] =	"RBracket";
295             keys[48] =	"SemiColon";
296             keys[49] =	"Comma";
297             keys[50] =	"Period";
298             keys[51] =	"Quote";
299             keys[52] =	"Slash";
300             keys[53] =	"BackSlash";
301             keys[54] =	"Tilde";
302             keys[55] =	"Equal";
303             keys[56] =	"Dash";
304             keys[57] =	"Space";
305             keys[58] =	"Return";
306             keys[59] =	"BackSpace";
307             keys[60] =	"Tab";
308             keys[61] =	"PageUp";
309             keys[62] =	"PageDown";
310             keys[63] =	"End";
311             keys[64] =	"Home";
312             keys[65] =	"Insert";
313             keys[66] =	"Delete";
314             keys[67] =	"Add";
315             keys[68] =	"Subtract";
316             keys[69] =	"Multiply";
317             keys[70] =	"Divide";
318             keys[71] =	"Left";
319             keys[72] =	"Right";
320             keys[73] =	"Up";
321             keys[74] =	"Down";
322             keys[75] =	"Numpad0";
323             keys[76] =	"Numpad1";
324             keys[77] =	"Numpad2";
325             keys[78] =	"Numpad3";
326             keys[79] =	"Numpad4";
327             keys[80] =	"Numpad5";
328             keys[81] =	"Numpad6";
329             keys[82] =	"Numpad7";
330             keys[83] =	"Numpad8";
331             keys[84] =	"Numpad9";
332             keys[85] =	"F1";
333             keys[86] =	"F2";
334             keys[87] =	"F3";
335             keys[88] =	"F4";
336             keys[89] =	"F5";
337             keys[90] =	"F6";
338             keys[91] =	"F7";
339             keys[92] =	"F8";
340             keys[93] =	"F9";
341             keys[94] =	"F10";
342             keys[95] =	"F11";
343             keys[96] =	"F12";
344             keys[97] =	"F13";
345             keys[98] =	"F14";
346             keys[99] =	"F15";
347             keys[100] =	"Pause";
348         }
349 
350         //must check for each possible key
351         while(running) {
352             for(int i =-1;i<101;++i) {
353                 if(Keyboard.isKeyPressed(cast(Keyboard.Key)i)) {
354                     if(i in keys){
355                         writeln("Key "~ keys[i] ~ " was pressed.");
356                     } else {
357                         writeln(i);
358                     }
359                     if(i == 36){
360                         running = false;
361                     }
362                 }
363             }
364         }
365     }
366 }