Passthrough input when explicitly reading events and keys

When any of these functions are called, Emacs expects to receive all
input events until they return. Unfortunately, there doesn't appear to
be a reliable way to detect that these functions are currently running
other than advising them.

* exwm-input.el (exwm-input--init): Advise low-level input reading
functions to bind 'exwm-input-line-mode-passthrough' to t when called.
(exwm-input--exit): Unadvise.
(exwm-input--call-with-passthrough): The advice.
(exwm-input--passthrough-functions): The functions we now advise.
This commit is contained in:
Steven Allen 2023-12-29 14:07:08 -08:00
parent 56db521a3e
commit 8ea607ba85

View file

@ -102,6 +102,13 @@ defined in `exwm-mode-map' here."
(defconst exwm-input--update-focus-interval 0.01
"Time interval (in seconds) for accumulating input focus update requests.")
(defconst exwm-input--passthrough-functions '(read-char
read-char-exclusive
read-key-sequence-vector
read-key-sequence
read-event)
"Low-level functions that read events and need to be exempted from EXWM's input handling.")
(defvar exwm-input--during-command nil
"Indicate whether between `pre-command-hook' and `post-command-hook'.")
@ -1158,6 +1165,11 @@ One use is to access the keymap bound to KEYS (as prefix keys) in `char-mode'."
(exwm--log)
(exwm-input--on-minibuffer-exit)))
(defun exwm-input--call-with-passthrough (function &rest args)
"Bind `exwm-input-line-mode-passthrough' and call the specified FUNCTION with ARGS."
(let ((exwm-input-line-mode-passthrough t))
(apply function args)))
(defun exwm-input--init ()
"Initialize the keyboard module."
(exwm--log)
@ -1213,7 +1225,10 @@ One use is to access the keymap bound to KEYS (as prefix keys) in `char-mode'."
(run-with-idle-timer 0 t #'exwm-input--on-echo-area-dirty))
(add-hook 'echo-area-clear-hook #'exwm-input--on-echo-area-clear)
;; Update focus when buffer list updates
(add-hook 'buffer-list-update-hook #'exwm-input--on-buffer-list-update))
(add-hook 'buffer-list-update-hook #'exwm-input--on-buffer-list-update)
(dolist (fun exwm-input--passthrough-functions)
(advice-add fun :around #'exwm-input--call-with-passthrough)))
(defun exwm-input--post-init ()
"The second stage in the initialization of the input module."
@ -1223,6 +1238,8 @@ One use is to access the keymap bound to KEYS (as prefix keys) in `char-mode'."
(defun exwm-input--exit ()
"Exit the input module."
(exwm--log)
(dolist (fun exwm-input--passthrough-functions)
(advice-remove fun #'exwm-input--call-with-passthrough))
(exwm-input--unset-simulation-keys)
(remove-hook 'pre-command-hook #'exwm-input--on-pre-command)
(remove-hook 'post-command-hook #'exwm-input--on-post-command)