# HG changeset patch # User Kim F. Storm # Date 1128435245 0 # Node ID d16139114c9c639f7f62be674864015a8ce7a542 # Parent b89d9c4d5386b988c39262261971cb217f3f458b (window_split_tree): New function. (Fwindow_split_tree): New defun. (syms_of_window): Defsubr it. diff -r b89d9c4d5386 -r d16139114c9c src/window.c --- a/src/window.c Tue Oct 04 14:06:44 2005 +0000 +++ b/src/window.c Tue Oct 04 14:14:05 2005 +0000 @@ -6225,6 +6225,85 @@ 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,6 +7110,7 @@ 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);