Skip to content

Commit ff60064

Browse files
committed
added alt detection to keyboard input parser
1 parent 9e85f9b commit ff60064

File tree

1 file changed

+120
-107
lines changed

1 file changed

+120
-107
lines changed

input.odin

Lines changed: 120 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package termcl
22

3-
import "core:strconv"
4-
import "core:unicode"
53
import "core:fmt"
64
import "core:os"
5+
import "core:strconv"
6+
import "core:unicode"
77

88
Input :: distinct []byte
99

@@ -151,195 +151,198 @@ check what value it is processed into.
151151
For example, `.Escape` is either Esc, Ctrl + [ and Ctrl + 3 to the terminal.
152152
*/
153153
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 {
180156
case '\x1b':
181-
seq.key = .Escape
157+
key = .Escape
182158
case '1':
183-
seq.key = .Num_1
159+
key = .Num_1
184160
case '2':
185-
seq.key = .Num_2
161+
key = .Num_2
186162
case '3':
187-
seq.key = .Num_3
163+
key = .Num_3
188164
case '4':
189-
seq.key = .Num_4
165+
key = .Num_4
190166
case '5':
191-
seq.key = .Num_5
167+
key = .Num_5
192168
case '6':
193-
seq.key = .Num_6
169+
key = .Num_6
194170
case '7':
195-
seq.key = .Num_7
171+
key = .Num_7
196172
case '8':
197-
seq.key = .Num_8
173+
key = .Num_8
198174
case '9':
199-
seq.key = .Num_9
175+
key = .Num_9
200176
case '0':
201-
seq.key = .Num_0
177+
key = .Num_0
202178
case '\r', '\n':
203-
seq.key = .Enter
179+
key = .Enter
204180
case '\t':
205-
seq.key = .Tab
181+
key = .Tab
206182
case 8, 127:
207-
seq.key = .Backspace
183+
key = .Backspace
208184
case 'a', 'A':
209-
seq.key = .A
185+
key = .A
210186
case 'b', 'B':
211-
seq.key = .B
187+
key = .B
212188
case 'c', 'C':
213-
seq.key = .C
189+
key = .C
214190
case 'd', 'D':
215-
seq.key = .D
191+
key = .D
216192
case 'e', 'E':
217-
seq.key = .E
193+
key = .E
218194
case 'f', 'F':
219-
seq.key = .F
195+
key = .F
220196
case 'g', 'G':
221-
seq.key = .G
197+
key = .G
222198
case 'h', 'H':
223-
seq.key = .H
199+
key = .H
224200
case 'i', 'I':
225-
seq.key = .I
201+
key = .I
226202
case 'j', 'J':
227-
seq.key = .J
203+
key = .J
228204
case 'k', 'K':
229-
seq.key = .K
205+
key = .K
230206
case 'l', 'L':
231-
seq.key = .L
207+
key = .L
232208
case 'm', 'M':
233-
seq.key = .M
209+
key = .M
234210
case 'n', 'N':
235-
seq.key = .N
211+
key = .N
236212
case 'o', 'O':
237-
seq.key = .O
213+
key = .O
238214
case 'p', 'P':
239-
seq.key = .P
215+
key = .P
240216
case 'q', 'Q':
241-
seq.key = .Q
217+
key = .Q
242218
case 'r', 'R':
243-
seq.key = .R
219+
key = .R
244220
case 's', 'S':
245-
seq.key = .S
221+
key = .S
246222
case 't', 'T':
247-
seq.key = .T
223+
key = .T
248224
case 'u', 'U':
249-
seq.key = .U
225+
key = .U
250226
case 'v', 'V':
251-
seq.key = .V
227+
key = .V
252228
case 'w', 'W':
253-
seq.key = .W
229+
key = .W
254230
case 'x', 'X':
255-
seq.key = .X
231+
key = .X
256232
case 'y', 'Y':
257-
seq.key = .Y
233+
key = .Y
258234
case 'z', 'Z':
259-
seq.key = .Z
235+
key = .Z
260236
case ',':
261-
seq.key = .Comma
237+
key = .Comma
262238
case ':':
263-
seq.key = .Colon
239+
key = .Colon
264240
case ';':
265-
seq.key = .Semicolon
241+
key = .Semicolon
266242
case '-':
267-
seq.key = .Minus
243+
key = .Minus
268244
case '+':
269-
seq.key = .Plus
245+
key = .Plus
270246
case '=':
271-
seq.key = .Equal
247+
key = .Equal
272248
case '{':
273-
seq.key = .Open_Curly_Bracket
249+
key = .Open_Curly_Bracket
274250
case '}':
275-
seq.key = .Close_Curly_Bracket
251+
key = .Close_Curly_Bracket
276252
case '(':
277-
seq.key = .Open_Paren
253+
key = .Open_Paren
278254
case ')':
279-
seq.key = .Close_Paren
255+
key = .Close_Paren
280256
case '[':
281-
seq.key = .Open_Square_Bracket
257+
key = .Open_Square_Bracket
282258
case ']':
283-
seq.key = .Close_Square_Bracket
259+
key = .Close_Square_Bracket
284260
case '/':
285-
seq.key = .Slash
261+
key = .Slash
286262
case '\'':
287-
seq.key = .Single_Quote
263+
key = .Single_Quote
288264
case '"':
289-
seq.key = .Double_Quote
265+
key = .Double_Quote
290266
case '.':
291-
seq.key = .Period
267+
key = .Period
292268
case '*':
293-
seq.key = .Asterisk
269+
key = .Asterisk
294270
case '`':
295-
seq.key = .Backtick
271+
key = .Backtick
296272
case '\\':
297-
seq.key = .Backslash
273+
key = .Backslash
298274
case ' ':
299-
seq.key = .Space
275+
key = .Space
300276
case '$':
301-
seq.key = .Dollar
277+
key = .Dollar
302278
case '!':
303-
seq.key = .Exclamation
279+
key = .Exclamation
304280
case '#':
305-
seq.key = .Hash
281+
key = .Hash
306282
case '%':
307-
seq.key = .Percent
283+
key = .Percent
308284
case '&':
309-
seq.key = .Ampersand
285+
key = .Ampersand
310286
case '´':
311-
seq.key = .Tick
287+
key = .Tick
312288
case '_':
313-
seq.key = .Underscore
289+
key = .Underscore
314290
case '^':
315-
seq.key = .Caret
291+
key = .Caret
316292
case '|':
317-
seq.key = .Pipe
293+
key = .Pipe
318294
case '@':
319-
seq.key = .At
295+
key = .At
320296
case '~':
321-
seq.key = .Tilde
297+
key = .Tilde
322298
case '<':
323-
seq.key = .Less_Than
299+
key = .Less_Than
324300
case '>':
325-
seq.key = .Greater_Than
301+
key = .Greater_Than
326302
case '?':
327-
seq.key = .Question_Mark
303+
key = .Question_Mark
328304
case:
305+
ok = false
329306
return
330307
}
331308

332-
return seq, true
309+
ok = true
310+
return
333311
}
334312

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+
}
336337

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
340341
return seq, true
341342
}
342343

344+
if input[0] != '\x1b' do return
345+
343346
if len(input) > 3 {
344347
input_len := len(input)
345348

@@ -488,6 +491,16 @@ parse_keyboard_input :: proc(input: Input) -> (keyboard_input: Keyboard_Input, h
488491
return seq, true
489492
}
490493

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+
491504
return
492505
}
493506

0 commit comments

Comments
 (0)