Watch
1
0
Fork
You've already forked SouveraineOS
0

keyboard: make Squeekboard the single path

This commit is contained in:
Fimeg 2026-08-11 15:44:49 -04:00
commit 89cf93f965
4 changed files with 69 additions and 42 deletions

View file

@ -1,4 +1,4 @@
---
---
outlines:
default: { width: 48.3, height: 79 }
tilda: { width: 30, height: 79 }
@ -10,7 +10,7 @@ outlines:
fndefault: { width: 55.3, height: 79 }
fnright2x: { width: 101, height: 79 }
fnhome: { width: 75.6, height: 79 }
views:
base:
@ -18,13 +18,13 @@ views:
- "Tab q w e r t y u i o p [ ] \\"
- "Ctrl a s d f g h j k l ; ' Return"
- "Shift_L z x c v b n m , . / Up Shift_R"
- "Esc preferences Alt Menu space show_fnkeys Left Down Right"
- "Esc preferences Alt Voice space show_fnkeys Left Down Right"
upper:
- "~ ! @ # $ % ^ & * ( ) _ + BackSpace"
- "Tab Q W E R T Y U I O P [ ] |"
- "Ctrl A S D F G H J K L : \" Return"
- "Shift_L Z X C V B N M < > ? Up Shift_R"
- "Esc preferences Alt Menu space show_fnkeys Left Down Right"
- "Esc preferences Alt Voice space show_fnkeys Left Down Right"
fnkeys:
- "Voice F1 F2 F3 F4 Seven Eight Nine NumSlash Home BkspFn"
- "TabFn F5 F6 F7 F8 Four Five Six NumAst End Ins Del"
@ -35,7 +35,8 @@ views:
buttons:
Voice:
outline: "lctrlesc"
text: " "
label: "🎙"
action: dictate
Shift_L:
action:
locking:
@ -276,7 +277,3 @@ buttons:
TabFn:
outline: "lctrlesc"
keysym: "Tab"

View file

@ -1,4 +1,4 @@
---
---
outlines:
default: { width: 48.3, height: 79 }
tilda: { width: 30, height: 79 }
@ -10,7 +10,7 @@ outlines:
fndefault: { width: 55.3, height: 79 }
fnright2x: { width: 101, height: 79 }
fnhome: { width: 75.6, height: 79 }
views:
base:
@ -18,13 +18,13 @@ views:
- "Tab q w e r t y u i o p [ ] \\"
- "Ctrl a s d f g h j k l ; ' Return"
- "Shift_L z x c v b n m , . / Up Shift_R"
- "Esc preferences Alt Menu space show_fnkeys Left Down Right"
- "Esc preferences Alt Voice space show_fnkeys Left Down Right"
upper:
- "~ ! @ # $ % ^ & * ( ) _ + BackSpace"
- "Tab Q W E R T Y U I O P [ ] |"
- "Ctrl A S D F G H J K L : \" Return"
- "Shift_L Z X C V B N M < > ? Up Shift_R"
- "Esc preferences Alt Menu space show_fnkeys Left Down Right"
- "Esc preferences Alt Voice space show_fnkeys Left Down Right"
fnkeys:
- "Voice F1 F2 F3 F4 Seven Eight Nine NumSlash Home BkspFn"
- "TabFn F5 F6 F7 F8 Four Five Six NumAst End Ins Del"
@ -35,7 +35,8 @@ views:
buttons:
Voice:
outline: "lctrlesc"
text: " "
label: "🎙"
action: dictate
Shift_L:
action:
locking:
@ -276,7 +277,3 @@ buttons:
TabFn:
outline: "lctrlesc"
keysym: "Tab"

View file

