1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-22 10:26:20 +00:00

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.
This commit is contained in:
Eli Zaretskii 2012-03-31 10:45:33 +03:00
parent 650b6d0b9e
commit 8427ddd200
3 changed files with 37 additions and 6 deletions

View File

@ -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" "\

View File

@ -1,3 +1,10 @@
2012-03-31 Eli Zaretskii <eliz@gnu.org>
* 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 <eliz@gnu.org>
* xdisp.c (append_space_for_newline): If the default face was

View File

@ -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);