The dock grows on wide screens (task 7.3)
Operator design answer, 2026-10-14: “More slots when wide” — the dock grows past 4 slots on wide screens, and the extra slots stay empty until apps are pinned.
Rule
home_grid::dock_slots(width, height): one slot per grid column, but no more
than the icon budget leaves after one full page (icon.rs CACHE_LIMIT = 24,
so a full page plus its dock stays resident), and never fewer than the panel’s
4.
| Surface | Columns | Page | Dock |
|---|---|---|---|
| 568x1232 (portrait panel) | 4 | 20 | 4 |
| 1280x800 (HDMI) | 9 | 18 | 6 |
| 1280x720 (HDMI) | 9 | 18 | 6 |
| 1232x568 (landscape panel) | 9 | 18 | 6 |
| 1920x1080 (HDMI) | 14 | 42 | 4 (page alone is over budget) |
HomeLayout::fit_dock sizes the stored dock when the surface changes. Wider
surfaces add empty slots at the end. Narrower ones never hide a pinned item:
an item past the new end moves into the first empty slot that remains, or
onto the grid when the dock is full.
Host evidence (host render, 2026-10-16)
home-1280x800.png and home-1232x568.png come from
cargo run --offline --example render_responsive_evidence -- <dir>, which
fills the dock with synthetic apps. Each shows six dock slots. The portrait
home-568x1232.png from the same run is byte-identical to
docs/evidence/shell-responsive/home-568x1232.png.
cargo test --offline --manifest-path nix/rust-shell-client/Cargo.toml --no-fail-fast passed: 547 lib tests (2 ignored) plus every integration
target, 0 failures. The new tests are:
home_grid::a_wide_dock_grows_within_the_icon_budget: slot counts, no overlap, inside the surface, and a centre tap hits each slot.home_state::fit_dock_grows_empty_and_shrinks_without_hiding_an_item.
The older wide Home renders under shell-responsive/,
hdmi-hotplug/landscape/host-renders/ and panel-landscape/host/ record the
4-slot dock as it was before this change, and are left as history.
On the board (2026-10-16, ~00:44–00:48 CDT)
Evidence class: injected pointer events plus native grim captures. No
real glass and no camera. Build 3f6eca48
(.#kernelMainlineDrmShellLandscapeHdmiBootFiles), system
zqy2i8w0h672f69jw7843w1l0mqz4wv5, deployed live with
switch-to-configuration test and the boot profile set. HDMI-A-1 at
1280x800. Pointer input is tools/board-pointer.py, a uinput mouse.
board-six-slots-1280x800-grim.png: after the deploy, Home’s dock shows six slots. The user’s four pinned apps fill slots 1–4, and slots 5–6 are empty, as the operator asked.- A long press on the Video app in the grid, then a drag to the sixth slot
(
hold 640 190 900, 12 moves to 1162,720,up). The shell loggedhome-layout-changed. The savedhome.jsondock then read[foot, Nautilus, editor, htop, null, k230-video]: six entries, persisted.board-video-dropped-in-slot-6-1280x800-grim.pngshows the result while still in rearrange mode. click 1194 80(Done), thenclick 1162 720on the sixth slot. The shell loggedapp-launch-requestedandapp-launch-mapped, so the new slot’s hit area launches its app.board-video-in-slot-6-1280x800-grim.pngshows Home with Video in slot 6, out of rearrange mode, before the launch.- Cleanup: the Video window was closed, and Video was dragged back to its
grid cell.
home.jsonagain matches the operator’s layout (Video in grid slot 4, slots 5–6 empty).
Limits:
- Shrinking the dock (unplugging HDMI back to the portrait panel) with an
item in slot 5 or 6 was not exercised on the board; it is covered only by
fit_dock_grows_empty_and_shrinks_without_hiding_an_item. - The 1232x568 landscape panel dock is host-render evidence only.
- The first drag-back attempt did not take: the press landed in rearrange mode without a drag. A second attempt with a 1.2 s hold worked.