diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-04-05 22:28:26 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-04-05 22:37:27 -0700 |
commit | 143cce94eea904ef025c94238fe3541b87ad694e (patch) | |
tree | 594a28c8f9008fc812ce09403c09fcddacf81168 | |
parent | 316bf37541c820e3c9d4b6640f4db324c4b2963b (diff) | |
download | mu-143cce94eea904ef025c94238fe3541b87ad694e.tar.gz |
support for arrow keys
Mu's keyboard handling is currently a bit of a mess, and this commit might be a bad idea. Ideally keyboards would return Unicode. Currently Mu returns single bytes. Mostly ASCII. No support for international keyboards yet. ASCII and Unicode have some keyboard scancodes grandfathered in, that don't really make sense for data transmission. Like backspace and delete. However, other keyboard scancodes don't have any place in Unicode. Including arrow keys. So Mu carves out an exception to Unicode for arrow keys. We'll place the arrow keys in a part of Unicode that is set aside for implementation-defined behavior (https://en.wikipedia.org/wiki/C0_and_C1_control_codes#C1_controls): 0x80: left arrow 0x81: down arrow 0x82: up arrow 0x83: right arrow The order is same as hjkl for mnemonic convenience. I'd _really_ to follow someone else's cannibalization here. If I find one later, I'll switch to it. Applications that blindly assume the keyboard generates Unicode will have a bad time. Events like backspace, delete and arrow keys are intended to be processed early and should not be in text. With a little luck I won't need to modify this convention when I support international keyboards.
-rw-r--r-- | 102keyboard.subx | 12 | ||||
-rw-r--r-- | boot.subx | 33 | ||||
-rw-r--r-- | shell/gap-buffer.mu | 12 | ||||
-rw-r--r-- | shell/trace.mu | 14 |
4 files changed, 67 insertions, 4 deletions
diff --git a/102keyboard.subx b/102keyboard.subx index e8d23962..0c8826e1 100644 --- a/102keyboard.subx +++ b/102keyboard.subx @@ -6,6 +6,18 @@ == code +# Most keys correspond to their ASCII/Unicode values. +# TODO: Support for international keyboards and multi-byte Unicode. +# +# However there are some exceptions that have no assigned place in Unicode +# (and with good reason): +# 0x80 = left arrow ← +# 0x81 = down arrow ↓ +# 0x82 = up arrow ↑ +# 0x83 = right arrow → +# These code points are not used by Unicode and their semantics are agreed to +# be context-sensitive: https://en.wikipedia.org/wiki/C0_and_C1_control_codes#C1_controls. +# Mu cannibalizes them in yet another non-standard way. read-key: # kbd: (addr keyboard) -> result/eax: byte # . prologue 55/push-ebp diff --git a/boot.subx b/boot.subx index 6982fccb..e8c86682 100644 --- a/boot.subx +++ b/boot.subx @@ -500,8 +500,14 @@ Keyboard-normal-map: 00 20 # 3a 00 00 00 00 00 00 -00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -# numeric keypad would start here, but isn't implemented +00 00 00 00 00 00 00 00 +# 48 +# ↑* ←* →* ↓* + 82 00 00 80 00 83 00 00 81 +# 51 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +# * - Not a valid ASCII/Unicode value. Keyboard-shift-map: 00 @@ -526,8 +532,14 @@ Keyboard-shift-map: 00 20 # 3a 00 00 00 00 00 00 -00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -# numeric keypad would start here, but isn't implemented +00 00 00 00 00 00 00 00 +# 48 +# ↑* ←* →* ↓* + 82 00 00 80 00 83 00 00 81 +# 51 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +# * - Not a valid ASCII/Unicode value. Keyboard-ctrl-map: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @@ -543,6 +555,19 @@ Keyboard-ctrl-map: # 2c # ^z ^x ^c ^v ^b ^n ^m ^/ 1a 18 03 16 02 0e 0d 00 00 1f 00 00 +# 38 +# space + 00 20 +# 3a + 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 +# 48 +# ↑* ←* →* ↓* + 82 00 00 80 00 83 00 00 81 +# 51 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +# * - Not a valid ASCII/Unicode value. # }}} Video-mode-info: diff --git a/shell/gap-buffer.mu b/shell/gap-buffer.mu index b3c84532..616500b0 100644 --- a/shell/gap-buffer.mu +++ b/shell/gap-buffer.mu @@ -759,6 +759,18 @@ fn edit-gap-buffer self: (addr gap-buffer), key: grapheme { delete-before-gap self return } + { + compare g, 0x80/left-arrow + break-if-!= + var dummy/eax: grapheme <- gap-left self + return + } + { + compare g, 0x83/right-arrow + break-if-!= + var dummy/eax: grapheme <- gap-right self + return + } # default: insert character add-grapheme-at-gap self, g } diff --git a/shell/trace.mu b/shell/trace.mu index 0736f796..b0c43f74 100644 --- a/shell/trace.mu +++ b/shell/trace.mu @@ -690,6 +690,13 @@ fn edit-trace _self: (addr trace), key: grapheme { increment *cursor-y return } + { + compare key, 0x81/down-arrow + break-if-!= + var cursor-y/eax: (addr int) <- get self, cursor-y + increment *cursor-y + return + } # cursor up { compare key, 0x6b/k @@ -698,6 +705,13 @@ fn edit-trace _self: (addr trace), key: grapheme { decrement *cursor-y return } + { + compare key, 0x82/up-arrow + break-if-!= + var cursor-y/eax: (addr int) <- get self, cursor-y + decrement *cursor-y + return + } # enter = expand { compare key, 0xa/newline |