diff options
| -rw-r--r-- | lisp/kitty-keyboard-protocol.el | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/lisp/kitty-keyboard-protocol.el b/lisp/kitty-keyboard-protocol.el index 566e6be..df2fbfa 100644 --- a/lisp/kitty-keyboard-protocol.el +++ b/lisp/kitty-keyboard-protocol.el @@ -228,6 +228,15 @@ would swap meta and super.") (val (and (< second-dim (length row)) (aref row second-dim)))) val)) +(defvar kitty-kbp-delete-backspace-workaround nil + "Work around terminal handling idiosyncracies for DEL and BS") +(defvar kitty-kbp--backspace-precomputed + (kitty-kbp--precompute-with-modifiers 'backspace) + "Precomputed operations for backspace") +(defvar kitty-kbp--delete-precomputed + (kitty-kbp--precompute-with-modifiers 'delete) + "Precomputed operations for delete") + (defun kitty-kbp-decode-key-stroke (keycode modifiers suffix) "Take KEYCODE MODIFIERS SUFFIX of the form (105,5,u) and construct key." ;; Ignore modifiers that we cannot understand (CapsLock and NumLock status) @@ -235,16 +244,22 @@ would swap meta and super.") (result)) (if (eql suffix ?u) (if (< keycode 57344) - ;; To do: support remaining keycodes in unicode private use area - ;; (send-string-to-terminal (format "%s" (logior keycode (aref kitty-kbp--numeric-modifiers mods)))) - (let* ((shifted-key (and (eql (logand mods kitty-kbp--shift-modifier) - kitty-kbp--shift-modifier) - (alist-get keycode kitty-kbp-shift-alist))) - ;; The following is equivalent to mods & ~shift - (new-modifiers (and shifted-key (- mods kitty-kbp--shift-modifier)))) - (setq result - (vector (logior (or shifted-key keycode) - (aref kitty-kbp--numeric-modifiers (if shifted-key new-modifiers mods)))))) + (cond + ((and kitty-kbp-delete-backspace-workaround (eql keycode ?\x7f)) + (setq result (aref kitty-kbp--backspace-precomputed mods))) + ((and kitty-kbp-delete-backspace-workaround (eql keycode ?\x8)) + (setq result (aref kitty-kbp--delete-precomputed mods))) + (t + ;; To do: support remaining keycodes in unicode private use area + ;; (send-string-to-terminal (format "%s" (logior keycode (aref kitty-kbp--numeric-modifiers mods)))) + (let* ((shifted-key (and (eql (logand mods kitty-kbp--shift-modifier) + kitty-kbp--shift-modifier) + (alist-get keycode kitty-kbp-shift-alist))) + ;; The following is equivalent to mods & ~shift + (new-modifiers (and shifted-key (- mods kitty-kbp--shift-modifier)))) + (setq result + (vector (logior (or shifted-key keycode) + (aref kitty-kbp--numeric-modifiers (if shifted-key new-modifiers mods)))))))) (when (<= (aref kitty-kbp--suffix-u-private-bounds 0) keycode @@ -303,6 +318,12 @@ would swap meta and super.") ;; (send-string-to-terminal complete-string) (kitty-kbp-handle-non-printable complete-string))) +(defvar kitty-kbp-debug-escape-codes nil + "Print keyboard protocol escape codes") +(defun kitty-kbp-toggle-escape-codes () + (interactive) + (setq kitty-kbp-debug-escape-codes (not kitty-kbp-debug-escape-codes))) + (defun kitty-kbp--handle-escape-code (prompt) "Handle keycode using integer math; PROMPT is ignored." (let ((keycode 0) @@ -321,11 +342,11 @@ would swap meta and super.") (if (> keycode 0) (setq modifiers (1- current-num)) (setq keycode current-num))))) - ;; (message "Code: %d modifiers %d suffix: %s" keycode modifiers suffix) + (when kitty-kbp-debug-escape-codes + (message "Code: %d modifiers %d suffix: %s" keycode modifiers suffix) + (princ (kitty-kbp-decode-key-stroke keycode modifiers suffix))) (kitty-kbp-decode-key-stroke keycode modifiers suffix))) - - ;; -------------------------------------------------------------------------------- ;; Keymap storage functions (currently do not work for unknown reasons) |
