Subject: bug#78418: 31.0.50; Change in fit-frame-to-buffer doesn't work with transient-posframe

From: Gerd Möllmann <[email-masked]>
Date: Wed, 14 May 2025 13:59:05 +0200

Gerd Möllmann <[email-masked]> writes:

> martin rudalics <[email-masked]> writes:
>
>>  >> what are the values of 'text-minus-body-height' and 'char-height' when
>>  >> the problem happens?
>>  >>
>>  >> martin
>>  >
>>  > text-minus-body-height 0, char-height 1
>>
>> Thanks.  Silly thinko then and the below should fix it.
>>
>> martin
>>
>> diff --git a/lisp/window.el b/lisp/window.el
>> index e0e626e9500..e372ef8b9bb 100644
>> --- a/lisp/window.el
>> +++ b/lisp/window.el
>> @@ -10153,14 +10153,14 @@ fit-frame-to-buffer-1
>>   	;; this may cause lines getting wrapped.  To avoid that, round
>>   	;; sizes up here which will, however, leave a blank space at the
>>   	;; end of the longest line(s).
>> -	(setq text-minus-body-width
>> -	      (+ text-minus-body-width
>> -		 (- char-width
>> -		    (% text-minus-body-width char-width))))
>> -	(setq text-minus-body-height
>> -	      (+ text-minus-body-height
>> -		 (- char-height
>> -		    (% text-minus-body-height char-height)))))
>> +	(let ((remainder (% text-minus-body-width char-width)))
>> +	  (unless (zerop remainder)
>> +	    (setq text-minus-body-width
>> +		  (+ text-minus-body-width (- char-width remainder)))))
>> +	(let ((remainder (% text-minus-body-height char-height)))
>> +	  (unless (zerop remainder)
>> +	    (setq text-minus-body-height
>> +		  (+ text-minus-body-height(- char-height remainder))))))
>>         (setq text-width
>>               (if width
>>                   (+ width text-minus-body-width)
>
> Thanks, that fixes the tty case, but on the GUI it still looks like in
> the screen shot I sent. With
>
> modified   lisp/window.el
> @@ -10158,6 +10158,8 @@ fit-frame-to-buffer-1
>  	    (setq text-minus-body-width
>  		  (+ text-minus-body-width (- char-width remainder)))))
>  	(let ((remainder (% text-minus-body-height char-height)))
> +          (message "remainder %S text-minus-body-height %S char-height %S"
> +                   remainder text-minus-body-height char-height)
>  	  (unless (zerop remainder)
>  	    (setq text-minus-body-height
>  		  (+ text-minus-body-height(- char-height remainder))))))
>
> it says
>
> remainder 0 text-minus-body-height 0 char-height 18

When I invoke a transient in the GUI, and with this diff

1 file changed, 6 insertions(+)
lisp/window.el | 6 ++++++

modified   lisp/window.el
@@ -10126,9 +10126,11 @@ fit-frame-to-buffer-1
             (setq left left-margin)))))
       ;; Fit height to constraints.
       (when height
+        (message "1: height %S" height)
         (unless frame-resize-pixelwise
           (setq height (* (/ (+ height char-height -1) char-height)
                           char-height)))
+        (message "2: height %S" height)
         ;; The new outer height.
         (setq outer-height (+ height outer-minus-body-height))
         ;; Preserve margins.
@@ -10158,6 +10160,8 @@ fit-frame-to-buffer-1
 	    (setq text-minus-body-width
 		  (+ text-minus-body-width (- char-width remainder)))))
 	(let ((remainder (% text-minus-body-height char-height)))
+          (message "remainder %S text-minus-body-height %S char-height %S"
+                   remainder text-minus-body-height char-height)
 	  (unless (zerop remainder)
 	    (setq text-minus-body-height
 		  (+ text-minus-body-height(- char-height remainder))))))
@@ -10165,6 +10169,8 @@ fit-frame-to-buffer-1
             (if width
                 (+ width text-minus-body-width)
               (frame-text-width frame)))
+      (message "height %S text-minus-body-height %S"
+               height text-minus-body-height)
       (setq text-height
             (if height
                 (+ height text-minus-body-height)

I see that the function is apparently called twice? And the output is

1: height 199
2: height 199
height 199 text-minus-body-height 0
1: height 199
2: height 216
remainder 0 text-minus-body-height 0 char-height 18
height 216 text-minus-body-height 0

Maybe the second '2:...' is what increases the frame size?