# 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 --
`, 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.
1. `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.
2. 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 logged
`home-layout-changed`. The saved `home.json` dock then read
`[foot, Nautilus, editor, htop, null, k230-video]`: six entries, persisted.
`board-video-dropped-in-slot-6-1280x800-grim.png` shows the result while
still in rearrange mode.
3. `click 1194 80` (Done), then `click 1162 720` on the sixth slot. The shell
logged `app-launch-requested` and `app-launch-mapped`, so the new slot's
hit area launches its app. `board-video-in-slot-6-1280x800-grim.png` shows
Home with Video in slot 6, out of rearrange mode, before the launch.
4. Cleanup: the Video window was closed, and Video was dragged back to its
grid cell. `home.json` again 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.