Subject: bug#33498: 26.1; Unable to delete minibuffer-only+child frames

From: Andreas Politz <[email-masked]>
Date: Mon, 26 Nov 2018 19:59:37 +0100

Thanks for the detailed explanation.  I was looking for a way to have
the minibuffer at the top of the frame, which you'd probably already
guessed.

martin rudalics <[email-masked]> writes:

> These operations would have to be automatized and improved as follows:
>
> Process a (minibuffer . child-frame) frame parameter to
>
> (1) make an _invisible_ top-level minibuffer-only frame similar to
>     what we are doing in the (minibuffer . nil) case,
>
> (2) create the minibuffer-less parent frame with the minibuffer window
>     set to the window made in (1),
>
> (3) reparent the minibuffer frame created in (1) and make it visible.

Should this be a dedicated function,
e.g. make-frame-with-minibuffer-child.  Or a behavior triggered by an
additional frame-parameter passed to the parent ?

> Then deleting the parent frame would
>
> (4) make the minibuffer frame invisible and top-level,
>
> (5) delete the parent frame,
>
> (6) delete the minibuffer frame if possible or make it visible if it
>     still serves as minibuffer frame for another frame.
>
> (4)-(5) would have to handle the cases correctly where delete_frame
> (the C function) is called from Elisp (via C-x 5 0, for example) and
> from the window manager (by clicking the "x" on the title bar).  The
> Elisp call would not shut down Emacs, the window manager call could.
>
It seems to me that this code should go into Fdelete_frame ?

> To process (6) we would maybe also want an 'auto-delete-minibuffer'
> frame parameter (which could then be also used for non-child-frame
> minibuffer-only frames).
>
> Finally, any such code will have to process the 'delete-before' frame
> parameter appropriately to avoid running into an infinite loop of
> failed deletion attempts.

What if we allow the deletion of a minibuffer frame, if it will not
violate the invariant that all frames have a minibuffer, i.e. because
the frame in question will be deleted some time later (because this
operation is already on the call-stack.).  I don't know if this
temporary violation (i.e. between deleting the child-minibuffer and
deleting the parent) is a problem.  Anyway, this would enable the user
to delete these kinds of frames normally, even if it looks jerky.

And then implement the special minibuffer-as-child-frame behavior and
logic via dedicated functions, which display and undsiplay these frames
nicely.  (Still, delete-frame would have to be redirected to some proxy
handling this case.)

Andreas