fix(tiles): a tile that joined before its pane existed resends its size

A session Run makes while the grid is open joins as a tile right away, so
the tile connects and sends its size before Run starts the pane. The
server only records a resize for a session with no PTY and spawns the pane
at 120x40, and Run's own resize step measures the parked main terminal
(display: none, so nothing). Measured live for Shell and Claude: a 97x17
tile over a 120x40 pane, for good (#464).

The chrome refresh now remembers each tile's last-seen pid and calls
TerminalTile.paneStarted() when it appears or changes. paneStarted()
forgets the sent size and sends it; a hidden tile (a zoomed neighbour)
sends nothing and keeps it forgotten, so its next fit() sends it, which a
plain fit({ force: true }) would lose. Keyed on the sessions map, so a
handleInit after an SSE drop counts too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Codeman maintainer
2026-10-06 19:46:04 +02:00
parent f1e5b82ecc
commit fa9d5879b3
8 changed files with 109 additions and 3 deletions
+11
View File
@@ -921,6 +921,17 @@
this.ws.send(JSON.stringify({ t: 'z', c: cols, r: rows, v: 'desktop' }));
}
// The session's PTY is new: a tile can connect before its session has a
// pane (one Run started while the grid is open joins first), and the
// server drops a resize that arrives with no PTY, then spawns at its own
// default size. Forget what was sent, so the size goes out now, or with
// the next fit() when this tile is hidden right now (a zoomed neighbour):
// _sendResize() returns before recording anything it did not send.
paneStarted() {
this._lastSentDims = null;
this._sendResize();
}
// The geometry the PTY actually holds (`{t:'zc'}`, the server's answer to
// every resize). A PTY and a terminal that disagree on WIDTH render
// garbled, so a different column count is adopted; rows stay local, as in