From 1427e662e235c9ec5d728a50a3282e23c3729366 Mon Sep 17 00:00:00 2001 From: Amr Gharbeia Date: Mon, 18 May 2026 14:56:45 -0400 Subject: [PATCH] =?UTF-8?q?v0.8.0:=20use=20typecase=20guard=20instead=20of?= =?UTF-8?q?=20characterp=20=E2=80=94=20integers=20from=20reader=20must=20b?= =?UTF-8?q?e=20converted=20via=20code-char?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (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. --- org/channel-tui-main.org | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/org/channel-tui-main.org b/org/channel-tui-main.org index 7687eb0..e374d1f 100644 --- a/org/channel-tui-main.org +++ b/org/channel-tui-main.org @@ -977,18 +977,22 @@ Returns T on success, nil on failure. Does NOT wait or retry." (subseq f 0 (1- f)))))) (t nil))) (on-key ch))) - ;; v0.8.0: only printable characters reach on-key; prevents - ;; ctrl-byte keywords (e.g. :CTRL-A) from matching keymaps - (t (when (characterp ch) - (if cl-tty.dialog:*dialog-stack* - (let* ((dlg (car cl-tty.dialog:*dialog-stack*)) - (sel (cl-tty.dialog:dialog-content dlg))) - (when (graphic-char-p ch) - (setf (cl-tty.select:select-filter sel) - (concatenate 'string - (or (cl-tty.select:select-filter sel) "") - (string ch))))) - (on-key ch :code (char-code ch)))))))))) + ;; v0.8.0: typecase converts integers to characters + ;; so ctrl-byte keywords (:CTRL-A) are rejected + (t (let ((chr (typecase ch + (character ch) + ((integer 32 126) (code-char ch)) + (t nil)))) + (when chr + (if cl-tty.dialog:*dialog-stack* + (let* ((dlg (car cl-tty.dialog:*dialog-stack*)) + (sel (cl-tty.dialog:dialog-content dlg))) + (when (graphic-char-p chr) + (setf (cl-tty.select:select-filter sel) + (concatenate 'string + (or (cl-tty.select:select-filter sel) "") + (string chr))))) + (on-key chr :code (when (integerp ch) ch))))))))))) ;; Keyboard reader via read-raw-byte (proven CSI detection) (handler-case (let* ((b (cl-tty.input::read-raw-byte :timeout 0.1))