@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
-@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999
-@c Free Software Foundation, Inc.
+@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001,
+@c 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
@c See the file elisp.texi for copying conditions.
@setfilename ../info/windows
@node Windows, Frames, Buffers, Top
* Size of Window:: Accessing the size of a window.
* Resizing Windows:: Changing the size of a window.
* Coordinates and Windows:: Converting coordinates to windows.
+* Window Tree:: The layout and sizes of all windows in a frame.
* Window Configurations:: Saving and restoring the state of the screen.
* Window Hooks:: Hooks for scrolling, window size changes,
redisplay going past a certain point,
In each frame, at any time, one and only one window is designated as
@dfn{selected within the frame}. The frame's cursor appears in that
-window. At any time, one frame is the selected frame; and the window
-selected within that frame is @dfn{the selected window}. The selected
-window's buffer is usually the current buffer (except when
-@code{set-buffer} has been used). @xref{Current Buffer}.
+window, but the other windows have ``non-selected'' cursors, normally
+less visible. (@pxref{Cursor Parameters}, for customization of this.)
+At any time, one frame is the selected frame; and the window selected
+within that frame is @dfn{the selected window}. The selected window's
+buffer is usually the current buffer (except when @code{set-buffer}
+has been used). @xref{Current Buffer}.
For practical purposes, a window exists only while it is displayed in
a frame. Once removed from the frame, the window is effectively deleted
previously visible in the window that was split.
@deffn Command split-window &optional window size horizontal
-This function splits @var{window} into two windows. The original
-window @var{window} remains the selected window, but occupies only
-part of its former screen area. The rest is occupied by a newly created
-window which is returned as the value of this function.
+This function splits a new window out of @var{window}'s screen area.
+It returns the new window.
If @var{horizontal} is non-@code{nil}, then @var{window} splits into
two side by side windows. The original window @var{window} keeps the
left-hand or upper of the two, and the new window is the right-hand or
lower.
-If @var{window} is omitted or @code{nil}, then the selected window is
-split. If @var{size} is omitted or @code{nil}, then @var{window} is
-divided evenly into two parts. (If there is an odd line, it is
-allocated to the new window.) When @code{split-window} is called
-interactively, all its arguments are @code{nil}.
+If @var{window} is omitted or @code{nil}, that stands for the selected
+window. When you split the selected window, it remains selected.
+
+If @var{size} is omitted or @code{nil}, then @var{window} is divided
+evenly into two parts. (If there is an odd line, it is allocated to
+the new window.) When @code{split-window} is called interactively,
+all its arguments are @code{nil}.
If splitting would result in making a window that is smaller than
@code{window-min-height} or @code{window-min-width}, the function
@end smallexample
Normally, Emacs indicates the border between two side-by-side windows
-with a scroll bar (@pxref{Window Frame Parameters,Scroll Bars}) or @samp{|}
+with a scroll bar (@pxref{Layout Parameters,Scroll Bars}) or @samp{|}
characters. The display table can specify alternative border
characters; see @ref{Display Tables}.
@end deffn
@node Selecting Windows
@section Selecting Windows
-@cindex selecting windows
+@cindex selecting a window
When a window is selected, the buffer in the window becomes the current
buffer, and the cursor will appear in it.
@end defun
@defmac save-selected-window forms@dots{}
-This macro records the selected window, as well as the selected window
+This macro records the selected frame, as well as the selected window
of each frame, executes @var{forms} in sequence, then restores the
-earlier selected windows. It returns the value of the last form in
-@var{forms}.
+earlier selected frame and windows. It also saves and restores the
+current buffer. It returns the value of the last form in @var{forms}.
This macro does not save or restore anything about the sizes,
arrangement or contents of windows; therefore, if the @var{forms}
@defmac with-selected-window window forms@dots{}
This macro selects @var{window} (without changing the buffer list),
executes @var{forms} in sequence, then restores the previously
-selected window (unless that window is no longer alive). It is similar
-to @code{save-selected-window} except that it explicitly selects
-@var{window}, without altering the buffer list sequence.
+selected window and current buffer. It is just like
+@code{save-selected-window}, except that it explicitly selects
+@var{window}, also without altering the buffer list sequence.
@end defmac
@cindex finding windows
The following functions choose one of the windows on the screen,
offering various criteria for the choice.
-@defun get-lru-window &optional frame
+@defun get-lru-window &optional frame dedicated
This function returns the window least recently ``used'' (that is,
selected). If any full-width windows are present, it only considers
these. The selected window is always the most recently used window.
The selected window can be the least recently used window if it is the
only window. A newly created window becomes the least recently used
-window until it is selected. A minibuffer window is never a candidate.
+window until it is selected. A minibuffer window is never a
+candidate. Dedicated windows are never candidates unless the
+@var{dedicated} argument is non-@code{nil}, so if all
+existing windows are dedicated, the value is @code{nil}.
The argument @var{frame} controls which windows are considered.
@end itemize
@end defun
-@defun get-largest-window &optional frame
+@defun get-largest-window &optional frame dedicated
This function returns the window with the largest area (height times
width). If there are no side-by-side windows, then this is the window
with the most lines. A minibuffer window is never a candidate.
+Dedicated windows are never candidates unless the
+@var{dedicated} argument is non-@code{nil}, so if all existing windows
+are dedicated, the value is @code{nil}.
-If there are two windows of the same size, then the function returns
-the window that is first in the cyclic ordering of windows (see
-following section), starting from the selected window.
+If there are two candidate windows of the same size, this function
+prefers the one that comes first in the cyclic ordering of windows
+(see following section), starting from the selected window.
The argument @var{frame} controls which set of windows to
consider. See @code{get-lru-window}, above.
the order is left to right, or top to bottom.
@defun next-window &optional window minibuf all-frames
-@cindex minibuffer window
+@cindex minibuffer window, and @code{next-window}
This function returns the window following @var{window} in the cyclic
ordering of windows. This is the window that @kbd{C-x o} would select
if typed when @var{window} is selected. If @var{window} is the only
@c Emacs 19 feature
@defun walk-windows proc &optional minibuf all-frames
-This function cycles through all windows, calling @code{proc}
-once for each window with the window as its sole argument.
+This function cycles through all windows. It calls the function
+@code{proc} once for each window, with the window as its sole
+argument.
The optional arguments @var{minibuf} and @var{all-frames} specify the
set of windows to include in the scan. See @code{next-window}, above,
@defun window-list &optional frame minibuf window
This function returns a list of the windows on @var{frame}, starting
-with @var{window}. If @var{frame} is @code{nil} or omitted, the
-selected frame is used instead; if @var{window} is @code{nil} or
-omitted, the selected window is used instead.
-
-The value of @var{minibuf} determines if the minibuffer window will be
-included in the result list. If @var{minibuf} is @code{t}, the
-minibuffer window will be included, even if it isn't active. If
-@var{minibuf} is @code{nil} or omitted, the minibuffer window will
-only be included in the list if it is active. If @var{minibuf} is
-neither @code{nil} nor @code{t}, the minibuffer window is not
-included, whether or not it is active.
+with @var{window}. If @var{frame} is @code{nil} or omitted,
+@code{window-list} uses the selected frame instead; if @var{window} is
+@code{nil} or omitted, it uses the selected window.
+
+The value of @var{minibuf} determines if the minibuffer window is
+included in the result list. If @var{minibuf} is @code{t}, the result
+always includes the minibuffer window. If @var{minibuf} is @code{nil}
+or omitted, that includes the minibuffer window if it is active. If
+@var{minibuf} is neither @code{nil} nor @code{t}, the result never
+includes the minibuffer window.
@end defun
@node Buffers and Windows
widths of @var{window} remain unchanged. @xref{Fringes}.
@end defun
+@defvar buffer-display-count
+This buffer-local variable records the number of times a buffer is
+displayed in a window. It is incremented each time
+@code{set-window-buffer} is called for the buffer.
+@end defvar
+
@defun window-buffer &optional window
This function returns the buffer that @var{window} is displaying. If
@var{window} is omitted, this function returns the buffer for the
@end defun
@defopt special-display-frame-alist
+@anchor{Definition of special-display-frame-alist}
This variable holds frame parameters for
@code{special-display-popup-frame} to use when it creates a frame.
@end defopt
@item
As long as the selected window displays the current buffer, the window's
point and the buffer's point always move together; they remain equal.
+@end itemize
-@item
+@noindent
@xref{Positions}, for more details on buffer positions.
-@end itemize
+@cindex cursor
As far as the user is concerned, point is where the cursor is, and
when the user switches to another buffer, the cursor jumps to the
position of point in that buffer.
@defun set-window-point window position
This function positions point in @var{window} at position
-@var{position} in @var{window}'s buffer.
+@var{position} in @var{window}'s buffer. It returns @var{position}.
+
+If @var{window} is selected, and its buffer is current,
+this simply does @code{goto-char}.
@end defun
@node Window Start
@section The Window Start Position
+@cindex window start position
Each window contains a marker used to keep track of a buffer position
that specifies where in the buffer display should start. This position
at the upper left corner of the window. It is usually, but not
inevitably, at the beginning of a text line.
+ After switching windows or buffers, and in some other cases, if the
+window start is in the middle of a line, Emacs adjusts the window
+start to the start of a line. This prevents certain operations from
+leaving the window start at a meaningless point within a line. This
+feature may interfere with testing some Lisp code by executing it
+using the commands of Lisp mode, because they trigger this
+readjustment. To test such code, put it into a command and bind the
+command to a key.
+
@defun window-start &optional window
@cindex window top line
This function returns the display-start position of window
redisplay.
For a realistic example of using @code{window-start}, see the
-description of @code{count-lines} in @ref{Text Lines}.
+description of @code{count-lines}. @xref{Definition of count-lines}.
@end defun
@defun window-end &optional window update
screen. If this does place point off screen, the display routines move
point to the left margin on the middle line in the window.
-For example, if point @w{is 1} and you set the start of the window @w{to
-2}, then point would be ``above'' the top of the window. The display
-routines will automatically move point if it is still 1 when redisplay
-occurs. Here is an example:
+For example, if point @w{is 1} and you set the start of the window
+@w{to 37}, the start of the next line, point will be ``above'' the top
+of the window. The display routines will automatically move point if
+it is still 1 when redisplay occurs. Here is an example:
@example
@group
@group
(set-window-start
(selected-window)
- (1+ (window-start)))
-@result{} 2
+ (save-excursion
+ (goto-char 1)
+ (forward-line 1)
+ (point)))
+@result{} 37
@end group
@group
;; @r{Here is what @samp{foo} looks like after executing}
;; @r{the @code{set-window-start} expression.}
---------- Buffer: foo ----------
-his is the contents of buffer foo.
2
3
@point{}4
@end defun
@defun pos-visible-in-window-p &optional position window partially
-This function returns @code{t} if @var{position} is within the range of
-text currently visible on the screen in @var{window}. It returns
-@code{nil} if @var{position} is scrolled vertically or horizontally out
-of view. Locations that are partially obscured are not considered
+This function returns non-@code{nil} if @var{position} is within the
+range of text currently visible on the screen in @var{window}. It
+returns @code{nil} if @var{position} is scrolled vertically out of
+view. Locations that are partially obscured are not considered
visible unless @var{partially} is non-@code{nil}. The argument
@var{position} defaults to the current position of point in
@var{window}; @var{window}, to the selected window.
+If @var{position} is @code{t}, that means to check the last visible
+position in @var{window}.
+
+The @code{pos-visible-in-window-p} function considers only vertical
+scrolling. If @var{position} is out of view only because @var{window}
+has been scrolled horizontally, @code{pos-visible-in-window-p} returns
+non-@code{nil} anyway. @xref{Horizontal Scrolling}.
+
+If @var{position} is visible, @code{pos-visible-in-window-p} returns
+@code{t} if @var{partially} is @code{nil}; if @var{partially} is
+non-@code{nil}, and the character after @var{position} is fully
+visible, it returns a list of the form @code{(@var{x} @var{y})}, where
+@var{x} and @var{y} are the pixel coordinates relative to the top left
+corner of the window; otherwise it returns an extended list of the
+form @code{(@var{x} @var{y} @var{rtop} @var{rbot} @var{rowh}
+@var{vpos})}, where the @var{rtop} and @var{rbot} specify the number
+of off-window pixels at the top and bottom of the row at
+@var{position}, @var{rowh} specifies the visible height of that row,
+and @var{vpos} specifies the vertical position (zero-based row number)
+of that row.
+
Here is an example:
@example
@group
+;; @r{If point is off the screen now, recenter it now.}
(or (pos-visible-in-window-p
(point) (selected-window))
(recenter 0))
@end example
@end defun
+@defun window-line-height &optional line window
+This function returns information about text line @var{line} in @var{window}.
+If @var{line} is one of @code{header-line} or @code{mode-line},
+@code{window-line-height} returns information about the corresponding
+line of the window. Otherwise, @var{line} is a text line number
+starting from 0. A negative number counts from the end of the window.
+The argument @var{line} defaults to the current line in @var{window};
+@var{window}, to the selected window.
+
+If the display is not up to date, @code{window-line-height} returns
+@code{nil}. In that case, @code{pos-visible-in-window-p} may be used
+to obtain related information.
+
+If there is no line corresponding to the specified @var{line},
+@code{window-line-height} returns @code{nil}. Otherwise, it returns
+a list @code{(@var{height} @var{vpos} @var{ypos} @var{offbot})},
+where @var{height} is the height in pixels of the visible part of the
+line, @var{vpos} and @var{ypos} are the vertical position in lines and
+pixels of the line relative to the top of the first text line, and
+@var{offbot} is the number of off-window pixels at the bottom of the
+text line. If there are off-window pixels at the top of the (first)
+text line, @var{ypos} is negative.
+@end defun
+
@node Textual Scrolling
@section Textual Scrolling
@cindex textual scrolling
@cindex scrolling textually
- @dfn{Textual scrolling} means moving the text up or down though a
+ @dfn{Textual scrolling} means moving the text up or down through a
window. It works by changing the value of the window's display-start
location. It may also change the value of @code{window-point} to keep
point on the screen.
buffer is different from the buffer that is displayed in the selected
window. @xref{Current Buffer}.
+ If the window contains a row which is taller than the height of the
+window (for example in the presence of a large image), the scroll
+functions will adjust the window vscroll to scroll the partially
+visible row. To disable this feature, Lisp code may bind the variable
+`auto-window-vscroll' to @code{nil} (@pxref{Vertical Scrolling}).
+
@deffn Command scroll-up &optional count
This function scrolls the text in the selected window upward
@var{count} lines. If @var{count} is negative, scrolling is actually
the one at the top left corner. You can specify a different window to
scroll, when the minibuffer is selected, by setting the variable
@code{minibuffer-scroll-window}. This variable has no effect when any
-other window is selected. @xref{Minibuffer Misc}.
+other window is selected. When it is non-@code{nil} and the
+minibuffer is selected, it takes precedence over
+@code{other-window-scroll-buffer}. @xref{Definition of
+minibuffer-scroll-window}.
When the minibuffer is active, it is the next window if the selected
window is the one at the bottom right corner. In this case,
@code{scroll-other-window} attempts to scroll the minibuffer. If the
minibuffer contains just one line, it has nowhere to scroll to, so the
line reappears after the echo area momentarily displays the message
-``Beginning of buffer''.
+@samp{Beginning of buffer}.
@end deffn
@c Emacs 19 feature
@end defopt
@defopt scroll-down-aggressively
-@tindex scroll-down-aggressively
The value of this variable should be either @code{nil} or a fraction
@var{f} between 0 and 1. If it is a fraction, that specifies where on
the screen to put point when scrolling down. More precisely, when a
@end defopt
@defopt scroll-up-aggressively
-@tindex scroll-up-aggressively
Likewise, for scrolling up. The value, @var{f}, specifies how far
point should be placed from the bottom of the window; thus, as with
@code{scroll-up-aggressively}, a larger value scrolls more aggressively.
@end defopt
@defopt scroll-preserve-screen-position
-If this option is non-@code{nil}, the scroll functions move point so
-that the vertical position of the cursor is unchanged, when that is
-possible.
+If this option is @code{t}, scrolling which would move the current
+point position out of the window chooses the new position of point
+so that the vertical position of the cursor is unchanged, if possible.
+
+If it is non-@code{nil} and not @code{t}, then the scrolling functions
+always preserve the vertical position of point, if possible.
@end defopt
@defopt next-screen-context-lines
@node Vertical Scrolling
@section Vertical Fractional Scrolling
-@cindex Vertical Fractional Scrolling
+@cindex vertical fractional scrolling
@dfn{Vertical fractional scrolling} means shifting the image in the
window up or down by a specified multiple or fraction of a line.
-Starting in Emacs 21, each window has a @dfn{vertical scroll position},
+Each window has a @dfn{vertical scroll position},
which is a number, never less than zero. It specifies how far to raise
the contents of the window. Raising the window contents generally makes
all or part of some lines disappear off the top, and all or part of some
line whose height is very short off the screen, while a value of 3.3
could scroll just part of the way through a tall line or an image.
-@defun window-vscroll &optional window
+@defun window-vscroll &optional window pixels-p
This function returns the current vertical scroll position of
-@var{window}, If @var{window} is @code{nil}, the selected window is
-used.
+@var{window}. If @var{window} is @code{nil}, the selected window is
+used. If @var{pixels-p} is non-@code{nil}, the return value is
+measured in pixels, rather than in units of the normal line height.
@example
@group
@end example
@end defun
-@defun set-window-vscroll window lines
+@defun set-window-vscroll window lines &optional pixels-p
This function sets @var{window}'s vertical scroll position to
@var{lines}. The argument @var{lines} should be zero or positive; if
not, it is taken as zero.
@result{} 1.13
@end group
@end example
+
+If @var{pixels-p} is non-@code{nil}, @var{lines} specifies a number of
+pixels. In this case, the return value is @var{lines}.
@end defun
+@defvar auto-window-vscroll
+If this variable is non-@code{nil}, the line-move, scroll-up, and
+scroll-down functions will automatically modify the window vscroll to
+scroll through display rows that are taller that the height of the
+window, for example in the presence of large images.
+@end defvar
+
@node Horizontal Scrolling
@section Horizontal Scrolling
@cindex horizontal scrolling
disappear off to the left depends on their width, and could vary from
line to line.
- Because we read from side to side in the ``inner loop'', and from top
-to bottom in the ``outer loop'', the effect of horizontal scrolling is
+ Because we read from side to side in the ``inner loop,'' and from top
+to bottom in the ``outer loop,'' the effect of horizontal scrolling is
not like that of textual or vertical scrolling. Textual scrolling
involves selection of a portion of text to display, and vertical
scrolling moves the window contents contiguously; but horizontal
bound for automatic scrolling, i.e. automatic scrolling will not
scroll a window to a column less than the specified one.
-@deffn Command scroll-left &optional count
+@deffn Command scroll-left &optional count set-minimum
This function scrolls the selected window @var{count} columns to the
left (or to the right if @var{count} is negative). The default
for @var{count} is the window width, minus 2.
-The return value is the total amount of leftward horizontal scrolling in
-effect after the change---just like the value returned by
-@code{window-hscroll} (below).
-@end deffn
-
-@deffn Command scroll-right &optional count
-This function scrolls the selected window @var{count} columns to the
-right (or to the left if @var{count} is negative). The default
-for @var{count} is the window width, minus 2.
-
The return value is the total amount of leftward horizontal scrolling in
effect after the change---just like the value returned by
@code{window-hscroll} (below).
Once you scroll a window as far right as it can go, back to its normal
position where the total leftward scrolling is zero, attempts to scroll
any farther right have no effect.
+
+If @var{set-minimum} is non-@code{nil}, the new scroll amount becomes
+the lower bound for automatic scrolling; that is, automatic scrolling
+will not scroll a window to a column less than the value returned by
+this function. Interactive calls pass non-@code{nil} for
+@var{set-minimum}.
+@end deffn
+
+@deffn Command scroll-right &optional count set-minimum
+This function scrolls the selected window @var{count} columns to the
+right (or to the left if @var{count} is negative). The default
+for @var{count} is the window width, minus 2. Aside from the direction
+of scrolling, this works just like @code{scroll-left}.
@end deffn
@defun window-hscroll &optional window
@end example
@end defun
-@tindex window-body-height
@defun window-body-height &optional window
Like @code{window-height} but the value does not include the
mode line (if any) or the header line (if any).
@end example
@end defun
+@defun window-full-width-p &optional window
+This function returns non-@code{nil} if @var{window} is as wide as
+the frame that contains it; otherwise @code{nil}.
+If @var{window} is @code{nil}, the function uses the selected window.
+@end defun
+
@defun window-edges &optional window
This function returns a list of the edge coordinates of @var{window}.
If @var{window} is @code{nil}, the selected window is used.
rightmost column used by @var{window}, and @var{bottom} is one more than
the bottommost row used by @var{window} and its mode-line.
-If a window has a scroll bar, the right edge value includes the width of
-the scroll bar. Otherwise, if the window has a neighbor on the right,
-its right edge value includes the width of the separator line between
-the window and that neighbor. Since the width of the window does not
-include this separator, the width does not usually equal the difference
-between the right and left edges.
+The edges include the space used by the window's scroll bar, display
+margins, fringes, header line, and mode line, if it has them. Also,
+if the window has a neighbor on the right, its right edge value
+includes the width of the separator line between the window and that
+neighbor. Since the width of the window does not include this
+separator, the width does not usually equal the difference between the
+right and left edges.
@end defun
-@defun window-inside-edges window
+@defun window-inside-edges &optional window
This is similar to @code{window-edges}, but the edge values
it returns include only the text area of the window. They
do not include the header line, mode line, scroll bar or
@end group
@end example
-@defun window-pixel-edges window
+@defun window-pixel-edges &optional window
This function is like @code{window-edges} except that, on a graphical
display, the edge values are measured in pixels instead of in
character lines and columns.
@end defun
-@defun window-inside-pixel-edges window
+@defun window-inside-pixel-edges &optional window
This function is like @code{window-inside-edges} except that, on a
graphical display, the edge values are measured in pixels instead of
in character lines and columns.
@node Resizing Windows
@section Changing the Size of a Window
@cindex window resizing
+@cindex resize window
@cindex changing window size
@cindex window size, changing
@example
@group
(defun enlarge-window-horizontally (columns)
+ (interactive "p")
(enlarge-window columns t))
@end group
@end example
@example
@group
(defun shrink-window-horizontally (columns)
+ (interactive "p")
(shrink-window columns t))
@end group
@end example
@end deffn
+@defun adjust-window-trailing-edge window delta horizontal
+This function makes the selected window @var{delta} lines taller or
+@var{delta} columns wider, by moving the bottom or right edge. This
+function does not delete other windows; if it cannot make the
+requested size adjustment, it signals an error. On success, this
+function returns @code{nil}.
+@end defun
+
+@defun fit-window-to-buffer &optional window max-height min-height
+This function makes @var{window} the right height to display its
+contents exactly. If @var{window} is omitted or @code{nil}, it uses
+the selected window.
+
+The argument @var{max-height} specifies the maximum height the window
+is allowed to be; @code{nil} means use the frame height. The argument
+@var{min-height} specifies the minimum height for the window;
+@code{nil} means use @code{window-min-height}. All these height
+values include the mode-line and/or header-line.
+@end defun
+
@deffn Command shrink-window-if-larger-than-buffer &optional window
-This command shrinks @var{window} to be as small as possible while still
-showing the full contents of its buffer---but not less than
-@code{window-min-height} lines. If @var{window} is not given,
-it defaults to the selected window.
+This command shrinks @var{window} vertically to be as small as
+possible while still showing the full contents of its buffer---but not
+less than @code{window-min-height} lines. If @var{window} is not
+given, it defaults to the selected window.
However, the command does nothing if the window is already too small to
display the whole text of the buffer, or if part of the contents are
currently scrolled off screen, or if the window is not the full width of
its frame, or if the window is the only window in its frame.
+
+This command returns non-@code{nil} if it actually shrank the window
+and @code{nil} otherwise.
@end deffn
-@tindex window-size-fixed
@defvar window-size-fixed
If this variable is non-@code{nil}, in any given buffer,
then the size of any window displaying the buffer remains fixed
unless you explicitly change it or Emacs has no other choice.
-(This feature is new in Emacs 21.)
If the value is @code{height}, then only the window's height is fixed;
if the value is @code{width}, then only the window's width is fixed.
Any other non-@code{nil} value fixes both the width and the height.
-The usual way to use this variable is to give it a buffer-local value in
-a particular buffer. That way, the windows (but usually there is only
-one) displaying that buffer have fixed size.
+This variable automatically becomes buffer-local when set.
Explicit size-change functions such as @code{enlarge-window}
get an error if they would have to change a window size which is fixed.
argument because it always uses the frame that @var{window} is on.
@end defun
+@node Window Tree
+@section The Window Tree
+@cindex window tree
+
+ A @dfn{window tree} specifies the layout, size, and relationship
+between all windows in one frame.
+
+@defun window-tree &optional frame
+This function returns the window tree for frame @var{frame}.
+If @var{frame} is omitted, the selected frame is used.
+
+The return value is a list of the form @code{(@var{root} @var{mini})},
+where @var{root} represents the window tree of the frame's
+root window, and @var{mini} is the frame's minibuffer window.
+
+If the root window is not split, @var{root} is the root window itself.
+Otherwise, @var{root} is a list @code{(@var{dir} @var{edges} @var{w1}
+@var{w2} ...)} where @var{dir} is @code{nil} for a horizontal split,
+and @code{t} for a vertical split, @var{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. The
+@var{edges} element is a list @code{(@var{left}@var{ top}@var{ right}@var{ bottom})}
+similar to the value returned by @code{window-edges}.
+@end defun
+
@node Window Configurations
@section Window Configurations
@cindex window configurations
@cindex saving window information
A @dfn{window configuration} records the entire layout of one
-frame---all windows, their sizes, which buffers they contain, what
-part of each buffer is displayed, and the values of point and the
-mark; also their fringes, margins, and scroll bar settings. It also
+frame---all windows, their sizes, which buffers they contain, how
+those buffers are scrolled, and their values of point and the mark;
+also their fringes, margins, and scroll bar settings. It also
includes the values of @code{window-min-height},
-@code{window-min-width} and @code{minibuffer-scroll-window}. An
-exception is made for point in the selected window for the current
-buffer; its value is not saved in the window configuration.
+@code{window-min-width} and @code{minibuffer-scroll-window}. As a
+special exception, the window configuration does not record the value
+of point in the selected window for the current buffer.
You can bring back an entire previous layout by restoring a window
configuration previously saved. If you want to record all frames
If the frame which @var{configuration} was saved from is dead, all this
function does is restore the three variables @code{window-min-height},
-@code{window-min-width} and @code{minibuffer-scroll-window}.
+@code{window-min-width} and @code{minibuffer-scroll-window}. In this
+case, the function returns @code{nil}. Otherwise, it returns @code{t}.
Here is a way of using this function to get the same effect
as @code{save-window-excursion}:
@defspec save-window-excursion forms@dots{}
This special form records the window configuration, executes @var{forms}
in sequence, then restores the earlier window configuration. The window
-configuration includes the value of point and the portion of the buffer
-that is visible. It also includes the choice of selected window.
-However, it does not include the value of point in the current buffer;
-use @code{save-excursion} also, if you wish to preserve that.
+configuration includes, for each window, the value of point and the
+portion of the buffer that is visible. It also includes the choice of
+selected window. However, it does not include the value of point in
+the current buffer; use @code{save-excursion} also, if you wish to
+preserve that.
Don't use this construct when @code{save-selected-window} is sufficient.
@node Window Hooks
@section Hooks for Window Scrolling and Changes
+@cindex hooks for window operations
This section describes how a Lisp program can take action whenever a
window displays a different part of its buffer or a different buffer.
There are three actions that can change this: scrolling the window,
switching buffers in the window, and changing the size of the window.
The first two actions run @code{window-scroll-functions}; the last runs
-@code{window-size-change-functions}. The paradigmatic use of these
-hooks is in the implementation of Lazy Lock mode; see @file{lazy-lock.el}.
+@code{window-size-change-functions}.
@defvar window-scroll-functions
This variable holds a list of functions that Emacs should call before
These functions must be careful in using @code{window-end}
(@pxref{Window Start}); if you need an up-to-date value, you must use
the @var{update} argument to ensure you get it.
+
+@strong{Warning:} don't use this feature to alter the way the window
+is scrolled. It's not designed for that, and such use probably won't
+work.
@end defvar
@defvar window-size-change-functions
@defun window-redisplay-end-trigger &optional window
This function returns @var{window}'s current end trigger position.
+If @var{window} is @code{nil} or omitted, it uses the selected window.
@end defun
@defvar window-configuration-change-hook