https://gitlab.synchro.net/main/sbbs/-/commit/a2e38c6aa08c94b987f56a8f
Modified Files:
src/doors/syncmoo1/DESIGN.md syncmoo1.h syncmoo1_input.c syncmoo1_io.c src/doors/syncmoo1/tools/fakterm.py
Log Message:
syncmoo1: hide the client's status line, and put it back on the way out
A terminal showing a status line reserves its bottom text row for it, so
the grid it reports is one row short: an 80x25 SyncTERM answers the grid
probe with 24 rows, sm_geom_fit_page() derives a 384px page from that,
and the frame fits into 368 instead of 384 -- a 1.80x vertical resample
of MoO1's 200 rows where 1.92x was available, spent on a row nothing
draws on.
Send DECSSDT Ps=0 before the probe burst so the grid reply reports the reclaimed height, and restore the pre-door setting at exit from the
DECRQSS reply the sequence is prefixed with. Every sibling door does
this already (syncretro, syncduke, syncdoom, syncconquer, syncscumm);
this one's DESIGN.md listed it and it was never built.
The bottom-row reserve in sm_geom_fit_page() stays. That is the sixel
scroll guard from 843981e6be (pulse-66-pour, 2026-07-08) -- a sixel band landing on the last text row scrolls the page and makes the picture jump
-- and it has to hold on terminals with no status line to reclaim. The
two are independent; hiding the status line only means the reserved row
is no longer one the picture wanted. So this buys the row 0511160331 (currently-20-fears, 2026-07-08) measured, not a native 640x400.
Inert where DECSSDT does not exist, which is still most of the field:
cterm gained it in 9019e4bcba (buys-6-curve, 2026-04-20), after the last release tag, so a released SyncTERM ignores the query and the hide alike
and keeps the 24-row grid.
The reply is captured by a raw-byte scan in the input pump ahead of the
escape state machine, which swallows the DCS it arrives in; the rolling
window bridges a reply split across two reads, as it does in the sibling
doors.
tools/fakterm.py had no notion of a status line, so a door that sent the
hide and one that didn't looked identical to it. Teach it DECSSDT: --status-line starts with one up (the reported grid is ROWS-1 until the
door hides it), --no-decssdt models a terminal that implements none of
it, and the teardown summary prints the query/set trace. Verified across
four cases, each exiting through the door's own atexit path rather than
the harness SIGKILL:
status line up, DECSSDT query 1, set 0, set 1 grid 25 640x384
same, before this change no traffic grid 24 640x368
status line up, no DECSSDT all ignored grid 24 640x368
status line already off query 0, set 0, set 0 grid 25 640x384
The last case is the one that matters for a player who had already
turned their status line off: they get it restored to off, not forced
back on.
fakterm.py's DEFAULT_LBX was also one directory short (src/xtrn, which
does not exist, rather than the repo's xtrn/syncmoo1), so the tool exited before spawning the door unless --lbx was passed.
---
þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net