changeset 2840:12299f73584e

(dumpglyphs): Create a temporary merged gc when cursor falls on char with non-default face.
author Richard M. Stallman <rms@gnu.org>
date Sun, 16 May 1993 22:32:36 +0000
parents 8c43cc245dd2
children ef56e3f6781c
files src/xterm.c
diffstat 1 files changed, 38 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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.  */