From 8427ddd200656d210b73881607adddc5f87078b0 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 31 Mar 2012 10:45:33 +0300 Subject: [PATCH] Fix cursor positioning in rows completely covered by display strings. src/xdisp.c (set_cursor_from_row): If `cursor' property on a display string comes from a `display' text property, use the buffer position of that property as if we actually saw that position in the row's glyphs. --- lisp/dired.el | 2 +- src/ChangeLog | 7 +++++++ src/xdisp.c | 34 +++++++++++++++++++++++++++++----- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/lisp/dired.el b/lisp/dired.el index e333fe7cd50..864ac2b9d4d 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -3736,7 +3736,7 @@ Ask means pop up a menu for the user to select one of copy, move or link." ;;;;;; dired-run-shell-command dired-do-shell-command dired-do-async-shell-command ;;;;;; dired-clean-directory dired-do-print dired-do-touch dired-do-chown ;;;;;; dired-do-chgrp dired-do-chmod dired-compare-directories dired-backup-diff -;;;;;; dired-diff) "dired-aux" "dired-aux.el" "aefbe886cce7b5436fd41a7c55c86f84") +;;;;;; dired-diff) "dired-aux" "dired-aux.el" "a07cca6379bd3fdc9eaeba4d341b89ee") ;;; Generated autoloads from dired-aux.el (autoload 'dired-diff "dired-aux" "\ diff --git a/src/ChangeLog b/src/ChangeLog index cbf9abd0ea1..189a7e4e775 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2012-03-31 Eli Zaretskii + + * xdisp.c (set_cursor_from_row): If `cursor' property on a display + string comes from a `display' text property, use the buffer + position of that property as if we actually saw that position in + the row's glyphs. + 2012-03-30 Eli Zaretskii * xdisp.c (append_space_for_newline): If the default face was diff --git a/src/xdisp.c b/src/xdisp.c index 118480a20ae..302a09dd974 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -13800,16 +13800,31 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, chprop = Fget_char_property (make_number (glyph_pos), Qcursor, glyph->object); + if (!NILP (chprop)) + { + /* If the string came from a `display' text property, + look up the buffer position of that property and + use that position to update bpos_max, as if we + actually saw such a position in one of the row's + glyphs. This helps with supporting integer values + of `cursor' property on the display string in + situations where most or all of the row's buffer + text is completely covered by display properties, + so that no glyph with valid buffer positions is + ever seen in the row. */ + EMACS_INT prop_pos = + string_buffer_position_lim (glyph->object, pos_before, + pos_after, 0); + + if (prop_pos >= pos_before) + bpos_max = prop_pos - 1; + } if (INTEGERP (chprop)) { bpos_covered = bpos_max + XINT (chprop); /* If the `cursor' property covers buffer positions up to and including point, we should display cursor on - this glyph. Note that overlays and text properties - with string values stop bidi reordering, so every - buffer position to the left of the string is always - smaller than any position to the right of the - string. Therefore, if a `cursor' property on one + this glyph. Note that, if a `cursor' property on one of the string's characters has an integer value, we will break out of the loop below _before_ we get to the position match above. IOW, integer values of @@ -13869,6 +13884,15 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, chprop = Fget_char_property (make_number (glyph_pos), Qcursor, glyph->object); + if (!NILP (chprop)) + { + EMACS_INT prop_pos = + string_buffer_position_lim (glyph->object, pos_before, + pos_after, 0); + + if (prop_pos >= pos_before) + bpos_max = prop_pos - 1; + } if (INTEGERP (chprop)) { bpos_covered = bpos_max + XINT (chprop); -- 2.39.2