diff --git a/src/backend/modern.lisp b/src/backend/modern.lisp index d38e494..8766227 100644 --- a/src/backend/modern.lisp +++ b/src/backend/modern.lisp @@ -181,31 +181,29 @@ as a fallback when a keyword is not in *named-colors*.") ;; ioctl on stdout fd — fast, correct after SIGWINCH at runtime. (multiple-value-bind (cols rows) (ignore-errors - (let* ((+tiocgwinsz+ 21523) ; 0x5413 on Linux - (winsize (sb-alien:make-alien sb-alien:unsigned-short 4))) + (let* ((winsize (sb-alien:make-alien sb-alien:unsigned-short 4))) (unwind-protect - (progn - (sb-unix:unix-ioctl (sb-sys:fd-stream-fd (backend-output-stream b)) - +tiocgwinsz+ - (sb-alien:alien-sap winsize)) - (values (sb-alien:deref winsize 1) ;; cols - (sb-alien:deref winsize 0))) ;; rows + (let ((ok (sb-unix:unix-ioctl + (sb-sys:fd-stream-fd (backend-output-stream b)) + 21523 (sb-alien:alien-sap winsize)))) + (when ok + (values (sb-alien:deref winsize 1) ;; cols + (sb-alien:deref winsize 0)))) ;; rows (sb-alien:free-alien winsize)))) (when (and cols rows (> cols 0) (> rows 0)) (values cols rows))) - ;; Direct ioctl on /dev/tty — opens the real controlling terminal. + ;; Direct ioctl on /dev/tty. (ignore-errors - (let ((tty-fd (sb-unix:unix-open "/dev/tty" 0 0))) ; O_RDONLY + (let ((tty-fd (sb-unix:unix-open "/dev/tty" 0 0))) (when (and tty-fd (numberp tty-fd) (> tty-fd 0)) (unwind-protect (let* ((winsize (sb-alien:make-alien sb-alien:unsigned-short 4))) - (sb-unix:unix-ioctl tty-fd 21523 (sb-alien:alien-sap winsize)) - (let ((cols (sb-alien:deref winsize 1)) - (rows (sb-alien:deref winsize 0))) - (sb-alien:free-alien winsize) - (when (and (integerp cols) (integerp rows) - (> cols 0) (> rows 0)) - (values cols rows)))) + (let ((ok (sb-unix:unix-ioctl tty-fd 21523 + (sb-alien:alien-sap winsize)))) + (when ok + (let ((cols (sb-alien:deref winsize 1)) + (rows (sb-alien:deref winsize 0))) + (values cols rows))))) (sb-unix:unix-close tty-fd))))) (values 80 24))) diff --git a/src/backend/simple.lisp b/src/backend/simple.lisp index ecf9399..33529a3 100644 --- a/src/backend/simple.lisp +++ b/src/backend/simple.lisp @@ -40,31 +40,28 @@ ;; ioctl on stdout fd — fast, correct after SIGWINCH at runtime. (multiple-value-bind (cols rows) (ignore-errors - (let* ((+tiocgwinsz+ 21523) - (winsize (sb-alien:make-alien sb-alien:unsigned-short 4))) + (let* ((winsize (sb-alien:make-alien sb-alien:unsigned-short 4))) (unwind-protect - (progn - (sb-unix:unix-ioctl (sb-sys:fd-stream-fd - (backend-output-stream b)) - +tiocgwinsz+ - (sb-alien:alien-sap winsize)) - (values (sb-alien:deref winsize 1) - (sb-alien:deref winsize 0))) + (let ((ok (sb-unix:unix-ioctl + (sb-sys:fd-stream-fd (backend-output-stream b)) + 21523 (sb-alien:alien-sap winsize)))) + (when ok + (values (sb-alien:deref winsize 1) + (sb-alien:deref winsize 0)))) (sb-alien:free-alien winsize)))) (when (and cols rows (> cols 0) (> rows 0)) (values cols rows))) (ignore-errors - (let ((tty-fd (sb-unix:unix-open "/dev/tty" 0 0))) ; O_RDONLY + (let ((tty-fd (sb-unix:unix-open "/dev/tty" 0 0))) (when (and tty-fd (numberp tty-fd) (> tty-fd 0)) (unwind-protect (let* ((winsize (sb-alien:make-alien sb-alien:unsigned-short 4))) - (sb-unix:unix-ioctl tty-fd 21523 (sb-alien:alien-sap winsize)) - (let ((cols (sb-alien:deref winsize 1)) - (rows (sb-alien:deref winsize 0))) - (sb-alien:free-alien winsize) - (when (and (integerp cols) (integerp rows) - (> cols 0) (> rows 0)) - (values cols rows)))) + (let ((ok (sb-unix:unix-ioctl tty-fd 21523 + (sb-alien:alien-sap winsize)))) + (when ok + (values (sb-alien:deref winsize 1) + (sb-alien:deref winsize 0)))) + (sb-alien:free-alien winsize)) (sb-unix:unix-close tty-fd))))) (values 80 24)))