diff src/xdisp.c @ 38588:08a4c6c00af0

(init_from_display_pos): If POS is in an overlay string, deal with the first overlay string having an image `display' property. (try_window_reusing_current_matrix, compute_line_metrics): Fix computation of row's visible height for the case that part of the row is invisible above and part of the row is at the same time invisible below the window.
author Gerd Moellmann <gerd@gnu.org>
date Fri, 27 Jul 2001 15:29:16 +0000
parents 5ee0cb00ee57
children c4f9d47715f4
line wrap: on
line diff
--- a/src/xdisp.c	Fri Jul 27 15:28:46 2001 +0000
+++ b/src/xdisp.c	Fri Jul 27 15:29:16 2001 +0000
@@ -1835,11 +1835,18 @@
      after-string.  */
   init_iterator (it, w, charpos, bytepos, NULL, DEFAULT_FACE_ID);
 
-  /* If position is within an overlay string, set up IT to
-     the right overlay string.  */
+  /* If position is within an overlay string, set up IT to the right
+     overlay string.  */
   if (pos->overlay_string_index >= 0)
     {
       int relative_index;
+
+      /* If the first overlay string happens to have a `display'
+	 property for an image, the iterator will be set up for that
+	 image, and we have to undo that setup first before we can
+	 correct the overlay string index.  */
+      if (it->method == next_element_from_image)
+	pop_it (it);
       
       /* We already have the first chunk of overlay strings in
 	 IT->overlay_strings.  Load more until the one for
@@ -10481,7 +10488,7 @@
   struct glyph_row *last_reused_text_row;
   struct glyph_row *start_row;
   int start_vpos, min_y, max_y;
-  
+
   if (/* This function doesn't handle terminal frames.  */
       !FRAME_WINDOW_P (f)
       /* Don't try to reuse the display if windows have been split
@@ -10623,14 +10630,12 @@
 	       ++row)
 	    {
 	      row->y = it.current_y;
+	      row->visible_height = row->height;
 
 	      if (row->y < min_y)
-		row->visible_height = row->height - (min_y - row->y);
-	      else if (row->y + row->height > max_y)
-		row->visible_height
-		  = row->height - (row->y + row->height - max_y);
-	      else
-		row->visible_height = row->height;
+		row->visible_height -= min_y - row->y;
+	      if (row->y + row->height > max_y)
+		row->visible_height -= row->y + row->height - max_y;
 	      
 	      it.current_y += row->height;
 
@@ -10785,13 +10790,11 @@
       for (row = first_reusable_row; row < first_row_to_display; ++row)
 	{
 	  row->y -= dy;
+	  row->visible_height = row->height;
 	  if (row->y < min_y)
-	    row->visible_height = row->height - (min_y - row->y);
-	  else if (row->y + row->height > max_y)
-	    row->visible_height
-	      = row->height - (row->y + row->height - max_y);
-	  else
-	    row->visible_height = row->height;
+	    row->visible_height -= min_y - row->y;
+	  if (row->y + row->height > max_y)
+	    row->visible_height -= row->y + row->height - max_y;
 	}
 
       /* Scroll the current matrix.  */
@@ -12246,7 +12249,7 @@
 
   if (FRAME_WINDOW_P (it->f))
     {
-      int i, header_line_height;
+      int i, min_y, max_y;
 
       /* The line may consist of one space only, that was added to
 	 place the cursor on it.  If so, the row's height hasn't been
@@ -12285,15 +12288,13 @@
       /* Compute how much of the line is visible.  */
       row->visible_height = row->height;
       
-      header_line_height = WINDOW_DISPLAY_HEADER_LINE_HEIGHT (it->w);
-      if (row->y < header_line_height)
-	row->visible_height -= header_line_height - row->y;
-      else
-	{
-	  int max_y = WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE (it->w);
-	  if (row->y + row->height > max_y)
-	    row->visible_height -= row->y + row->height - max_y;
-	}
+      min_y = WINDOW_DISPLAY_HEADER_LINE_HEIGHT (it->w);
+      max_y = WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE (it->w);
+
+      if (row->y < min_y)
+	row->visible_height -= min_y - row->y;
+      if (row->y + row->height > max_y)
+	row->visible_height -= row->y + row->height - max_y;
     }
   else
     {