Subject: Re: bug#76275: 31.0.50; frame-inhibit-implied-resize broken on recent master

From: martin rudalics <[email-masked]>
Date: Fri, 14 Feb 2025 11:25:04 +0100

> By means of Git bisection I have discovered that commit dbf22fd0d05 to
 > fix bug#74750 has broken frame-inhibit-implied-resize.
 > Here is a reproducer:
 >
 > 1. Configure the Sway compositor to move and resize new windows that
 >     open if they have the title "Emacs Sway input":
 > --8<---------------cut here---------------start------------->8---
 > for_window [title="^Emacs Sway input$"] \
 > 	floating enable, sticky enable, \
 > 	resize set width 90 ppt, resize set height 90 px, \
 > 	border pixel 2, move position 5 ppt 10 px
 > --8<---------------cut here---------------end--------------->8---
 >
 > 2. Create sway-completing-read.el:
 > --8<---------------cut here---------------start------------->8---
 > (defun spw/scale-default (frame)
 >    (set-face-attribute 'default frame :height 120))
 > (add-to-list 'window-size-change-functions #'spw/scale-default)
 >
 > (defun spw/sway-completing-read (prompt collection &rest optional-args)
 >    (let* ((frame-inhibit-implied-resize t)
 > 	 (frame (make-frame `((title . "Emacs Sway input")
 > 			      (minibuffer . only)
 > 			      (display . ,(getenv "WAYLAND_DISPLAY"))))))
 >      (unwind-protect
 > 	(with-selected-frame frame
 > 	  (set-window-scroll-bars (minibuffer-window frame) 0 nil 0 nil t)
 > 	  (apply #'completing-read prompt collection optional-args))
 >        (delete-frame frame))))
 > --8<---------------cut here---------------end--------------->8---
 >
 > 3. src/emacs -Q -l sway-completing-read.el --fg-daemon=test
 >
 > 4. lib-src/emacsclient -stest -e '(spw/sway-completing-read "Choose: " (list "one" "two" "three"))'
 >
 > Result before dbf22fd0d05: New graphical frame of size 90%x90px appears.
 > Result after dbf22fd0d05: New graphical frame of a different size appears.
 >
 > I think what happens is that Sway moves and resizes the new frame, but
 > then Emacs immediately wants to resize it after scaling the font size.
 > Binding frame-inhibit-implied-resize used to prevent that, but it's now
 > broken.

Two (maybe silly) questions:

(1) Is the

 > (defun spw/scale-default (frame)
 >    (set-face-attribute 'default frame :height 120))
 > (add-to-list 'window-size-change-functions #'spw/scale-default)

needed to reproduce the problem and how or why?  If so, then please tell
us (via GDB) when and how these bypass the

	  || !f->can_set_window_size
	  || !f->after_make_frame

check in run_window_change_functions in window.c.  If they do bypass it,
could you insert an additional

           || !f->tool_bar_resized

there and tell us what happens then?

(2) Is the

 >      (unwind-protect
 > 	(with-selected-frame frame
 > 	  (set-window-scroll-bars (minibuffer-window frame) 0 nil 0 nil t)
 > 	  (apply #'completing-read prompt collection optional-args))
 >        (delete-frame frame))))

needed to reproduce the problem and how or why?

Thanks, martin