Lennart Borgman <[EMAIL PROTECTED]> 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); } + + + /*********************************************************************** + 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))); + } + /*********************************************************************** 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 <[EMAIL PROTECTED]> http://www.cua.dk _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel