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).