Fix 'fit-frame-to-buffer' (Bug#56102)

* lisp/window.el (fit-frame-to-buffer-sizes): Fix doc-string.
Give calls to 'max' a second argument so they do something
useful.  If ONLY equals 'vertically', call
'window-text-pixel-size' with X-LIMIT nil (Bug#56102).  For
minimum sizes of the window to fit, use 'window-safe-min-size' by
default.
* doc/lispref/windows.texi (Resizing Windows): Fix descriptions of
'fit-frame-to-buffer' and 'fit-frame-to-buffer-sizes'.
This commit is contained in:
Martin Rudalics 2022-07-06 09:25:43 +02:00
parent 1540481850
commit 939dc2ff12
2 changed files with 30 additions and 27 deletions

View file

@ -1158,11 +1158,13 @@ frame to its buffer using the command @code{fit-frame-to-buffer}.
This command adjusts the size of @var{frame} to display the contents of
its buffer exactly. @var{frame} can be any live frame and defaults to
the selected one. Fitting is done only if @var{frame}'s root window is
live. The arguments @var{max-height}, @var{min-height}, @var{max-width}
and @var{min-width} specify bounds on the new total size of
@var{frame}'s root window. @var{min-height} and @var{min-width} default
to the values of @code{window-min-height} and @code{window-min-width}
respectively.
live.
The arguments @var{max-height}, @var{min-height}, @var{max-width} and
@var{min-width}, if non-@code{nil}, specify bounds on the new body size
of @var{frame}'s root window. A non-@code{nil} value specified by any
of these arguments overrides the corresponding value specified by
the option @code{fit-frame-to-buffer-sizes} described below.
If the optional argument @var{only} is @code{vertically}, this function
may resize the frame vertically only. If @var{only} is
@ -1187,10 +1189,10 @@ here can be overridden for a specific frame by that frame's
@defopt fit-frame-to-buffer-sizes
This option specifies size boundaries for @code{fit-frame-to-buffer}.
It specifies the total maximum and minimum lines and maximum and minimum
columns of the root window of any frame that shall be fit to its buffer.
If any of these values is non-@code{nil}, it overrides the corresponding
argument of @code{fit-frame-to-buffer}.
It specifies the maximum and minimum lines and maximum and minimum
columns of the root window's body of any frame that shall be fit to its
buffer. Any value this option specifies will be overridden by the
corresponding argument of @code{fit-frame-to-buffer}, if non-@code{nil}.
@end defopt
@deffn Command shrink-window-if-larger-than-buffer &optional window

View file

@ -9179,10 +9179,11 @@ present. See also `fit-frame-to-buffer-sizes'."
(defcustom fit-frame-to-buffer-sizes '(nil nil nil nil)
"Size boundaries of frame for `fit-frame-to-buffer'.
This list specifies the total maximum and minimum lines and
maximum and minimum columns of the root window of any frame that
shall be fit to its buffer. If any of these values is non-nil,
it overrides the corresponding argument of `fit-frame-to-buffer'.
This list specifies the total maximum and minimum numbers of
lines and the maximum and minimum numbers of columns of the body
of the root window of any frame that shall be fit to its buffer.
Any value specified by ths variable will be overridden by the
corresponding argument of `fit-frame-to-buffer', if non-nil.
On window systems where the menubar can wrap, fitting a frame to
its buffer may swallow the last line(s). Specifying an
@ -9378,30 +9379,30 @@ for `fit-frame-to-buffer'."
(t parent-or-display-height))
;; The following is the maximum height that fits into the
;; top and bottom margins.
(max (- bottom-margin top-margin outer-minus-body-height))))
(max (- bottom-margin top-margin outer-minus-body-height) 0)))
(min-height
(cond
((numberp min-height) (* min-height line-height))
((numberp (nth 1 sizes)) (* (nth 1 sizes) line-height))
(t (window-min-size window nil nil t))))
(t (window-safe-min-size window nil t))))
(max-width
(min
(cond
((numberp max-width) (* max-width char-width))
((numberp (nth 2 sizes)) (* (nth 2 sizes) char-width))
(t parent-or-display-width))
;; The following is the maximum width that fits into the
;; left and right margins.
(max (- right-margin left-margin outer-minus-body-width))))
(unless (eq only 'vertically)
(min
(cond
((numberp max-width) (* max-width char-width))
((numberp (nth 2 sizes)) (* (nth 2 sizes) char-width))
(t parent-or-display-width))
;; The following is the maximum width that fits into the
;; left and right margins.
(max (- right-margin left-margin outer-minus-body-width) 0))))
(min-width
(cond
((numberp min-width) (* min-width char-width))
((numberp (nth 3 sizes)) (nth 3 sizes))
(t (window-min-size window t nil t))))
((numberp (nth 3 sizes)) (* (nth 3 sizes) char-width))
(t (window-safe-min-size window t t))))
;; Note: Currently, for a new frame the sizes of the header
;; and mode line may be estimated incorrectly
(size
(window-text-pixel-size window from to max-width max-height))
(size (window-text-pixel-size window from to max-width max-height))
(width (max (car size) min-width))
(height (max (cdr size) min-height)))
;; Don't change height or width when the window's size is fixed