On Fri, Dec 13, 2024 at 1:15 PM martin rudalics <rudalics@gmx.at> wrote:
 > Thank you for the patch and continued focus on this. The following is the
 > behavior I see on NS with the patch applied with target width 1700 and
 > height 1000. These are results from clone-frame using text-pixels which
 > I've included below without explicit pixelwise argument so it respects
 > frame-resize-pixelwise.

Thank you for conducting these experiments.

My pleasure, actually. I live inside Emacs so the better we make it for us the better for all.

 > Note: frame-inhibit-implied-resize=(tab-bar-lines) is the default setting
 > on NS:
 >
 > #if defined (USE_GTK) || defined (HAVE_NS)
 >    frame_inhibit_implied_resize = list1 (Qtab_bar_lines);
 >
 > frame-resize-pixelwise=nil frame-inhibit-implied-resize=nil text-width=1692
 > (Δ-8) text-height=984 (Δ-16) native-width=1727 (Δ-8) native-height 988
 > (Δ-16)
 >
 > Result: respects lines/cols as expected.

It's problematic to clone a frame made with 'frame-resize-pixelwise'
non-nil in a setting with 'frame-resize-pixelwise' nil.  I always have
'frame-resize-pixelwise' t and never change it.

As you pointed out, these are experiments and reflect the desire to fully understand (and control) Emacs behavior under various circumstances we encounter.
 
 > frame-resize-pixelwise=t frame-inhibit-implied-resize=(tab-bar-lines)
 > text-width=1700 (Δ0) text-height=1000 (Δ0) native-width=1735 (Δ0)
 > native-height 1004 (Δ0)
 >
 > Result: Okay by accident, I think, only because tab-bar-lines parameter is
 > nil during adjust_frame_height invocations?

adjust_frame_size you mean, I suppose.  Does your frame have a tab bar?

Yes, typo. These results are all under -Q as we need to repro, so no visible tab bar, just the default NS view which is the tool bar which under master, now appears on the title bar. Something I didn't notice until today but it's neither here nor there, I suppose. I disable tool-bar under all my own real-world circumstances.

 > frame-resize-pixelwise=t frame-inhibit-implied-resize=nil text-width=1700
 > (Δ0) text-height=1000 (Δ0) native-width=1735 (Δ0) native-height 1004 (Δ0)
 >
 > Result: Okay but with frame-inhibit-implied-resize nil, I'd have expected
 > rows/cols vs. pixelwise.

Why?  'frame-inhibit-implied-resize' is about _not_ resizing a frame's
window when one removes/adds one of the items it mentions.  It should
work with pixelwise and normal resizing.

I said that because the latest patch respects frame-inhibit-implied-resize not frame-resize-pixelwise.

 > frame-resize-pixelwise=t frame-inhibit-implied-resize=t text-width=1685
 > (Δ-15) text-height=1000 (Δ0) native-width=1720 (Δ-15) native-height 1004
 > (Δ0)
 >
 > Result: I think this case remains broken needing the adjustment from your
 > first patch that you wanted to also account for fringes?

15 is an odd number so it can't be the default fringes.  IIUC it's your
scroll bar which gets set up after the "frame was made" and while
resizing is inhibited.  Note that the fringes are purely Emacs internal
- we can set them up any way we like.  The scroll bar is more difficult
since the toolkit usually determines its default width.  You could try
to debug this with a breakpoint in 'gui_set_scroll_bar_width' and after
that one in 'frame_inhibit_resize'.  Here on xfwm/GTK-3 the text width
remains unchanged.

Indeed 15 is the vertical scroll bar width. This was what I reported in the original bug submission. You suggested a patch that would accommodate fringes, et.al. If you'd like me to make adjustments; e.g., resizing fringes or whatever, happy to do it and rerun.

These are all ostensively calls to clone-frame. I'd expect, as I guess most people would, that cloning produces the precise geometry of the originating frame, scroll bar or not.
 
 > My default GUI setup is frame-resize-pixelwise t
 > frame-inhibit-implied-resize t as I expect many people have adopted these
 > days.

Few people have AFAICT.  Note that all these experiments are borderline.
Cloning a frame should respect the settings that were active at the time
the original was made.  We can try to make it behave reasonably when
these values change but I am not sure whether we will succeed.

Let's try.

-Stephane