changeset 32912:b55f99786a33

(pos_visible_p): Change current buffer if necessary. Handle obscured lines at the top of the window.
author Gerd Moellmann <gerd@gnu.org>
date Thu, 26 Oct 2000 12:44:20 +0000
parents 67ee3f53d728
children 8a79f057b2a5
files src/xdisp.c
diffstat 1 files changed, 37 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/xdisp.c	Thu Oct 26 12:43:47 2000 +0000
+++ b/src/xdisp.c	Thu Oct 26 12:44:20 2000 +0000
@@ -940,7 +940,14 @@
 {
   struct it it;
   struct text_pos top;
-  int visible_p, bottom_y;
+  int visible_p;
+  struct buffer *old_buffer = NULL;
+
+  if (XBUFFER (w->buffer) != current_buffer)
+    {
+      old_buffer = current_buffer;
+      set_buffer_internal_1 (XBUFFER (w->buffer));
+    }
 
   *fully = visible_p = 0;
   SET_TEXT_POS_FROM_MARKER (top, w->start);
@@ -951,15 +958,32 @@
   
   if (IT_CHARPOS (it) == charpos)
     {
-      int line_height;
-
-      if (it.max_ascent == 0 && it.max_descent == 0)
-	line_height = last_height;
-      else
-	line_height = it.max_ascent + it.max_descent;
-      
-      *fully = it.current_y + line_height <= it.last_visible_y;
-      visible_p = 1;
+      int line_height, line_bottom_y;
+      int line_top_y = it.current_y;
+      int window_top_y = WINDOW_DISPLAY_HEADER_LINE_HEIGHT (w);
+      
+      line_height = it.max_ascent + it.max_descent;
+      if (line_height == 0)
+	{
+	  if (last_height)
+	    line_height = last_height;
+	  else
+	    {
+	      move_it_by_lines (&it, 1, 1);
+	      line_height = (it.max_ascent || it.max_descent
+			     ? it.max_ascent + it.max_descent
+			     : last_height);
+	    }
+	}
+      line_bottom_y = line_top_y + line_height;
+
+      if (line_top_y < window_top_y)
+	visible_p = line_bottom_y > window_top_y;
+      else if (line_top_y < it.last_visible_y)
+	{
+	  visible_p = 1;
+	  *fully = line_bottom_y <= it.last_visible_y;
+	}
     }
   else if (it.current_y + it.max_ascent + it.max_descent > it.last_visible_y)
     {
@@ -970,6 +994,9 @@
 	  *fully  = 0;
 	}
     }
+
+  if (old_buffer)
+    set_buffer_internal_1 (old_buffer);
   
   return visible_p;
 }