changeset 109780:300a489dd304

Fix cursor drawing on stretch glyphs in R2L lines. xterm.c (x_draw_stretch_glyph_string): w32term.c (x_draw_stretch_glyph_string): In R2L rows, display the cursor on the right edge of the stretch glyph. xdisp.c (window_box_right_offset, window_box_right): Fix commentary.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 14 Aug 2010 15:55:04 +0300
parents d2d95919c4db
children c89afd5304b0
files src/ChangeLog src/w32term.c src/xdisp.c src/xterm.c
diffstat 4 files changed, 65 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sat Aug 14 13:59:55 2010 +0300
+++ b/src/ChangeLog	Sat Aug 14 15:55:04 2010 +0300
@@ -1,5 +1,12 @@
 2010-08-14  Eli Zaretskii  <eliz@gnu.org>
 
+	* xterm.c (x_draw_stretch_glyph_string):
+	* w32term.c (x_draw_stretch_glyph_string): In R2L rows, display
+	the cursor on the right edge of the stretch glyph.
+
+	* xdisp.c (window_box_right_offset, window_box_right): Fix
+	commentary.
+
 	* xdisp.c (Fcurrent_bidi_paragraph_direction): Fix paragraph
 	direction when point is inside a run of whitespace characters.
 
--- a/src/w32term.c	Sat Aug 14 13:59:55 2010 +0300
+++ b/src/w32term.c	Sat Aug 14 15:55:04 2010 +0300
@@ -2106,17 +2106,34 @@
   if (s->hl == DRAW_CURSOR
       && !x_stretch_cursor_p)
     {
-      /* If `x-stretch-block-cursor' is nil, don't draw a block cursor
-	 as wide as the stretch glyph.  */
+      /* If `x-stretch-cursor' is nil, don't draw a block cursor as
+	 wide as the stretch glyph.  */
       int width, background_width = s->background_width;
-      int x = s->x, left_x = window_box_left_offset (s->w, TEXT_AREA);
-
-      if (x < left_x)
+      int x = s->x;
+
+      if (!s->row->reversed_p)
 	{
-	  background_width -= left_x - x;
-	  x = left_x;
+	  int left_x = window_box_left_offset (s->w, TEXT_AREA);
+
+	  if (x < left_x)
+	    {
+	      background_width -= left_x - x;
+	      x = left_x;
+	    }
+	}
+      else
+	{
+	  /* In R2L rows, draw the cursor on the right edge of the
+	     stretch glyph.  */
+	  int right_x = window_box_right_offset (s->w, TEXT_AREA);
+
+	  if (x + background_width > right_x)
+	    background_width -= x - right_x;
+	  x += background_width;
 	}
       width = min (FRAME_COLUMN_WIDTH (s->f), background_width);
+      if (s->row->reversed_p)
+	x -= width;
 
       /* Draw cursor.  */
       x_draw_glyph_string_bg_rect (s, x, s->y, width, s->height);
@@ -2130,7 +2147,10 @@
 	  RECT r;
           HDC hdc = s->hdc;
 
-	  x += width;
+	  if (!s->row->reversed_p)
+	    x += width;
+	  else
+	    x = s->x;
 	  if (s->row->mouse_face_p
 	      && cursor_in_mouse_face_p (s->w))
 	    {
--- a/src/xdisp.c	Sat Aug 14 13:59:55 2010 +0300
+++ b/src/xdisp.c	Sat Aug 14 15:55:04 2010 +0300
@@ -1208,7 +1208,7 @@
 
 
 /* Return the window-relative coordinate of the right edge of display
-   area AREA of window W.  AREA < 0 means return the left edge of the
+   area AREA of window W.  AREA < 0 means return the right edge of the
    whole window, to the left of the right fringe of W.  */
 
 INLINE int
@@ -1238,7 +1238,7 @@
 
 
 /* Return the frame-relative coordinate of the right edge of display
-   area AREA of window W.  AREA < 0 means return the left edge of the
+   area AREA of window W.  AREA < 0 means return the right edge of the
    whole window, to the left of the right fringe of W.  */
 
 INLINE int
--- a/src/xterm.c	Sat Aug 14 13:59:55 2010 +0300
+++ b/src/xterm.c	Sat Aug 14 15:55:04 2010 +0300
@@ -2435,17 +2435,34 @@
   if (s->hl == DRAW_CURSOR
       && !x_stretch_cursor_p)
     {
-      /* If `x-stretch-block-cursor' is nil, don't draw a block cursor
-	 as wide as the stretch glyph.  */
+      /* If `x-stretch-cursor' is nil, don't draw a block cursor as
+	 wide as the stretch glyph.  */
       int width, background_width = s->background_width;
-      int x = s->x, left_x = window_box_left_offset (s->w, TEXT_AREA);
-
-      if (x < left_x)
+      int x = s->x;
+
+      if (!s->row->reversed_p)
 	{
-	  background_width -= left_x - x;
-	  x = left_x;
+	  int left_x = window_box_left_offset (s->w, TEXT_AREA);
+
+	  if (x < left_x)
+	    {
+	      background_width -= left_x - x;
+	      x = left_x;
+	    }
+	}
+      else
+	{
+	  /* In R2L rows, draw the cursor on the right edge of the
+	     stretch glyph.  */
+	  int right_x = window_box_right_offset (s->w, TEXT_AREA);
+
+	  if (x + background_width > right_x)
+	    background_width -= x - right_x;
+	  x += background_width;
 	}
       width = min (FRAME_COLUMN_WIDTH (s->f), background_width);
+      if (s->row->reversed_p)
+	x -= width;
 
       /* Draw cursor.  */
       x_draw_glyph_string_bg_rect (s, x, s->y, width, s->height);
@@ -2458,7 +2475,10 @@
 	  XRectangle r;
 	  GC gc;
 
-	  x += width;
+	  if (!s->row->reversed_p)
+	    x += width;
+	  else
+	    x = s->x;
 	  if (s->row->mouse_face_p
 	      && cursor_in_mouse_face_p (s->w))
 	    {