diff --git a/src/backend/modern.lisp b/src/backend/modern.lisp index 4f975a8..a0b8bd1 100644 --- a/src/backend/modern.lisp +++ b/src/backend/modern.lisp @@ -172,9 +172,20 @@ as a fallback when a keyword is not in *named-colors*.") (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 - (sb-alien:free-alien winsize)))) + (values (sb-alien:deref winsize 1) ;; cols + (sb-alien:deref winsize 0))) ;; rows + (sb-alien:free-alien winsize)))) + ;; $COLUMNS / $LINES env vars — set by every POSIX shell. + ;; Catches cases where ioctl on stdout's fd disagrees with + ;; the real terminal size (e.g. stdout redirected or a + ;; file descriptor mismatch). + (ignore-errors + (let ((cols (parse-integer (sb-ext:posix-getenv "COLUMNS") + :junk-allowed t)) + (rows (parse-integer (sb-ext:posix-getenv "LINES") + :junk-allowed t))) + (when (and cols rows (> cols 0) (> rows 0)) + (values cols rows)))) (values 80 24))) (defmethod backend-write ((b modern-backend) string) diff --git a/src/backend/simple.lisp b/src/backend/simple.lisp index 0ca931f..4722ce4 100644 --- a/src/backend/simple.lisp +++ b/src/backend/simple.lisp @@ -39,6 +39,13 @@ (values (sb-alien:deref winsize 1) (sb-alien:deref winsize 0))) (sb-alien:free-alien winsize)))) + (ignore-errors + (let ((cols (parse-integer (sb-ext:posix-getenv "COLUMNS") + :junk-allowed t)) + (rows (parse-integer (sb-ext:posix-getenv "LINES") + :junk-allowed t))) + (when (and cols rows (> cols 0) (> rows 0)) + (values cols rows)))) (values 80 24))) (defmethod backend-write ((b simple-backend) string)