Subject: Re: bug#75056: 31.0.50; tty-child-frames with server / multiple clients possible hangs

From: Gerd Möllmann <[email-masked]>
Date: Sun, 26 Jan 2025 09:41:07 +0100

Eli Zaretskii <[email-masked]> writes:

>> I would perhaps check how that switching to single-kboard is done. That
>> is, which C functions do that, what does do_switch_frame do and so on.
>
> See temporarily_switch_to_single_kboard in keyboard.c.

After reading admin/notes/multi-tty, I don't want to go down that rabbit
hole :-).

>
>> And why does the mini_frame in redisplay_internal end up invisible? Is
>> F1 invisible now, and if so why?
>
> I don't think I follow: what mini_frame are you talking about?  AFAIU,
> the scenario described in
>
>   https://debbugs.gnu.org/cgi/bugreport.cgi?bug=75056#92
>
> said that the child frame (which is the minibuffer frame in this
> scenario, right?) was dismissed, so the fact that it becomes invisible
> is explained by that?

(In message #77 I mention the mini_frame in redisplay_internal which was 
invisible for some reason, and that led to a crash in
combine_updates_for_frame.)

In #92 I think Len means disappeared from the screen. As far as I know,
if Len is using Vertico-Posframe, this means the Posframe child frame
has been made invisible (not deleted).

Everything normal up to this point.

Then he switches to the other frame and strange things happen.
Apparently someone somewhere gets confused. The Posframe that was just
made invisible is made visible (why?) and the mini_frame was invisible
(why?), although in another case.

>From what I've read so far, I can't explain that. That's why I came up
with my description of how I would try to understand this, without child
frames first. (I don't want to debug this, sorry.)

> Or maybe I didn't understand what was described there, since,
> unfortunately, this uses Corfu without telling enough about what's
> going on for people who are unfamiliar with Corfu. AFAIU, the scenario
> described there was talking about child frames, and the problem was
> that the child frame got displayed although it was dismissed before.

It's Posframe. It does things to display the minibuffer in a child
frame. without having a minibuffer. Also involved is Vertico which is a
completion framework that also does complicated things.

As I said, I would start to try understanding this from the ground up,
and add the complicated stuff step by step. First without anything, then
add Vertico, then add Posframe.