From 94e16dd57500765e9ef12f0c64e96f5d9fe5523e Mon Sep 17 00:00:00 2001 From: "Kim F. Storm" Date: Tue, 4 Oct 2005 14:14:05 +0000 Subject: [PATCH] (window_split_tree): New function. (Fwindow_split_tree): New defun. (syms_of_window): Defsubr it. --- src/window.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/src/window.c b/src/window.c index 9e75a592733..d282c2dd3f4 100644 --- a/src/window.c +++ b/src/window.c @@ -6225,6 +6225,85 @@ usage: (save-window-excursion BODY ...) */) 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 @@ The selected frame is the one whose configuration has changed. */); 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); -- 2.39.2