# HG changeset patch # User Gerd Moellmann # Date 991057341 0 # Node ID fcd11c3e63417fbf3f4906f868c3a8ee6a1a3ae2 # Parent 682de754cdf097b05d441eae02083cc08bdc224c (cursor_in_mouse_face_p): New function. (x_draw_stretch_glyph_string): Use it to choose a different GC when drawing a cursor within highlighted text. diff -r 682de754cdf0 -r fcd11c3e6341 src/xterm.c --- a/src/xterm.c Mon May 28 13:01:24 2001 +0000 +++ b/src/xterm.c Mon May 28 13:42:21 2001 +0000 @@ -399,6 +399,7 @@ DRAW_IMAGE_SUNKEN }; +static int cursor_in_mouse_face_p P_ ((struct window *)); static int clear_mouse_face P_ ((struct x_display_info *)); static int x_alloc_nearest_color_1 P_ ((Display *, Colormap, XColor *)); static void x_set_window_size_1 P_ ((struct frame *, int, int, int)); @@ -4384,14 +4385,23 @@ /* Clear rest using the GC of the original non-cursor face. */ if (width < s->background_width) { - GC gc = s->face->gc; int x = s->x + width, y = s->y; int w = s->background_width - width, h = s->height; XRectangle r; - + GC gc; + + if (s->row->mouse_face_p + && cursor_in_mouse_face_p (s->w)) + { + x_set_mouse_face_gc (s); + gc = s->gc; + } + else + gc = s->face->gc; + x_get_glyph_string_clip_rect (s, &r); XSetClipRectangles (s->display, gc, 0, 0, &r, 1, Unsorted); - + if (s->face->stipple) { /* Fill background with a stipple pattern. */ @@ -11201,6 +11211,35 @@ } +/* Non-zero if physical cursor of window W is within mouse face. */ + +static int +cursor_in_mouse_face_p (w) + struct window *w; +{ + struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (XFRAME (w->frame)); + int in_mouse_face = 0; + + if (WINDOWP (dpyinfo->mouse_face_window) + && XWINDOW (dpyinfo->mouse_face_window) == w) + { + int hpos = w->phys_cursor.hpos; + int vpos = w->phys_cursor.vpos; + + if (vpos >= dpyinfo->mouse_face_beg_row + && vpos <= dpyinfo->mouse_face_end_row + && (vpos > dpyinfo->mouse_face_beg_row + || hpos >= dpyinfo->mouse_face_beg_col) + && (vpos < dpyinfo->mouse_face_end_row + || hpos < dpyinfo->mouse_face_end_col + || dpyinfo->mouse_face_past_end)) + in_mouse_face = 1; + } + + return in_mouse_face; +} + + /* Display or clear cursor of window W. If ON is zero, clear the cursor. If it is non-zero, display the cursor. If ON is nonzero, where to put the cursor is specified by HPOS, VPOS, X and Y. */