feat: give sessions the full height and overlay status content#14
Merged
Conversation
The last screen row is no longer reserved for a status bar. The keybind hint lives in the sidebar's bottom row, the separator runs through the last row, and the viewport (and the session inside it) spans the full terminal height. Status content (rename prompt, kill confirmation, the armed-prefix keybind list, transient messages) overlays the last row full-width while present; when it clears, the row repaints from cached sidebar and session state. A session cursor on the last row hides while the overlay shows so it does not blink over the text.
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The last screen row is no longer reserved for a status bar. Sessions in
boo uinow get the full terminal height, and the bottom row composes like every other row: sidebar, separator, viewport.Keybinds: Ctrl+Ahint moved into the sidebar's bottom row (it fits in the sidebar width), so the separator line runs all the way down.Layout.Hit.statusis gone: clicks and drags on the bottom row hit the viewport (or nothing, over the hint/separator), and mouse events there forward to the application like any other viewport row.This came out of investigating a bottom-bar/cursor positioning issue seen with bottom-anchored TUIs (Claude Code): with a reserved bottom row the session never owned the true last row of the terminal. Removing the reservation removes that interplay entirely; please re-check the original symptom against this branch.
Validation
Dogfooded by running
boo uiinside a boo session and peeking it, with an inner session that anchors an input line plus cursor at its last row (Claude Code style):Arming
C-aoverlays the keybind bar across the bottom row;Escreverts it and the cursor returns to row 24.stty sizeinside a session now reports the full height (24 75in a 24x100 terminal).zig fmt --check,zig build test, andzig build test-integrationall pass.Design notes
Layout.viewportRows()now returns the full height; every consumer (view sizing, resize propagation, empty-state centering, cursor clamping) follows from that single change.listRows()keeps the same formula.need_render, and the per-row cache diff repaints the bottom row when its composed content changes in either direction.waitLastRowhelper renders the accumulated PTY output through ghostty-vt and asserts the bottom row's contents, verifying hint+separator, the full-width overlay while armed, and the revert afterEsc.This PR was generated by Coder Agents on behalf of @kylecarbs.