v0.8.0: use typecase guard instead of characterp — integers from reader must be converted via code-char

(characterp 97) is NIL so (when (characterp ch) ...) broke all printable
input. The typecase ((integer 32 126) ...) converts printable integer
bytes to characters while rejecting keywords like :CTRL-A.
This commit is contained in:
2026-05-18 14:56:45 -04:00
parent 8c29c228cd
commit 1427e662e2

View File

@@ -977,18 +977,22 @@ Returns T on success, nil on failure. Does NOT wait or retry."
(subseq f 0 (1- f)))))) (subseq f 0 (1- f))))))
(t nil))) (t nil)))
(on-key ch))) (on-key ch)))
;; v0.8.0: only printable characters reach on-key; prevents ;; v0.8.0: typecase converts integers to characters
;; ctrl-byte keywords (e.g. :CTRL-A) from matching keymaps ;; so ctrl-byte keywords (:CTRL-A) are rejected
(t (when (characterp ch) (t (let ((chr (typecase ch
(character ch)
((integer 32 126) (code-char ch))
(t nil))))
(when chr
(if cl-tty.dialog:*dialog-stack* (if cl-tty.dialog:*dialog-stack*
(let* ((dlg (car cl-tty.dialog:*dialog-stack*)) (let* ((dlg (car cl-tty.dialog:*dialog-stack*))
(sel (cl-tty.dialog:dialog-content dlg))) (sel (cl-tty.dialog:dialog-content dlg)))
(when (graphic-char-p ch) (when (graphic-char-p chr)
(setf (cl-tty.select:select-filter sel) (setf (cl-tty.select:select-filter sel)
(concatenate 'string (concatenate 'string
(or (cl-tty.select:select-filter sel) "") (or (cl-tty.select:select-filter sel) "")
(string ch))))) (string chr)))))
(on-key ch :code (char-code ch)))))))))) (on-key chr :code (when (integerp ch) ch)))))))))))
;; Keyboard reader via read-raw-byte (proven CSI detection) ;; Keyboard reader via read-raw-byte (proven CSI detection)
(handler-case (handler-case
(let* ((b (cl-tty.input::read-raw-byte :timeout 0.1)) (let* ((b (cl-tty.input::read-raw-byte :timeout 0.1))