Subject: Re: bug#75931: 31.0.50; mouse-face and pointer properties make pointer change back and forth

From: Mauro Aranda <[email-masked]>
Date: Sat, 1 Feb 2025 07:25:29 -0300

Eli Zaretskii <[email-masked]> writes:

 >> Date: Fri, 31 Jan 2025 05:52:07 -0300
 >> Cc: [email-masked], [email-masked]
 >> From: Mauro Aranda <[email-masked]>
 >>
 >> Eli Zaretskii <[email-masked]> writes:
 >>
 >>  >> Date: Thu, 30 Jan 2025 17:41:02 -0300
 >>  >> Cc: [email-masked], [email-masked]
 >>  >> From: Mauro Aranda <[email-masked]>
 >>  >>
 >>  >> Eli Zaretskii <[email-masked]> writes:
 >>  >>
 >>  >>  > Please try the patch below.
 >>  >>
 >>  >> Thanks, but the issue remains after applying the patch.
 >>  >
 >>  > That probably means that one or more other calls to show_mouse_face
 >>  > need to be passed 'false' as the last argument. Since AFAIU only the
 >>  > calls with DRAW_MOUSE_FACE can reset the mouse pointer back to the
 >>  > hand shape, those are the calls that are the suspects.  So please
 >>  > change each such call and see which additional one needs that.  I 
hope
 >>  > there's only one such call, so please change only one call at a time,
 >>  > each time returning the other calls to their current state.
 >>
 >> It's the call at the end of mouse_face_from_buffer_pos.
 >
 > I'm confused: didn't you say earlier in this discussion that removing
 > this call to show_mouse_face in erase_phys_cursor:
 >
 >   #ifdef HAVE_WINDOW_SYSTEM
 >     /* Since erasing the phys cursor will probably lead to corruption of
 >        the mouse face display if the glyph's pixel_width is not kept up
 >        to date with the :box property of the mouse face, just redraw the
 >        mouse face, but leave the mouse cursor as it was.  */
 >     if (FRAME_WINDOW_P (WINDOW_XFRAME (w)) && mouse_face_here_p)
 >       {
 >     w->phys_cursor_on_p = false;
 >     w->phys_cursor_type = NO_CURSOR;
 >     show_mouse_face (MOUSE_HL_INFO (WINDOW_XFRAME (w)), DRAW_MOUSE_FACE,
 >              false);
 >     return;
 >       }
 >   #endif
 > solves the problem?

No, I never tried removing it, I said:
"Perhaps it is the call to show_mouse_face that was added to
erase_phys_cursor."

That was because reverting the changes in dispnew.c solved the problem
after your commit, but didn't solve it anymore after the commit by Po
Lu, which added that call.

Whether passing a false argument in the call counts as "removing it",
for this matter, I don't know.

What I meant with "it's the call at the end of
mouse_face_from_buffer_pos" is that that's the other call that needed to
pass false (in addition to the one in erase_phys_cursor) for the problem
to disappear.

 > Is that still the case with the current code?

Allow me to summarize:

* Does reverting the hunk from your commit in dispnew.c solves it?
- After your commit, it does.

- After the commit by Po Lu, it does not.

* Does arranging for the call to show_mouse_face to not redefine the
mouse cursor solves it?

I tried that by changing FRAME_OUTPUT_DATA (f)->hand_cursor to
FRAME_OUTPUT_DATA (f)->current_cursor

That made the problem go away, without having to revert the hunk in
dispnew.c.  (From now on, everything tested is without reverting that
hunk)

Note that here I may have misunderstood
what you asked me: maybe you wanted me to do something in
erase_phys_cursor, around the call to show_mouse_face, but not inside
show_mouse_face.  I didn't know what to do, but I explained that I
changed the code in show_mouse_face.

* Does the patch where the only call to show_mouse_face that passes
false as a third argument solve it?

No, it doesn't.

* Is there any other call to show_mouse_face (in addition to the one in
erase_phys_cursor that needs to pass false as a third argument for the
problem to go away? If yes, which one/s?

I found out by testing one by one that the other call it's the one in
mouse_face_from_buffer_pos.