diff --git a/exwm-layout.el b/exwm-layout.el index d084c96e4..b0b946775 100644 --- a/exwm-layout.el +++ b/exwm-layout.el @@ -240,6 +240,17 @@ (xcb:flush exwm--connection))) (cl-incf exwm-layout--fullscreen-frame-count)) +(defun exwm-layout--other-buffer-predicate (buffer) + "Return non-nil when the BUFFER may be displayed in selected frame. + +Prevents EXWM-mode buffers already being displayed on some other window from +being selected. + +Should be set as `buffer-predicate' frame parameter for all +frames. Used by `other-buffer'." + (not (and (eq 'exwm-mode (buffer-local-value 'major-mode buffer)) + (get-buffer-window buffer t)))) + (defvar exwm-layout-show-all-buffers nil "Non-nil to allow switching to buffers on other workspaces.") diff --git a/exwm-workspace.el b/exwm-workspace.el index b2fb64830..c9a57f5a3 100644 --- a/exwm-workspace.el +++ b/exwm-workspace.el @@ -235,6 +235,7 @@ The optional FORCE option is for internal use only." (declare-function exwm-layout--show "exwm-layout.el" (id &optional window)) (declare-function exwm-layout--hide "exwm-layout.el" (id)) (declare-function exwm-layout--refresh "exwm-layout.el") +(declare-function exwm-layout--other-buffer-predicate "exwm-layout.el" (buffer)) ;;;###autoload (defun exwm-workspace-move-window (index &optional id) @@ -684,6 +685,9 @@ The optional FORCE option is for internal use only." ;; The default behavior of `display-buffer' (indirectly called by ;; `minibuffer-completion-help') is not correct here. (cl-pushnew '(exwm-workspace--display-buffer) display-buffer-alist)) + ;; Prevent `other-buffer' from selecting already displayed EXWM buffers. + (modify-all-frames-parameters + '((buffer-predicate . exwm-layout--other-buffer-predicate))) ;; Configure workspaces (dolist (i exwm-workspace--list) (let ((outer-id (string-to-number (frame-parameter i 'outer-window-id)))