subtree(3p/exwm): update to commit 'b62d5e79'
This is almost one year of changes to EXWM. Note that it undoes our port of https://github.com/ch11ng/exwm/pull/737 That PR hasn't seen any movement in three years, so it might not be that relevant anymore. Other stuff has been mainlined in the meantime. Change-Id: I0845ff8a28a5bb1553855f6d6f0ceeaedcf0809e
This commit is contained in:
commit
ff96777456
9 changed files with 530 additions and 234 deletions
82
third_party/exwm/exwm-input.el
vendored
82
third_party/exwm/exwm-input.el
vendored
|
|
@ -117,6 +117,9 @@ defined in `exwm-mode-map' here."
|
|||
|
||||
(defvar exwm-input--simulation-keys nil "Simulation keys in line-mode.")
|
||||
|
||||
(defvar exwm-input--skip-buffer-list-update nil
|
||||
"Skip the upcoming 'buffer-list-update'.")
|
||||
|
||||
(defvar exwm-input--temp-line-mode nil
|
||||
"Non-nil indicates it's in temporary line-mode for char-mode.")
|
||||
|
||||
|
|
@ -135,16 +138,8 @@ defined in `exwm-mode-map' here."
|
|||
"Timer for deferring the update of input focus.")
|
||||
|
||||
(defvar exwm-input--update-focus-window nil "The (Emacs) window to be focused.
|
||||
It also helps us discern whether a `buffer-list-update-hook' was caused by a
|
||||
different window having been selected.
|
||||
|
||||
This value should always be overwritten.")
|
||||
|
||||
(defvar exwm-input--update-focus-window-buffer nil
|
||||
"Buffer displayed in `exwm-input--update-focus-window'.
|
||||
Helps us discern whether a `buffer-list-update-hook' was caused by the selected
|
||||
window switching to a different buffer.")
|
||||
|
||||
(defvar exwm-input--echo-area-timer nil "Timer for detecting echo area dirty.")
|
||||
|
||||
(defvar exwm-input--event-hook nil
|
||||
|
|
@ -164,8 +159,6 @@ Current buffer will be the `exwm-mode' buffer when this hook runs.")
|
|||
(declare-function exwm-layout--iconic-state-p "exwm-layout.el" (&optional id))
|
||||
(declare-function exwm-layout--show "exwm-layout.el" (id &optional window))
|
||||
(declare-function exwm-reset "exwm.el" ())
|
||||
(declare-function exwm-workspace--client-p "exwm-workspace.el"
|
||||
(&optional frame))
|
||||
(declare-function exwm-workspace--minibuffer-own-frame-p "exwm-workspace.el")
|
||||
(declare-function exwm-workspace--workspace-p "exwm-workspace.el" (workspace))
|
||||
(declare-function exwm-workspace-switch "exwm-workspace.el"
|
||||
|
|
@ -301,24 +294,14 @@ ARGS are additional arguments to CALLBACK."
|
|||
|
||||
(defun exwm-input--on-buffer-list-update ()
|
||||
"Run in `buffer-list-update-hook' to track input focus."
|
||||
;; `buffer-list-update-hook' is invoked by several functions
|
||||
;; (`get-buffer-create', `select-window', `with-temp-buffer', etc.), but we
|
||||
;; just want to notice when a different window has been selected, or when the
|
||||
;; selected window displays a different buffer, so that we can set the focus
|
||||
;; to the associated X window (in case of an `exwm-mode' buffer). In order to
|
||||
;; differentiate, we keep track of the last selected window and buffer in the
|
||||
;; `exwm-input--update-focus-window' and
|
||||
;; `exwm-input--update-focus-window-buffer' variables.
|
||||
(let* ((win (selected-window))
|
||||
(buf (window-buffer win)))
|
||||
(when (and (not (exwm-workspace--client-p))
|
||||
(not (and (eq exwm-input--update-focus-window win)
|
||||
(eq exwm-input--update-focus-window-buffer buf))))
|
||||
(exwm--log "selected-window=%S current-buffer=%S" win buf)
|
||||
(setq exwm-input--update-focus-window win)
|
||||
(setq exwm-input--update-focus-window-buffer buf)
|
||||
(redirect-frame-focus (selected-frame) nil)
|
||||
(exwm-input--update-focus-defer))))
|
||||
(when (and ; this hook is called incesantly; place cheap tests on top
|
||||
(not exwm-input--skip-buffer-list-update)
|
||||
(exwm--terminal-p)) ; skip other terminals, e.g. TTY client frames
|
||||
(exwm--log "current-buffer=%S selected-window=%S"
|
||||
(current-buffer) (selected-window))
|
||||
(redirect-frame-focus (selected-frame) nil)
|
||||
(setq exwm-input--update-focus-window (selected-window))
|
||||
(exwm-input--update-focus-defer)))
|
||||
|
||||
(defun exwm-input--update-focus-defer ()
|
||||
"Defer updating input focus."
|
||||
|
|
@ -1116,37 +1099,40 @@ One use is to access the keymap bound to KEYS (as prefix keys) in char-mode."
|
|||
|
||||
(defun exwm-input--on-minibuffer-setup ()
|
||||
"Run in `minibuffer-setup-hook' to grab keyboard if necessary."
|
||||
(exwm--log)
|
||||
(with-current-buffer
|
||||
(window-buffer (frame-selected-window exwm-workspace--current))
|
||||
(when (and (derived-mode-p 'exwm-mode)
|
||||
(not (exwm-workspace--client-p))
|
||||
(eq exwm--selected-input-mode 'char-mode))
|
||||
(exwm-input--grab-keyboard exwm--id))))
|
||||
(let* ((window (or (minibuffer-selected-window) ; minibuffer-setup-hook
|
||||
(selected-window))) ; echo-area-clear-hook
|
||||
(frame (window-frame window)))
|
||||
(when (exwm--terminal-p frame)
|
||||
(with-current-buffer (window-buffer window)
|
||||
(when (and (derived-mode-p 'exwm-mode)
|
||||
(eq exwm--selected-input-mode 'char-mode))
|
||||
(exwm--log "Grab #x%x window=%s frame=%s" exwm--id window frame)
|
||||
(exwm-input--grab-keyboard exwm--id))))))
|
||||
|
||||
(defun exwm-input--on-minibuffer-exit ()
|
||||
"Run in `minibuffer-exit-hook' to release keyboard if necessary."
|
||||
(exwm--log)
|
||||
(with-current-buffer
|
||||
(window-buffer (frame-selected-window exwm-workspace--current))
|
||||
(when (and (derived-mode-p 'exwm-mode)
|
||||
(not (exwm-workspace--client-p))
|
||||
(eq exwm--selected-input-mode 'char-mode)
|
||||
(eq exwm--input-mode 'line-mode))
|
||||
(exwm-input--release-keyboard exwm--id))))
|
||||
(let* ((window (or (minibuffer-selected-window) ; minibuffer-setup-hook
|
||||
(selected-window))) ; echo-area-clear-hook
|
||||
(frame (window-frame window)))
|
||||
(when (exwm--terminal-p frame)
|
||||
(with-current-buffer (window-buffer window)
|
||||
(when (and (derived-mode-p 'exwm-mode)
|
||||
(eq exwm--selected-input-mode 'char-mode)
|
||||
(eq exwm--input-mode 'line-mode))
|
||||
(exwm--log "Release #x%x window=%s frame=%s" exwm--id window frame)
|
||||
(exwm-input--release-keyboard exwm--id))))))
|
||||
|
||||
(defun exwm-input--on-echo-area-dirty ()
|
||||
"Run when new message arrives to grab keyboard if necessary."
|
||||
(exwm--log)
|
||||
(when (and (not (active-minibuffer-window))
|
||||
(not (exwm-workspace--client-p))
|
||||
cursor-in-echo-area)
|
||||
(when (and cursor-in-echo-area
|
||||
(not (active-minibuffer-window)))
|
||||
(exwm--log)
|
||||
(exwm-input--on-minibuffer-setup)))
|
||||
|
||||
(defun exwm-input--on-echo-area-clear ()
|
||||
"Run in `echo-area-clear-hook' to release keyboard if necessary."
|
||||
(exwm--log)
|
||||
(unless (current-message)
|
||||
(exwm--log)
|
||||
(exwm-input--on-minibuffer-exit)))
|
||||
|
||||
(defun exwm-input--init ()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue