Function: window--transpose

window--transpose is a byte-compiled function defined in window-x.el.gz.

Signature

(window--transpose WINDOW CONF NO-RESIZE)

Documentation

Rearrange windows under WINDOW recursively.

CONF should be a cons cell (HORIZONTAL-SPLIT . VERTICAL-SPLIT) where HORIZONTAL-SPLIT will be used as the third argument of split-window when splitting a window that was previously horizontally split, and VERTICAL-SPLIT as third argument of split-window for a window that was previously vertically split. If NO-RESIZE is nil, the SIDE argument of the window-split is converted from vertical to horizontal or vice versa, with the same proportion of the total split.

Source Code

;; Defined in /usr/src/emacs/lisp/window-x.el.gz
(defun window--transpose (window conf no-resize)
  "Rearrange windows under WINDOW recursively.
CONF should be a cons cell (HORIZONTAL-SPLIT . VERTICAL-SPLIT) where
HORIZONTAL-SPLIT will be used as the third argument of `split-window'
when splitting a window that was previously horizontally split, and
VERTICAL-SPLIT as third argument of `split-window' for a window that was
previously vertically split.  If NO-RESIZE is nil, the SIDE argument of
the window-split is converted from vertical to horizontal or vice versa,
with the same proportion of the total split."
  (when (or (not window) (window-live-p window))
    (user-error "No windows to transpose"))
  (let* ((frame (window-frame window))
	 (first-window window)
	 (selected-window (frame-selected-window window))
	 (win-tree (car (window-tree-normal-sizes window)))
	 (win-list (seq-filter #'window-live-p (flatten-list win-tree)))
	 (atom-windows (seq-keep #'window-atom-root win-list)))
    (unless (and (not (eq (car atom-windows) window))
                 (or no-resize
		     (and (not atom-windows)
                          (not (seq-some #'window-fixed-size-p win-list)))))
      (user-error "Cannot rotate windows due to fixed size or atom windows"))
    (delete-dups atom-windows)
    (while (not (window-live-p first-window))
      (setq first-window (window-child first-window)))
    (delete-other-windows-internal first-window window)
    (window--transpose-1 win-tree first-window conf no-resize atom-windows)
    ;; Go back to previously selected window.
    (set-frame-selected-window frame selected-window)
    (mapc #'window-make-atom atom-windows)))