@ -1,11 +1,35 @@
# TASK 17 — Keyboard (stevia) + dictation polish
**Status:** shipped-partial; daily dictation use confirmed 2026-08-07. The
phone went from NO on-screen keyboard to a working patched stevia with a mic
key and live dictation in one session. What shipped works; the follow-ons are
UX/layout polish.
**Status:** Squeekboard replacement source authored 2026-08-11; parser tests
green, full package build and glass proof pending. Stevia remains the active
fallback until the new Squeekboard package is installed and survives repeated
dismiss/reopen cycles.
## What shipped (2026-07-21)
## Current decision (2026-08-11)
One keyboard owns the phone: Squeekboard. The daily layout has a permanent
number row plus Fn/numpad; the terminal hint selects the compact terminal
layout. Both expose the same first-party dictation action. The old
Stevia/Squeekboard switcher and drag-up keyboard swap retire only after the
replacement is proven on glass.
`Pixel3Arch/pkgs/squeekboard` now carries:
- a `dictate` layout action that spawns packaged
`/usr/bin/souveraine-stt`;
- daily and terminal layouts with the mic available from their base rows;
- a Cairo-drawn, state-honest mic: restrained violet at idle, three breathing
violet bubbles while recording, a rotating broken ring while transcribing,
and a red-violet error mark;
- animation driven by
`$XDG_RUNTIME_DIR/souveraine-stt/state`, polled only while the keyboard
widget is mapped.
No bitmap was imported and no Stevia completion code was reused. Native
Squeekboard word completion remains the next layer after the single-keyboard
path is stable.
## Earlier Stevia path (historical, currently installed)
- **stevia is the OSK**, patched to run under Hyprland. Upstream stevia
hard-requires `zphoc_device_state_v1` (phoc-private) before creating a
@ -31,14 +55,11 @@ UX/layout polish.
4xx / unreachable from a genuine empty transcript. The old "didn't catch
that" on any no-text result masked a whole server outage as a mic bug.
## Follow-ons (the polish that remains)
## Historical follow-ons and retained evidence
1. **Dictation UX**: the mic key spawns the CLI fire-and-forget — no
in-keyboard recording indicator (the CLI sends a notify-send "Listening…"
toast, which is coarse). A pressed/recording state on the key itself
(stevia has `--status` wired: `souveraine-stt --status` → idle|recording)
would be the honest tell. Needs a stevia patch to poll status and
restyle the key, OR drive it off the notify path.
1. **Dictation UX:** the earlier Stevia implementation established the state
contract. Squeekboard now renders that contract directly in the mic key;
package and glass proof remain.
**2026-07-30 progress:**
- `souveraine-stt` now writes a 3-state file
@ -95,11 +116,14 @@ UX/layout polish.
## Acceptance
Keyboard usable in every app; mic key dictates real speech into the
focused field (verified 2026-07-21: "Hello, can you hear me?" end-to-end);
pill dismisses without eating key taps; number row, layout switcher, Hunspell
suggestions and compact arrows work in the daily layout; a recording indicator
makes the mic key's state obvious.
Squeekboard raises from ordinary and terminal inputs, types letters/numbers,
and survives at least five dismiss/reopen cycles. Its mic key dictates real
speech into the focused field and visibly traverses idle → recording →
transcribing → idle; the error state is also forced once. The AI side panels
must not dismiss or strand it. Only after that proof may Stevia,
`souveraine-osk-switch`, and the shell's keyboard-swap gesture be removed.
Native word completion is a following acceptance step, not a blocker for the
single-keyboard cutover.
## Connects to

View file

@ -1,7 +1,8 @@
# TASK 70 — The island: agent surfacing for the shell (and her face)
**Status:** recon 2026-08-11, nothing built. **Adjacent to:** TASK-69 (the
session daemon is this surface's data source). **Source reviewed:**
**Status:** source implemented; relocation into the AI panel is uncommitted
and not installed as of 2026-08-11. **Adjacent to:** TASK-69 (the session
daemon is this surface's data source). **Source reviewed:**
`patheonsceo/Dynamic-island-for-arch` ("Open Agent Island", upstream clone for
reference). **Twines with:** TASK-59 (the avatar).
@ -134,11 +135,19 @@ would be a guess wearing the costume of a measurement.
### Status
Untested against a running shell — nothing has rendered. `qmllint` is clean on
all four files, but it cannot resolve `qs.*` imports from the repo, so
property-level mistakes will only appear at load. Acceptance ("one real session
showing, safety suite green") is **not** met: the sessions are real and shown,
the permission half is not built.
The first bar rendering was installed on laptop and phone. Casey's glass
review rejected that placement: the phone bar has no room for agent-session
chrome, and activity belongs beside the conversation it describes.
The source now removes `island` from both bar profiles and mounts a compact,
expandable `AgentSessionPanel` at the top of `AiChat`. It consumes the
existing `AgentSessions` singleton and `IslandExpansion`; no second
collector or session model was introduced. This relocation is source-only
until packaged. The phone may receive it with the next package; the laptop's
live shell must wait for Casey's coordinated larger push.
Acceptance remains partial: real session status is implemented read-only; the
permission half is deliberately not built.
**Method note:** `/usr/bin/qmllint` is a **Qt5** binary that prints nothing and
exits 0 on broken input — it is not a gate. Use `/usr/lib/qt6/bin/qmllint`, and