From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: storm@cua.dk (Kim F. Storm) Newsgroups: gmane.emacs.devel,gmane.emacs.help Subject: Re: balance-windows again Date: Wed, 28 Sep 2005 00:57:06 +0200 Message-ID: References: <4328B58E.6010103@student.lu.se> <432A6DC2.30606@student.lu.se> <432ABE47.1010909@student.lu.se> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1127863239 23077 80.91.229.2 (27 Sep 2005 23:20:39 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Tue, 27 Sep 2005 23:20:39 +0000 (UTC) Cc: help-gnu-emacs@gnu.org, Emacs Devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Sep 28 01:20:29 2005 Return-path: Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1EKOix-0001o0-1M for ged-emacs-devel@m.gmane.org; Wed, 28 Sep 2005 01:18:59 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1EKOiw-0000hL-By for ged-emacs-devel@m.gmane.org; Tue, 27 Sep 2005 19:18:58 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1EKOfK-000855-WC for emacs-devel@gnu.org; Tue, 27 Sep 2005 19:15:15 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1EKOfH-00083b-Gf for emacs-devel@gnu.org; Tue, 27 Sep 2005 19:15:12 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1EKOcm-0006yN-R6; Tue, 27 Sep 2005 19:12:38 -0400 Original-Received: from [195.41.46.235] (helo=pfepa.post.tele.dk) by monty-python.gnu.org with esmtp (Exim 4.34) id 1EKONu-0007NK-0I; Tue, 27 Sep 2005 18:57:14 -0400 Original-Received: from kfs-l.imdomain.dk.cua.dk (0x503e2644.bynxx3.adsl-dhcp.tele.dk [80.62.38.68]) by pfepa.post.tele.dk (Postfix) with SMTP id 76E0E47FE11; Wed, 28 Sep 2005 00:57:12 +0200 (CEST) Original-To: Lennart Borgman In-Reply-To: <432ABE47.1010909@student.lu.se> (Lennart Borgman's message of "Fri, 16 Sep 2005 14:44:55 +0200") User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:43297 gmane.emacs.help:29770 Archived-At: Lennart Borgman 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 http://www.cua.dk