all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Gerd Möllmann" <gerd.moellmann@gmail.com>
To: Po Lu <luangruo@yahoo.com>
Cc: Eli Zaretskii <eliz@gnu.org>,
	hermann sorgel <hermannsorgel@gmail.com>,
	Stefan Kangas <stefankangas@gmail.com>,
	72230@debbugs.gnu.org
Subject: bug#72230: 29.4; Cursor Disappears with Hebrew Text
Date: Mon, 22 Jul 2024 08:47:30 +0200	[thread overview]
Message-ID: <m2v80x53el.fsf@pro2.fritz.box> (raw)
In-Reply-To: <87sew2xju6.fsf@yahoo.com> (Po Lu's message of "Mon, 22 Jul 2024 10:05:05 +0800")

Po Lu <luangruo@yahoo.com> writes:

> Stefan Kangas <stefankangas@gmail.com> writes:
>
>> Eli Zaretskii <eliz@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?
>
> Yes, this will cause the overhangs of a cursor glyph to overwrite its
> surroundings.  There is certain to be some other factor that has not
> been accounted for, while mindlessly removing clipping operations is not
> the solution.
>
>> 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;
>
> I don't recollect what `s' is supposed to represent.

I propose the following as a fix. This computes the right rectangle to
draw before that rectangle is set via NSClipRect.

1 file changed, 8 insertions(+), 12 deletions(-)
src/nsterm.m | 20 ++++++++------------

modified   src/nsterm.m
@@ -3026,7 +3026,7 @@ External call (RIF): draw cursor.
      Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
    -------------------------------------------------------------------------- */
 {
-  NSRect r, s;
+  NSRect r;
   int fx, fy, h, cursor_height;
   struct frame *f = WINDOW_XFRAME (w);
   struct glyph *phys_cursor_glyph;
@@ -3076,6 +3076,12 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
       /* The bar cursor should never be wider than the glyph.  */
       if (cursor_width < w->phys_cursor_width)
         w->phys_cursor_width = cursor_width;
+
+      /* If the character under cursor is R2L, draw the bar cursor
+         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)
+        fx += cursor_glyph->pixel_width - w->phys_cursor_width;
     }
   /* If we have an HBAR, "cursor_width" MAY specify height.  */
   else if (cursor_type == HBAR_CURSOR)
@@ -3126,18 +3132,8 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
       [ctx restoreGraphicsState];
       break;
     case HBAR_CURSOR:
-      NSRectFill (r);
-      [ctx restoreGraphicsState];
-      break;
     case BAR_CURSOR:
-      s = r;
-      /* If the character under cursor is R2L, draw the bar cursor
-         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;
-
-      NSRectFill (s);
+      NSRectFill (r);
       [ctx restoreGraphicsState];
       break;
     }






  reply	other threads:[~2024-07-22  6:47 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-21 14:20 bug#72230: 29.4; Cursor Disappears with Hebrew Text hermann sorgel
2024-07-21 15:46 ` Eli Zaretskii
2024-07-21 16:01   ` Eli Zaretskii
2024-07-21 17:15     ` hermann sorgel
2024-07-21 17:31     ` hermann sorgel
2024-07-21 17:37       ` Eli Zaretskii
2024-07-21 18:05         ` Stefan Kangas
2024-07-21 18:42           ` Gerd Möllmann
2024-07-21 18:45           ` Gerd Möllmann
2024-07-21 19:26             ` Stefan Kangas
2024-07-21 21:35               ` hermann sorgel
2024-07-22  2:05           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-22  6:47             ` Gerd Möllmann [this message]
2024-07-23  6:17               ` Gerd Möllmann
2024-07-23  7:14                 ` Stefan Kangas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2v80x53el.fsf@pro2.fritz.box \
    --to=gerd.moellmann@gmail.com \
    --cc=72230@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    --cc=hermannsorgel@gmail.com \
    --cc=luangruo@yahoo.com \
    --cc=stefankangas@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.