From 7cdb55653135b279dd6cdca77d4857bc735aa426 Mon Sep 17 00:00:00 2001 From: Amr Gharbeia Date: Thu, 14 May 2026 11:22:12 -0400 Subject: [PATCH] fix: remove %query-terminal-size completely MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CSI 18t query leaks into the threaded keyboard reader because the response arrives on stdin after the reader thread starts. The response bytes get queued as key events and inserted as text into the TUI input buffer. Removing the query entirely — ioctl is sufficient for terminal size detection on all modern terminals. --- 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 cf21def..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 using blocking read. -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) - (handler-case - (sb-ext:with-timeout 0.3 - (loop do (let ((ch (read-char saved nil nil))) - (when ch - (vector-push-extend ch response) - (when (char= ch #\t) (return)))))) - (sb-ext:timeout ())) - (when (>= (length response) 5) - (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)