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:
@@ -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)
|
||||||
|
|||||||
@@ -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 ()
|
||||||
|
|||||||
Reference in New Issue
Block a user