Mercurial > emacs
changeset 71019:82cce6834b5d
(get_phys_cursor_geometry): Return computed x and y through
parameters. Adjust x and width in case cursor in on a partially
visible stretch glyph on the left edge.
(erase_phys_cursor): Don't erase into left fringe/margin in case
previous cursor glyph is a partially visible stretch glyph on left.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Sat, 27 May 2006 22:36:58 +0000 |
parents | 97fa1dbc1aee |
children | 3cc856b86408 |
files | src/xdisp.c |
diffstat | 1 files changed, 24 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xdisp.c Sat May 27 22:36:40 2006 +0000 +++ b/src/xdisp.c Sat May 27 22:36:58 2006 +0000 @@ -1986,15 +1986,15 @@ Set w->phys_cursor_width to width of phys cursor. */ -int -get_phys_cursor_geometry (w, row, glyph, heightp) +void +get_phys_cursor_geometry (w, row, glyph, xp, yp, heightp) struct window *w; struct glyph_row *row; struct glyph *glyph; - int *heightp; + int *xp, *yp, *heightp; { struct frame *f = XFRAME (WINDOW_FRAME (w)); - int y, wd, h, h0, y0; + int x, y, wd, h, h0, y0; /* Compute the width of the rectangle to draw. If on a stretch glyph, and `x-stretch-block-cursor' is nil, don't draw a @@ -2004,6 +2004,14 @@ #ifdef HAVE_NTGUI wd++; /* Why? */ #endif + + x = w->phys_cursor.x; + if (x < 0) + { + wd += x; + x = 0; + } + if (glyph->type == STRETCH_GLYPH && !x_stretch_cursor_p) wd = min (FRAME_COLUMN_WIDTH (f), wd); @@ -2033,8 +2041,9 @@ } } + *xp = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, x); + *yp = WINDOW_TO_FRAME_PIXEL_Y (w, y); *heightp = h; - return WINDOW_TO_FRAME_PIXEL_Y (w, y); } /* @@ -21319,7 +21328,7 @@ /* Maybe clear the display under the cursor. */ if (w->phys_cursor_type == HOLLOW_BOX_CURSOR) { - int x, y; + int x, y, left_x; int header_line_height = WINDOW_HEADER_LINE_HEIGHT (w); int width; @@ -21327,11 +21336,16 @@ if (cursor_glyph == NULL) goto mark_cursor_off; - x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x); + width = cursor_glyph->pixel_width; + left_x = window_box_left_offset (w, TEXT_AREA); + x = w->phys_cursor.x; + if (x < left_x) + width -= left_x - x; + width = min (width, window_box_width (w, TEXT_AREA) - x); y = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height, cursor_row->y)); - width = min (cursor_glyph->pixel_width, - window_box_width (w, TEXT_AREA) - w->phys_cursor.x); - + x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, max (x, left_x)); + + if (width > 0) rif->clear_frame_area (f, x, y, width, cursor_row->visible_height); }