Subject: Re: bug#68235: 29.1.90; Switching tabs stops following process output in selected window

From: martin rudalics <[email-masked]>
Date: Thu, 18 Jan 2024 11:47:52 +0100

>> We can set up a buffer local variable whose value is a function that
 >> 'set-window-configuration' would call whenever it finds a window with
 >> that buffer dead. 'set-window-configuration' would then check whether
 >> that function correctly returned a live buffer to show in that window.
 >> If the function succeeded, 'set-window-configuration' could try to
 >> restore the earlier values of window point and start in the window.  If
 >> the function failed, 'set-window-configuration' would either delete the
 >> window or display *scratch* in it.
 >
 > Probably better to keep this function in a window parameter
 > like you proposed earlier to restore dired positions.

I just tried what I proposed above and noticed that it's virtually
impossible to come up with a safe solution.  Running Lisp from the
middle of 'set-window-configuration' is madness because the respective
frame may be still under construction at that time with windows, their
respective links, sizes and buffers missing.

What we can safely do is the following: Give 'set-window-configuration'
a new argument, say 'keep-dead-buffer-windows'.  If non-nil,
'set-window-configuration' does not delete dead buffer windows but shows
*scratch* in them.  'post-set-window-configuration-functions' would then
pass two arguments: the respective frame and a list of four entries for
each dead buffer window it found: The window, the buffer it previously
showed, its window point and its window start position.  A function run
by that hook would then be able to replace *scratch* with, for example,
a new buffer visiting the file the previously shown buffer visited and
also restore point and window start of that window.

martin