• src/doors/termgfx/termgfx_termio.c

    From Rob Swindell (on Debian Linux)@1:103/705 to Git commit to main/sbbs/master on Wed Jul 22 20:38:40 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/a69d062a745f0a2ea36b379f
    Modified Files:
    src/doors/termgfx/termgfx_termio.c
    Log Message:
    termgfx present_rgbx: subset the per-frame palette on all terminals

    present_rgbx re-quantizes and re-sends its palette every frame and has
    no dirty-box path, so nothing relies on persisted registers -- making SIXEL_PAL_USED safe on every terminal here, SyncTERM included. Each
    truecolor frame now defines only the registers its quantized image
    uses. Used by SyncRPG.

    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)
  • From Rob Swindell (on Debian Linux)@1:103/705 to Git commit to main/sbbs/master on Thu Jul 23 02:18:02 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/c6d429e9400c9239371468c4
    Modified Files:
    src/doors/termgfx/termgfx_termio.c
    Log Message:
    termgfx: honor the BBS session time limit

    termio read DOOR32.SYS for its socket and DISCARDED line 9, the caller's minutes left. A door driven through it therefore ran until the player quit,
    and the BBS reclaimed the node only when the session itself ended -- every sibling door has honored this for a long time; syncscumm and syncrpg never have.

    The limit now comes from the drop file, or from an explicit -t<seconds> (Synchronet's %T) which overrides it, exactly as the siblings resolve it. -t
    is matched on an all-digit suffix and marked consumed, so it never reaches
    the engine's argv and an engine word option starting with -t passes through untouched.

    Over the last minute the remaining time appears on the shared notice row,
    then the session ends by setting g_quit -- the same clean unwind an idle timeout uses, so the engine saves whatever it saves rather than being killed mid-write.

    Two things about that notice are deliberate. It runs from the pump, not the present path, for the reason the idle poll does: this door presents only
    when the engine's dirty flag says the frame changed, so a countdown driven
    by frames would stall on a static screen. And it runs AFTER the idle poll,
    so when both want the row this one wins -- the idle countdown can be
    dismissed by pressing a key, this one cannot, and offering "press any key" against a limit no key will move would be a lie.

    Verified offline: -t fires to the millisecond, a DOOR32.SYS granting one
    minute exits at 60.0s (the field that was previously thrown away), -t
    overrides that drop file, and a session with no limit at all never fires.

    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)
  • From Rob Swindell (on Debian Linux)@1:103/705 to Git commit to main/sbbs/master on Sun Jul 26 22:57:46 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/653e414fd1364d2f24e3fcb6
    Modified Files:
    src/doors/termgfx/termgfx_termio.c
    Log Message:
    termgfx: stop reporting the dirty-rect share as unavailable on SyncTERM

    The Ctrl-S strip showed "dr n/a" for every SyncTERM session, on every
    tier, while patching was in fact running -- so the one number that says
    whether the door is patching or repainting has never been readable on the client most callers use.

    The readout was keyed on the terminal having REPORTED a pixel cell size (ESC[16t). SyncTERM never reports one: CTerm implements no xterm window
    ops and uses CSI t as a private palette command, so the query fails its parameter-count check and is dropped. The patch path does not need that
    value in any case -- the diff runs on a fixed tile grid in framebuffer
    space, and placement derives its cell from canvas over grid -- so the
    condition described a dependency that does not exist.

    Measured against a SyncTERM-alike answering the grid CPR but no window
    ops: the strip now reads "dr 100%" where it read "dr n/a", with partial
    frames on the wire the whole time. A terminal that does report a cell
    size is unaffected.

    SyncRetro keeps its own version of this check: it derives the cell size
    itself, so the state is reachable there for a genuinely unknown geometry.

    Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)