From: pranshu sharma <pranshusharma366@gmail.com>
To: martin rudalics <rudalics@gmx.at>
Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org
Subject: Re: Add function to rotate/transpose all windows
Date: Thu, 03 Oct 2024 20:09:43 +1000 [thread overview]
Message-ID: <8734ldlcpk.fsf@gmail.com> (raw)
In-Reply-To: <32650808-7cf9-4288-91b5-c7d78663de8f@gmx.at> (martin rudalics's message of "Thu, 3 Oct 2024 10:17:31 +0200")
martin rudalics <rudalics@gmx.at> writes:
>>> I'd call this just 'window--transpose'.
>>
>> done
>
> Not really IIUC.
sorry, it is done now
> Then please say "the arguments are the same as for
> `window--transpose'".
yes, done
> Once we have installed it, we'll consult Juri Linkov. He knows more
> about keybindings in this area. BTW, you could have a look at the
> function 'window-swap-states'. IIUC it should then be rewritten in
> terms of the 'flip-windows-...' functions to get rid of window states
> and the overlay rigmarole.
Hmm, the only way I can imagine using the flip thing is modifying window
tree to swap 2 windows in the subtree, and then set conf to (below
. left) and do-not-convert-size to nil. This will just rebuild the
whole window tree.
>
> Please test what happens if you have a keybinding for this and you hit
> that key in the minibuffer window, for example, after typing C-h f.
>
It just acts as if you are calling it without prefix arg, I think that
is expected behaviour imo. It just goes back to orignal if
read-minibuffer-restore-windows is non nil.
> Still a space missing after the "."
>
>> (defun flip-windows-vertically (&optional frame-or-window)
>> "Horizontally flip windows of FRAME-OR-WINDOW. When the windows are
>
> Newline missing after ".".
>
>> flipped vertically, the window layout is made to it's reflection from
>> the top edge. FRAME-OR-WINDOW must be a live frame or window and
>> defaults to the selected frame. If FRAME-OR-WINDOW is a frame, flip from
>
> Space missing after ".".
>> (defun transpose-windows--rearrange (frame-or-window conf do-not-convert-size)
> ... third argument _of_ ...
>
>> previously vertically split. When is DO-NOT-CONVERT-SIZE non-nil, the
>
ah puncutation comments, I just failed my english writing exam on
wednesday :(
> Actually
>
> (zerop (window-child-count rwin))
>
> is equivalent to
>
> (window-live-p rwin)
>
> and the latter should be cheaper.
Thanks, I applied that change
> What I forgot to ask so far: Have you completed copyright assignment
> for Emacs? I can't look into this myself.
I sent the form to assign@gnu.org, 15 days ago, still waiting for reply.
Does it normally take this long?
Code:
----------------------------------------
(defun window-tree-pixel-sizes (window &optional next)
"Return pixel sizes of all windows rooted at WINDOW.
The return value is a list where each window is represented either by a
triple whose first element is either t for an internal window that is a
horizontal combination, nil for an internal window that is a vertical
combination, or the window itself for a live window. The second element
is a cons of the pixel height and pixel width of the window. The third
element is specified for internal windows only and recursively lists
that window's child windows using the same triple structure."
(let (list)
(while window
(setq list
(cons
(cond
((window-top-child window)
(cons t (cons (cons (window-pixel-height window)
(window-pixel-width window))
(window-tree-pixel-sizes
(window-top-child window) t))))
((window-left-child window)
(cons nil (cons (cons (window-pixel-height window)
(window-pixel-width window))
(window-tree-pixel-sizes
(window-left-child window) t))))
(t (list window (cons (window-pixel-height window)
(window-pixel-width window)))))
list))
(setq window (when next (window-next-sibling window))))
(nreverse list)))
(defun rotate-windows-anticlockwise (&optional frame-or-window)
"Rotate windows of FRAME-OR-WINDOW anticlockwise by 90 degrees.
FRAME-OR-WINDOW must be a live frame or window and defaults to the
selected frame. If FRAME-OR-WINDOW is a frame, rotate the main window
of the frame, otherwise rotate FRAME-OR-WINDOW. See
`rotate-windows-clockwise' for how to rotate windows in the opposite
direction"
(interactive `(,(and current-prefix-arg (window-parent))))
(let ((window (if (windowp frame-or-window)
frame-or-window
(window-main-window frame-or-window))))
(window--transpose window '(right . above) nil)))
(defun rotate-windows-clockwise (&optional frame-or-window)
"Rotate windows of FRAME-OR-WINDOW clockwise by 90 degrees.
FRAME-OR-WINDOW must be a live frame or window and defaults to the
selected frame. If FRAME-OR-WINDOW is a frame, rotate the main window
of the frame, otherwise rotate FRAME-OR-WINDOW. See
`rotate-windows-anticlockwise' for how to rotate windows in the opposite
direction"
(interactive `(,(and current-prefix-arg (window-parent))))
(let ((window (if (windowp frame-or-window)
frame-or-window
(window-main-window frame-or-window))))
(window--transpose window '(left . below) nil)))
(defun flip-windows-horizontally (&optional frame-or-window)
"Horizontally flip windows of FRAME-OR-WINDOW.
When the windows are flipped horzontally, the window layout is made to
it's reflection from the side edge. FRAME-OR-WINDOW must be a live
frame or window and defaults to the selected frame. If FRAME-OR-WINDOW
is a frame, flip from the main window of the frame, otherwise flip from
FRAME-OR-WINDOW. See `flip-windows-vertically' for how to flip windows
vertically."
(interactive `(,(and current-prefix-arg (window-parent))))
(let ((window (if (windowp frame-or-window)
frame-or-window
(window-main-window frame-or-window))))
(window--transpose window '(below . left) t)))
(defun flip-windows-vertically (&optional frame-or-window)
"Horizontally flip windows of FRAME-OR-WINDOW.
When the windows are flipped vertically, the window layout is made to
it's reflection from the top edge. FRAME-OR-WINDOW must be a live frame
or window and defaults to the selected frame. If FRAME-OR-WINDOW is a
frame, flip from the main window of the frame, otherwise flip from
FRAME-OR-WINDOW. See `flip-windows-horizontally' for how to flip
windows horizontally."
(interactive `(,(and current-prefix-arg (window-parent))))
(let ((window (if (windowp frame-or-window)
frame-or-window
(window-main-window frame-or-window))))
(window--transpose window '(above . right) t)))
(defun transpose-windows (&optional frame-or-window)
"Transpose windows of FRAME-OR-WINDOW.
Rearrange windows such that where a horizontal split was used a vertical
one is used instead, and vice versa. FRAME-OR-WINDOW must be a live
frame or window and defaults to the selected frame. If FRAME-OR-WINDOW
is a frame, transpose the main window of the frame, otherwise
transpose FRAME-OR-WINDOW."
(interactive `(,(and current-prefix-arg (window-parent))))
(let ((window (if (windowp frame-or-window)
frame-or-window
(window-main-window frame-or-window))))
(window--transpose window '(right . below) nil)))
(defun window--transpose (frame-or-window conf do-not-convert-size)
"Rearrange windows of FRAME-OR-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 DO-NOT-CONVERT-SIZE non-nil, the size
argument of the window-split is converted from vertical to horizontal or
vice versa, with the same proportion of the total split."
(pcase-let ((`(,rwin . ,frame)
(if (framep frame-or-window)
(cons (window-main-window frame-or-window) frame-or-window)
(cons frame-or-window (window-frame frame-or-window)))))
(if (or (not rwin)
(window-live-p rwin))
(message "No windows to transpose")
(let* ((fwin rwin)
(selwin (frame-selected-window frame-or-window))
(win-tree (car (window-tree-pixel-sizes rwin))))
(while (not (window-live-p fwin))
(setq fwin (window-child fwin)))
;; All child windows need to be recursively deleted.
(mapc (lambda (win)
(when (and (windowp win)
(not (eq win fwin)))
(delete-window win)))
;; We know for sure that first 2 in the list are not
;; windows.
(cddr (flatten-list win-tree)))
(window--transpose-1 win-tree fwin conf do-not-convert-size)
;; Go back to previously selected window.
(set-frame-selected-window frame selwin)))))
(defun window--transpose-1 (subtree cwin conf do-not-convert-size)
"Subroutine of `window--transpose'.
SUBTREE must be in the format of the result of
`window-tree-pixel-sizes'. CWIN is the current window through which the
window splits are made. The CONF and DO-NOT-CONVERT-SIZE arguments are
the same as the ones in `window--transpose'."
;; `ilen' is the max size a window could be of given the split type.
;; `flen' is max size the window could be converted to the opposite
;; of the given split type.
(pcase-let ((`(,ilen . ,flen) (if (car subtree)
(cons (float (car (cadr subtree)))
(float (window-pixel-width cwin)))
(cons (float (cdr (cadr subtree)))
(float (window-pixel-height cwin))))))
(mapc
(pcase-lambda (`(,win . ,size))
(let ((split-size (- (if do-not-convert-size
size
(round (* flen (/ size ilen))))))
(split-type
(funcall (if (car subtree) 'car 'cdr) conf)))
(if (listp win)
;; `win' is a window subtree.
(window--transpose-1 win (split-window cwin
split-size
split-type
t
(seq-some
(lambda (x)
(and (windowp x) x))
(flatten-list win)))
conf do-not-convert-size)
;; `win' is a window.
(split-window cwin split-size
split-type t
win))))
(mapcar
(lambda (e)
(let ((window? (if (windowp (car e)) (car e) e)))
(cons window?
;; The respective size of the window.
(if (car subtree)
(car (cadr e))
(cdr (cadr e))))))
;; By using cdddr, we ignore window split type, sizes and the
;; first window (it's implicitly created).
(nreverse (cdddr subtree))))
;; (caaddr subtree) is the first window.
(unless (windowp (caaddr subtree))
(window--transpose-1 (caddr subtree) cwin conf do-not-convert-size))))
next prev parent reply other threads:[~2024-10-03 10:09 UTC|newest]
Thread overview: 144+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-24 13:45 Add function to rotate/transpose all windows pranshu sharma
2024-09-24 13:53 ` Eli Zaretskii
2024-09-25 8:05 ` martin rudalics
2024-09-25 8:34 ` pranshu sharma
2024-09-25 9:31 ` martin rudalics
2024-09-25 10:50 ` pranshu sharma
2024-09-25 13:53 ` martin rudalics
2024-09-25 15:31 ` pranshu sharma
2024-09-26 14:10 ` martin rudalics
2024-09-26 14:22 ` Eli Zaretskii
2024-09-27 17:29 ` martin rudalics
2024-09-28 7:52 ` pranshu sharma
2024-09-28 9:26 ` martin rudalics
2024-09-28 10:53 ` pranshu sharma
2024-09-28 14:48 ` martin rudalics
2024-09-29 7:36 ` pranshu sharma
2024-09-29 8:40 ` martin rudalics
2024-09-29 9:23 ` pranshu sharma
2024-09-29 14:48 ` martin rudalics
2024-09-30 6:29 ` pranshu sharma
2024-09-30 8:57 ` martin rudalics
2024-10-01 9:17 ` pranshu sharma
2024-10-02 9:04 ` martin rudalics
2024-10-03 7:06 ` pranshu sharma
2024-10-03 8:17 ` martin rudalics
2024-10-03 10:09 ` pranshu sharma [this message]
2024-10-03 14:18 ` martin rudalics
2024-10-04 5:50 ` pranshu sharma
2024-10-04 8:08 ` martin rudalics
2024-10-04 15:10 ` pranshu sharma
2024-10-05 14:43 ` martin rudalics
2024-10-06 2:54 ` pranshu sharma
2024-10-06 15:02 ` martin rudalics
2024-10-06 15:52 ` pranshu sharma
2024-10-07 8:33 ` martin rudalics
2024-10-07 9:42 ` pranshu sharma
2024-10-03 15:12 ` Eli Zaretskii
2024-10-08 18:35 ` Juri Linkov
2024-10-09 6:59 ` pranshu sharma
2024-10-09 16:21 ` Juri Linkov
2024-10-10 11:49 ` pranshu sharma
2024-10-10 16:57 ` Juri Linkov
2024-10-13 5:43 ` pranshu sharma
2024-10-13 8:17 ` martin rudalics
2024-10-14 17:36 ` Juri Linkov
2024-10-15 8:34 ` pranshu sharma
2024-10-15 16:16 ` Juri Linkov
2024-10-18 14:52 ` pranshu sharma
2024-10-18 17:48 ` martin rudalics
2024-10-18 18:37 ` Eli Zaretskii
2024-10-19 1:45 ` pranshu sharma
2024-10-19 6:45 ` Eli Zaretskii
2024-10-19 18:19 ` Juri Linkov
2024-10-19 8:33 ` martin rudalics
2024-10-20 8:19 ` martin rudalics
2024-10-20 14:11 ` Pranshu Sharma
2024-10-20 17:37 ` martin rudalics
2024-10-21 5:54 ` Pranshu Sharma
2024-10-21 8:14 ` martin rudalics
2024-10-21 9:23 ` martin rudalics
2024-10-21 13:37 ` Pranshu Sharma
2024-10-22 18:12 ` martin rudalics
2024-10-24 14:38 ` Pranshu Sharma
2024-10-24 18:39 ` martin rudalics
2024-10-25 14:24 ` Pranshu Sharma
2024-10-25 17:09 ` martin rudalics
2024-10-26 9:14 ` Pranshu Sharma
2024-10-27 8:23 ` martin rudalics
2024-11-02 14:06 ` Pranshu Sharma
2024-11-05 18:01 ` martin rudalics
2024-11-08 9:23 ` Pranshu Sharma
2024-11-08 10:06 ` Pranshu Sharma
2024-11-08 15:52 ` martin rudalics
2024-11-09 2:14 ` Pranshu Sharma
2024-11-09 8:48 ` martin rudalics
2024-11-08 15:52 ` martin rudalics
2024-11-09 2:09 ` Pranshu Sharma
2024-11-09 8:48 ` martin rudalics
2024-11-09 10:55 ` Pranshu Sharma
2024-11-09 18:06 ` martin rudalics
2024-11-10 10:09 ` Pranshu Sharma
2024-11-10 16:36 ` martin rudalics
2024-11-11 14:47 ` Pranshu Sharma
2024-11-11 16:55 ` martin rudalics
2024-11-12 13:50 ` Pranshu Sharma
2024-11-12 17:46 ` martin rudalics
2024-11-16 13:36 ` Pranshu Sharma
2024-11-16 16:54 ` martin rudalics
2024-11-17 2:45 ` Pranshu Sharma
2024-11-17 10:22 ` martin rudalics
2024-11-17 15:03 ` Pranshu Sharma
2024-11-17 16:38 ` martin rudalics
2024-11-18 0:37 ` Pranshu Sharma
2024-11-18 8:55 ` martin rudalics
2024-11-19 9:34 ` Pranshu Sharma
2024-11-19 17:48 ` martin rudalics
2024-11-21 14:04 ` Pranshu Sharma
2024-11-21 17:54 ` martin rudalics
2024-11-24 13:53 ` Pranshu Sharma
2024-11-26 9:49 ` martin rudalics
2024-11-26 14:14 ` Pranshu Sharma
2024-11-27 8:29 ` Pranshu Sharma
2024-11-27 9:18 ` martin rudalics
2024-11-27 14:37 ` Pranshu Sharma
2024-11-27 17:42 ` martin rudalics
2024-11-28 2:43 ` Pranshu Sharma
2024-11-28 9:28 ` martin rudalics
2024-11-28 15:18 ` Pranshu Sharma
2024-11-30 10:07 ` martin rudalics
2024-11-30 17:41 ` Juri Linkov
2024-11-30 19:01 ` martin rudalics
2024-12-01 4:13 ` Pranshu Sharma
2024-12-03 7:30 ` Juri Linkov
2024-12-03 8:25 ` martin rudalics
2024-12-01 6:41 ` Pranshu Sharma
2024-12-01 17:20 ` martin rudalics
2024-12-02 8:06 ` Pranshu Sharma
2024-12-03 8:23 ` martin rudalics
2024-12-04 15:20 ` Pranshu Sharma
2024-12-04 17:56 ` martin rudalics
2024-12-04 19:12 ` Juri Linkov
2024-12-05 14:16 ` Pranshu Sharma
2024-12-05 17:48 ` Juri Linkov
2024-12-06 4:51 ` Pranshu Sharma
2024-12-06 7:29 ` Juri Linkov
2024-12-05 14:23 ` Pranshu Sharma
2024-12-05 15:17 ` Pranshu Sharma
2024-10-14 17:32 ` Juri Linkov
2024-09-28 7:58 ` pranshu sharma
2024-09-28 8:18 ` Eli Zaretskii
2024-09-28 9:40 ` martin rudalics
2024-09-28 11:35 ` Eli Zaretskii
2024-09-28 14:58 ` martin rudalics
2024-09-28 15:28 ` Eli Zaretskii
2024-10-07 8:33 ` martin rudalics
2024-09-28 13:22 ` pranshu sharma
2024-09-28 14:21 ` Eli Zaretskii
2024-09-28 14:49 ` martin rudalics
2024-09-27 10:06 ` pranshu sharma
2024-09-27 17:29 ` martin rudalics
2024-09-24 17:40 ` Petteri Hintsanen
2024-09-24 19:34 ` Charles Choi
2024-09-25 2:00 ` Emanuel Berg
2024-09-25 7:00 ` pranshu sharma
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8734ldlcpk.fsf@gmail.com \
--to=pranshusharma366@gmail.com \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=rudalics@gmx.at \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).