]> git.eshelyaron.com Git - emacs.git/commitdiff
(get_glyph_string_clip_rect): Always show a cursor
authorKim F. Storm <storm@cua.dk>
Thu, 27 Jan 2005 00:16:28 +0000 (00:16 +0000)
committerKim F. Storm <storm@cua.dk>
Thu, 27 Jan 2005 00:16:28 +0000 (00:16 +0000)
glyph, even when row is only partially visible and actual cursor
position is not visible.

src/xdisp.c

index d7c32be09ea5878b25174fdae84cff9289d479ae..e83004d1741a0d685b2aeb7463b1c21d6fc62df3 100644 (file)
@@ -1837,7 +1837,7 @@ get_glyph_string_clip_rect (s, nr)
   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 @@ get_glyph_string_clip_rect (s, nr)
        }
       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)
+      /* 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)
        {
-         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);
+         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);
+           }
        }
     }