diff --git a/src/backend/modern.lisp b/src/backend/modern.lisp index d87bc28..b774b2e 100644 --- a/src/backend/modern.lisp +++ b/src/backend/modern.lisp @@ -175,10 +175,15 @@ as a fallback when a keyword is not in *named-colors*.") (sb-alien:deref winsize 0))) ;; rows (sb-alien:free-alien winsize))))) (or ;; Try ioctl on fd 0 first (stdin — stty uses this) - (ignore-errors (ioctl-size 0)) + (multiple-value-bind (cols rows) (ignore-errors (ioctl-size 0)) + (when (and cols rows (> cols 0) (> rows 0)) + (values cols rows))) ;; Then try the output stream's fd - (ignore-errors - (ioctl-size (sb-sys:fd-stream-fd (backend-output-stream b)))) + (multiple-value-bind (cols rows) + (ignore-errors + (ioctl-size (sb-sys:fd-stream-fd (backend-output-stream b)))) + (when (and cols rows (> cols 0) (> rows 0)) + (values cols rows))) ;; $COLUMNS/$LINES fallback — set by every POSIX shell (ignore-errors (let* ((cstr (sb-ext:posix-getenv "COLUMNS")) diff --git a/src/backend/simple.lisp b/src/backend/simple.lisp index b01ffce..d5fad96 100644 --- a/src/backend/simple.lisp +++ b/src/backend/simple.lisp @@ -37,9 +37,14 @@ (values (sb-alien:deref winsize 1) (sb-alien:deref winsize 0))) (sb-alien:free-alien winsize))))) - (or (ignore-errors (ioctl-size 0)) - (ignore-errors - (ioctl-size (sb-sys:fd-stream-fd (backend-output-stream b)))) + (or (multiple-value-bind (cols rows) (ignore-errors (ioctl-size 0)) + (when (and cols rows (> cols 0) (> rows 0)) + (values cols rows))) + (multiple-value-bind (cols rows) + (ignore-errors + (ioctl-size (sb-sys:fd-stream-fd (backend-output-stream b)))) + (when (and cols rows (> cols 0) (> rows 0)) + (values cols rows))) (ignore-errors (let* ((cstr (sb-ext:posix-getenv "COLUMNS")) (rstr (sb-ext:posix-getenv "LINES"))