diff --git a/src/move-wm.scm b/src/move-wm.scm index a482c42..eeebbf0 100644 --- a/src/move-wm.scm +++ b/src/move-wm.scm @@ -70,12 +70,80 @@ ((configure-window) (let ((window (second msg)) - (changes (third msg))) - ;; TODO: exact sizes ?! - (configure-window dpy window - (append (make-window-change-alist - (border-width 0)) - changes)))) + (changes (third msg)) + (client? (client-of-window wm window))) + (if (window-exists? dpy window) (begin + (mdisplay "move-wm: root-configure: " client? window changes "\n") + (let* ((r (window-rectangle dpy window)) + (dx (cond + ((assq (window-change x) changes) => + (lambda (c.x) (- (cdr c.x) (rectangle:x r)))) + (else 0))) + (dy (cond + ((assq (window-change x) changes) => + (lambda (c.x) (- (cdr c.x) (rectangle:x r)))) + (else 0))) + (dw (cond + ((assq (window-change width) changes) => + (lambda (c.w) (- (cdr c.w) (rectangle:width r)))) + (else 0))) + (dh (cond + ((assq (window-change height) changes) => + (lambda (c.h) (- (cdr c.h) (rectangle:height r)))) + (else 0))) + (send-synthetic-event + (lambda () + (let ((r (root-rectangle dpy window))) + (send-event dpy window #f (event-mask structure-notify) + (create-configure-event + (event-type configure-notify) 0 #t dpy + window window + ;; TODO: border-width/gravity ? + (rectangle:x r) (rectangle:y r) + (rectangle:width r) (rectangle:height r) + 0 none #f)))))) + (cond + ((or (assq (window-change width) changes) + (assq (window-change height) changes) + (assq (window-change border-width) changes)) + (if client? + (let* ((cw (client:client-window client?)) + (cr (window-rectangle dpy cw))) + (configure-window + dpy cw + (append (make-window-change-alist + (border-width 0) + (x (+ (rectangle:x cr) dx)) + (y (+ (rectangle:y cr) dy)) + (width (+ (rectangle:width cr) dw)) + (height (+ (rectangle:height cr) dh))) + changes))) + (configure-window dpy window + (append (make-window-change-alist + (border-width 0)) + changes)))) + ((or (assq (window-change x) changes) + (assq (window-change y) changes) + (assq (window-change stack-mode) changes)) + (if client? + (let* ((cw (client:client-window client?)) + (cr (window-rectangle dpy cw))) + (mdisplay "configuring client-window: " cw + (append (make-window-change-alist + (border-width 0) + (x (+ (rectangle:x cr) dx)) + (y (+ (rectangle:y cr) dy))) + changes) "\n") + + (configure-window + dpy cw + (append (make-window-change-alist + (border-width 0) + (x (+ (rectangle:x cr) dx)) + (y (+ (rectangle:y cr) dy))) + changes)))) + (send-synthetic-event)) + (else (send-synthetic-event)))))))) ((iconify-client) (let ((client (second msg))) @@ -170,7 +238,8 @@ (let ((bw (get-option-value options 'border-width)) (th (get-option-value options 'titlebar-height))) (move-resize-window dpy (client:client-window client) - (rectangle:x r) (rectangle:y r) + (- (rectangle:x r) bw) + (- (rectangle:y r) (+ bw th)) (+ (rectangle:width r) (* 2 bw)) (+ (rectangle:height r) (* 2 bw) th))) (fit-client-windows wm client) @@ -323,7 +392,13 @@ (default-height (if maybe-rect (rectangle:height maybe-rect) 200)) (w.h (initial-client-size wm client default-width default-height)) ;; TODO: Transients centered? - (maybe-x.y (find-free-position wm client w.h (cons 0 0))) + (options (wm:options wm)) + (maybe-x.y + (let* ((bw (get-option-value options 'border-width)) + (th (get-option-value options 'titlebar-height)) + (x.y (find-free-position wm client w.h '(0 . 0)))) + (cons (+ (car x.y) bw) + (+ (cdr x.y) (+ bw th))))) (x.y (desired-position/hints dpy win maybe-x.y))) (make-rectangle (car x.y) (cdr x.y) (car w.h) (cdr w.h))))