changeset 49538:975c685ad4c4

(SKIP_GLYPHS): New macro. (set_cursor_from_row): Skip all glyphs that comes from overlay string.
author Kenichi Handa <handa@m17n.org>
date Fri, 31 Jan 2003 03:53:43 +0000
parents 6ef6a0d31663
children 1ad5bfbb831a
files src/xdisp.c
diffstat 1 files changed, 46 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Fri Jan 31 03:53:24 2003 +0000
+++ b/src/xdisp.c	Fri Jan 31 03:53:43 2003 +0000
@@ -9447,6 +9447,19 @@
   return Qnil;
 }
 
+
+/* Increment GLYPH until it reaches END or CONDITION fails while
+   adding (GLYPH)->pixel_width to X. */
+
+#define SKIP_GLYPHS(glyph, end, x, condition)	\
+  do						\
+    {						\
+      (x) += (glyph)->pixel_width;		\
+      ++(glyph);				\
+    }						\
+  while ((glyph) < (end) && (condition))
+
+
 /* Set cursor position of W.  PT is assumed to be displayed in ROW.
    DELTA is the number of bytes by which positions recorded in ROW
    differ from current buffer positions.  */
@@ -9501,12 +9514,7 @@
 	  string_start = glyph;
 	  string_start_x = x;
 	  /* Skip all glyphs from string.  */
-	  do
-	    {
-	      x += glyph->pixel_width;
-	      ++glyph;
-	    }
-	  while (glyph < end && STRINGP (glyph->object));
+	  SKIP_GLYPHS (glyph, end, x, STRINGP (glyph->object));
 	}
     }
 
@@ -9517,28 +9525,42 @@
 	 are from string.  As there's no easy way to know the
 	 character position of the current glyph, find the correct
 	 glyph on point by scanning from string_start again.  */
-      Lisp_Object pos, limit;
-
-      limit = make_number (MATRIX_ROW_END_CHARPOS (row) + delta);
+      Lisp_Object limit;
+      Lisp_Object string;
+      int pos;
+
+      limit = make_number (pt_old + 1);
+      end = glyph;
       glyph = string_start;
       x = string_start_x;
-      pos = make_number (string_buffer_position (w, glyph->object,
-						 string_before_pos));
-      pos = Fnext_single_char_property_change (pos, Qdisplay, Qnil, limit);
-      while (XINT (pos) <= pt_old)
-	{
+      string = glyph->object;
+      pos = string_buffer_position (w, string, string_before_pos);
+      /* If STRING is from overlay, LAST_POS == 0.  We skip such glyphs
+	 because we always put cursor after overlay strings.  */
+      while (pos == 0 && glyph < end)
+	{
+	  string = glyph->object;
+	  SKIP_GLYPHS (glyph, end, x, EQ (glyph->object, string));
+	  if (glyph < end)
+	    pos = string_buffer_position (w, glyph->object, string_before_pos);
+	}
+
+      while (glyph < end)
+	{
+	  pos = XINT (Fnext_single_char_property_change
+		      (make_number (pos), Qdisplay, Qnil, limit));
+	  if (pos > pt_old)
+	    break;
 	  /* Skip glyphs from the same string.  */
-	  do
-	    {
-	      x += glyph->pixel_width;
-	      ++glyph;
-	    }
+	  string = glyph->object;
+	  SKIP_GLYPHS (glyph, end, x, EQ (glyph->object, string));
+	  /* Skip glyphs from an overlay.  */
 	  while (glyph < end
-		 && EQ (glyph->object, string_start->object));
-	  if (glyph == end || !STRINGP (glyph->object))
-	    break;
-	  string_start = glyph;
-	  pos = Fnext_single_char_property_change (pos, Qdisplay, Qnil, limit);
+		 && ! string_buffer_position (w, glyph->object, pos))
+	    {
+	      string = glyph->object;
+	      SKIP_GLYPHS (glyph, end, x, EQ (glyph->object, string));
+	    }
 	}
     }