From 1ce18afd0559bacc3a7c43f5a73342814a5b176f Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Tue, 11 Aug 2015 15:06:11 +0800 Subject: [PATCH] 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 +++++++++++++++++++- exwm-input.el | 1 - exwm-manage.el | 7 +++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/exwm-floating.el b/exwm-floating.el index 3971fa4..7888fd2 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 diff --git a/exwm-input.el b/exwm-input.el index a193314..4acacdf 100644 --- a/exwm-input.el +++ b/exwm-input.el @@ -86,7 +86,6 @@ It's updated in several occasions, and only used by `exwm-input--set-focus'.") "Update input focus." (when (and (frame-parameter nil 'exwm-window-id) ;e.g. emacsclient frame (eq (current-buffer) (window-buffer))) ;e.g. `with-temp-buffer' - (exwm--log "EXWM-INPUT--UPDATE-FOCUS") (if (eq major-mode 'exwm-mode) (progn (exwm--log "Set focus ID to #x%x" exwm--id) (setq exwm-input--focus-id exwm--id) diff --git a/exwm-manage.el b/exwm-manage.el index 79cff22..fc61e50 100644 --- a/exwm-manage.el +++ b/exwm-manage.el @@ -276,6 +276,8 @@ corresponding buffer.") buffer edges) (xcb:unmarshal obj data) (with-slots (window x y width height border-width) obj + (exwm--log "ConfigureRequest from #x%x @%dx%d%+d%+d, border: %d" + window width height x y border-width) (if (setq buffer (exwm--id->buffer window)) ;; Send client message for managed windows (with-current-buffer buffer @@ -286,6 +288,7 @@ corresponding buffer.") (or exwm--floating-edges (window-inside-absolute-pixel-edges (get-buffer-window))))) + (exwm--log "Reply with ConfigureNotify (edges): %s" edges) (xcb:+request exwm--connection (make-instance 'xcb:SendEvent :propagate 0 :destination window @@ -300,6 +303,7 @@ corresponding buffer.") :height (- (elt edges 3) (elt edges 1)) :border-width 0 :override-redirect 0) exwm--connection)))) + (exwm--log "ConfigureWindow (preserve geometry)") ;; Configure unmanaged windows (xcb:+request exwm--connection (make-instance 'xcb:ConfigureWindow @@ -317,6 +321,7 @@ corresponding buffer.") "Handle MapRequest event." (let ((obj (make-instance 'xcb:MapRequest))) (xcb:unmarshal obj data) + (exwm--log "MapRequest from #x%x" (slot-value obj 'window)) (exwm-manage--manage-window (slot-value obj 'window)))) (defun exwm-manage--on-UnmapNotify (data synthetic) @@ -324,6 +329,7 @@ corresponding buffer.") (unless synthetic (let ((obj (make-instance 'xcb:UnmapNotify))) (xcb:unmarshal obj data) + (exwm--log "UnmapNotify from #x%x" (slot-value obj 'window)) (exwm-manage--unmanage-window (slot-value obj 'window) t)))) (defun exwm-manage--on-DestroyNotify (data synthetic) @@ -331,6 +337,7 @@ corresponding buffer.") (unless synthetic (let ((obj (make-instance 'xcb:DestroyNotify))) (xcb:unmarshal obj data) + (exwm--log "DestroyNotify from #x%x" (slot-value obj 'window)) (exwm-manage--unmanage-window (slot-value obj 'window))))) (defun exwm-manage--init ()