From 5c5729c0d4832a870a928d6d7cc2f990a7e8f649 Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Mon, 19 Feb 2018 22:40:27 +0800 Subject: Fix various issues with multi-monitor support * exwm-workspace.el (exwm-workspace-switch): Do not hide X windows when switching to a workspace on another output; update the timestamp (last switched to) of a workspace frame. (exwm-workspace-move-window): Do not hide an X window when moving it to an active workspace on another output. * exwm-floating.el (exwm-floating--set-floating): * exwm-layout.el (exwm-layout-set-fullscreen): * exwm-manage.el (exwm-manage--manage-window) (exwm-manage--on-ConfigureRequest): * exwm-systemtray.el (exwm-systemtray--refresh) (exwm-systemtray--init): Correct coordinate calculations. * exwm-workspace.el (exwm-workspace--current-width): Removed since no longer used. --- exwm-floating.el | 74 ++++++++++++++++++++++++-------------------------------- 1 file changed, 31 insertions(+), 43 deletions(-) (limited to 'exwm-floating.el') diff --git a/exwm-floating.el b/exwm-floating.el index 8cd0491bea..5a2c61e878 100644 --- a/exwm-floating.el +++ b/exwm-floating.el @@ -129,52 +129,22 @@ This is also used by X window containers.") (y (slot-value exwm--geometry 'y)) (width (slot-value exwm--geometry 'width)) (height (slot-value exwm--geometry 'height))) - (exwm--log "Floating geometry (original, absolute): %dx%d%+d%+d" - width height x y) - (when (and (/= x 0) - (/= y 0)) - (let ((workarea (elt exwm-workspace--workareas - (exwm-workspace--position original-frame)))) - (setq x (- x (aref workarea 0)) - y (- y (aref workarea 1))))) - (exwm--log "Floating geometry (original, relative): %dx%d%+d%+d" - width height x y) + (exwm--log "Floating geometry (original): %dx%d%+d%+d" width height x y) ;; Save frame parameters. (set-frame-parameter frame 'exwm-outer-id outer-id) (set-frame-parameter frame 'exwm-id window-id) (set-frame-parameter frame 'exwm-container frame-container) ;; Fix illegal parameters ;; FIXME: check normal hints restrictions - (let* ((display-width (frame-pixel-width original-frame)) - (display-height (- (frame-pixel-height original-frame) - (if (exwm-workspace--minibuffer-own-frame-p) - 0 - (window-pixel-height (minibuffer-window - original-frame))) - (* 2 (window-mode-line-height)) - (window-header-line-height window))) - (display-height (* 2 (/ display-height 2)))) ;round to even - (if (> width display-width) - ;; Too wide - (progn (setq x 0 - width display-width)) - ;; Invalid width - (when (= 0 width) (setq width (/ display-width 2))) - ;; Make sure at least half of the window is visible - (when (or (> (+ x (/ width 2)) display-width) (> 0 (+ x (/ width 2)))) - (setq x (/ (- display-width width) 2)))) - (if (> height display-height) - ;; Too tall - (setq y 0 - height display-height) - ;; Invalid height - (when (= 0 height) (setq height (/ display-height 2))) - ;; Make sure at least half of the window is visible - (when (or (> (+ y (/ height 2)) display-height) - (> 0 (+ y (/ height 2)))) - (setq y (/ (- display-height height) 2)))) + (let* ((workarea (elt exwm-workspace--workareas + (exwm-workspace--position original-frame))) + (x* (aref workarea 0)) + (y* (aref workarea 1)) + (width* (aref workarea 2)) + (height* (aref workarea 3))) ;; Center floating windows - (when (and (= x 0) (= y 0)) + (when (and (or (= x 0) (= x x*)) + (or (= y 0) (= y y*))) (let ((buffer (exwm--id->buffer exwm-transient-for)) window edges) (when (and buffer (setq window (get-buffer-window buffer))) @@ -184,11 +154,29 @@ This is also used by X window containers.") (setq edges nil))) (if edges ;; Put at the center of leading window - (setq x (/ (- (elt edges 2) (elt edges 0) width) 2) - y (/ (- (elt edges 3) (elt edges 1) height) 2)) + (setq x (+ x* (/ (- (elt edges 2) (elt edges 0) width) 2)) + y (+ y* (/ (- (elt edges 3) (elt edges 1) height) 2))) ;; Put at the center of screen - (setq x (/ (- display-width width) 2) - y (/ (- display-height height) 2)))))) + (setq x (/ (- width* width) 2) + y (/ (- height* height) 2))))) + (if (> width width*) + ;; Too wide + (progn (setq x x* + width width*)) + ;; Invalid width + (when (= 0 width) (setq width (/ width* 2))) + ;; Make sure at least half of the window is visible + (unless (< x* (+ x (/ width 2)) (+ x* width*)) + (setq x (+ x* (/ (- width* width) 2))))) + (if (> height height*) + ;; Too tall + (setq y y* + height height*) + ;; Invalid height + (when (= 0 height) (setq height (/ height* 2))) + ;; Make sure at least half of the window is visible + (unless (< y* (+ y (/ height 2)) (+ y* height*)) + (setq y (+ y* (/ (- height* height) 2)))))) (exwm--set-geometry id x y nil nil) (xcb:flush exwm--connection) (exwm--log "Floating geometry (corrected): %dx%d%+d%+d" width height x y) -- cgit 1.4.1