@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
-@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2004
-@c Free Software Foundation, Inc.
+@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2002, 2003,
+@c 2004, 2005, 2006 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,
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
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. Dedicated windows are never candidates, and if all
+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, and if all existing windows
+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 candidate windows of the same size, this function
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
@defun set-window-point window position
This function positions point in @var{window} at position
@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
@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
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}, it returns a list of the form @code{(@var{x} @var{y}
-@var{partial})}, where @var{x} and @var{y} are the pixel coordinates
-relative to the top left corner of the window, and @var{partial} is
-@code{nil} if the character after @var{position} is fully visible;
-otherwise it is a cons @code{(@var{rtop} . @var{rbot})} where the
-@var{rtop} and @var{rbot} specify the number of invisible pixels at
-the top and bottom of the row at @var{position}.
+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:
@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
window. @xref{Current Buffer}.
If the window contains a row which is taller than the height of the
-window (for example in the presense of a large image), the scroll
+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}).
@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.
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 presense of large images.
+window, for example in the presence of large images.
@end defvar
@node 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).
window size. Emacs does not permit overlapping windows or gaps between
windows, so resizing one window affects other windows.
-@deffn Command enlarge-window size &optional horizontal preserve-before
+@deffn Command enlarge-window size &optional horizontal
This function makes the selected window @var{size} lines taller,
stealing lines from neighboring windows. It takes the lines from one
window at a time until that window is used up, then takes from another.
size of a fixed-size window, @code{enlarge-window} gets an error
instead.
-If @var{preserve-before} is non-@code{nil}, this function does not
-change the size of the siblings above or to the left of the selected
-window. Only the size of the siblings below or to the right of the
-selected window are changed.
-
If @var{size} is negative, this function shrinks the window by
@minus{}@var{size} lines or columns. If that makes the window smaller
than the minimum size (@code{window-min-height} and
@end example
@end deffn
-@deffn Command shrink-window size &optional horizontal preserve-before
+@deffn Command shrink-window size &optional horizontal
This function is like @code{enlarge-window} but negates the argument
@var{size}, making the selected window smaller by giving lines (or
columns) to the other windows. If the window shrinks below
@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
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
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
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