diff options
| author | Adam Malczewski <[email protected]> | 2026-06-13 16:51:27 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-13 16:51:27 +0900 |
| commit | 2b99158e5f1be1a51c9e6bf351e058efa98e63c4 (patch) | |
| tree | 8e154bc5ef0b7bccbc447a848fb80c05acb8ddfe | |
| parent | c378dd00fee61799feaab9c6d84a73d69691d8dc (diff) | |
| download | unbox-2b99158e5f1be1a51c9e6bf351e058efa98e63c4.tar.gz unbox-2b99158e5f1be1a51c9e6bf351e058efa98e63c4.zip | |
Stage dock: land plan + vocabulary (Fork B, mechanism/policy split)
Slice 10 (stage dock): Stage-Manager-style left-edge dock of minimized-window
previews revealed by a left-edge swipe. Records the Fork-B decision (previews are
toplevel snapshots imported as textures into the RMLUi context, shown as <img> in
one RML document) and the mechanism/policy split (kernel: snapshot + list bindings
+ gesture-claim; ext-xdg-shell: hide/show/geometry/scene_tree; ext-stage-dock:
minimized set, layout, recognition, easing). Adds canonical terms: stage dock,
stage (reserved), preview, favicon, gesture, swipe, minimize, restore, reveal.
| -rw-r--r-- | GLOSSARY.md | 14 | ||||
| -rw-r--r-- | notes/plan.md | 2 | ||||
| -rw-r--r-- | tasks.md | 35 |
3 files changed, 45 insertions, 6 deletions
diff --git a/GLOSSARY.md b/GLOSSARY.md index e68c9a7..83123a2 100644 --- a/GLOSSARY.md +++ b/GLOSSARY.md @@ -54,6 +54,20 @@ | **keybinding** | A key-combo → action mapping declared in `unbox.toml` (`[[keybind]]`), matched on the kernel's `key_filter`. Owned by ext-keybindings. | shortcut, hotkey, accelerator | | **action** | The verb a keybinding triggers: `spawn`, `focus-next`, `focus-prev`, `close-active`, `quit`. | command (reserved for the `spawn` shell string) | | **tap binding** | A keybinding on a bare modifier (e.g. `"Super"`) that fires on release only if it was pressed and released with nothing in between. | — | +| **gesture** | A recognized touch/pointer motion pattern an extension CLAIMS before clients see it (the touch analogue of the key_filter consume-or-pass). Recognition is a pure core; the claim/intercept is a kernel mechanism. | — | +| **swipe** | A straight-line gesture; e.g. the left-edge swipe that reveals the stage dock. | fling, drag (when meaning a recognized swipe) | + +## Stage dock (ext-stage-dock) + +| Term | Meaning | Aliases to avoid | +|---|---|---| +| **stage dock** | The left-edge ui surface holding window **previews**, revealed by an edge **swipe** (and, in a future slice, **stages**). One RML document in the overlay scene layer. Owned by ext-stage-dock (standard tier). | sidebar, shelf, dock (bare), taskbar, panel | +| **stage** | RESERVED — a future workspace-like grouping shown in the stage dock. NOT implemented; do not use the word for anything else yet. | (reserved) | +| **preview** | A frozen, graphically scaled image of a toplevel's pixels, snapshotted at minimize time and imported as a texture the ui substrate shows inside a ui surface (a stage-dock slot). NOT live. | thumbnail, snapshot, mini-window | +| **favicon** | The application icon shown on a preview, resolved from the toplevel's `app_id` via the XDG icon theme. (User-chosen term, overriding the usual "app icon".) | app icon, icon (when meaning this) | +| **minimize** | Compositor-side: hide a toplevel into the stage dock as a preview. The toplevel stays MAPPED (no xdg unmap); its scene node detaches and frame callbacks cease. The hide/show MECHANISM is ext-xdg-shell's `Toplevel::hide()/show()`; "minimized" STATE + dock placement are ext-stage-dock policy. | iconify, hide (bare) | +| **restore** | Return a minimized toplevel to the normal layer at its prior geometry and focus it; its preview leaves the dock. | unminimize, unhide | +| **reveal** | The proportional, finger-following show/hide of the stage dock driven by the edge swipe (fraction 0..1); release snaps fully open or closed. | slide, animate (bare) | ## Workflow diff --git a/notes/plan.md b/notes/plan.md index c2d7258..f7a9db0 100644 --- a/notes/plan.md +++ b/notes/plan.md @@ -66,6 +66,8 @@ solves), and the trigger that would reopen it. | **Keybindings are config-driven via `unbox.toml`** — ext-keybindings (core) is the first `unbox.toml` consumer/parser; external fuzzel-on-Super stands in for an in-process launcher for now | Fastest path to a usable DE (Super→fuzzel, Alt+Tab); exercises the key_filter + ext-xdg-shell focus contract with no new UI | A bespoke in-process launcher/taskbar lands (slice 6) | | **Kernel exports `WAYLAND_DISPLAY`** (setenv at startup) so any process an extension spawns connects to unbox, not the session that launched unbox | Spawned clients inherit the process env; without it fuzzel hit the parent labwc (`wayland-0`) → "no monitors" | — | | **VT switching (Ctrl+Alt+Fn) is kernel-hardwired** before the key_filter (`wlr_session_change_vt`) | It is the session escape hatch — must work even if an extension throws or greedily consumes keys; not a rebindable feature (user decision) | — | +| **Stage dock** (ext-stage-dock, standard) = the Stage-Manager-style left-edge dock of minimized-window **previews**, revealed by a left-edge **swipe**. **Fork B**: previews are toplevel snapshots imported as textures INTO the ui substrate's RMLUi context and shown as `<img>` in ONE RML document | Closest to the iPad Stage Manager north star; one ui surface animates as a unit via RCSS; reuses the slice-3 dmabuf/EGLImage bridge in reverse (wlr pixels → RMLUi texture) instead of two-layer scene/RML lockstep | Cross-context texture import proves infeasible on crocus → fall back to Fork A (previews as `wlr_scene` snapshot nodes) | +| **Mechanism in kernel/core, policy in ext-stage-dock.** Kernel ui substrate gains: preview-snapshot, list/container bindings, a gesture-CLAIM input path. ext-xdg-shell gains: `Toplevel::hide()/show()` (≠ unmap), `geometry()`, `scene_tree()`. ext-stage-dock owns: the "minimized" set, dock layout, gesture recognition, easing | Keeps "kernel names no feature" — snapshot/claim/list-bindings are generic primitives; minimize-to-dock is the only policy and lives in one standard extension | — | ## 3. Architecture @@ -14,12 +14,34 @@ out. Kernel now exports `WAYLAND_DISPLAY` so extension-spawned clients reach unb Follow-up: Ctrl+Alt+F1..F12 VT switching is now kernel-hardwired (the session escape hatch). -**Next action:** Slice 6 — ext-taskbar + ext-launcher (first standard -extensions; prove the ui-substrate contract). Queued into it from -slice 5: list/container data bindings (taskbar will change-request the -shape), keyboard-into-ui-surfaces (launcher text input), kernel removes -the deprecated no-op `Options::ui_spike` field, host-bin's demo ui -extension retires (replaced by the real consumers). +**Active — Slice 10: stage dock** (user-driven; supersedes slice 6 as the next +UI work). The Stage-Manager-style left-edge dock of minimized-window **previews**, +revealed by a left-edge **swipe**. **Fork B** (see plan.md §2): previews are +toplevel snapshots imported as textures into the RMLUi context, shown as `<img>` +in one RML document. Waves (a number per wave runs in parallel = disjoint units): + +- **a1** — kernel/ui-substrate SPIKE (opus), Fork-B gate: snapshot a toplevel → + import into the RMLUi context → show as `<img>` in a ui surface, scaled, on + crocus (nested + headless render-node). New public surface: `Preview` + + `UiSubstrate::create_preview(...)`. If cross-context import fails → fall back to + Fork A before building further. +- **b1** ext-xdg-shell: `Toplevel::hide()/show()` (≠ unmap) + `geometry()` + + `scene_tree()`. · **b2** kernel: UiSurface list/container bindings (the deferred + slice-6 list shape). · **b4** ext-stage-dock (new unit): skeleton + pure cores + (gesture recognizer + dock layout), doctest. +- **c1** kernel (opus): gesture-claim input path (intercept edge-origin + pointer/touch before client+substrate; drag stream; client touch-cancel). · + **c2** ext-stage-dock + host-bin: static integration — key-trigger minimize → + snapshot→slot→hide; tap slot→restore. (real-seat) +- **d1** ext-stage-dock: animated minimize/restore via RCSS transitions. (real-seat) + +Then e1 (gestural reveal + drag-out) and the config-driven keybinding migration +(stage-dock triggers → ext-keybindings actions + ext-stage-dock Service) follow d1. + +Slice 6 (ext-taskbar + ext-launcher) is paused; the stage dock matures the same +ui-substrate gaps it would have (list bindings, first real interactive consumer). +Still queued whenever UI work resumes: keyboard-into-ui-surfaces, removing the +deprecated no-op `Options::ui_spike`, retiring host-bin's demo ui. ## Slices @@ -36,6 +58,7 @@ extension retires (replaced by the real consumers). | 7 | ext-window-tiling: pure layout core + thin scene glue | pending | layout math 100% doctest-covered, zero wlroots types in core | | 8 | ext-osk: RML keyboard ui surface injecting via wlr_seat | pending | type into foot via touch only; auto-show on text-input focus | | 9 | Session hardening: s6 user service, TTY launch on seat0, layout persistence (append-only state + pure reconcile on boot) | pending | survives `kill -9` + s6 restart with workspaces restored | +| 10 | **Stage dock** (ext-stage-dock): minimized-window previews on a left-edge swipe (Fork B) | **in progress** | minimize→preview in dock→restore round-trips real-seat; previews are RMLUi-imported toplevel snapshots; gesture reveal follows the finger | ## Deferred decisions (decide when reached — see notes/plan.md §7) |
