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)
|
||||
|
||||
Reference in New Issue
Block a user