# HG changeset patch # User Gerd Moellmann # Date 956171276 0 # Node ID 2ea744c8844a72bd6bcf496f7fc96c780eaefbfc # Parent 1d7862b7e02d74b833362a00a2d9772fb6b3a7e9 (count-screen-lines): New function. (shrink-window-if-larger-than-buffer): Use count-screen-lines instead of window-buffer-height. diff -r 1d7862b7e02d -r 2ea744c8844a lisp/window.el --- a/lisp/window.el Wed Apr 19 19:07:29 2000 +0000 +++ b/lisp/window.el Wed Apr 19 19:07:56 2000 +0000 @@ -1,6 +1,7 @@ ;;; window.el --- GNU Emacs window commands aside from those written in C. -;; Copyright (C) 1985, 1989, 1992, 1993, 1994 Free Software Foundation, Inc. +;; Copyright (C) 1985, 1989, 1992, 1993, 1994, 2000 +;; Free Software Foundation, Inc. ;; Maintainer: FSF @@ -258,6 +259,42 @@ nil window)))))) +(defun count-screen-lines (&optional beg end count-final-newline window) + "Return the number of screen lines in the region. +The number of screen lines may be different from the number of actual lines, +due to line breaking, display table, etc. + +Optional arguments BEG and END default to `point-min' and `point-max' +respectively. + +If region ends with a newline, ignore it unless optinal third argument +COUNT-FINAL-NEWLINE is non-nil. + +The optional fourth argument WINDOW specifies the window used for obtaining +parameters such as width, horizontal scrolling, and so on. The default is +to use the selected window's parameters. + +Like `vertical-motion', `count-screen-lines' always uses the current buffer, +regardless of which buffer is displayed in WINDOW. This makes possible to use +`count-screen-lines' in any buffer, whether or not it is currently displayed +in some window." + (unless beg + (setq beg (point-min))) + (unless end + (setq end (point-max))) + (if (= beg end) + 0 + (save-excursion + (save-restriction + (widen) + (narrow-to-region (min beg end) + (if (and (not count-final-newline) + (= ?\n (char-before (max beg end)))) + (1- (max beg end)) + (max beg end))) + (goto-char (point-min)) + (1+ (vertical-motion (buffer-size) window)))))) + (defun shrink-window-if-larger-than-buffer (&optional window) "Shrink the WINDOW to be as small as possible to display its contents. Do not shrink to less than `window-min-height' lines. @@ -280,7 +317,10 @@ (or (not mini) (< (nth 3 edges) (nth 1 (window-edges mini))) (> (nth 1 edges) (cdr (assq 'menu-bar-lines params))))) - (let ((text-height (window-buffer-height window)) + ;; `count-screen-lines' always works on the current buffer, so + ;; make sure it is the buffer displayed by WINDOW. + (let ((text-height (with-current-buffer (window-buffer window) + (count-screen-lines))) (window-height (window-height))) ;; Don't try to redisplay with the cursor at the end ;; on its own line--that would force a scroll and spoil things.