From 1ce18afd0559bacc3a7c43f5a73342814a5b176f Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Tue, 11 Aug 2015 15:06:11 +0800 Subject: Center floating windows by default This commit makes a floating window centered to its leading window if it has a valid WM_TRANSIENT_FOR property set. Other it's placed at the center of the screen. --- exwm-floating.el | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'exwm-floating.el') diff --git a/exwm-floating.el b/exwm-floating.el index 3971fa48126b..7888fd2d0b4f 100644 --- a/exwm-floating.el +++ b/exwm-floating.el @@ -67,6 +67,7 @@ (y (slot-value exwm--geometry 'y)) (width (slot-value exwm--geometry 'width)) (height (slot-value exwm--geometry 'height))) + (exwm--log "Floating geometry (original): %dx%d%+d%+d" width height x y) ;; Save window IDs (set-frame-parameter frame 'exwm-window-id frame-id) (set-frame-parameter frame 'exwm-outer-id outer-id) @@ -102,7 +103,24 @@ (when (= 0 height) (setq height (/ display-height 2))) ;; Completely outside (when (or (> y display-height) (> 0 (+ y display-height))) - (setq y (/ (- display-height height) 2))))) + (setq y (/ (- display-height height) 2)))) + ;; Center floating windows + (when (and (= x 0) (= y 0)) + (let ((buffer (exwm--id->buffer exwm-transient-for)) + window edges) + (when (and buffer (setq window (get-buffer-window buffer))) + (setq edges (window-inside-absolute-pixel-edges window)) + (unless (and (<= width (- (elt edges 2) (elt edges 0))) + (<= height (- (elt edges 3) (elt edges 1)))) + (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)) + ;; Put at the center of screen + (setq x (/ (- display-width width) 2) + y (/ (- display-height height) 2)))))) + (exwm--log "Floating geometry (corrected): %dx%d%+d%+d" width height x y) ;; Set OverrideRedirect on this frame (xcb:+request exwm--connection (make-instance 'xcb:ChangeWindowAttributes -- cgit 1.4.1