Start SDL text input: the AKGL build's keyboard was dead

SDL3 has text input off by default and per-window, so without
SDL_StartTextInput() it emits no SDL_EVENT_TEXT_INPUT at all and every
keystroke reaches libakgl's ring with an empty text field. The editor had just
been changed to prefer that composed text over the keycode, so it read every
key as not-a-character: no echo in the window, and nothing on stdout either,
because RUN could never be typed. One cause, both symptoms.

The editor now falls back to the keycode when there is no composed text, so a
host that forgets to start text input gets a worse keyboard rather than none.

The suite missed this because every keyboard test pushes the text-input event
into SDL's queue by hand -- which is what a real keyboard produces, but only
once text input has been started. Synthesising the end of a chain cannot test
the beginning of it. The new test asserts SDL_TextInputActive() directly, and
both halves were checked by reverting each and watching it fail.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Andrew Kesterson <andrew@aklabs.net>
This commit is contained in:
2026-07-31 14:23:07 -04:00
parent b751c1b600
commit f77f759b54
4 changed files with 115 additions and 2 deletions

View File

@@ -13,6 +13,7 @@
* equivalent until then.
*/
#include <ctype.h>
#include <stdio.h>
#include <string.h>
@@ -218,8 +219,28 @@ static void edit_key(akbasic_AkglSink *state, const akgl_Keystroke *key, bool *s
}
/*
* No composed text: a cursor key, a function key or a bare modifier. Not an
* editing command here -- a script's own GET loop is what wants those.
* No composed text, but a printable keycode: type it anyway.
*
* **This fallback is why the editor still works on a host that never called
* SDL_StartTextInput().** SDL emits no SDL_EVENT_TEXT_INPUT until text input
* is started, so without it every keystroke arrives here with an empty
* `text` -- and treating that as "not a character" makes the entire keyboard
* dead, silently, which is exactly what happened once. A worse keyboard is a
* great deal better than no keyboard.
*
* Upper case, because that is all a bare keycode can offer and it is what a
* C128 does. When text input *is* running a printable key always carries
* text, so this never fires and lower case survives.
*/
if ( key->key >= 0x20 && key->key < 0x7f ) {
edit_append(state, (char)toupper((unsigned char)key->key));
echo_line(state);
return;
}
/*
* Neither: a cursor key, a function key or a bare modifier. Not an editing
* command here -- a script's own GET loop is what wants those.
*/
}