changeset 110686:624c74ddf6bf

Fix bug #6349 with cursor positioning in truncated lines. xdisp.c (set_cursor_from_row): When the row is truncated and point is outside the range of displayed characters, position the cursor inside the scroll margin.
author Eli Zaretskii <eliz@gnu.org>
date Fri, 01 Oct 2010 19:38:36 +0200
parents 1d1ed3e3e171
children 8973ee7a7297
files src/ChangeLog src/xdisp.c
diffstat 2 files changed, 21 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Fri Oct 01 16:49:14 2010 +0200
+++ b/src/ChangeLog	Fri Oct 01 19:38:36 2010 +0200
@@ -1,3 +1,9 @@
+2010-10-01  Eli Zaretskii  <eliz@gnu.org>
+
+	* xdisp.c (set_cursor_from_row): When the row is truncated and
+	point is outside the range of displayed characters, position the
+	cursor inside the scroll margin.  (Bug#6349)
+
 2010-10-01  Dan Nicolaescu  <dann@ics.uci.edu>
 
 	Do not include stdlib.h and string.h, config.h does it.
--- a/src/xdisp.c	Fri Oct 01 16:49:14 2010 +0200
+++ b/src/xdisp.c	Fri Oct 01 19:38:36 2010 +0200
@@ -12494,8 +12494,10 @@
   /* Non-zero means we've seen at least one glyph that came from a
      display string.  */
   int string_seen = 0;
-  /* Largest buffer position seen so far during scan of glyph row.  */
-  EMACS_INT bpos_max = last_pos;
+  /* Largest and smalles buffer positions seen so far during scan of
+     glyph row.  */
+  EMACS_INT bpos_max = pos_before;
+  EMACS_INT bpos_min = pos_after;
   /* Last buffer position covered by an overlay string with an integer
      `cursor' property.  */
   EMACS_INT bpos_covered = 0;
@@ -12585,6 +12587,8 @@
 
 	    if (glyph->charpos > bpos_max)
 	      bpos_max = glyph->charpos;
+	    if (glyph->charpos < bpos_min)
+	      bpos_min = glyph->charpos;
 	    if (!glyph->avoid_cursor_p)
 	      {
 		/* If we hit point, we've found the glyph on which to
@@ -12659,6 +12663,8 @@
 
 	    if (glyph->charpos > bpos_max)
 	      bpos_max = glyph->charpos;
+	    if (glyph->charpos < bpos_min)
+	      bpos_min = glyph->charpos;
 	    if (!glyph->avoid_cursor_p)
 	      {
 		if (dpos == 0)
@@ -12745,7 +12751,13 @@
 	    }
 	}
       else if (match_with_avoid_cursor
-	       /* zero-width characters produce no glyphs */
+	       /* A truncated row may not include PT among its
+		  character positions.  Setting the cursor inside the
+		  scroll margin will trigger recalculation of hscroll
+		  in hscroll_window_tree.  */
+	       || (row->truncated_on_left_p && pt_old < bpos_min)
+	       || (row->truncated_on_right_p && pt_old > bpos_max)
+	       /* Zero-width characters produce no glyphs.  */
 	       || ((row->reversed_p
 		    ? glyph_after > glyphs_end
 		    : glyph_after < glyphs_end)