Fix termios-cc API for SBCL 2.5.x, demo exits cleanly if raw mode fails

make-raw-termios (input.lisp:66-67): termios-cc accessor in SBCL 2.5.x
takes one arg (the struct) and returns the cc array.  Use (aref ...)
to set individual control characters.  Old code used 3-arg setf form
that no longer works and produced style warnings.

demo.lisp: Now exits with a clear error message when raw mode can't
be established, rather than running in broken pipe-safe mode where
escape sequences are echoed and input is line-buffered.
This commit is contained in:
Hermes
2026-05-12 01:30:09 +00:00
parent 517b43b801
commit 4594d40a9c
2 changed files with 7 additions and 3 deletions

View File

@@ -126,7 +126,10 @@
(defun run-demo () (defun run-demo ()
(let ((saved (ignore-errors (set-raw-mode)))) (let ((saved (ignore-errors (set-raw-mode))))
(unless saved (unless saved
(format *error-output* "Failed to set raw mode, trying pipe-safe mode~%")) (format *error-output* "~&ERROR: Cannot set terminal to raw mode.~%")
(format *error-output* " Make sure you are in a real terminal (not a pipe/redirect).~%")
(format *error-output* " Try: sbcl --script demo.lisp~%")
(return-from run-demo))
(unwind-protect (unwind-protect
(progn (progn
(init-app-state) (init-app-state)

View File

@@ -63,8 +63,9 @@
(clear-flag (sb-posix:termios-lflag termios) (clear-flag (sb-posix:termios-lflag termios)
(logior sb-posix:icanon sb-posix:echo (logior sb-posix:icanon sb-posix:echo
sb-posix:isig sb-posix:iexten))) sb-posix:isig sb-posix:iexten)))
(setf (sb-posix:termios-cc termios sb-posix:vmin) 1) (let ((cc-array (sb-posix:termios-cc termios)))
(setf (sb-posix:termios-cc termios sb-posix:vtime) 0) (setf (aref cc-array sb-posix:vmin) 1)
(setf (aref cc-array sb-posix:vtime) 0))
termios)) termios))
(defun set-raw-mode () (defun set-raw-mode ()