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: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
(defun exwm-input-set-key (key command)
"Set a global key binding.
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: ")
(global-set-key key command)
(cl-pushnew key exwm-input--global-keys)
(setq exwm-input-global-keys (append exwm-input-global-keys
(list (cons key command))))
(exwm-input--set-key key command)
(when (called-interactively-p 'any)
(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 atom))
'atom)))
;; Initialize global keys.
(dolist (i exwm-input-global-keys)
(exwm-input--set-key (car i) (cdr i)))
;; Initialize simulation keys.
(when exwm-input-simulation-keys
(exwm-input-set-simulation-keys exwm-input-simulation-keys))