changeset 49519:a0a826fd5281

(set_cursor_from_row): Pay attention to string display properties.
author Kenichi Handa <handa@m17n.org>
date Wed, 29 Jan 2003 13:12:46 +0000
parents 0736ffffe240
children de390d032ae7
files src/xdisp.c
diffstat 1 files changed, 62 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Wed Jan 29 13:12:27 2003 +0000
+++ b/src/xdisp.c	Wed Jan 29 13:12:46 2003 +0000
@@ -9460,6 +9460,14 @@
 {
   struct glyph *glyph = row->glyphs[TEXT_AREA];
   struct glyph *end = glyph + row->used[TEXT_AREA];
+  /* The first glyph that starts a sequence of glyphs from string.  */
+  struct glyph *string_start;
+  /* The X coordinate of string_start.  */
+  int string_start_x;
+  /* The last known character position.  */
+  int last_pos = MATRIX_ROW_START_CHARPOS (row) + delta;
+  /* The last known character position before string_start.  */
+  int string_before_pos;
   int x = row->x;
   int pt_old = PT - delta;
 
@@ -9475,13 +9483,63 @@
 	++glyph;
       }
 
+  string_start = NULL;
   while (glyph < end
 	 && !INTEGERP (glyph->object)
 	 && (!BUFFERP (glyph->object)
-	     || glyph->charpos < pt_old))
-    {
-      x += glyph->pixel_width;
-      ++glyph;
+	     || (last_pos = glyph->charpos) < pt_old))
+    {
+      if (! STRINGP (glyph->object))
+	{
+	  string_start = NULL;
+	  x += glyph->pixel_width;
+	  ++glyph;
+	}
+      else
+	{
+	  string_before_pos = last_pos;
+	  string_start = glyph;
+	  string_start_x = x;
+	  /* Skip all glyphs from string.  */
+	  do
+	    {
+	      x += glyph->pixel_width;
+	      ++glyph;
+	    }
+	  while (glyph < end && STRINGP (glyph->object));
+	}
+    }
+
+  if (string_start
+      && (glyph == end || !BUFFERP (glyph->object) || last_pos > pt_old))
+    {
+      /* We may have skipped over point because the previous glyphs
+	 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);
+      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)
+	{
+	  /* Skip glyphs from the same string.  */
+	  do
+	    {
+	      x += glyph->pixel_width;
+	      ++glyph;
+	    }
+	  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);
+	}
     }
 
   w->cursor.hpos = glyph - row->glyphs[TEXT_AREA];