Beispiel #1
0
/*
 * Interchange colors in the cache, e.g., for reverse-video.
 */
void
redoCgs(XtermWidget xw, Pixel fg, Pixel bg, CgsEnum cgsId)
{
    int n;
    VTwin *cgsWin = WhichVWin(TScreenOf(xw));
    CgsCache *me = myCache(xw, cgsWin, cgsId);

    if (me != 0) {
        CgsCacheData *save_data = me->data;

        for (n = 0; n < DEPTH; ++n) {
            if (LIST(n).gc != 0 && HaveFont(LIST(n).font)) {
                LINK(n);

                if (LIST(n).fg == fg
                        && LIST(n).bg == bg) {
                    setCgsFore(xw, cgsWin, cgsId, bg);
                    setCgsBack(xw, cgsWin, cgsId, fg);
                } else if (LIST(n).fg == bg
                           && LIST(n).bg == fg) {
                    setCgsFore(xw, cgsWin, cgsId, fg);
                    setCgsBack(xw, cgsWin, cgsId, bg);
                } else {
                    continue;
                }

                (void) chgCache(xw, cgsId, me, False);
            }
        }
        me->data = save_data;
    }
}
Beispiel #2
0
/*
 * Copy the parameters (except GC of course) from one cache record to another.
 */
void
copyCgs(XtermWidget xw, VTwin *cgsWin, CgsEnum dstCgsId, CgsEnum srcCgsId)
{
    if (dstCgsId != srcCgsId) {
        CgsCache *me;

        if ((me = myCache(xw, cgsWin, srcCgsId)) != 0) {
            TRACE(("copyCgs from %s to %s\n",
                   traceCgsEnum(srcCgsId),
                   traceCgsEnum(dstCgsId)));
            TRACE2(("copyCgs from %s (me %p, fg %s, bg %s, cset %s) to %s {{\n",
                    traceCgsEnum(srcCgsId),
                    me,
                    tracePixel(xw, THIS(fg)),
                    tracePixel(xw, THIS(bg)),
                    traceCSet(THIS(cset)),
                    traceCgsEnum(dstCgsId)));
            setCgsCSet(xw, cgsWin, dstCgsId, THIS(cset));
            setCgsFore(xw, cgsWin, dstCgsId, THIS(fg));
            setCgsBack(xw, cgsWin, dstCgsId, THIS(bg));
            setCgsFont(xw, cgsWin, dstCgsId, THIS(font));
            TRACE2(("...copyCgs }}\n"));
        }
    }
}
Beispiel #3
0
/*
 * Lookup/cache a GC for the double-size character display.  We save up to
 * NUM_CHRSET values.
 */
GC
xterm_DoubleGC(XtermWidget xw,
	       unsigned chrset,
	       unsigned attr_flags,
	       unsigned draw_flags,
	       GC old_gc,
	       int *inxp)
{
    TScreen *screen = TScreenOf(xw);
    VTwin *cgsWin = WhichVWin(screen);
    char *name;
    GC result = 0;

    if ((name = xtermSpecialFont(screen, attr_flags, draw_flags, chrset)) != 0) {
	CgsEnum cgsId = WhichCgsId(attr_flags);
	Boolean found = False;
	XTermFonts *data = 0;
	int n;

	if ((n = xterm_Double_index(xw, chrset, attr_flags)) >= 0) {
	    data = &(screen->double_fonts[n]);
	    if (data->fn != 0) {
		if (!strcmp(data->fn, name)
		    && data->fs != 0) {
		    found = True;
		    free(name);
		} else {
		    discard_font(xw, n);
		}
	    }
	}

	if (!found) {
	    XTermFonts temp;

	    TRACE(("xterm_DoubleGC %s %d: %s\n",
		   (attr_flags & BOLD) ? "BOLD" : "NORM", n, name));

	    memset(&temp, 0, sizeof(temp));
	    temp.fn = name;
	    temp.chrset = chrset;
	    temp.flags = (attr_flags & BOLD);

	    if (!xtermOpenFont(xw, name, &temp, fwAlways, False)) {
		/* Retry with * in resolutions */
		char *nname = xtermSpecialFont(screen,
					       attr_flags,
					       draw_flags | NORESOLUTION,
					       chrset);

		if (nname != 0) {
		    found = (Boolean) xtermOpenFont(xw, nname, &temp,
						    fwAlways, False);
		    free(nname);
		}
	    } else {
		found = True;
	    }
	    free(name);

	    if (found) {
		n = 0;
		data = pushback_font(xw, &temp);
	    }

	    TRACE(("-> %s\n", found ? "OK" : "FAIL"));
	}

	if (found) {
	    setCgsCSet(xw, cgsWin, cgsId, chrset);
	    setCgsFont(xw, cgsWin, cgsId, data);
	    setCgsFore(xw, cgsWin, cgsId, getCgsFore(xw, cgsWin, old_gc));
	    setCgsBack(xw, cgsWin, cgsId, getCgsBack(xw, cgsWin, old_gc));
	    result = getCgsGC(xw, cgsWin, cgsId);
	    *inxp = n;
	} else if (attr_flags & BOLD) {
	    UIntClr(attr_flags, BOLD);
	    result = xterm_DoubleGC(xw, chrset,
				    attr_flags,
				    draw_flags,
				    old_gc, inxp);
	}
    }

    return result;
}