diff options
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/term/xterm-kitty.el (renamed from lisp/xterm-kitty.el) | 71 |
1 files changed, 42 insertions, 29 deletions
diff --git a/lisp/xterm-kitty.el b/lisp/term/xterm-kitty.el index 906c032..9706fbb 100644 --- a/lisp/xterm-kitty.el +++ b/lisp/term/xterm-kitty.el @@ -21,19 +21,19 @@ ;;; Commentary: ;; Work-in-progress to support kitty terminal with all modifiers -;; - not ready yet to be moved into term/xterm-kitty.el ;; - still need to ;; + ensure proper 24-bit color support -;; + reduce/formalize dependencies on xterm.el -;; + provide init-terminal-xterm-kitty +;; + add all keys specified in private unicode space +;; + figure out a way to split keybindings between kitty and non-kitty +;; frames ;;; Code: (require 'term/xterm) -(defvar xterm-kitty-in-use - (and (string-match "^xterm-kitty" (getenv-internal "TERM" initial-environment)) t) - "Currently running under xterm-kitty.") +(defun xterm-kitty-in-use (&optional frame) + "Check whether FRAME is running under kitty terminal." + (terminal-parameter frame 'kitty-window-id)) (defvar xterm-kitty-modifiers-alist '((1 . shift) (2 . alt) (4 . control) (8 . super) (16 . hyper) (32 . meta)) @@ -360,7 +360,7 @@ off shift modifiers for alphabetic characters. The only way to avoid it is to provide the key vector itself to 'define-key', which this function explicitly creates. In that sense, this function is almost equivalent to 'event-convert-list'." - (if xterm-kitty-in-use + (if (xterm-kitty-in-use) (vector (xterm-kitty--add-modifier-list modifiers key)) default)) @@ -374,7 +374,7 @@ function is almost equivalent to 'event-convert-list'." (defun xterm-kitty-apply-keyboard (&optional keymap alternate-keymap) "Apply keyboard defintion; optionally to KEYMAP and ALTERNATE-KEYMAP." (let* ((kmap (or keymap - (and xterm-kitty-in-use input-decode-map))) + (and (xterm-kitty-in-use) input-decode-map))) (alternate-kmap (or alternate-keymap (and kmap (not keymap) @@ -391,14 +391,6 @@ function is almost equivalent to 'event-convert-list'." (when (and alternate-kmap) (xterm-kitty--setup-legacy-control-maps alternate-kmap)))) -(defun xterm-kitty-add () - "This one should be replaced by init-terminal-xterm-kitty; just a hack for now." - (when xterm-kitty-in-use - (setq xterm-extra-capabilities '(reportBackground getSelection setSelection)) - (add-hook 'terminal-init-xterm-hook 'xterm-kitty-apply-keyboard) - (add-hook 'terminal-init-xterm-hook 'xterm-kitty-save-window-id) - (xterm-kitty-add-select-frame-set-input-focus-advice))) - (defun xterm-kitty-window-id (&optional terminal) ; public API (terminal-parameter terminal 'kitty-window-id)) @@ -438,9 +430,8 @@ function is almost equivalent to 'event-convert-list'." (defun xterm-kitty-save-window-id () "Save kitty window ID of current terminal" - (when xterm-kitty-in-use - (xterm--query "\eP@kitty-cmd{\"cmd\":\"ls\",\"version\":[0,19,3]}\e\\" - '(("\eP@kitty-cmd" . xterm-kitty--save-kitty-window-id))))) + (xterm--query "\eP@kitty-cmd{\"cmd\":\"ls\",\"version\":[0,19,3]}\e\\" + '(("\eP@kitty-cmd" . xterm-kitty--save-kitty-window-id)))) (defvar xterm-kitty--focus-window-command-string "\eP@kitty-cmd{\"cmd\":\"focus-window\",\"version\":[0,19,3],\"no_response\":true,\"payload\":{\"match\":\"id:%d\"}}\e\\" @@ -449,21 +440,20 @@ function is almost equivalent to 'event-convert-list'." "Set focus to terminal containing FRAME-OR-WINDOW FRAME-OR-WINDOW can be a terminal, a frame, or a window" - (let* ((frame (if (windowp frame-or-window) - (window-frame frame-or-window) - frame-or-window)) - (kitty-window-id (and xterm-kitty-in-use (xterm-kitty-window-id (frame-terminal frame))))) + (let* ((frame (if (windowp frame-or-window) (window-frame frame-or-window) frame-or-window)) + (kitty-window-id (xterm-kitty-window-id (frame-terminal frame)))) ;; (message "Window id %d for %s" kitty-window-id frame) - (when kitty-window-id - (send-string-to-terminal (format xterm-kitty--focus-window-command-string kitty-window-id))))) + (if kitty-window-id + (send-string-to-terminal (format xterm-kitty--focus-window-command-string kitty-window-id)) + (message "%s is not a kitty window" frame-or-window)))) (defun xterm-kitty-select-frame-set-input-focus-advice (old-function frame &optional no-record) - (or (when xterm-kitty-in-use + (or (when (xterm-kitty-in-use frame) ;; (message "Switching to frame: %s" frame) (xterm-kitty-focus frame) (select-frame frame no-record)) (funcall old-function frame no-record))) (defun xterm-kitty-visible-window-advice (old-function &optional window minibuf all-frames) - (when xterm-kitty-in-use + (when (xterm-kitty-in-use) ;; Terminal emacs thinks that only one frame is ever visible (funcall old-function window minibuf (if (eql all-frames 'visible) t all-frames)))) (defun xterm-kitty-add-select-frame-set-input-focus-advice () @@ -479,8 +469,31 @@ function is almost equivalent to 'event-convert-list'." (defun xterm-kitty-new-os-window () "Open new xterm-kitty os window" (interactive) - (when xterm-kitty-in-use + (when (xterm-kitty-in-use) (send-string-to-terminal xterm-kitty--new-os-window-command-string))) -(provide 'xterm-kitty) +(defun terminal-init-xterm-kitty () + "Terminal initialization function for kitty" + ;; Order is important here: window id must be saved prior to any + ;; other xterm-kitty function calls in this function. + (xterm-kitty-save-window-id) + (xterm-kitty-apply-keyboard) + + ;; Standard xterm-like initialization + (xterm-register-default-colors xterm-standard-colors) + (tty-set-up-initial-frame-faces) + + ;; Steal private functions from term/xterm that kitty supports + (xterm--query "\e]11;?\e\\" + '(("\e]11;" . xterm--report-background-handler))) + (xterm--init-activate-get-selection) + (xterm--init-activate-set-selection) + (when xterm-set-window-title + (xterm--init-frame-title)) + (xterm--init-bracketed-paste-mode) + (xterm--init-focus-tracking) + + (run-hooks 'terminal-init-xterm-kitty-hook)) + +(provide 'term/xterm-kitty) ;;; xterm-kitty.el ends here |
