[EMAIL PROTECTED] (Kim F. Storm) writes: > 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).
I think exposing the "container windows" as my previous patch did was a really bad idea. Instead, I prefer to explicitly include the window-edges of those windows. Below is a different patch which implements this. The new window-split-tree function doesn't return the format Lennart requested, but it is trivial to convert it to his proposed format: (defun balance-window-split (&optional frame) (balance-window-split-1 (car (window-split-tree frame)))) (defun balance-window-split-1 (split) (if (windowp split) split (let ((dir (car split)) (edges (car (cdr split))) (childs (cdr (cdr split)))) (list (cons 'dir (if dir 'ver 'hor)) (cons 'b (nth 3 edges)) (cons 'r (nth 2 edges)) (cons 't (nth 1 edges)) (cons 'l (nth 0 edges)) (cons 'childs (mapcar #'balance-window-split-1 childs)))))) Here's the revised patch: 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 29 Sep 2005 12:31:57 -0000 *************** *** 6225,6230 **** --- 6226,6310 ---- return unbind_to (count, val); } + + + /*********************************************************************** + 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 (Fwindow_edges (wn), + window_split_tree (XWINDOW (w->hchild)))); + else if (!NILP (w->vchild)) + wn = Fcons (Qt, Fcons (Fwindow_edges (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 EDGES W1 W2 ...) where DIR is nil for a + horisontal split, and t for a vertical split, EDGES gives the combined + size and position of the subwindows in the 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 representing a window split, and so on. + EDGES is a list \(LEFT TOP RIGHT BOTTOM) as returned by `window-edges'. + + 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))); + } + /*********************************************************************** Marginal Areas *************** *** 7031,7036 **** --- 7111,7117 ---- 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 <[EMAIL PROTECTED]> http://www.cua.dk _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel