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))