Commit 9292c85b authored by Chong Yidong's avatar Chong Yidong
Browse files

(cursor_row_p): Only end row on newline if it's a display string.

Suggested by Lennart Borgman.
parent 837751ae
...@@ -15865,13 +15865,37 @@ cursor_row_p (w, row) ...@@ -15865,13 +15865,37 @@ cursor_row_p (w, row)
   
if (PT == MATRIX_ROW_END_CHARPOS (row)) if (PT == MATRIX_ROW_END_CHARPOS (row))
{ {
/* If the row ends with a newline from a string, we don't want /* Suppose the row ends on a string.
the cursor there, but we still want it at the start of the Unless the row is continued, that means it ends on a newline
string if the string starts in this row. in the string. If it's anything other than a display string
If the row is continued it doesn't end in a newline. */ (e.g. a before-string from an overlay), we don't want the
cursor there. (This heuristic seems to give the optimal
behavior for the various types of multi-line strings.) */
if (CHARPOS (row->end.string_pos) >= 0) if (CHARPOS (row->end.string_pos) >= 0)
cursor_row_p = (row->continued_p {
|| PT >= MATRIX_ROW_START_CHARPOS (row)); if (row->continued_p)
cursor_row_p = 1;
else
{
/* Check for `display' property. */
struct glyph *beg = row->glyphs[TEXT_AREA];
struct glyph *end = beg + row->used[TEXT_AREA] - 1;
struct glyph *glyph;
cursor_row_p = 0;
for (glyph = end; glyph >= beg; --glyph)
if (STRINGP (glyph->object))
{
Lisp_Object prop
= Fget_char_property (make_number (PT),
Qdisplay, Qnil);
cursor_row_p =
(!NILP (prop)
&& display_prop_string_p (prop, glyph->object));
break;
}
}
}
else if (MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row)) else if (MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row))
{ {
/* If the row ends in middle of a real character, /* If the row ends in middle of a real character,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment