mirror of
https://github.com/ch11ng/exwm.git
synced 2024-11-27 13:07:59 +01:00
Fix input focus transfer between workspaces
* exwm-input.el (exwm-input--set-focus): Make input focus revert to parent by default (to prevent input focus from following pointer). * exwm-input.el (exwm-input--update-focus): Switch to another workspace if input focus is transfered to it. * exwm-workspace.el (exwm-workspace--on-focus-in, exwm-workspace--init) (exwm-workspace--exit): Remove `exwm-workspace--on-focus-in' and related uses.
This commit is contained in:
parent
f52848595d
commit
6bfedf8bf7
2 changed files with 10 additions and 17 deletions
|
@ -73,7 +73,7 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.")
|
||||||
(exwm--log "Focus on #x%x with SetInputFocus" id)
|
(exwm--log "Focus on #x%x with SetInputFocus" id)
|
||||||
(xcb:+request exwm--connection
|
(xcb:+request exwm--connection
|
||||||
(make-instance 'xcb:SetInputFocus
|
(make-instance 'xcb:SetInputFocus
|
||||||
:revert-to xcb:InputFocus:PointerRoot
|
:revert-to xcb:InputFocus:Parent
|
||||||
:focus id
|
:focus id
|
||||||
:time xcb:Time:CurrentTime)))
|
:time xcb:Time:CurrentTime)))
|
||||||
(exwm-input--set-active-window id)
|
(exwm-input--set-active-window id)
|
||||||
|
@ -169,9 +169,15 @@ This value should always be overwritten.")
|
||||||
(xcb:flush exwm--connection)))
|
(xcb:flush exwm--connection)))
|
||||||
(when (eq (selected-window) window)
|
(when (eq (selected-window) window)
|
||||||
(exwm--log "Focus on %s" window)
|
(exwm--log "Focus on %s" window)
|
||||||
(select-frame-set-input-focus (window-frame window) t)
|
(if (and (exwm-workspace--workspace-p (selected-frame))
|
||||||
(exwm-input--set-active-window)
|
(not (eq (selected-frame) exwm-workspace--current)))
|
||||||
(xcb:flush exwm--connection)))))
|
;; The focus is on another workspace (e.g. it got clicked)
|
||||||
|
;; so switch to it.
|
||||||
|
(exwm-workspace-switch (selected-frame))
|
||||||
|
;; The focus is still on the current workspace.
|
||||||
|
(select-frame-set-input-focus (window-frame window) t)
|
||||||
|
(exwm-input--set-active-window)
|
||||||
|
(xcb:flush exwm--connection))))))
|
||||||
(setq exwm-input--update-focus-lock nil))
|
(setq exwm-input--update-focus-lock nil))
|
||||||
|
|
||||||
(defun exwm-input--on-minibuffer-setup ()
|
(defun exwm-input--on-minibuffer-setup ()
|
||||||
|
|
|
@ -610,16 +610,6 @@ INDEX must not exceed the current number of workspaces."
|
||||||
(exwm-workspace--workspace-from-frame-or-index frame-or-index)
|
(exwm-workspace--workspace-from-frame-or-index frame-or-index)
|
||||||
exwm-workspace--current))))
|
exwm-workspace--current))))
|
||||||
|
|
||||||
(defun exwm-workspace--on-focus-in ()
|
|
||||||
"Handle unexpected frame switch."
|
|
||||||
;; `focus-in-hook' is run by `handle-switch-frame'.
|
|
||||||
(unless (eq this-command #'handle-switch-frame)
|
|
||||||
(let ((index (exwm-workspace--position (selected-frame))))
|
|
||||||
(exwm--log "Focus on workspace %s" index)
|
|
||||||
(when (and index (/= index exwm-workspace-current-index))
|
|
||||||
(exwm--log "Workspace was switched unexpectedly")
|
|
||||||
(exwm-workspace-switch index)))))
|
|
||||||
|
|
||||||
(defun exwm-workspace--set-desktop (id)
|
(defun exwm-workspace--set-desktop (id)
|
||||||
"Set _NET_WM_DESKTOP for X window ID."
|
"Set _NET_WM_DESKTOP for X window ID."
|
||||||
(with-current-buffer (exwm--id->buffer id)
|
(with-current-buffer (exwm--id->buffer id)
|
||||||
|
@ -1374,8 +1364,6 @@ applied to all subsequently created X frames."
|
||||||
;; `minibuffer-completion-help') is not correct here.
|
;; `minibuffer-completion-help') is not correct here.
|
||||||
(cl-pushnew '(exwm-workspace--display-buffer) display-buffer-alist
|
(cl-pushnew '(exwm-workspace--display-buffer) display-buffer-alist
|
||||||
:test #'equal))
|
:test #'equal))
|
||||||
;; Handle unexpected frame switch.
|
|
||||||
(add-hook 'focus-in-hook #'exwm-workspace--on-focus-in)
|
|
||||||
;; Prevent `other-buffer' from selecting already displayed EXWM buffers.
|
;; Prevent `other-buffer' from selecting already displayed EXWM buffers.
|
||||||
(modify-all-frames-parameters
|
(modify-all-frames-parameters
|
||||||
'((buffer-predicate . exwm-layout--other-buffer-predicate)))
|
'((buffer-predicate . exwm-layout--other-buffer-predicate)))
|
||||||
|
@ -1413,7 +1401,6 @@ applied to all subsequently created X frames."
|
||||||
(setq display-buffer-alist
|
(setq display-buffer-alist
|
||||||
(cl-delete '(exwm-workspace--display-buffer) display-buffer-alist
|
(cl-delete '(exwm-workspace--display-buffer) display-buffer-alist
|
||||||
:test #'equal))
|
:test #'equal))
|
||||||
(remove-hook 'focus-in-hook #'exwm-workspace--on-focus-in)
|
|
||||||
(advice-remove 'x-create-frame #'exwm-workspace--x-create-frame)
|
(advice-remove 'x-create-frame #'exwm-workspace--x-create-frame)
|
||||||
(remove-hook 'after-make-frame-functions
|
(remove-hook 'after-make-frame-functions
|
||||||
#'exwm-workspace--add-frame-as-workspace)
|
#'exwm-workspace--add-frame-as-workspace)
|
||||||
|
|
Loading…
Reference in a new issue