Redirect stderr to log file (or /dev/null) during TUI
ober
7e5ca8799c5eb374d05e37eb284ca4c4f5773ef0
--- a/src/jcode/ui/tui.ss +++ b/src/jcode/ui/tui.ss @@ -61,6 +61,28 @@ (close-port p) (*tui-log-port* #f)))) +(def *saved-stderr* (make-parameter #f)) + +(def (redirect-stderr-for-tui! verbose?) + "Redirect stderr away from terminal. If verbose, send to ~/jcode.log; else /dev/null." + (*saved-stderr* (current-error-port)) + (current-error-port + (if (and verbose? (*tui-log-port*)) + (*tui-log-port*) + (open-file-output-port "/dev/null" + (file-options no-fail) + (buffer-mode none) + (make-transcoder (utf-8-codec)))))) + +(def (restore-stderr!) + (when (*saved-stderr*) + (let ((devnull (current-error-port))) + (current-error-port (*saved-stderr*)) + (*saved-stderr* #f) + ;; Close /dev/null port (but not the log port, that's closed separately) + (unless (eq? devnull (*tui-log-port*)) + (close-port devnull))))) + ;; ---- Spinner animation ---- (def *spinner-frames* '#("⠋" "⠙" "⠹" "⠸" "⠼" "⠴" "⠦" "⠧" "⠇" "⠏")) @@ -136,8 +158,10 @@ (session-init-db) (init-tools-for-tui) (apply-tui-overrides! args) - (when (member "--verbose" args) (open-tui-log!)) - (tui-log "tui-main: starting, args=~a" args) + (let ((verbose? (and (member "--verbose" args) #t))) + (when verbose? (open-tui-log!)) + (tui-log "tui-main: starting, args=~a" args) + (redirect-stderr-for-tui! verbose?)) (with-tui (tui-log "tui-main: tb-init done") (let ((in-mode (bitwise-ior TB_INPUT_ALT TB_INPUT_MOUSE))) @@ -159,6 +183,7 @@ (tb-present!) (tui-log "tui-main: entering event loop") (event-loop state) + (restore-stderr!) (close-tui-log!)))) (def (init-tools-for-tui)