• src/doors/syncconquer/door/door_io.c src/doors/termgfx/term.c term.h

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Wednesday, July 08, 2026 02:41:47
    https://gitlab.synchro.net/main/sbbs/-/commit/b454a7de6ceaefa915be41a3
    Modified Files:
    src/doors/syncconquer/door/door_io.c src/doors/termgfx/term.c term.h Log Message:
    syncalert: hide the SyncTERM status line for a true 640x400 canvas

    SyncTERM defaults to an 80x24 / 640x384 drawing area (its status line takes
    the 25th row), so a 640x400 game fractionally downscales 0.96x and RA's single-pixel vertical bars drop -- text and gauges look degraded; it's
    crisp only at a real 640x400.

    Hide the status line at entry with DECSSDT (CSI 0 $ ~ = "no status
    display"), emitted BEFORE the canvas probe so the probe reports the
    reclaimed 640x400 and every image tier then renders 1:1. The client's
    current setting is queried first with DECRQSS (DCS $ q $ ~ ST); door_io_
    pump() captures the reply (a raw-byte scan, since the DCS reply is
    otherwise swallowed) and door_term_restore() puts it back on exit -- or the usual "indicator" default if the terminal doesn't answer the query.
    Terminals with no status line / no DECSSDT ignore all of it.

    Added to termgfx as a reusable feature (term.c/term.h): the termgfx_term_status_off string, termgfx_term_status_set() restore builder,
    and termgfx_term_parse_status() reply parser -- so SyncDuke/SyncDOOM can reclaim the row the same way.

    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Tuesday, July 21, 2026 01:49:54
    https://gitlab.synchro.net/main/sbbs/-/commit/17dad6930d25c946b9cc999d
    Modified Files:
    src/doors/syncconquer/door/door_io.c src/doors/termgfx/term.c term.h Log Message:
    syncconquer: don't trust xterm's text-area size as a sixel ceiling

    Both C&C titles rendered an all-black screen in a MAXIMIZED xterm (sixel
    mode) while a small xterm window and Foot played fine. Cause: xterm
    discards a sixel whose declared raster exceeds its maxGraphicSize
    (~1000x1000) whole rather than clipping it, and door_calc_rect() was
    trusting the terminal's exact pixel canvas (ESC[14t) as the sixel
    ceiling whenever it was reported -- but xterm's ESC[14t answer is its
    big TEXT-AREA size (~1900px maximized), not its graphics ceiling. So the
    door emitted a 1833x1146 sixel that xterm dropped entirely. The later click-to-see-buttons was the dirty-rect path emitting small (<1000)
    partial sixels that squeaked under the ceiling. (SyncDuke/SyncDOOM clamp
    to the safe ceiling unless XTSMGRAPHICS is reported and never had this; syncconquer alone trusted the exact canvas, to fill WT/Foot windows.)

    Identify xterm via XTVERSION and resolve the sixel ceiling in precedence
    order: a reported XTSMGRAPHICS ceiling, else an exact canvas ONLY when
    not xterm (Windows Terminal / Foot / SyncTERM render well past 1000px),
    else the safe ~1000px floor. xterm now clamps to 1000x625 and renders;
    other terminals keep their full window size. The negotiated geometry log
    line and Ctrl-S stats gain an xterm marker.

    Adds termgfx_term_parse_xtversion() to the shared termgfx/term.{c,h} -- a rolling-window raw scan of the XTVERSION reply (DCS >|<name>(<ver>) ST),
    a sibling of termgfx_term_parse_status() -- so the doors that roll their
    own terminal I/O can identify xterm. This ports into syncconquer's
    private terminal-I/O copy the fix the shared termgfx_termio.c already
    carries.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net