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.
This commit is contained in:
Kartik K. Agaram 2021-04-05 22:28:26 -07:00
parent 316bf37541
commit 143cce94ee
4 changed files with 67 additions and 4 deletions

View File

@ -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

View File

@ -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:

View File

@ -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
}

View File

@ -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