diff --git a/docs/manual-checks.md b/docs/manual-checks.md index 7947f78..ce5b60a 100644 --- a/docs/manual-checks.md +++ b/docs/manual-checks.md @@ -1334,6 +1334,23 @@ by gesture or by the arrow, returns to Settings and not to HOSTS; a second back **Failure means:** `ShellScreen.Vault` is missing from `IsMoreSurface` or from the back gesture's first case, and those two have to move together — the switch mirrors that property by construction. +### 11.10 The accessory keys do not cost the terminal its keyboard · **needs a hardware keyboard** + +With a shell open and a Bluetooth or USB keyboard paired, type into the terminal and confirm it arrives. +Now tap **Tab** on the accessory row, or **A+**, and type again. + +**Pass:** the byte the key sent arrives, and so does everything typed after it. The terminal still has the +keyboard. + +**Failure means:** the buttons on that row have become focusable again. An ordinary Avalonia button takes +focus on tap, which takes it off the `NativeWebView` — and the package's own `OnLostFocus` then resigns the +page's focus. The row goes on working, because its keys are pressed rather than typed into, so the symptom +is a terminal that answers the buttons and ignores the keyboard: it reads as the session having died. See +`Focusable = false` in `TerminalScreen.axaml.cs` and the focus entry in `docs/platform-flags.md`. + +Worth doing on the software keyboard too, where the same fault shows as the keyboard closing on the first +tap of an arrow key. + --- ## Phase 12 — Shared vaults: the operations that span two accounts diff --git a/docs/platform-flags.md b/docs/platform-flags.md index 9528158..da9d92e 100644 --- a/docs/platform-flags.md +++ b/docs/platform-flags.md @@ -168,6 +168,18 @@ that reports `GetFocus()`, the class name of the window holding it, and the page could fire. Not Escape, and not a bare F6: both are keys a TUI legitimately binds, and Ctrl+Shift is the range terminal emulators conventionally keep for themselves. +**On the phone the same asymmetry arrives through a button, and the fix is one property.** The terminal's +accessory row — Ctrl, Esc, Tab, the arrows, and the two text-size keys — is a set of ordinary Avalonia +buttons over a `NativeWebView`. An ordinary button takes focus on tap, which takes it off the WebView, and +`OnLostFocus` then calls the adapter's `ResignFocus()`. So pressing Tab handed the terminal one byte and +took the keyboard away from it: everything typed afterwards on a hardware keyboard went nowhere. + +The symptom is what makes it worth an entry. The row goes on working — its keys are *pressed* rather than +typed into — so what a user sees is a terminal that answers the buttons and ignores the keyboard, which +reads as the session having died rather than as a focus problem. `Focusable = false` is what a toolbar +button is, and it means the focused element never changes, so nothing resigns and nothing has to be handed +back. Every button on that row carries it; check 11.10 is the measurement. + None of this is covered by a test, and cannot be here: headless Avalonia has no native window, so a headless test renders and focuses correctly and would confirm the wrong belief. What the suite covers is the plumbing that drives it — that connecting asks for focus once per session, that a failed connect does diff --git a/src/DodoSSH.Client.Android/Views/TerminalScreen.axaml b/src/DodoSSH.Client.Android/Views/TerminalScreen.axaml index 3117c02..89e6e68 100644 --- a/src/DodoSSH.Client.Android/Views/TerminalScreen.axaml +++ b/src/DodoSSH.Client.Android/Views/TerminalScreen.axaml @@ -347,6 +347,11 @@ Disabled at the ends rather than clamping silently. A button that keeps accepting taps and does nothing reads as the terminal having stopped responding, which is the one thing this screen must never look like. + + ◆ Focusable="False", for the reason the accessory keys carry in code — see + TerminalScreen.axaml.cs. Every button on this row sits over a terminal somebody is typing into, + and an ordinary one takes Avalonia's focus off the NativeWebView on tap, which makes the package + resign the page's focus. Making the text smaller must not cost the keyboard. --> @@ -356,7 +361,7 @@