Add Customize interface for global keys

* exwm-input.el (exwm-input--set-key): New function for actually
setting the binding.
(exwm-input-global-keys): New user option for customizing global keys.
(exwm-input-set-key): Update `exwm-input-global-keys' and call
`exwm-input--set-key'
(exwm-input--init): Initialize global keys.
This commit is contained in:
Chris Feng 2018-02-26 00:15:44 +08:00
parent c719c3f54b
commit a50058be78

View file

@ -464,15 +464,45 @@ ARGS are additional arguments to CALLBACK."
(xcb:+request exwm--connection req)))) (xcb:+request exwm--connection req))))
(xcb:flush exwm--connection))) (xcb:flush exwm--connection)))
(defun exwm-input--set-key (key command)
(global-set-key key command)
(cl-pushnew key exwm-input--global-keys))
(defcustom exwm-input-global-keys nil
"Global keys.
It is an alist of the form (key . command), meaning giving KEY (a key
sequence) a global binding as COMMAND.
Notes:
* Setting the value directly (rather than customizing it) after EXWM
finishes initialization has no effect."
:type '(alist :key-type key-sequence :value-type function)
:set (lambda (symbol value)
(when (boundp symbol)
(dolist (i (symbol-value symbol))
(global-unset-key (car i))))
(set symbol value)
(setq exwm-input--global-keys nil)
(dolist (i value)
(exwm-input--set-key (car i) (cdr i)))
(when exwm--connection
(exwm-input--update-global-prefix-keys))))
;;;###autoload ;;;###autoload
(defun exwm-input-set-key (key command) (defun exwm-input-set-key (key command)
"Set a global key binding. "Set a global key binding.
The new key binding only takes effect in real time when this command is The new key binding only takes effect in real time when this command is
called interactively. Only invoke it non-interactively in configuration." called interactively, and is lost when this session ends unless it's
specifically saved in the Customize interface for `exwm-input-global-keys'.
In configuration you should customize or set `exwm-input-global-keys'
instead."
(interactive "KSet key globally: \nCSet key %s to command: ") (interactive "KSet key globally: \nCSet key %s to command: ")
(global-set-key key command) (setq exwm-input-global-keys (append exwm-input-global-keys
(cl-pushnew key exwm-input--global-keys) (list (cons key command))))
(exwm-input--set-key key command)
(when (called-interactively-p 'any) (when (called-interactively-p 'any)
(exwm-input--update-global-prefix-keys))) (exwm-input--update-global-prefix-keys)))
@ -871,6 +901,9 @@ Its usage is the same with `exwm-input-set-simulation-keys'."
:name-len (length atom) :name-len (length atom)
:name atom)) :name atom))
'atom))) 'atom)))
;; Initialize global keys.
(dolist (i exwm-input-global-keys)
(exwm-input--set-key (car i) (cdr i)))
;; Initialize simulation keys. ;; Initialize simulation keys.
(when exwm-input-simulation-keys (when exwm-input-simulation-keys
(exwm-input-set-simulation-keys exwm-input-simulation-keys)) (exwm-input-set-simulation-keys exwm-input-simulation-keys))