• src/doors/syncmoo1/DESIGN.md syncmoo1.h syncmoo1_input.c syncmoo1_io.c

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Sun Aug 16 22:55:13 2026
    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