From ddbbeda285b3b671ace99f1688e6bd3c3f84c742 Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Thu, 7 Apr 2016 21:03:42 +0800 Subject: [PATCH] Fix 2 multi-monitor issues * exwm-workspace.el (exwm-workspace--on-focus-in, exwm-workspace--init): Handle unexpected frame switch in `focus-in-hook'. * exwm-floating.el (exwm-floating--set-floating): If the absolute position is (0, 0) then the relative position is also the same. --- exwm-floating.el | 4 +++- exwm-workspace.el | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/exwm-floating.el b/exwm-floating.el index a67bc19..770976d 100644 --- a/exwm-floating.el +++ b/exwm-floating.el @@ -91,7 +91,9 @@ (frame-geometry (frame-parameter original-frame 'exwm-geometry))) (exwm--log "Floating geometry (original, absolute): %dx%d%+d%+d" width height x y) - (when frame-geometry + (when (and frame-geometry + (/= x 0) + (/= y 0)) (setq x (- x (slot-value frame-geometry 'x)) y (- y (slot-value frame-geometry 'y)))) (exwm--log "Floating geometry (original, relative): %dx%d%+d%+d" diff --git a/exwm-workspace.el b/exwm-workspace.el index 8dd6284..60cf9dd 100644 --- a/exwm-workspace.el +++ b/exwm-workspace.el @@ -229,6 +229,16 @@ The optional FORCE option is for internal use only." (xcb:flush exwm--connection)) (run-hooks 'exwm-workspace-switch-hook)))) +(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 (cl-position (selected-frame) exwm-workspace--list))) + (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))))) + (defvar exwm-floating-border-width) (defvar exwm-floating-border-color) @@ -679,6 +689,8 @@ The optional FORCE option is for internal use only." (add-hook 'minibuffer-exit-hook #'exwm-workspace--on-minibuffer-exit) (run-with-idle-timer 0 t #'exwm-workspace--on-echo-area-dirty) (add-hook 'echo-area-clear-hook #'exwm-workspace--on-echo-area-clear) + ;; Handle unexpected frame switch. + (add-hook 'focus-in-hook #'exwm-workspace--on-focus-in) ;; Create workspace frames. (dotimes (_ exwm-workspace-number) (push (make-frame `((window-system . x)