• docs/v322_new.md src/doors/syncdoom/README.md syncdoom.c src/doors/syn

    From Rob Swindell (on Windows 11)@VERT to Git commit to main/sbbs/master on Saturday, July 25, 2026 02:41:33
    https://gitlab.synchro.net/main/sbbs/-/commit/030a89ccc53f780b1f70221f
    Modified Files:
    docs/v322_new.md src/doors/syncdoom/README.md syncdoom.c src/doors/syncduke/README.md syncduke_config.c syncduke_door.c src/doors/syncmoo1/README.md syncmoo1_config.c syncmoo1_config.h syncmoo1_door.c syncmoo1_plat.c syncmoo1_plat.h xtrn/syncarcade/install-xtrn.ini xtrn/syncdoom/README.md install-xtrn.ini lobby.js syncdoom.example.ini xtrn/syncduke/install-xtrn.ini lobby.js syncduke.example.ini xtrn/syncivision/install-xtrn.ini xtrn/syncmoo1/syncmoo1.example.ini xtrn/syncnes/install-xtrn.ini
    Log Message:
    doors: don't leave a console window on the BBS machine (Windows)

    SyncDOOM, SyncDuke and SyncMOO1 are console-subsystem programs, so a BBS
    that spawns them with CREATE_NEW_CONSOLE gets one console window per
    player on the server's desktop. The door draws to the client's terminal
    and prints nothing there, so the window is pure noise.

    Synchronet already suppresses it host-side: the xtrn entries carry XTRN_NODISPLAY, which spawns with CREATE_NO_WINDOW. Two gaps remained.

    The SyncDOOM and SyncDuke lobbies spawn the door themselves, via
    bbs.exec(), where the xtrn entry's setting does not apply -- so a lobby-launched game popped up a window even under Synchronet. They now
    pass EX_NODISPLAY, controlled by a new [lobby] nodisplay key (default
    on), as syncretro_lobby.js already did unconditionally.

    On any other BBS there is no such setting at all. Each door therefore
    closes its own console at startup: new [debug] hide_console (default
    on) and the -showconsole / -hideconsole arguments. Only a console the
    process owns is freed (GetConsoleProcessList() == 1), and only with a
    door socket, so a run from a command prompt keeps its output and a
    stdio door keeps fd 0/1. The three std streams are re-pointed at NUL,
    since the engines print on paths we don't control. This mirrors
    syncconquer's door_console_detach(), and composes with CREATE_NO_WINDOW,
    which still avoids the brief flash before the door can act.

    Ordering matters where a door captures its diagnostics: FreeConsole() invalidates stderr even when it has already been freopen()ed onto a
    file, so the detach runs before SyncMOO1's stderr capture and before
    SyncDuke's stdout-to-stderr dup2().

    Sysop-facing docs no longer describe a component by the language it is
    written in ("the C door", "the JS lobby"): a sysop neither knows nor
    cares. Source-file names (lobby.js) still appear where the file itself
    is meant.

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