Synopsis:[]
Script allows to move maximized windows to another head. It retains and tries to adapt maximization attributes to the new head.
Code:[]
(require 'sawfish.wm.state.maximize) (require 'sawfish.wm.util.stacking) (defvar ensc/old-head nil) (defvar ensc/frame-delta nil) (defun ensc/before-move-window (w) (setq ensc/old-head (current-head w)) (let ((head-dim (head-dimensions ensc/old-head)) (frame-dim (window-dimensions w))) (setq ensc/frame-delta (cons (- (car head-dim) (car frame-dim)) (- (cdr head-dim) (cdr frame-dim))))) (setq move-resize-directions ;; HACK: that's a copy of the first part of (infer-directions) ;; and must be adapted when this function is modified (if (window-get w 'fixed-position) '() (list 'vertical 'horizontal 'head)))) (defun ensc/move-window (w) (when (and move-lock-when-maximized (window-maximized-p w) (pointer-head)) ; when moving into smaller head, this can be nil (let* ((cur-head (pointer-head)) (cur-frame-dim (window-frame-dimensions w)) (cur-head-offset (head-offset cur-head)) (cur-head-dim (head-dimensions cur-head))) (unless (equal ensc/old-head cur-head) (when (window-maximized-vertically-p w) (setq move-resize-y (cdr cur-head-offset)) (setq move-resize-height (- (cdr cur-head-dim) (cdr ensc/frame-delta)))) (when (window-maximized-horizontally-p w) (setq move-resize-x (car cur-head-offset)) (setq move-resize-width (- (car cur-head-dim) (car ensc/frame-delta)))) (when (eq move-resize-mode 'opaque) (raise-window* w)) (setq ensc/old-head cur-head))) )) (add-hook 'before-move-hook (lambda (w) (ensc/before-move-window w))) (add-hook 'while-moving-hook (lambda (w) (ensc/move-window w)))
Bugs:[]
Window will be resized to the wrong size when the new head has another reserved area (e.g. no panel).