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.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user