]> git.eshelyaron.com Git - emacs.git/commitdiff
(window_split_tree): New function.
authorKim F. Storm <storm@cua.dk>
Tue, 4 Oct 2005 14:14:05 +0000 (14:14 +0000)
committerKim F. Storm <storm@cua.dk>
Tue, 4 Oct 2005 14:14:05 +0000 (14:14 +0000)
(Fwindow_split_tree): New defun.
(syms_of_window): Defsubr it.

src/window.c

index 9e75a592733740aa40ec695f6037d49586a6e00a..d282c2dd3f4ba760839c2e4583f613454a41bd18 100644 (file)
@@ -6225,6 +6225,85 @@ usage: (save-window-excursion BODY ...)  */)
   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 (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)));
+}
+
 \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);