Subject: Re: bug#46827: Broken initial size of GTK3 frame

From: martin rudalics <[email-masked]>
Date: Wed, 3 Mar 2021 09:48:16 +0100

> Thanks, but is there any reason to remove the call before updating the
 > tool bar?  You see, I believe one of the reasons for the need to
 > clear_garbaged_frames is that call you suggest to remove.  Why not
 > leave it there, and _add_ one more call after prepare_menu_bars (and
 > perhaps condition it on the same condition as prepare_menu_bars)?

We can obviously do that (see attached patch).  But is there any reason
we cannot run the

   do_pending_window_change (true);
   clear_garbaged_frames ();

_after_ the

       prepare_menu_bars ();
       do_pending_window_change (true);

block?

In either case, the more I look into this, the more things confuse me.
For example, why does

	  if (!must_finish)
	    {
	      do_pending_window_change (true);
	      /* If selected_window changed, redisplay again.  */
	      if (WINDOWP (selected_window)
		  && (w = XWINDOW (selected_window)) != sw)
		goto retry;

not check for windows_or_buffers_changed too just as we do after the
third do_pending_window_change call?  But then I don't understand why we
check for windows_or_buffers_changed at all.  adjust_frame_size doesn't
set that IIUC but it does garbage the frame - why don't we check that in
redisplay_internal?

 >> While frame resizing can make the
 >> selected window small, it will neither remove nor change it.
 >
 > Never-ever?

Never-ever.  Fdelete_window_internal, Fdelete_other_windows_internal and
Fset_window_configuration are the only functions allowed to delete
windows.  run_window_change_functions could delete the selected window
so we probably should do the w == sw check after that now.

martin
diff --git a/src/xdisp.c b/src/xdisp.c
index cc0a689ba3..78f25af991 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -15658,7 +15658,13 @@ redisplay_internal (void)

   /* Build menubar and tool-bar items.  */
   if (NILP (Vmemory_full))
-    prepare_menu_bars ();
+    {
+      prepare_menu_bars ();
+
+      /* Once more taking into account the new tool bar height
+	 (Bug#46827).  */
+      do_pending_window_change (true);
+    }

   /* do_pending_window_change could change the selected_window due to
      frame resizing which makes the selected window too small.