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

From: Gerd Möllmann <[email-masked]>
Date: Tue, 28 Jan 2025 11:03:41 +0100

martin rudalics <[email-masked]> writes:

>>> (2) do_switch_frame now has this
>>>
>>> 	  if (FRAMEP (top_frame))
>>> 	    {
>>> 	      struct frame *top = XFRAME (top_frame);
>>> 	      struct frame *old_root = root_frame (top);
>>> 	      if (old_root != new_root)
>>> 		SET_FRAME_VISIBLE (old_root, false);
>>> 	    }
>>>
>>> This is wrong because it will set the visibility of the old top frame to
>>> nil.
>>
>> I don't understand that one. It doesn't, or shouldn't change, the
>> visibility of the top_frame, but the visibility of its root. Can you
>> please explain?
>
> The root_frame of the old top frame is the old top frame itself.  Or am
> I missing something?

Maybe. Make a child with M-l, then in the child 

  (frame-parent (tty-top-frame)
  => F1

It's 1:1 the display info's top_frame. IOW, I left the setting of
top_frame as is was before, only that there are now child frames to
which it gets set.

>
>> My idea is that root windows on ttys become invisible/invisible when
>> they are displayed on the terminal or not. Child windows on these roots
>> keep their visibility. They are automatically not displayed when the
>> root is not displayed, that's inherently the case when
>> combine_updates_for frame is not called for invisible root frames.
>
> I think we should use the metaphor of a top frame on a tty as that of a
> maximized frame on a GUI.  Such a frame hides all other normal frames on
> that workspace but does not render them invisible or iconified (I ignore
> z-order and groups here).  

That's not so in the current code. And why should it be so complicated?
Either I can see a frame or not.

> If you want to optimize redisplay, then the old concept of obscured
> frames will be better suited IMO.

It's much easier for me to think about if this second concept of being
obscured does not exist. And it's easier in redisplay: If it's visible
display it, otherwise don't.