Script allows to move maximized windows to another head. It retains and tries to adapt maximization attributes to the new head.


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


Window will be resized to the wrong size when the new head has another reserved area (e.g. no panel).

Community content is available under CC-BY-SA unless otherwise noted.