pmacs/src
Levi Neuwirth db18261a5d
feat(gui-1b): B7 --- the TUI's horizontal axis, which used to vanish
`MouseEventKind::ScrollLeft` and `ScrollRight` reached `dispatch_mouse`
and fell into its catch-all, so a horizontal wheel over a TUI document
did nothing at all. B7's row said as much: "events arrive and are
dropped".

They now call `scroll_window_columns` --- the SAME helper B2's panel leg
uses. One contract, one implementation, so the two document surfaces
cannot clamp differently, which is what B3 means by "each document
surface clamps at its own content bounds".

Four rows, each mutation-checked against its own mutation:

  three columns per notch      step of one          -> 1 row
  right bound keeps the last   clamp at full width  -> 1 row
    display column visible
  origin saturates at zero     (covered by the above)
  wrap pins the origin to 0    drop the wrap guard  -> 1 row, only it

The right-bound row is the one that needed care. "The origin stopped
somewhere" is satisfiable by a bound that lets the origin pass every
glyph and blanks the viewport, so the row asserts the FINAL DISPLAY
COLUMN IS STILL REACHABLE --- origin + viewport >= widest --- and
separately that the origin has not passed the content.

Two fixture facts the rows need, both stated rather than assumed:

- they PAINT first. B7's bound is `widest - viewport`, and a window that
  has never painted has `last_content_cols == 0`, so the bound
  degenerates to `widest` and the row measures nothing. My first draft
  had exactly that hole and passed for the wrong reason.
- they set TRUNCATE after the paint. Under wrap the bound does not exist
  and clause 5 pins the origin to zero, so a bound row must be a
  truncate row. The paint writes `last_wrap` from the view config, which
  is why the order matters --- setting it first, as I first did, is
  overwritten and the rows silently exercised the wrap branch instead.
2026-09-01 11:00:20 +02:00
..
audit
…
bin feat(lsp): D3 --- the file watcher stops sleeping and walks once per scan (#233) 2026-08-11 14:59:28 +02:00
lua_bindings feat(lsp): D3 --- the file watcher stops sleeping and walks once per scan (#233) 2026-08-11 14:59:28 +02:00
packages
…
terminal fix(panel): G5k --- the gesture records its domain, and every tail obeys it 2026-08-20 21:40:02 +02:00
ansi.rs
…
async_runtime.rs feat(async): parse budgets report the measurement that failed 2026-08-29 16:43:37 +02:00
attach.rs feat(release): binaries on tag — Distribution Stage 1 2026-08-01 14:40:47 -04:00
attach_dispatch.rs
…
attach_reconnect.rs
…
autosave.rs
…
bootstrap.rs feat(bootstrap): make the ambient storage roots a parameter 2026-07-31 18:48:07 -04:00
buffer.rs fix(crdt): allow match_same_arms, and record why the gate missed it 2026-08-30 19:56:50 +02:00
buffer_mirror.rs
…
buffer_registry.rs
…
builtin_packages.rs
…
cell.rs
…
code_action.rs
…
command.rs fix(discovery): clip command descriptions at the single-row surfaces 2026-08-10 13:52:32 +02:00
completion.rs
…
completion_framework.rs
…
config.rs
…
config_registry.rs test: the report itself, at a real PTY — and §1.1 was wrong 2026-08-07 19:37:46 +02:00
crdt.rs fix(buffer): fan out generated writes, and clear the history that exists 2026-07-26 13:43:22 -04:00
daemon.rs refactor: put the display-column rule where both frontends share it 2026-09-01 10:34:00 +02:00
daemon_attach.rs
…
definition.rs
…
desktop.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
diag.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
display_width.rs refactor: put the display-column rule where both frontends share it 2026-09-01 10:34:00 +02:00
document_highlight.rs
…
editor.rs feat(gui-1b): B7 --- the TUI's horizontal axis, which used to vanish 2026-09-01 11:00:20 +02:00
editor_core.rs fix: 1a review round 2 --- provenance was armed but never completed 2026-08-12 17:20:15 +02:00
file_io.rs
…
fold.rs
…
fold_view.rs
…
font_pref.rs
…
formatting.rs
…
frontend.rs feat(discovery): M-x rows carry descriptions — protocol v22 -> v23 2026-08-10 13:52:32 +02:00
fs.rs fix(tests): D3 round three --- two witness overclaims, and the CI red was a core-count assumption 2026-08-11 17:18:47 +02:00
hash.rs
…
help.rs
…
highlight.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
hook.rs
…
hover.rs
…
inlay_hint.rs
…
instance_buffer.rs
…
instance_render.rs
…
key.rs
…
keymap_stack.rs
…
keymap_tree.rs
…
lib.rs feat(bootstrap): make the ambient storage roots a parameter 2026-07-31 18:48:07 -04:00
locations.rs
…
lockfile.rs
…
lsp.rs feat(workers): a required purpose on every job and process — worker identity Stage 1 2026-08-10 14:51:54 +02:00
lsp_status.rs
…
lua.rs
…
lua_isolation.rs
…
main.rs docs: absorb the v1.1.0 release, and correct what it made stale 2026-08-01 18:09:59 -04:00
mcp.rs feat(workers): a required purpose on every job and process — worker identity Stage 1 2026-08-10 14:51:54 +02:00
menu.rs
…
message_bus.rs
…
minibuffer.rs
…
optimistic.rs
…
overlay.rs fix(crdt): key the crdt_op shape invariant on provenance 2026-08-30 17:48:21 +02:00
overlay_color.rs
…
overlay_paint.rs feat(view): wrap-aware coordinates, breaking in and additive out 2026-08-07 13:07:54 +02:00
prepare_rename.rs
…
presence.rs
…
process.rs feat(workers): a required purpose on every job and process — worker identity Stage 1 2026-08-10 14:51:54 +02:00
project.rs
…
project_index.rs
…
protocol.rs feat(protocol): the mapped panel family --- v25 wire shapes and their pins 2026-08-20 17:55:21 +02:00
rename.rs
…
rope.rs fix(crdt): enumerate the invariant over three axes, not two 2026-08-30 19:19:35 +02:00
search.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
semantic_client.rs
…
semantic_render.rs test(panel): the authority-loss matrix, asserted as EFFECTS across every quadrant 2026-08-21 11:43:27 +02:00
semantic_tokens.rs
…
signature.rs
…
socket_path.rs
…
state.rs
…
statusline.rs fix(panel): close Stage 2A review round 2 (2 P1, 1 P2) 2026-07-26 10:38:21 -04:00
symbol.rs
…
syntax.rs feat(lean4): editing surface + Stage 1 acceptance (Q#LN5, LN6, LN17) 2026-07-25 09:59:48 -04:00
text_view.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
transport.rs
…
view.rs fix(crdt): key the crdt_op shape invariant on provenance 2026-08-30 17:48:21 +02:00
window.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
worker.rs
…
workers_buffer.rs fix(workers): a safe display-text boundary for purpose and handler names 2026-08-10 14:51:54 +02:00