diff options
Diffstat (limited to 'kernel/input.rv')
| -rw-r--r-- | kernel/input.rv | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/kernel/input.rv b/kernel/input.rv index 26ce545..ed0f4f7 100644 --- a/kernel/input.rv +++ b/kernel/input.rv @@ -25,11 +25,13 @@ end # she stroke my keys till i handle # no fr this is just a key stroke handler -global shell = { line = "", shift = :false, extended = :false } +global shell = { shift = :false, extended = :false, ctrl = :false } fn decode_key(code) do if code == 0x2a or code == 0x36 do shell.shift = :true return :nil end # shift down if code == 0xaa or code == 0xb6 do shell.shift = :false return :nil end # shift up + if code == 0x1d do shell.ctrl = :true return :nil end # ctrl down + if code == 0x9d do shell.ctrl = :false return :nil end # ctrl up if code >= 128 return :nil # other releases if code == 28 return "\n" # enter if code == 14 return "\x08" # backspace @@ -37,7 +39,8 @@ fn decode_key(code) do if code >= KEYMAP:len() return :nil const character = if shell.shift KEYMAP_SHIFT[code] else KEYMAP[code] if character == " " and code != 0x39 return :nil # blank cells = modifiers/unmapped - character + if shell.ctrl return string.of_ascii(character:ascii() band 0x1f) + return character end global on_key = fn(code) do @@ -49,21 +52,15 @@ global on_key = fn(code) do else if code == 0x50 do final = 66 end # down else if code == 0x4d do final = 67 end # right else if code == 0x4b do final = 68 end # left + else if code == 0x47 do final = 72 end # home + else if code == 0x4f do final = 70 end # end if final != 0 do - stdin_deliver(27) - stdin_deliver(91) - stdin_deliver(final) + tty:feed(27) tty:feed(91) tty:feed(final) end return :nil end const character = decode_key(code) if character == :nil return :nil - if stdin_deliver(character:ascii()) return :nil - if character == "\n" do puts("\n") run(shell.line) shell.line = "" return :nil end - if character == "\x08" do - if shell.line:len() > 0 do shell.line = shell.line:sub(0, shell.line:len() - 1) puts("\x08 \x08") end - return :nil - end - shell.line ~= character - puts(character) + tty:feed(character:ascii()) end + |
