# HG changeset patch # User Richard M. Stallman # Date 737591556 0 # Node ID 12299f73584e7db59e43bb13a08dab316923a0df # Parent 8c43cc245dd25f08dc4b43f58c15a39d470de9ee (dumpglyphs): Create a temporary merged gc when cursor falls on char with non-default face. diff -r 8c43cc245dd2 -r 12299f73584e src/xterm.c --- a/src/xterm.c Sun May 16 22:31:48 1993 +0000 +++ b/src/xterm.c Sun May 16 22:32:36 1993 +0000 @@ -456,15 +456,11 @@ struct face *face = FRAME_DEFAULT_FACE (f); FONT_TYPE *font = FACE_FONT (face); GC gc = FACE_GC (face); - - /* Cursor display take full precidence. */ - if (hl == 2) - { - gc = (f->display.x->cursor_gc); - } - - /* Then comes faces of the text itself. */ - else if (cf != 0) + int defaulted = 1; + int gc_temporary = 0; + + /* First look at the face of the text itself. */ + if (cf != 0) { /* The face codes on the glyphs must be valid indices into the frame's face table. */ @@ -477,6 +473,7 @@ face = intern_face (f, FRAME_FACES (f) [cf]); font = FACE_FONT (face); gc = FACE_GC (face); + defaulted = 0; } /* Then comes the distinction between modeline and normal text. */ @@ -487,11 +484,43 @@ face = FRAME_MODE_LINE_FACE (f); font = FACE_FONT (face); gc = FACE_GC (face); + defaulted = 0; + } + +#define FACE_DEFAULT (~0) + + /* Now override that if the cursor's on this character. */ + if (hl == 2 && (defaulted + || !(face->font && (int) face->font != FACE_DEFAULT))) + { + gc = f->display.x->cursor_gc; + } + /* Cursor on non-default face: must merge. */ + else if (hl == 2) + { + XGCValues xgcv; + unsigned long mask; + + xgcv.background = f->display.x->cursor_pixel; + xgcv.foreground = f->display.x->cursor_foreground_pixel; + xgcv.font = face->font->fid; + xgcv.graphics_exposures = 0; + mask = GCForeground | GCBackground | GCFont | GCGraphicsExposures; + gc = XCreateGC (x_current_display, FRAME_X_WINDOW (f), + mask, &xgcv); +#if 0 + if (face->stipple && face->stipple != FACE_DEFAULT) + XSetStipple (x_current_display, gc, face->stipple); +#endif + gc_temporary = 1; } XDrawImageString (x_current_display, window, gc, left, top + FONT_BASE (font), buf, len); + if (gc_temporary) + XFreeGC (x_current_display, gc); + /* We should probably check for XA_UNDERLINE_POSITION and XA_UNDERLINE_THICKNESS properties on the font, but let's just get the thing working, and come back to that. */