Subject: Re: bug#72986: Disabling menu-bar-mode changes size of new frames

From: martin rudalics <[email-masked]>
Date: Fri, 4 Oct 2024 17:01:25 +0200

> First frame with menu bar:
 >
 > Frame size history of #<frame  *Minibuf-1* - GNU Emacs at dwks
 > 0x59e577a85750>
 > x_create_frame_1 (5), TS=80x25~>1280x875, NS=80x25~>1296x875,
 > IS=80x25~>1296x875, MS=32x70 IH IV
 > gui_figure_window_size (5), TS=1280x875~>1280x1260, TC=80x25~>80x36,
 > NS=1296x875~>1296x1260, IS=1296x875~>1296x1260, MS=32x70 IH IV
 > scroll-bar-width (3), NS=1296x1260~>1328x1260, IS=1296x1260~>1328x1260,
 > MS=160x175
 > scroll-bar-height (3), MS=160x175
 > menu-bar-lines (2), MS=160x175
 > x_create_frame_2 (0), MS=160x175
 > xg_frame_set_char_size, invisible, PS=1328x1260, XS=1328x1260, DS=1328x1260

This is our first explicit call to set the frame size albeit for an
invisible frame.

 > xg_frame_set_char_size (5), MS=32x70 IH IV
 > x_make_frame_visible
 > MapNotify, not hidden & not iconified, PS=1328x1260, DS=1328x1260
 > ConfigureNotify, PS=1328x1260, XS=1328x1260, DS=1328x1260

So far I failed to notice that first ConfigureNotify following the
MapNotify.  It comes with the expected values XS=1328x1260.  Where on
earth does it come from ...

 > xg_frame_resized, unchanged, PS=1328x1260, XS=1328x1260
 > ConfigureNotify, PS=1328x1260, XS=1328x1258, DS=1328x1260

... and where does this with XS=1328x1258 come from?  On my system, I
get just one ConfigureNotify for each xg_frame_set_char_size.

 > xg_frame_resized, changed, PS=1328x1260, XS=1328x1258
 > change_frame_size_1, delayed, PS=1328x1260, XS=1328x1258, DS=1328x1260

Here we steadfastly reject the 1258 pixels conceded to us ...

 > tool-bar-lines (2), MS=160x175
 > xg_frame_set_char_size, visible, PS=1328x1260, XS=1328x1260, DS=1328x1258
 >  +values, PS=664x654, XS=664x696

... ask again with 696 (/ (+ 1260 50 82) 2) ...

 > ConfigureNotify, PS=1328x1260, XS=1328x1258, DS=1328x1258
 > xg_frame_resized, changed, PS=1328x1260, XS=1328x1258, DS=1328x1258
 > change_frame_size_1, delayed, PS=1328x1260, XS=1328x1258, DS=1328x1258

... and finally succumb because ConfigureNotify offers us those lousy
1258 pixels once more and we don't delay the change any more.

 > change_frame_size (5), TS=1280x1260~>1280x1258, TC=80x36~>80x35,
 > NS=1328x1260~>1328x1258, IS=1328x1260~>1328x1258, MS=32x70 IH IV
 > set_window_configuration (4), MS=160x175 IH IV

We end up with 35 lines as before.

 > First frame without menu bar:
 >
 > Frame size history of #<frame  *Minibuf-1* - GNU Emacs at dwks
 > 0x63f23d459690>
 > x_create_frame_1 (5), TS=80x25~>1280x875, NS=80x25~>1296x875,
 > IS=80x25~>1296x875, MS=32x70 IH IV
 > gui_figure_window_size (5), TS=1280x875~>1280x1260, TC=80x25~>80x36,
 > NS=1296x875~>1296x1260, IS=1296x875~>1296x1260, MS=32x70 IH IV
 > scroll-bar-width (3), NS=1296x1260~>1328x1260, IS=1296x1260~>1328x1260,
 > MS=160x175
 > scroll-bar-height (3), MS=160x175
 > menu-bar-lines (2), MS=160x175
 > x_create_frame_2 (0), MS=160x175
 > xg_frame_set_char_size, invisible, PS=1328x1260, XS=1328x1260, DS=1328x1260
 > xg_frame_set_char_size (5), MS=32x70 IH IV
 > x_make_frame_visible
 > MapNotify, not hidden & not iconified, PS=1328x1260, DS=1328x1260
 > ConfigureNotify, PS=1328x1260, XS=1328x1260, DS=1328x1260
 > xg_frame_resized, unchanged, PS=1328x1260, XS=1328x1260
 > menu-bar-lines (2), MS=160x175
 > xg_frame_set_char_size, visible, PS=1328x1260, XS=1328x1260, DS=1328x1260
 >  +values, PS=664x655, XS=664x630

