Mercurial > emacs
changeset 28655:2ea744c8844a
(count-screen-lines): New function.
(shrink-window-if-larger-than-buffer): Use count-screen-lines
instead of window-buffer-height.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Wed, 19 Apr 2000 19:07:56 +0000 |
parents | 1d7862b7e02d |
children | ebc349d16eb9 |
files | lisp/window.el |
diffstat | 1 files changed, 42 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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.