|
1 | 1 | package termcl |
2 | 2 |
|
3 | | -import "core:strconv" |
4 | | -import "core:unicode" |
5 | 3 | import "core:fmt" |
6 | 4 | import "core:os" |
| 5 | +import "core:strconv" |
| 6 | +import "core:unicode" |
7 | 7 |
|
8 | 8 | Input :: distinct []byte |
9 | 9 |
|
@@ -151,195 +151,198 @@ check what value it is processed into. |
151 | 151 | For example, `.Escape` is either Esc, Ctrl + [ and Ctrl + 3 to the terminal. |
152 | 152 | */ |
153 | 153 | parse_keyboard_input :: proc(input: Input) -> (keyboard_input: Keyboard_Input, has_input: bool) { |
154 | | - input := input |
155 | | - seq: Keyboard_Input |
156 | | - |
157 | | - if len(input) == 0 do return |
158 | | - |
159 | | - if len(input) == 1 { |
160 | | - input_rune := cast(rune)input[0] |
161 | | - if unicode.is_upper(input_rune) { |
162 | | - seq.mod = .Shift |
163 | | - } |
164 | | - |
165 | | - if unicode.is_control(input_rune) { |
166 | | - switch input_rune { |
167 | | - case '\r', |
168 | | - '\n', |
169 | | - '\b', |
170 | | - 127, /* backspace */ |
171 | | - '\t', |
172 | | - '\x1b': |
173 | | - case: |
174 | | - seq.mod = .Ctrl |
175 | | - input[0] += 64 |
176 | | - } |
177 | | - } |
178 | | - |
179 | | - switch input[0] { |
| 154 | + _alnum_to_key :: proc(b: byte) -> (key: Key, ok: bool) { |
| 155 | + switch b { |
180 | 156 | case '\x1b': |
181 | | - seq.key = .Escape |
| 157 | + key = .Escape |
182 | 158 | case '1': |
183 | | - seq.key = .Num_1 |
| 159 | + key = .Num_1 |
184 | 160 | case '2': |
185 | | - seq.key = .Num_2 |
| 161 | + key = .Num_2 |
186 | 162 | case '3': |
187 | | - seq.key = .Num_3 |
| 163 | + key = .Num_3 |
188 | 164 | case '4': |
189 | | - seq.key = .Num_4 |
| 165 | + key = .Num_4 |
190 | 166 | case '5': |
191 | | - seq.key = .Num_5 |
| 167 | + key = .Num_5 |
192 | 168 | case '6': |
193 | | - seq.key = .Num_6 |
| 169 | + key = .Num_6 |
194 | 170 | case '7': |
195 | | - seq.key = .Num_7 |
| 171 | + key = .Num_7 |
196 | 172 | case '8': |
197 | | - seq.key = .Num_8 |
| 173 | + key = .Num_8 |
198 | 174 | case '9': |
199 | | - seq.key = .Num_9 |
| 175 | + key = .Num_9 |
200 | 176 | case '0': |
201 | | - seq.key = .Num_0 |
| 177 | + key = .Num_0 |
202 | 178 | case '\r', '\n': |
203 | | - seq.key = .Enter |
| 179 | + key = .Enter |
204 | 180 | case '\t': |
205 | | - seq.key = .Tab |
| 181 | + key = .Tab |
206 | 182 | case 8, 127: |
207 | | - seq.key = .Backspace |
| 183 | + key = .Backspace |
208 | 184 | case 'a', 'A': |
209 | | - seq.key = .A |
| 185 | + key = .A |
210 | 186 | case 'b', 'B': |
211 | | - seq.key = .B |
| 187 | + key = .B |
212 | 188 | case 'c', 'C': |
213 | | - seq.key = .C |
| 189 | + key = .C |
214 | 190 | case 'd', 'D': |
215 | | - seq.key = .D |
| 191 | + key = .D |
216 | 192 | case 'e', 'E': |
217 | | - seq.key = .E |
| 193 | + key = .E |
218 | 194 | case 'f', 'F': |
219 | | - seq.key = .F |
| 195 | + key = .F |
220 | 196 | case 'g', 'G': |
221 | | - seq.key = .G |
| 197 | + key = .G |
222 | 198 | case 'h', 'H': |
223 | | - seq.key = .H |
| 199 | + key = .H |
224 | 200 | case 'i', 'I': |
225 | | - seq.key = .I |
| 201 | + key = .I |
226 | 202 | case 'j', 'J': |
227 | | - seq.key = .J |
| 203 | + key = .J |
228 | 204 | case 'k', 'K': |
229 | | - seq.key = .K |
| 205 | + key = .K |
230 | 206 | case 'l', 'L': |
231 | | - seq.key = .L |
| 207 | + key = .L |
232 | 208 | case 'm', 'M': |
233 | | - seq.key = .M |
| 209 | + key = .M |
234 | 210 | case 'n', 'N': |
235 | | - seq.key = .N |
| 211 | + key = .N |
236 | 212 | case 'o', 'O': |
237 | | - seq.key = .O |
| 213 | + key = .O |
238 | 214 | case 'p', 'P': |
239 | | - seq.key = .P |
| 215 | + key = .P |
240 | 216 | case 'q', 'Q': |
241 | | - seq.key = .Q |
| 217 | + key = .Q |
242 | 218 | case 'r', 'R': |
243 | | - seq.key = .R |
| 219 | + key = .R |
244 | 220 | case 's', 'S': |
245 | | - seq.key = .S |
| 221 | + key = .S |
246 | 222 | case 't', 'T': |
247 | | - seq.key = .T |
| 223 | + key = .T |
248 | 224 | case 'u', 'U': |
249 | | - seq.key = .U |
| 225 | + key = .U |
250 | 226 | case 'v', 'V': |
251 | | - seq.key = .V |
| 227 | + key = .V |
252 | 228 | case 'w', 'W': |
253 | | - seq.key = .W |
| 229 | + key = .W |
254 | 230 | case 'x', 'X': |
255 | | - seq.key = .X |
| 231 | + key = .X |
256 | 232 | case 'y', 'Y': |
257 | | - seq.key = .Y |
| 233 | + key = .Y |
258 | 234 | case 'z', 'Z': |
259 | | - seq.key = .Z |
| 235 | + key = .Z |
260 | 236 | case ',': |
261 | | - seq.key = .Comma |
| 237 | + key = .Comma |
262 | 238 | case ':': |
263 | | - seq.key = .Colon |
| 239 | + key = .Colon |
264 | 240 | case ';': |
265 | | - seq.key = .Semicolon |
| 241 | + key = .Semicolon |
266 | 242 | case '-': |
267 | | - seq.key = .Minus |
| 243 | + key = .Minus |
268 | 244 | case '+': |
269 | | - seq.key = .Plus |
| 245 | + key = .Plus |
270 | 246 | case '=': |
271 | | - seq.key = .Equal |
| 247 | + key = .Equal |
272 | 248 | case '{': |
273 | | - seq.key = .Open_Curly_Bracket |
| 249 | + key = .Open_Curly_Bracket |
274 | 250 | case '}': |
275 | | - seq.key = .Close_Curly_Bracket |
| 251 | + key = .Close_Curly_Bracket |
276 | 252 | case '(': |
277 | | - seq.key = .Open_Paren |
| 253 | + key = .Open_Paren |
278 | 254 | case ')': |
279 | | - seq.key = .Close_Paren |
| 255 | + key = .Close_Paren |
280 | 256 | case '[': |
281 | | - seq.key = .Open_Square_Bracket |
| 257 | + key = .Open_Square_Bracket |
282 | 258 | case ']': |
283 | | - seq.key = .Close_Square_Bracket |
| 259 | + key = .Close_Square_Bracket |
284 | 260 | case '/': |
285 | | - seq.key = .Slash |
| 261 | + key = .Slash |
286 | 262 | case '\'': |
287 | | - seq.key = .Single_Quote |
| 263 | + key = .Single_Quote |
288 | 264 | case '"': |
289 | | - seq.key = .Double_Quote |
| 265 | + key = .Double_Quote |
290 | 266 | case '.': |
291 | | - seq.key = .Period |
| 267 | + key = .Period |
292 | 268 | case '*': |
293 | | - seq.key = .Asterisk |
| 269 | + key = .Asterisk |
294 | 270 | case '`': |
295 | | - seq.key = .Backtick |
| 271 | + key = .Backtick |
296 | 272 | case '\\': |
297 | | - seq.key = .Backslash |
| 273 | + key = .Backslash |
298 | 274 | case ' ': |
299 | | - seq.key = .Space |
| 275 | + key = .Space |
300 | 276 | case '$': |
301 | | - seq.key = .Dollar |
| 277 | + key = .Dollar |
302 | 278 | case '!': |
303 | | - seq.key = .Exclamation |
| 279 | + key = .Exclamation |
304 | 280 | case '#': |
305 | | - seq.key = .Hash |
| 281 | + key = .Hash |
306 | 282 | case '%': |
307 | | - seq.key = .Percent |
| 283 | + key = .Percent |
308 | 284 | case '&': |
309 | | - seq.key = .Ampersand |
| 285 | + key = .Ampersand |
310 | 286 | case '´': |
311 | | - seq.key = .Tick |
| 287 | + key = .Tick |
312 | 288 | case '_': |
313 | | - seq.key = .Underscore |
| 289 | + key = .Underscore |
314 | 290 | case '^': |
315 | | - seq.key = .Caret |
| 291 | + key = .Caret |
316 | 292 | case '|': |
317 | | - seq.key = .Pipe |
| 293 | + key = .Pipe |
318 | 294 | case '@': |
319 | | - seq.key = .At |
| 295 | + key = .At |
320 | 296 | case '~': |
321 | | - seq.key = .Tilde |
| 297 | + key = .Tilde |
322 | 298 | case '<': |
323 | | - seq.key = .Less_Than |
| 299 | + key = .Less_Than |
324 | 300 | case '>': |
325 | | - seq.key = .Greater_Than |
| 301 | + key = .Greater_Than |
326 | 302 | case '?': |
327 | | - seq.key = .Question_Mark |
| 303 | + key = .Question_Mark |
328 | 304 | case: |
| 305 | + ok = false |
329 | 306 | return |
330 | 307 | } |
331 | 308 |
|
332 | | - return seq, true |
| 309 | + ok = true |
| 310 | + return |
333 | 311 | } |
334 | 312 |
|
335 | | - if input[0] != '\x1b' do return |
| 313 | + input := input |
| 314 | + seq: Keyboard_Input |
| 315 | + |
| 316 | + if len(input) == 0 do return |
| 317 | + |
| 318 | + if len(input) == 1 { |
| 319 | + input_rune := cast(rune)input[0] |
| 320 | + if unicode.is_upper(input_rune) { |
| 321 | + seq.mod = .Shift |
| 322 | + } |
| 323 | + |
| 324 | + if unicode.is_control(input_rune) { |
| 325 | + switch input_rune { |
| 326 | + case '\r', |
| 327 | + '\n', |
| 328 | + '\b', |
| 329 | + 127, /* backspace */ |
| 330 | + '\t', |
| 331 | + '\x1b': |
| 332 | + case: |
| 333 | + seq.mod = .Ctrl |
| 334 | + input[0] += 64 |
| 335 | + } |
| 336 | + } |
336 | 337 |
|
337 | | - if input[1] == 10 { |
338 | | - seq.mod = .Alt |
339 | | - seq.key = .Enter |
| 338 | + key, ok := _alnum_to_key(input[0]) |
| 339 | + if !ok do return {}, false |
| 340 | + seq.key = key |
340 | 341 | return seq, true |
341 | 342 | } |
342 | 343 |
|
| 344 | + if input[0] != '\x1b' do return |
| 345 | + |
343 | 346 | if len(input) > 3 { |
344 | 347 | input_len := len(input) |
345 | 348 |
|
@@ -488,6 +491,16 @@ parse_keyboard_input :: proc(input: Input) -> (keyboard_input: Keyboard_Input, h |
488 | 491 | return seq, true |
489 | 492 | } |
490 | 493 |
|
| 494 | + // alt is ESC + <char> |
| 495 | + if len(input) == 2 { |
| 496 | + key, ok := _alnum_to_key(input[1]) |
| 497 | + if ok { |
| 498 | + seq.mod = .Alt |
| 499 | + seq.key = key |
| 500 | + return seq, true |
| 501 | + } |
| 502 | + } |
| 503 | + |
491 | 504 | return |
492 | 505 | } |
493 | 506 |
|
|
0 commit comments