]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix cursor positioning in rows completely covered by display strings.
authorEli Zaretskii <eliz@gnu.org>
Sat, 31 Mar 2012 07:45:33 +0000 (10:45 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 31 Mar 2012 07:45:33 +0000 (10:45 +0300)
 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
src/ChangeLog
src/xdisp.c

index e333fe7cd50c913d88a8abcfc718693cc88a3e85..864ac2b9d4df04e7ede6c06dceefd15a5cecf281 100644 (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" "\
index cbf9abd0ea1a9a8e217f1e9ecf9a905b7a1188dd..189a7e4e775e203dfd0fb77ec3f6130549a52b2a 100644 (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
index 118480a20ae1bf05f3820dcd7a28df1d778413af..302a09dd9740121bcd39fd0dfbb303c2b9f14051 100644 (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);