emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: "Final" version of tty child frames


From: martin rudalics
Subject: Re: "Final" version of tty child frames
Date: Fri, 17 Jan 2025 10:08:12 +0100
User-agent: Mozilla Thunderbird

>> +     - There exists at least one visible child frame whose root is the
>> +       same frame as the root of W's frame.  Such a frame could overlap
>> +       the position of point in W in which case we (1) don't want to
>> +       show the cursor and (2) make sure that if point is not overlapped
>> +       by that frame, the cursor is shown.  */
>
> If one wants, one could sharpen the second point a bit. Glyphs from
> child frames can only ever appear if
>
> - in a current matrix
>
>    matrix == w->current_matrix
>
> - if w->frame is a root frame (NILP (w->frame->parent_frame)
>    IOW, the current matrix of child frames will never show this
>    phenomenon.
>
>    struct frame *f = XFRAME (w->frame);
>    is_tty_root_frame (f);
>
> - w is the selected window
>
> - that root frame has visible child frames. Something like
>
>    Lisp_Object z_order = frames_in_reverse_z_order (f, true);
>    bool has_visible_child = CONSP (XCDR (z_order);
>
> Which might be easier to understand than the below.

I am a bit lost with this.  Just note one aspect which you can test with
my example file: With C-l and M-l you get two child frames overlapping
each other.  Now in the child frame beneath move the cursor in the area
right of the child frame above to the left so that it is hidden and back
again until it is visible.  Here I have two child frames and no root
frame involved.  Does your "sharpened second point" handle that?

>> +  bool is_tty_selected = false;
>> +  struct frame *f = WINDOW_XFRAME (w);
>> +  struct frame *r = root_frame (WINDOW_XFRAME (w));
>> +
>> +  Lisp_Object tail, other;
>> +
>> +  if (w == XWINDOW (selected_window))
>> +    FOR_EACH_FRAME (tail, other)
>> +      {
>> +      struct frame *o = XFRAME (other);
>> +
>> +      if (FRAME_LIVE_P (o) && is_tty_child_frame (o)
>> +          && FRAME_VISIBLE_P (o) && root_frame (o) == r)

This root_frame (o) == r check is meant to handle the case of two
overlapping child frames too.

>> +        {
>> +          is_tty_selected = true;
>> +          break;
>> +        }
>> +      }
>> +

martin



reply via email to

[Prev in Thread] Current Thread [Next in Thread]