> What is supposed to happen, with the current code, when the frame is
> resized to less than the minimum dimensions we allow? Shouldn't we
> disallow/refuse such resizes? And if we don't refuse, what will
> happen to the windows? E.g., if the frame is not tall enough to show
> the menu bar, the two mode lines, the mini-window, and at least one
> line for each of the two windows, what should I expect to see on
> display?
As for GUI frames I wrote some code to handle that but you didn't like
it back then. Basically, we should do the following:
- Add min-size-hints so the window manage never tries to make the frame
to small. These have to correspond to the current window layout and
the window decorations - a frame with split windows has a larger
minimum size than one with one window only as we can see in the
present thread.
- When the window manager doesn't comply, simple ignore the shrink
request. Portions of our frame that don't fit will be clipped by the
window manager. I wrote some code to always keep the minibuffer
window visible in such case but cannot remember whether it works well.
My WM (and Windows too) never tried to make a GUI frame smaller than I
wanted.
On terminal emulators we should (or even do) conceptually the same as
with a non-compliant WM. The terminal emulator has to do the clipping
just like the WM.
> Taking some code and moving it to another place in the same function
> can only affect what's going on in that function and the functions it
> calls. For example, if you had
>
> foo ();
> bar ();
> baz ();
>
> and then you move the call to baz to be before the call to bar, like
> this:
>
> foo ();
> baz ();
> bar ();
>
> then I can understand why bar and its subroutines are affected. But
> once we are done with this code, all the 3 calls have been made, and
> the order in which they were made can hardly matter for the code which
> runs after that, right?
So I moved the assignments within adjust_frame_size (baz) in front of
the resize_frame_windows (bar) calls. Is it that what you mean?
> So if the crash was inside the call to bar, then I could understand
> how moving the call to baz before it could affect the crash. But the
> backtrace from the assertion violation didn't show adjust_frame_glyphs
> anywhere on the call-stack, so I don't understand how simply
> rearranging code inside adjust_frame_glyphs could change something
> _outside_ it.
Do you mean adjust_frame_size instead of adjust_frame_glyphs here so the
fact that makes you wonder is that adjust_frame_size never shows up in
the backtraces?
I could imagine that resize_frame_windows (or even
'window--pixel-to-total') mess up things in a way that confuses frame
based redisplay later. In adjust_frame_glyphs_for_frame_redisplay we do
eassert (matrix_dim.width == FRAME_TOTAL_COLS (f)
&& matrix_dim.height == FRAME_TOTAL_LINES (f));
and I wonder whether there's an execution path that could bypass that
assertion.
martin