changeset 56894:8beec197715e

(set_cursor_from_row): Look for non-nil `cursor' property in overlay or text-property strings; set cursor on corresponding glyph rather than at end of the string.
author Kim F. Storm <storm@cua.dk>
date Thu, 02 Sep 2004 22:34:07 +0000
parents b3e23208cc2a
children b4c980745e7f
files src/xdisp.c
diffstat 1 files changed, 26 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Thu Sep 02 17:03:16 2004 +0000
+++ b/src/xdisp.c	Thu Sep 02 22:34:07 2004 +0000
@@ -306,6 +306,7 @@
 extern Lisp_Object Qheight;
 extern Lisp_Object QCwidth, QCheight, QCascent;
 extern Lisp_Object Qscroll_bar;
+extern Lisp_Object Qcursor;
 
 /* Non-nil means highlight trailing whitespace.  */
 
@@ -10647,6 +10648,7 @@
 {
   struct glyph *glyph = row->glyphs[TEXT_AREA];
   struct glyph *end = glyph + row->used[TEXT_AREA];
+  struct glyph *cursor = NULL;
   /* The first glyph that starts a sequence of glyphs from string.  */
   struct glyph *string_start;
   /* The X coordinate of string_start.  */
@@ -10656,6 +10658,7 @@
   /* The last known character position before string_start.  */
   int string_before_pos;
   int x = row->x;
+  int cursor_x = x;
   int pt_old = PT - delta;
 
   /* Skip over glyphs not having an object at the start of the row.
@@ -10688,12 +10691,29 @@
 	  string_start = glyph;
 	  string_start_x = x;
 	  /* Skip all glyphs from string.  */
-	  SKIP_GLYPHS (glyph, end, x, STRINGP (glyph->object));
-	}
-    }
-
-  if (string_start
-      && (glyph == end || !BUFFERP (glyph->object) || last_pos > pt_old))
+	  do
+	    {
+	      if ((cursor == NULL || glyph > cursor)
+		  && !NILP (Fget_char_property (make_number ((glyph)->charpos),
+						Qcursor, (glyph)->object)))
+		{
+		  cursor = glyph;
+		  cursor_x = x;
+		}
+	      x += glyph->pixel_width;
+	      ++glyph;
+	    }
+	  while (glyph < end && STRINGP (glyph->object));
+	}
+    }
+
+  if (cursor != NULL)
+    {
+      glyph = cursor;
+      x = cursor_x;
+    }
+  else 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