From b80bd77d847f7ef38af32398b721158f05c7716e Mon Sep 17 00:00:00 2001 From: Amr Gharbeia Date: Thu, 14 May 2026 09:32:25 -0400 Subject: [PATCH] fix: remove CSI 18t terminal query (read-char-no-hang on fd 0 never returns) The %query-terminal-size function sent \033[18t and tried to read the response via read-char-no-hang on fd 0, which always returns nil in this SBCL environment. The response leaked into user input, displaying garbled CSI sequences. Rely on ioctl only. --- src/backend/classes.lisp | 31 ------------------------------- src/backend/modern.lisp | 1 - src/backend/simple.lisp | 1 - 3 files changed, 33 deletions(-) diff --git a/src/backend/classes.lisp b/src/backend/classes.lisp index c6c976d..677a565 100644 --- a/src/backend/classes.lisp +++ b/src/backend/classes.lisp @@ -1,36 +1,5 @@ (in-package :cl-tty.backend) -(defun %query-terminal-size () - "Query terminal size via ANSI CSI 18 t and parse the response. -Returns (values cols rows) or nil." - (ignore-errors - (let* ((saved (sb-sys:make-fd-stream 0 :input t :buffering :none)) - (response (make-array 0 :element-type 'character - :fill-pointer 0 :adjustable t))) - (format t "~C[18t" #\Esc) - (force-output) - (loop with deadline = (+ (get-internal-real-time) - (* internal-time-units-per-second 0.2)) - while (< (get-internal-real-time) deadline) - do (let ((ch (read-char-no-hang saved nil nil))) - (when ch - (vector-push-extend ch response) - (when (char= ch #\t) (return))))) - (when (>= (length response) 8) - (let* ((str (subseq response 1)) - (start (or (position #\[ str) 0)) - (after (subseq str (1+ start))) - (semi (position #\; after))) - (when semi - (let* ((cols-start (1+ semi)) - (cols-end (position #\t after :start cols-start)) - (rows (parse-integer (subseq after 0 semi) :junk-allowed t)) - (cols (when cols-end - (parse-integer (subseq after cols-start cols-end) - :junk-allowed t)))) - (when (and rows cols (> rows 0) (> cols 0)) - (values cols rows))))))))) - (defclass backend () ()) (defgeneric initialize-backend (backend) diff --git a/src/backend/modern.lisp b/src/backend/modern.lisp index 792834b..4f975a8 100644 --- a/src/backend/modern.lisp +++ b/src/backend/modern.lisp @@ -175,7 +175,6 @@ as a fallback when a keyword is not in *named-colors*.") (values (sb-alien:deref winsize 1) ;; cols (sb-alien:deref winsize 0))) ;; rows (sb-alien:free-alien winsize)))) - (%query-terminal-size) (values 80 24))) (defmethod backend-write ((b modern-backend) string) diff --git a/src/backend/simple.lisp b/src/backend/simple.lisp index e00c091..0ca931f 100644 --- a/src/backend/simple.lisp +++ b/src/backend/simple.lisp @@ -39,7 +39,6 @@ (values (sb-alien:deref winsize 1) (sb-alien:deref winsize 0))) (sb-alien:free-alien winsize)))) - (%query-terminal-size) (values 80 24))) (defmethod backend-write ((b simple-backend) string)