-;;; window.el --- GNU Emacs window commands aside from those written in C.
+;;; window.el --- GNU Emacs window commands aside from those written in C
-;; Copyright (C) 1985, 1989, 1992, 1993, 1994, 2000
+;; Copyright (C) 1985, 1989, 1992, 1993, 1994, 2000, 2001
;; Free Software Foundation, Inc.
;; Maintainer: FSF
+;; Keywords: internal
;; This file is part of GNU Emacs.
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
-
;;; Commentary:
;; Window tree functions.
(cons walk-windows-current walk-windows-already-seen))
(funcall proc walk-windows-current)))))
-(defun some-window (predicate &optional minibuf all-frames default)
+(defun get-window-with-predicate (predicate &optional minibuf
+ all-frames default)
"Return a window satisfying PREDICATE.
This function cycles through all visible windows using `walk-windows',
minibuf all-frames)
default))
+(defalias 'some-window 'get-window-with-predicate)
+
(defun minibuffer-window-active-p (window)
"Return t if WINDOW (a minibuffer window) is now active."
(eq window (active-minibuffer-window)))
(defmacro save-selected-window (&rest body)
- "Execute BODY, then select the window that was selected before BODY."
+ "Execute BODY, then select the window that was selected before BODY.
+However, if that window has become dead, don't get an error,
+just refrain from switching to it."
`(let ((save-selected-window-window (selected-window)))
(unwind-protect
(progn ,@body)
- (select-window save-selected-window-window))))
+ (if (window-live-p save-selected-window-window)
+ (select-window save-selected-window-window)))))
\f
(defun count-windows (&optional minibuf)
"Return the number of visible windows.
count))
(defun window-safely-shrinkable-p (&optional window)
- "Non-nil if the WINDOW can be shrunk without shrinking other windows."
+ "Non-nil if the WINDOW can be shrunk without shrinking other windows.
+If WINDOW is nil or omitted, it defaults to the currently selected window."
(save-selected-window
(when window (select-window window))
(or (and (not (eq window (frame-first-window)))
(and size (< size 0)
(setq size (+ (window-width) size)))
(split-window-save-restore-data (split-window nil size t) old-w)))
-\f
-(defcustom mode-line-window-height-fudge nil
- "*Fudge factor returned by `mode-line-window-height-fudge' on graphic displays.
-If non-nil, it should be the number of lines to add to the sizes of
-windows to compensate for the extra height of the mode-line, so it
-doesn't't obscure the last line of text.
-
-If nil, an attempt is made to calculate reasonable value.
-
-This is a kluge."
- :type '(choice (const :tag "Guess" nil)
- (integer :tag "Extra lines" :value 1))
- :group 'windows)
-
-;; List of face attributes that might change a face's height
-(defconst height-affecting-face-attributes
- '(:family :height :box :font :inherit))
-
-(defsubst mode-line-window-height-fudge (&optional face)
- "Return a fudge factor to compensate for the extra height of graphic mode-lines.
-On a non-graphic display, return 0.
-
-FACE is the face used to display the mode-line; it defaults to `mode-line'.
-
-If the variable `mode-line-window-height-fudge' has a non-nil value, it
-is returned. Otherwise, the `mode-line' face is checked to see if it
-contains any attributes that might affect its height; if it does, 1 is
-returned, otherwise 0.
-
-\[Because mode-lines on a graphics capable display may have a height
-larger than a normal text line, a window who's size is calculated to
-exactly show some text, including 1 line for the mode-line, may be
-displayed with the last text line obscured by the mode-line.
-
-To work-around this problem, call `mode-line-window-height-fudge', and
-add the return value to the requested window size.]
-
-This is a kluge."
- (if (display-graphic-p)
- (or
- ;; Return user-specified value
- mode-line-window-height-fudge
- ;; Try and detect whether mode-line face has any attributes that
- ;; could make it bigger than a default text line, and return a
- ;; fudge factor of 1 if so.
- (let ((attrs height-affecting-face-attributes)
- (fudge 0))
- (while attrs
- (let ((val (face-attribute (or face 'mode-line) (pop attrs))))
- (unless (or (null val) (eq val 'unspecified))
- (setq fudge 1 attrs nil))))
- fudge))
- 0))
\f
(defun set-window-text-height (window height)
(defun fit-window-to-buffer (&optional window max-height min-height)
"Make WINDOW the right size to display its contents exactly.
+If WINDOW is omitted or nil, it defaults to the selected window.
If the optional argument MAX-HEIGHT is supplied, it is the maximum height
the window is allowed to be, defaulting to the frame height.
If the optional argument MIN-HEIGHT is supplied, it is the minimum
(defun shrink-window-if-larger-than-buffer (&optional window)
"Shrink the WINDOW to be as small as possible to display its contents.
+If WINDOW is omitted or nil, it defaults to the selected window.
Do not shrink to less than `window-min-height' lines.
Do nothing if the buffer contains more lines than the present window height,
or if some of the window's contents are scrolled out of view,
(pos-visible-in-window-p (point-min) window)
(not (eq mini 'only))
(or (not mini)
- (< (nth 3 edges) (nth 1 (window-edges mini)))
- (> (nth 1 edges) (frame-parameter frame 'menu-bar-lines))))
+ (let ((mini-window (minibuffer-window frame)))
+ (or (null mini-window)
+ (not (eq frame (window-frame mini-window)))
+ (< (nth 3 edges)
+ (nth 1 (window-edges mini-window)))
+ (> (nth 1 edges)
+ (frame-parameter frame 'menu-bar-lines))))))
(fit-window-to-buffer window (window-height window)))))
(defun kill-buffer-and-window ()