diff --git a/lisp/window-x.el b/lisp/window-x.el index 14009db1223..35afc603e45 100644 --- a/lisp/window-x.el +++ b/lisp/window-x.el @@ -152,20 +152,9 @@ rotate-windows-back (interactive (list (window--rotate-interactive-arg))) (rotate-windows window t)) -;;;###autoload -(defun rotate-windows (&optional window reverse) - "Rotate windows under WINDOW in cyclic ordering. - -Optional argument REVERSE says to rotate windows backward, in reverse -cyclic order. - -If WINDOW is nil, it defaults to the root window of the selected frame. - -Interactively, a prefix argument says to rotate the parent window of the -selected window." - (interactive (list (window--rotate-interactive-arg))) +(defun windows--rearrange-order (window ls-func) (when (or (not window) (window-live-p window)) - (user-error "No windows to rotate")) + (user-error "No windows to rearrange")) (let* ((frame (window-frame window)) (selected-window (frame-selected-window window)) (win-tree (car (window-tree-normal-sizes window))) @@ -176,11 +165,8 @@ rotate-windows (not (window-dedicated-p win)))) (flatten-list win-tree)) (user-error "All windows are dedicated"))) - (rotated-ls (if reverse - (append (cdr winls) (list (car winls))) - (append (last winls) winls))) - (other-window-arg (if reverse 1 -1)) - (first-window (car rotated-ls)) + (new-ls (funcall ls-func winls)) + (first-window (car new-ls)) (new-win-tree ;; Recursively process `win-tree' and construct a new tree ;; with the same shape and rotated windows at the leaves. @@ -189,7 +175,7 @@ rotate-windows ((consp tree) (cons (rec (car tree)) (rec (cdr tree)))) ((and (window-live-p tree) (not (window-dedicated-p tree))) - (pop rotated-ls)) + (pop new-ls)) (t tree))))) (when (or (seq-some #'window-atom-root winls) (seq-some #'window-fixed-size-p winls)) @@ -197,11 +183,48 @@ rotate-windows (delete-other-windows-internal first-window window) (window--transpose-1 new-win-tree first-window '(below . right) t nil) (set-frame-selected-window frame selected-window) + winls)) + +;;;###autoload +(defun rotate-windows (&optional window reverse) + "Rotate windows under WINDOW in cyclic ordering. + +Optional argument REVERSE says to rotate windows backward, in reverse +cyclic order. + +If WINDOW is nil, it defaults to the root window of the selected frame. + +Interactively, a prefix argument says to rotate the parent window of the +selected window." + (interactive (list (window--rotate-interactive-arg))) + (let ((winls (windows--rearrange-order + window + (lambda (winls) + (if reverse + (append (cdr winls) (list (car winls))) + (append (last winls) winls))))) + (other-window-arg (if reverse 1 -1))) (when rotate-windows-change-selected (other-window other-window-arg) - (while (not (memq (selected-window) winls)) + (while (not (memq (frame-selected-window window) winls)) (other-window other-window-arg))))) +(defun reverse-window-layout (&optional window) + "Reverses the cyclic ordering of windows under WINDOW. + +If WINDOW is nil, it defaults to the root window of the selected frame. + +Interactively, a prefix argument says to reverse the parent window of +the selected window." + (interactive (list (window--rotate-interactive-arg))) + (let ((winls (windows--rearrange-order + window + ;; TODO Proper dedicated window handeling, this function + ;; has extra requriments. + 'reverse))) + (other-window + (- (* 2 (+ 1 (seq-position winls (frame-selected-window window)))) 1)))) + (defun window--transpose (window conf no-resize) "Rearrange windows under WINDOW recursively. CONF should be a cons cell (HORIZONTAL-SPLIT . VERTICAL-SPLIT) where