# HG changeset patch # User Kim F. Storm # Date 1094164447 0 # Node ID 8beec197715eb5db691bdb22a52f26c56ca943f5 # Parent b3e23208cc2a38f19520e72df77aa53e74f402da (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. diff -r b3e23208cc2a -r 8beec197715e src/xdisp.c --- 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