From: storm@cua.dk (Kim F. Storm)
Cc: help-gnu-emacs@gnu.org, Emacs Devel <emacs-devel@gnu.org>
Subject: Re: balance-windows again
Date: Wed, 28 Sep 2005 00:57:06 +0200 [thread overview]
Message-ID: <m3zmpyt8zh.fsf@kfs-l.imdomain.dk> (raw)
In-Reply-To: <432ABE47.1010909@student.lu.se> (Lennart Borgman's message of "Fri, 16 Sep 2005 14:44:55 +0200")
Lennart Borgman <lennart.borgman.073@student.lu.se> writes:
>>>Is there any possibility that access to the window split tree from
>>>elisp could be implemented in Emacs?
>>
> A tree where the nodes are the splits and the leaves are the windows.
>
The following patch adds a window-split-tree function which returns a simple
tree presentation of the window split. You can use window-edges on the
elements of the tree to get the dimensions (and build your representation).
Index: window.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/window.c,v
retrieving revision 1.516
diff -c -r1.516 window.c
*** window.c 18 Sep 2005 16:28:53 -0000 1.516
--- window.c 27 Sep 2005 22:54:40 -0000
***************
*** 6225,6230 ****
--- 6226,6312 ----
return unbind_to (count, val);
}
+
+ \f
+ /***********************************************************************
+ Window Split Tree
+ ***********************************************************************/
+
+ static Lisp_Object
+ window_split_tree (w)
+ struct window *w;
+ {
+ Lisp_Object tail = Qnil;
+ Lisp_Object result = Qnil;
+
+ while (w)
+ {
+ Lisp_Object wn;
+
+ XSETWINDOW (wn, w);
+ if (!NILP (w->hchild))
+ wn = Fcons (Qnil, Fcons (wn, window_split_tree (XWINDOW (w->hchild))));
+ else if (!NILP (w->vchild))
+ wn = Fcons (Qt, Fcons (wn, window_split_tree (XWINDOW (w->vchild))));
+
+ if (NILP (result))
+ {
+ result = tail = Fcons (wn, Qnil);
+ }
+ else
+ {
+ XSETCDR (tail, Fcons (wn, Qnil));
+ tail = XCDR (tail);
+ }
+
+ w = NILP (w->next) ? 0 : XWINDOW (w->next);
+ }
+
+ return result;
+ }
+
+
+
+ DEFUN ("window-split-tree", Fwindow_split_tree, Swindow_split_tree,
+ 0, 1, 0,
+ doc: /* Return the window split tree for frame FRAME.
+
+ The return value is a list of the form (ROOT MINI), where ROOT
+ represents the window split tree of the frame's root window, and MINI
+ is the frame's minibuffer window.
+
+ If the root window is not split, ROOT is the root window itself.
+ Otherwise, ROOT is a list (DIR W W1 W2 ...) where DIR is nil for a
+ horisontal split, and t for a vertical split, W is the container
+ window for the window split, and the rest of the elements are the
+ subwindows in the split. Each of the subwindows may again be a window
+ or a list of subwindows, and so on.
+
+ The container windows are not live windows (see `window-live-p'), but
+ you can use `window-edges' and `window-inside-edges' on the container
+ windows to get the combined size of a sub-tree of the full window
+ split.
+
+ If FRAME is nil or omitted, return information on the currently
+ selected frame. */)
+ (frame)
+ Lisp_Object frame;
+ {
+ Lisp_Object alist;
+ FRAME_PTR f;
+
+ if (NILP (frame))
+ frame = selected_frame;
+
+ CHECK_FRAME (frame);
+ f = XFRAME (frame);
+
+ if (!FRAME_LIVE_P (f))
+ return Qnil;
+
+ return window_split_tree (XWINDOW (FRAME_ROOT_WINDOW (f)));
+ }
+
\f
/***********************************************************************
Marginal Areas
***************
*** 7031,7036 ****
--- 7113,7119 ----
defsubr (&Sset_window_configuration);
defsubr (&Scurrent_window_configuration);
defsubr (&Ssave_window_excursion);
+ defsubr (&Swindow_split_tree);
defsubr (&Sset_window_margins);
defsubr (&Swindow_margins);
defsubr (&Sset_window_fringes);
>
--
Kim F. Storm <storm@cua.dk> http://www.cua.dk
next prev parent reply other threads:[~2005-09-27 22:57 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-14 23:43 balance-windows again Lennart Borgman
2005-09-16 7:01 ` Lennart Borgman
2005-09-16 8:20 ` Kim F. Storm
2005-09-16 12:44 ` Lennart Borgman
2005-09-27 22:57 ` Kim F. Storm [this message]
2005-09-29 12:34 ` Kim F. Storm
2005-09-30 12:03 ` Lennart Borgman
-- strict thread matches above, loose matches on Subject: below --
2005-09-15 17:13 Bingham, Jay
2005-09-15 22:11 ` Lennart Borgman
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=m3zmpyt8zh.fsf@kfs-l.imdomain.dk \
--to=storm@cua.dk \
--cc=emacs-devel@gnu.org \
--cc=help-gnu-emacs@gnu.org \
/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.
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).