app,widget: use arrow keys for Android navigation

Android doesn't distinguish between the arrow keys on a keyboard and the
directional keys on a remote control, so there's no way to move the caret
in an Editor with arrow keys. This change updates the Android port to map
Android's DPAD_* key codes to the arrow key names, fixing caret movement.
The change also updates Editor to only request arrow keys that actually move
the caret, to keep directional focus movement working.

Fixes: https://todo.sr.ht/~eliasnaur/gio/410
Signed-off-by: Mearaj <mearajbhagad@gmail.com>
This commit is contained in:
Mearaj
2022-05-10 15:58:48 +05:30
committed by Elias Naur
parent c68417aaf9
commit 7ced0d29ab
3 changed files with 24 additions and 10 deletions
+4 -4
View File
@@ -905,13 +905,13 @@ func convertKeyCode(code C.jint) (string, bool) {
case C.AKEYCODE_META_LEFT, C.AKEYCODE_META_RIGHT:
n = key.NameSuper
case C.AKEYCODE_DPAD_UP:
n = key.NameUp
n = key.NameUpArrow
case C.AKEYCODE_DPAD_DOWN:
n = key.NameDown
n = key.NameDownArrow
case C.AKEYCODE_DPAD_LEFT:
n = key.NameLeft
n = key.NameLeftArrow
case C.AKEYCODE_DPAD_RIGHT:
n = key.NameRight
n = key.NameRightArrow
default:
return "", false
}
+5 -4
View File
@@ -855,18 +855,19 @@ func (w *Window) processEvent(d driver, e event.Event) bool {
w.updateAnimation(d)
} else if e, ok := e.(key.Event); ok && e.State == key.Press {
handled = true
isMobile := runtime.GOOS == "ios" || runtime.GOOS == "android"
switch {
case e.Name == key.NameTab && e.Modifiers == 0:
w.moveFocus(router.FocusForward, d)
case e.Name == key.NameTab && e.Modifiers == key.ModShift:
w.moveFocus(router.FocusBackward, d)
case e.Name == key.NameUp && e.Modifiers == 0:
case e.Name == key.NameUpArrow && e.Modifiers == 0 && isMobile:
w.moveFocus(router.FocusUp, d)
case e.Name == key.NameDown && e.Modifiers == 0:
case e.Name == key.NameDownArrow && e.Modifiers == 0 && isMobile:
w.moveFocus(router.FocusDown, d)
case e.Name == key.NameLeft && e.Modifiers == 0:
case e.Name == key.NameLeftArrow && e.Modifiers == 0 && isMobile:
w.moveFocus(router.FocusLeft, d)
case e.Name == key.NameRight && e.Modifiers == 0:
case e.Name == key.NameRightArrow && e.Modifiers == 0 && isMobile:
w.moveFocus(router.FocusRight, d)
default:
handled = false