The 630 here are the next strange thing (they existed in all previous
runs you reported but I didn't notice them either).  For some reason the
height of the tool bar is not added when we do not add the one of the
menu bar.  This must be a bug on our side.

 > ConfigureNotify, PS=1328x1260, XS=1328x1308, DS=1328x1260

This one is truly remarkable: 1308 is 1258 + 50 and 50 pixels are the
height of your menu bar.  Why would anyone add the menu bar height here
when we just asked to not add neither the height of the menu nor that of
the tool bar?

 > xg_frame_resized, changed, PS=1328x1260, XS=1328x1308
 > change_frame_size_1, delayed, PS=1328x1260, XS=1328x1308, DS=1328x1260
 > change_frame_size (5), TS=1280x1260~>1280x1308, TC=80x36~>80x37,

So this gets us 37 lines, one too many ...

 > NS=1328x1260~>1328x1308, IS=1328x1260~>1328x1308, MS=32x70 IH IV
 > tool-bar-lines (2), MS=160x175
 > xg_frame_set_char_size, visible, PS=1328x1308, XS=1328x1308
 >  +values, PS=664x654, XS=664x695
 > ConfigureNotify, PS=1328x1308, XS=1328x1176
 > xg_frame_resized, changed, PS=1328x1308, XS=1328x1176
 > change_frame_size_1, delayed, PS=1328x1308, XS=1328x1176
 > change_frame_size (5), TS=1280x1308~>1280x1176, TC=80x37~>80x33,

... here we shrink back to 33 lines ...

 > NS=1328x1308~>1328x1176, IS=1328x1308~>1328x1176, MS=32x70 IH IV
 > ConfigureNotify, PS=1328x1176, XS=1328x1292
 > xg_frame_resized, changed, PS=1328x1176, XS=1328x1292
 > change_frame_size_1, delayed, PS=1328x1176, XS=1328x1292
 > change_frame_size (5), TS=1280x1176~>1280x1292, TC=80x33~>80x36,
 > NS=1328x1176~>1328x1292, IS=1328x1176~>1328x1292, MS=32x70 IH IV

... and here we get the correct number of lines albeit with a surplus of
12 pixels.  How does that first frame without menu bar look to you?

 > Second frame with menu bar:
 >
 > Frame size history of #<frame  *Minibuf-1* 0x55cd2d33c8f0>
 > x_create_frame_1 (5), TS=80x25~>1280x875, NS=80x25~>1296x875,
 > IS=80x25~>1296x875, MS=32x70 IH IV
 > gui_figure_window_size (5), TS=1280x875~>1280x1260, TC=80x25~>80x36,
 > NS=1296x875~>1296x1260, IS=1296x875~>1296x1260, MS=32x70 IH IV
 > scroll-bar-width (3), NS=1296x1260~>1328x1260, IS=1296x1260~>1328x1260,
 > MS=160x175
 > scroll-bar-height (3), MS=160x175
 > menu-bar-lines (2), MS=160x175
 > x_create_frame_2 (0), MS=160x175
 > xg_frame_set_char_size, invisible, PS=1328x1260, XS=1328x1260, DS=1328x1260
 > xg_frame_set_char_size (5), MS=32x70 IH IV
 > x_make_frame_visible
 > MapNotify, not hidden & not iconified, PS=1328x1260, DS=1328x1260
 > ConfigureNotify, PS=1328x1260, XS=400x340, DS=1328x1260

This is the usual minimization attempt ...

 > xg_frame_resized, changed, PS=1328x1260, XS=400x340
 > change_frame_size_1, delayed, PS=1328x1260, XS=400x340, DS=1328x1260
 > change_frame_size (5), TS=1280x1260~>352x340, TC=80x36~>22x9,

... which succeeds here.  There's no good first ConfigureNotify event
and no second ConfigureNotify as with the initial frame.  The remainder
can be ignored.

This time I'll have to look into our code first - something is fishy.

If there are any volunteers on GNOME who can apply a patch and check
whether they get the same either buggy or correct behavior, preferably
with a scaled screen, I'd be very, very grateful.

martin