[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: balance-windows again
From: |
Kim F. Storm |
Subject: |
Re: balance-windows again |
Date: |
Thu, 29 Sep 2005 14:34:44 +0200 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) |
address@hidden (Kim F. Storm) writes:
> 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).
I think exposing the "container windows" as my previous patch did was
a really bad idea. Instead, I prefer to explicitly include the
window-edges of those windows. Below is a different patch which
implements this.
The new window-split-tree function doesn't return the format Lennart
requested, but it is trivial to convert it to his proposed format:
(defun balance-window-split (&optional frame)
(balance-window-split-1 (car (window-split-tree frame))))
(defun balance-window-split-1 (split)
(if (windowp split)
split
(let ((dir (car split))
(edges (car (cdr split)))
(childs (cdr (cdr split))))
(list
(cons 'dir (if dir 'ver 'hor))
(cons 'b (nth 3 edges))
(cons 'r (nth 2 edges))
(cons 't (nth 1 edges))
(cons 'l (nth 0 edges))
(cons 'childs (mapcar #'balance-window-split-1 childs))))))
Here's the revised patch:
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 29 Sep 2005 12:31:57 -0000
***************
*** 6225,6230 ****
--- 6226,6310 ----
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,7036 ****
--- 7111,7117 ----
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 <address@hidden> http://www.cua.dk