diff src/xdisp.c @ 59738:a21e342024d8

(get_glyph_string_clip_rect): Always show a cursor glyph, even when row is only partially visible and actual cursor position is not visible.
author Kim F. Storm <storm@cua.dk>
date Thu, 27 Jan 2005 00:16:28 +0000
parents 4712d3f43248
children e4f04fff5ce6
line wrap: on
line diff
--- a/src/xdisp.c	Thu Jan 27 00:16:00 2005 +0000
+++ b/src/xdisp.c	Thu Jan 27 00:16:28 2005 +0000
@@ -1837,7 +1837,7 @@
   if (s->hl == DRAW_CURSOR)
     {
       struct glyph *glyph = s->first_glyph;
-      int height;
+      int height, max_y;
 
       if (s->x > r.x)
 	{
@@ -1846,13 +1846,26 @@
 	}
       r.width = min (r.width, glyph->pixel_width);
 
-      /* Don't draw cursor glyph taller than our actual glyph.  */
-      height = max (FRAME_LINE_HEIGHT (s->f), glyph->ascent + glyph->descent);
-      if (height < r.height)
-	{
-	  int max_y = r.y + r.height;
-	  r.y = min (max_y, s->ybase + glyph->descent - height);
-	  r.height = min (max_y - r.y, height);
+      /* If r.y is below window bottom, ensure that we still see a cursor.  */
+      height = min (glyph->ascent + glyph->descent,
+		    min (FRAME_LINE_HEIGHT (s->f), s->row->visible_height));
+      max_y = window_text_bottom_y (s->w) - height;
+      max_y = WINDOW_TO_FRAME_PIXEL_Y (s->w, max_y);
+      if (s->ybase - glyph->ascent > max_y)
+	{
+	  r.y = max_y;
+	  r.height = height;
+	}
+      else
+	{
+	  /* Don't draw cursor glyph taller than our actual glyph.  */
+	  height = max (FRAME_LINE_HEIGHT (s->f), glyph->ascent + glyph->descent);
+	  if (height < r.height)
+	    {
+	      max_y = r.y + r.height;
+	      r.y = min (max_y, max (r.y, s->ybase + glyph->descent - height));
+	      r.height = min (max_y - r.y, height);
+	    }
 	}
     }