1 module polyplex.core.input.keyboard;
2 import derelict.sdl2.sdl;
3 import std.stdio;
4 import std.conv;
5 
6 enum Keys {
7 	Unknown,
8 	A = SDL_SCANCODE_A,
9 	B = SDL_SCANCODE_B,
10 	C = SDL_SCANCODE_C,
11 	D = SDL_SCANCODE_D,
12 	E = SDL_SCANCODE_E,
13 	F = SDL_SCANCODE_F,
14 	G = SDL_SCANCODE_G,
15 	H = SDL_SCANCODE_H,
16 	I = SDL_SCANCODE_I,
17 	J = SDL_SCANCODE_J,
18 	K = SDL_SCANCODE_K,
19 	L = SDL_SCANCODE_L,
20 	M = SDL_SCANCODE_M,
21 	N = SDL_SCANCODE_N,
22 	O = SDL_SCANCODE_O,
23 	P = SDL_SCANCODE_P,
24 	Q = SDL_SCANCODE_Q,
25 	R = SDL_SCANCODE_R,
26 	S = SDL_SCANCODE_S,
27 	T = SDL_SCANCODE_T,
28 	U = SDL_SCANCODE_U,
29 	V = SDL_SCANCODE_V,
30 	W = SDL_SCANCODE_W,
31 	X = SDL_SCANCODE_X,
32 	Y = SDL_SCANCODE_Y,
33 	Z = SDL_SCANCODE_Z,
34 	One = SDL_SCANCODE_1,
35 	Two = SDL_SCANCODE_2,
36 	Three = SDL_SCANCODE_3,
37 	Four = SDL_SCANCODE_4,
38 	Five = SDL_SCANCODE_5,
39 	Six = SDL_SCANCODE_6,
40 	Seven = SDL_SCANCODE_7,
41 	Eight = SDL_SCANCODE_8,
42 	Nine = SDL_SCANCODE_9,
43 	Zero = SDL_SCANCODE_0,
44 	Return = SDL_SCANCODE_RETURN,
45 	Escape = SDL_SCANCODE_ESCAPE,
46 	Backspace = SDL_SCANCODE_BACKSPACE,
47 	Tab = SDL_SCANCODE_TAB,
48 	Space = SDL_SCANCODE_SPACE,
49 	Minus = SDL_SCANCODE_MINUS,
50 	Equals = SDL_SCANCODE_EQUALS,
51 	LeftBracket = SDL_SCANCODE_LEFTBRACKET,
52 	RightBracket = SDL_SCANCODE_RIGHTBRACKET,
53 	Backslash = SDL_SCANCODE_BACKSLASH,
54 	Nonuhash = SDL_SCANCODE_NONUSHASH,
55 	Semicolon = SDL_SCANCODE_SEMICOLON,
56 	Apostrophe = SDL_SCANCODE_APOSTROPHE,
57 	Grave = SDL_SCANCODE_GRAVE,
58 	Comma = SDL_SCANCODE_COMMA,
59 	Period = SDL_SCANCODE_PERIOD,
60 	Slash = SDL_SCANCODE_SLASH,
61 	Capslock = SDL_SCANCODE_CAPSLOCK,
62 	F1 = SDL_SCANCODE_F1,
63 	F2 = SDL_SCANCODE_F2,
64 	F3 = SDL_SCANCODE_F3,
65 	F4 = SDL_SCANCODE_F4,
66 	F5 = SDL_SCANCODE_F5,
67 	F6 = SDL_SCANCODE_F6,
68 	F7 = SDL_SCANCODE_F7,
69 	F8 = SDL_SCANCODE_F8,
70 	F9 = SDL_SCANCODE_F9,
71 	F10 = SDL_SCANCODE_F10,
72 	F11 = SDL_SCANCODE_F11,
73 	F12 = SDL_SCANCODE_F12,
74 	Execute = SDL_SCANCODE_EXECUTE,
75 	Help = SDL_SCANCODE_HELP,
76 	Menu = SDL_SCANCODE_MENU,
77 	Select = SDL_SCANCODE_SELECT,
78 	Stop = SDL_SCANCODE_STOP,
79 	Again = SDL_SCANCODE_AGAIN,
80 	Undo = SDL_SCANCODE_UNDO,
81 	Cut = SDL_SCANCODE_CUT,
82 	Copy = SDL_SCANCODE_COPY,
83 	Paste = SDL_SCANCODE_PASTE,
84 	Find = SDL_SCANCODE_FIND,
85 	Mute = SDL_SCANCODE_MUTE,
86 	VolumeUp = SDL_SCANCODE_VOLUMEUP,
87 	VolumeDown = SDL_SCANCODE_VOLUMEDOWN,
88 	KPComma = SDL_SCANCODE_KP_COMMA,
89 	KPEqual = SDL_SCANCODE_KP_EQUALS,
90 	International1,
91 	International2,
92 	International3,
93 	International4,
94 	International5,
95 	International6,
96 	International7,
97 	International8,
98 	International9,
99 	Lang1,
100 	Lang2,
101 	Lang3,
102 	Lang4,
103 	Lang5,
104 	Lang6,
105 	Lang7,
106 	Lang8,
107 	Lang9,
108 	AltErase = SDL_SCANCODE_ALTERASE,
109 	Sysreq = SDL_SCANCODE_SYSREQ,
110 	Cancel = SDL_SCANCODE_CANCEL,
111 	Clear = SDL_SCANCODE_CLEAR,
112 	Prior = SDL_SCANCODE_PRIOR,
113 	Return2 = SDL_SCANCODE_RETURN2,
114 	Seperator = SDL_SCANCODE_SEPARATOR,
115 	Out = SDL_SCANCODE_OUT,
116 	Oper = SDL_SCANCODE_OPER,
117 	ClearAgain = SDL_SCANCODE_CLEARAGAIN,
118 	LeftControl = SDL_SCANCODE_LCTRL,
119 	LeftShift = SDL_SCANCODE_LSHIFT,
120 	LeftAlt = SDL_SCANCODE_LALT,
121 	LeftGUI = SDL_SCANCODE_LGUI,
122 	RightControl = SDL_SCANCODE_RCTRL,
123 	RightShift = SDL_SCANCODE_RSHIFT,
124 	RightAlt = SDL_SCANCODE_RALT,
125 	RightGUI = SDL_SCANCODE_RGUI,
126 	Mode,
127 	AudioNext,
128 	AudioPrevious,
129 	AudioStop,
130 	AudioPlay,
131 	AudioMute,
132 	MediaSelect,
133 	WWW,
134 	Mail,
135 	Calculator,
136 	Computer,
137 	ACSearch,
138 	ACHome,
139 	ACBack,
140 	ACForward,
141 	ACStop,
142 	ACRefresh,
143 	ACBookmarks,
144 	BrightnessDown,
145 	BrightnessUp,
146 	DisplaySwitch,
147 	KBDIlluminationToggle,
148 	KBDIlluminationDown,
149 	KBDIlluminationUp,
150 	Eject,
151 	Sleep,
152 	App1,
153 	App2,
154 	Up = SDL_SCANCODE_UP,
155 	Down = SDL_SCANCODE_DOWN,
156 	Left = SDL_SCANCODE_LEFT,
157 	Right = SDL_SCANCODE_RIGHT,
158 }
159 
160 enum KeyState {
161 	Up,
162 	Down
163 }
164 
165 public class KeyboardState {
166 	private ubyte[] key_states;
167 
168 	this(ubyte* key_states, int size) {
169 		// SDL wants to override the values, so we manually copy them in to another array.
170 		foreach(i; 0 .. size) {
171 			this.key_states.length++;
172 			this.key_states[i] = key_states[i];
173 		}
174 	}
175 
176 	/**
177 		Returns true if the specified key is down (pressed).
178 	*/
179 	public bool IsKeyDown(Keys key) {
180 		if (key_states[key] == 1) return true;
181 		return false;
182 	}
183 
184 	/**
185 		Returns true if all of the specified keys are down (pressed).
186 	*/
187 	public bool AreKeysDown(Keys[] kees) {
188 		foreach(Keys k; kees) {
189 			if (IsKeyUp(k)) return false;
190 		}
191 		return true;
192 	}
193 
194 	/**
195 		Returns true if the specified key is up (not pressed).
196 	*/
197 	public bool IsKeyUp(Keys key) {
198 		return !IsKeyDown(key);
199 	}
200 
201 	/**
202 		Returns true if all of the specified keys are up (not pressed).
203 	*/
204 	public bool AreKeysUp(Keys[] kees) {
205 		foreach(Keys k; kees) {
206 			if (IsKeyDown(k)) return false;
207 		}
208 		return true;
209 	}
210 }
211 
212 public class Keyboard {
213 
214 	/**
215 		Returns the current state of the keyboard.
216 	*/
217 	public static KeyboardState GetState() {
218 		int elements;
219 		ubyte* arr = SDL_GetKeyboardState(&elements);
220 		return new KeyboardState(arr, elements);
221 	}
222 }