changeset 65326:33c5395c982b

(redisplay_internal): Make UPDATED as long as needed. (move_it_in_display_line_to): Stop after last char on line even on a windowing terminal, if that's the specified stop position.
author Richard M. Stallman <rms@gnu.org>
date Sun, 04 Sep 2005 01:28:41 +0000
parents 66bec6e31cea
children 183e1bf747e4
files src/xdisp.c
diffstat 1 files changed, 23 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Sun Sep 04 01:11:43 2005 +0000
+++ b/src/xdisp.c	Sun Sep 04 01:28:41 2005 +0000
@@ -6012,6 +6012,8 @@
 	     glyphs have the same width.  */
 	  int single_glyph_width = it->pixel_width / it->nglyphs;
 	  int new_x;
+	  int x_before_this_char = x;
+	  int hpos_before_this_char = it->hpos;
 
 	  for (i = 0; i < it->nglyphs; ++i, x = new_x)
 	    {
@@ -6043,8 +6045,22 @@
 		    {
 		      ++it->hpos;
 		      it->current_x = new_x;
+
+		      /* The character's last glyph just barely fits
+			 in this row.  */
 		      if (i == it->nglyphs - 1)
 			{
+			  /* If this is the destination position,
+			     return a position *before* it in this row,
+			     now that we know it fits in this row.  */
+			  if (BUFFER_POS_REACHED_P ())
+			    {
+			      it->hpos = hpos_before_this_char;
+			      it->current_x = x_before_this_char;
+			      result = MOVE_POS_MATCH_OR_ZV;
+			      break;
+			    }
+
 			  set_iterator_to_next (it, 1);
 #ifdef HAVE_WINDOW_SYSTEM
 			  if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
@@ -10596,9 +10612,13 @@
   if (consider_all_windows_p)
     {
       Lisp_Object tail, frame;
-      int i, n = 0, size = 50;
-      struct frame **updated
-	= (struct frame **) alloca (size * sizeof *updated);
+      int i, n = 0, size = 5;
+      struct frame **updated;
+
+      FOR_EACH_FRAME (tail, frame)
+	size++;
+
+      updated = (struct frame **) alloca (size * sizeof *updated);
 
       /* Recompute # windows showing selected buffer.  This will be
 	 incremented each time such a window is displayed.  */