changeset 80693:842392852afc

(move_it_to): When stopping at a charpos, check if that's a continued multi-char glyph; if so, advance to the actual glyph. (try_window): Check scroll margin on bottom window edge too.
author Chong Yidong <cyd@stupidchicken.com>
date Fri, 08 Aug 2008 15:50:53 +0000
parents 80c6b8023a44
children 2a233b85cfc7
files src/xdisp.c
diffstat 1 files changed, 25 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Fri Aug 08 15:49:52 2008 +0000
+++ b/src/xdisp.c	Fri Aug 08 15:50:53 2008 +0000
@@ -6932,6 +6932,30 @@
 
  out:
 
+  /* On text terminals, we may stop at the end of a line in the middle
+     of a multi-character glyph.  If the glyph itself is continued,
+     i.e. it is actually displayed on the next line, don't treat this
+     stopping point as valid; move to the next line instead (unless
+     that brings us offscreen).  */
+  if (!FRAME_WINDOW_P (it->f)
+      && op & MOVE_TO_POS
+      && IT_CHARPOS (*it) == to_charpos
+      && it->what == IT_CHARACTER
+      && it->nglyphs > 1
+      && it->line_wrap == WINDOW_WRAP
+      && it->current_x == it->last_visible_x - 1
+      && it->c != '\n'
+      && it->c != '\t'
+      && it->vpos < XFASTINT (it->w->window_end_vpos))
+    {
+      it->continuation_lines_width += it->current_x;
+      it->current_x = it->hpos = it->max_ascent = it->max_descent = 0;
+      it->current_y += it->max_ascent + it->max_descent;
+      ++it->vpos;
+      last_height = it->max_ascent + it->max_descent;
+      last_max_ascent = it->max_ascent;
+    }
+
   TRACE_MOVE ((stderr, "move_it_to: reached %d\n", reached));
 }
 
@@ -13665,7 +13689,7 @@
 	     seems to give wrong results.  We don't want to recenter
 	     when the last line is partly visible, we want to allow
 	     that case to be handled in the usual way.  */
-	  || (w->cursor.y + 1) > it.last_visible_y)
+	  || w->cursor.y > it.last_visible_y - this_scroll_margin - 1)
 	{
 	  w->cursor.vpos = -1;
 	  clear_glyph_matrix (w->desired_matrix);