• src/conio/ciolib.adoc ciolib.c ciolib.h src/syncterm/Wren.adoc conn.c

    From Deuc¨@VERT to Git commit to main/sbbs/master on Monday, July 20, 2026 16:56:59
    https://gitlab.synchro.net/main/sbbs/-/commit/db36ea385821994e462db67a
    Modified Files:
    src/conio/ciolib.adoc ciolib.c ciolib.h src/syncterm/Wren.adoc conn.c modem.c ripper.c src/syncterm/scripts/auto/connected/disconnect_flow.wren keys_default.wren online_menu.wren scrollback_view.wren src/syncterm/scripts/auto/menu/main_menu.wren src/syncterm/scripts/auto/picker/file_picker.wren src/syncterm/scripts/menu_bbs_editor.wren menu_ui.wren syncterm.wren syncterm_menu.wren ui_app.wren ui_help_test.wren ui_widget.wren ui_widget_test.wren wren_console.wren src/syncterm/ssh.c syncterm.c syncterm.h term.c wren_bind.c wren_bind_screen.c wren_bind_screen.h wren_host.h
    Log Message:
    Make process-close requests unwind Wren UI safely

    Treat CIO_KEY_QUIT as a sticky process-level request and preserve it
    across conio input ownership barriers. Route every SyncTERM getch path
    through a shared reader so connection setup, RIP popups, scrollback,
    and terminal input cannot consume a close request accidentally.

    Handle the request before connected-session Wren hooks and before
    ordinary App widget or keymap dispatch. Unwind one modal frame through
    its Escape cleanup on each pump iteration, including when cleanup
    raises an error.

    Add Widget.atExit as the explicit UIFC-style exception and inherit it
    for nested modals. Use it throughout the command-line entry-save flow
    so shutdown confirmations and edits remain interactive while ordinary
    menus continue unwinding.

    Remove obsolete per-menu quit bindings, document the host and widget
    contracts, and add regression coverage for modal unwinding, at-exit inheritance, keymap bypass, and cleanup failures.

    Co-Authored-By: OpenAI Codex <noreply@openai.com>

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