GNU bug report logs -
#72230
29.4; Cursor Disappears with Hebrew Text
Previous Next
Reported by: hermann sorgel <hermannsorgel <at> gmail.com>
Date: Sun, 21 Jul 2024 15:30:02 UTC
Severity: normal
Found in version 29.4
Fixed in version 30.1
Done: Gerd Möllmann <gerd.moellmann <at> gmail.com>
Bug is archived. No further changes may be made.
Full log
Message #26 received at 72230 <at> debbugs.gnu.org (full text, mbox):
Stefan Kangas <stefankangas <at> gmail.com> writes:
> Eli Zaretskii <eliz <at> gnu.org> writes:
>
>> So maybe the problem is elsewhere. One thing is almost certain: it's
>> a problem specific to the macOS build of Emacs. People who can debug
>> on that platform are encouraged to suggest insights and changes.
>
> This seems to have something to with the clipping path, and is fixed
> here by the below patch. I don't think it's suitable for installing
> though.
>
> Po Lu, since you added the below NSRectClip call, do you have any
> thoughts here?
>
> diff --git a/src/nsterm.m b/src/nsterm.m
> index 794630de1c1..54b15bc851d 100644
> --- a/src/nsterm.m
> +++ b/src/nsterm.m
> @@ -3102,7 +3102,7 @@ Note that CURSOR_WIDTH is meaningful only for
> (h)bar cursors.
> #ifdef NS_IMPL_GNUSTEP
> GSRectClipList (ctx, &r, 1);
> #else
> - NSRectClip (r);
> + // NSRectClip (r);
> #endif
>
> [FRAME_CURSOR_COLOR (f) set];
> @@ -3135,7 +3135,7 @@ Note that CURSOR_WIDTH is meaningful only for
> (h)bar cursors.
> on the right of its glyph, rather than on the left. */
> cursor_glyph = get_phys_cursor_glyph (w);
> if ((cursor_glyph->resolved_level & 1) != 0)
> - s.origin.x += cursor_glyph->pixel_width - s.size.width;
> + s.origin.x += cursor_glyph->pixel_width - cursor_width;
>
> NSRectFill (s);
> [ctx restoreGraphicsState];
A clipping path set with NSRectClip is permanent, and the only way to
get rid it is to restore the graphics state. This seems to work:
modified src/nsterm.m
@@ -3130,6 +3130,8 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
[ctx restoreGraphicsState];
break;
case BAR_CURSOR:
+ [ctx restoreGraphicsState];
+ [ctx saveGraphicsState];
s = r;
/* If the character under cursor is R2L, draw the bar cursor
on the right of its glyph, rather than on the left. */
@@ -3137,6 +3139,10 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
if ((cursor_glyph->resolved_level & 1) != 0)
s.origin.x += cursor_glyph->pixel_width - s.size.width;
+ /* Get rid of the clipping set previously. */
+ [ctx restoreGraphicsState];
+ [ctx saveGraphicsState];
+ NSRectClip (s);
NSRectFill (s);
[ctx restoreGraphicsState];
break;
This bug report was last modified 1 year and 31 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.