⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 multi-tabed terminal based on rxvt
💻 C
📖 第 1 页 / 共 5 页
字号:
     */    XftPatternGetString( r->TermWin.xftmpattern, XFT_FAMILY, 0, &omfname );    assert (NOT_NULL(omfname));	/* shouldn't be NULL */    len = STRLEN(mfname);    olen = STRLEN(omfname);    if( STRCMP( mfname, DEFAULT_XFT_FONT_NAME) 	/* Not the default font */	    /* Not opened font */	    && (len != olen || STRNCASECMP((char*) omfname, mfname, len))    )	rxvt_msg( DBG_ERROR, DBG_MAIN,		"Cannot open mfont '%s'. Using mfont '%s' instead.\n",	    mfname, omfname);    rxvt_dbgmsg ((DBG_DEBUG, DBG_MAIN, "create xftmpattern = 0x%x on mfont %d\n", (unsigned int) r->TermWin.xftmpattern, r->h->rs[Rs_xftmsz] ?  r->TermWin.xftmsize : r->TermWin.xftfont->height-1));    /*     * Actually open the mfont.     */    r->TermWin.xftmfont = XftFontOpenPattern(r->Xdisplay,	    r->TermWin.xftmpattern);        if (IS_NULL(r->TermWin.xftmfont))	goto Failure;# ifdef DEBUG    face = XftLockFace (r->TermWin.xftmfont);    XftUnlockFace (r->TermWin.xftmfont);# endif    width = r->TermWin.xftmfont->max_advance_width;    if ((width & 0x01) == 1)	/* in case width is not even */	r->TermWin.xftmono = 0;    else if (	      STRCASECMP (ofname, (char*) omfname)	      && (r->TermWin.fwidth != (width >> 1))	    )	r->TermWin.xftmono = 0;    else if (ISSET_OPTION(r, Opt2_xftSlowOutput))	r->TermWin.xftmono = 0;    rxvt_dbgmsg ((DBG_VERBOSE, DBG_MAIN, "xftmono is %d\n", r->TermWin.xftmono));    MAX_IT (r->TermWin.fwidth, (width >> 1));    if( !r->TermWin.xftpfont )	r->TermWin.pwidth = r->TermWin.fwidth;    height = r->TermWin.xftmfont->ascent + r->TermWin.xftmfont->descent;# ifndef NO_LINESPACE    height += r->TermWin.lineSpace;# endif    MAX_IT (r->TermWin.fheight, height);    if( !r->TermWin.xftpfont ) r->TermWin.pheight = r->TermWin.fheight;    return 1;Failure:    if (r->TermWin.xftmpattern)    {	XftPatternDestroy (r->TermWin.xftmpattern);	SET_NULL(r->TermWin.xftmpattern);    }    return 0;}# endif	/* MULTICHAR_SET *//* * Set the weight of an Xft font from the weight description. *//* INTPROTO */voidsetXftWeight( XftPattern *xp, const char *weightString, int defaultWeight ){    assert(xp);    /* font weight */    if ( NOT_NULL(weightString) )    {	if (0 == STRCASECMP (weightString, "light"))	    XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_LIGHT);	else if (0 == STRCASECMP (weightString, "medium"))	    XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_MEDIUM);	else if (0 == STRCASECMP (weightString, "demibold"))	    XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_DEMIBOLD);	else if (0 == STRCASECMP (weightString, "bold"))	    XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_BOLD);	else if (0 == STRCASECMP (weightString, "black"))	    XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_BLACK);	else	    XftPatternAddInteger (xp, XFT_WEIGHT, defaultWeight);    }    else	XftPatternAddInteger( xp, XFT_WEIGHT, defaultWeight );}/* EXTPROTO */intrxvt_init_font_xft (rxvt_t* r){    XftResult	    fr;    XftPattern*	    xp;    XGlyphInfo	    ext1, ext2;    int		    len, olen;	    /* font name length */    char*	    fname;	    /* font name to open */    FcChar8*	    ofname = NULL;  /* actually opened font name */# ifdef DEBUG    FT_Face	    face;# endif    rxvt_dbgmsg ((DBG_VERBOSE, DBG_MAIN, "rxvt_init_font_xft\n"));    rxvt_dbgmsg ((DBG_VERBOSE, DBG_MAIN, "load freetype font\n"));    xp = XftPatternCreate ();    if (IS_NULL(xp))	return 0;    /* font family */    fname = (char*) r->h->rs[Rs_xftfont];    if (IS_NULL(fname))	fname = DEFAULT_XFT_FONT_NAME;    XftPatternAddString (xp, XFT_FAMILY, fname);    /* No spacing between lines */    XftPatternAddBool (xp, XFT_MINSPACE, FcFalse);    /* antialias */    if (ISSET_OPTION(r, Opt2_xftAntialias))	XftPatternAddBool (xp, XFT_ANTIALIAS, FcTrue);    else	XftPatternAddBool (xp, XFT_ANTIALIAS, FcFalse);    /* hinting */    if (ISSET_OPTION(r, Opt2_xftHinting))	XftPatternAddBool (xp, FC_HINTING, FcTrue);    else	XftPatternAddBool (xp, FC_HINTING, FcFalse);    /* autohint */    if (ISSET_OPTION(r, Opt2_xftAutoHint))	XftPatternAddBool (xp, FC_AUTOHINT, FcTrue);    else	XftPatternAddBool (xp, FC_AUTOHINT, FcFalse);    /* font size, we always set it. if it's not set by the user, we    ** have chosen a default value (12) for it */    XftPatternAddDouble (xp, XFT_SIZE, (double) r->TermWin.xftsize);    /* Enforce Size/Pixel_Size = 1.0 */    XftPatternAddDouble (xp, XFT_SCALE, (double) 1.0);    /* font width */    if (r->h->rs[Rs_xftwd])    {	if (0 == STRCASECMP (r->h->rs[Rs_xftwd], "ultracondensed"))	    XftPatternAddInteger (xp, FC_WIDTH, FC_WIDTH_ULTRACONDENSED);	else if (0 == STRCASECMP (r->h->rs[Rs_xftwd], "condensed"))	    XftPatternAddInteger (xp, FC_WIDTH, FC_WIDTH_CONDENSED);	else if (0 == STRCASECMP (r->h->rs[Rs_xftwd], "normal"))	    XftPatternAddInteger (xp, FC_WIDTH, FC_WIDTH_NORMAL);	else if (0 == STRCASECMP (r->h->rs[Rs_xftwd], "expanded"))	    XftPatternAddInteger (xp, FC_WIDTH, FC_WIDTH_EXPANDED);	else if (0 == STRCASECMP (r->h->rs[Rs_xftwd], "ultraexpanded"))	    XftPatternAddInteger (xp, FC_WIDTH, FC_WIDTH_ULTRAEXPANDED);	else	    XftPatternAddInteger (xp, FC_WIDTH, FC_WIDTH_NORMAL);    }    setXftWeight( xp, r->h->rs[Rs_xftwt], XFT_WEIGHT_MEDIUM );    /* font slant */    if (r->h->rs[Rs_xftst])    {	if (0 == STRCASECMP (r->h->rs[Rs_xftst], "roman"))	    XftPatternAddInteger (xp, XFT_SLANT, XFT_SLANT_ROMAN);	else if (0 == STRCASECMP (r->h->rs[Rs_xftst], "italic"))	    XftPatternAddInteger (xp, XFT_SLANT, XFT_SLANT_ITALIC);	else if (0 == STRCASECMP (r->h->rs[Rs_xftst], "oblique"))	    XftPatternAddInteger (xp, XFT_SLANT, XFT_SLANT_OBLIQUE);	else	/* default is roman */	    XftPatternAddInteger (xp, XFT_SLANT, XFT_SLANT_ROMAN);    }    /* font rgba */    if (r->h->rs[Rs_xftrgb])    {	if (0 == STRCASECMP (r->h->rs[Rs_xftrgb], "rgb"))	    XftPatternAddInteger (xp, XFT_RGBA, XFT_RGBA_RGB);	else if (0 == STRCASECMP (r->h->rs[Rs_xftrgb], "bgr"))	    XftPatternAddInteger (xp, XFT_RGBA, XFT_RGBA_BGR);	else if (0 == STRCASECMP (r->h->rs[Rs_xftrgb], "vrgb"))	    XftPatternAddInteger (xp, XFT_RGBA, XFT_RGBA_VRGB);	else if (0 == STRCASECMP (r->h->rs[Rs_xftrgb], "vbgr"))	    XftPatternAddInteger (xp, XFT_RGBA, XFT_RGBA_VBGR);	else	    XftPatternAddInteger (xp, XFT_RGBA, XFT_RGBA_NONE);    }    /*     * 2006-01-26 gi1242: Monospaced fonts seem a good idea.     * 2006-01-27 gi1242: Maybe not such a good idea. When we ask for a     * monospaced font from a propotionally spaced font, we just get the same     * old prop font, with a bigass textwidth. That's no use to us. If it     * returned the closest matching mono-spaced font, then that would be     * useful.     */#if 0    XftPatternAddInteger (xp, XFT_SPACING, XFT_MONO);#endif    r->TermWin.xftpattern = XftFontMatch (r->Xdisplay, XSCREEN, xp, &fr);    if (IS_NULL(r->TermWin.xftpattern))	goto Failure;    /* globaladvance */    if (ISSET_OPTION(r, Opt2_xftGlobalAdvance))    {	XftPatternDel (r->TermWin.xftpattern, FC_GLOBAL_ADVANCE);	XftPatternAddBool (r->TermWin.xftpattern, FC_GLOBAL_ADVANCE, FcTrue);    }# ifdef DEBUG    FcPatternPrint (r->TermWin.xftpattern);# endif    /*     * Print a warning if our matched font is different from the user supplied     * font.     */    XftPatternGetString (r->TermWin.xftpattern, XFT_FAMILY, 0, &ofname);    assert (NOT_NULL(ofname));	/* shouldn't be NULL */    len = STRLEN(fname);    olen = STRLEN(ofname);    if( STRCMP( fname, DEFAULT_XFT_FONT_NAME) 	/* Not the default font */	    /* Not opened font */	    && (len != olen || STRNCASECMP((char*) ofname, fname, len))    )	rxvt_msg( DBG_ERROR, DBG_MAIN,		"Cannot open font '%s'. Using font '%s' instead.\n",	    fname, ofname);    rxvt_dbgmsg ((DBG_DEBUG, DBG_MAIN, "create xftpattern = 0x%x on font %d\n", (unsigned int) r->TermWin.xftpattern, r->TermWin.xftsize));    /*     * Actually open the font.     */    r->TermWin.xftfont = XftFontOpenPattern( r->Xdisplay,					    r->TermWin.xftpattern);    /*     * Now open the prop font.     */    if (IS_NULL(r->h->rs[Rs_xftpfn]))	fname = DEFAULT_XFT_PFONT_NAME;    else if( !STRCASECMP( r->h->rs[Rs_xftpfn], "none"))	SET_NULL(fname);    else	fname = (char *) r->h->rs[Rs_xftpfn];    if (NOT_NULL(fname) &&	IS_NULL(r->TermWin.xftpfont) &&	IS_NULL(r->TermWin.xftPfont))    {	XftPattern *ppat = XftPatternDuplicate( xp );	XftPattern *match;	XftPatternDel( ppat, XFT_FAMILY);	XftPatternAddString (ppat, XFT_FAMILY, fname);	XftPatternDel( ppat, XFT_SIZE);	XftPatternAddDouble( ppat, XFT_SIZE, (double) r->TermWin.xftpsize);	/*	 * If one ever adds a XFT_MONO flag to the pattern, then it should be	 * removed here.	 */#if 0	XftPatternDel( ppat, XFT_SPACING);#endif	match = XftFontMatch (r->Xdisplay, XSCREEN, ppat, &fr);	r->TermWin.xftpfont = XftFontOpenPattern( r->Xdisplay, match);	/*	 * XXX gi1242 2006-01-27: Xft bug. Patterns passed to XftFontOpenPattern	 * can't always be safely freed.	 */#if 0	FcPatternPrint( match);	XftPatternDestroy( match);#endif	/*	 * Try and open a bold version of the same font to use for the active	 * tab title / etc.	 */	XftPatternDel	     (ppat, XFT_WEIGHT);	XftPatternAddInteger (ppat, XFT_WEIGHT, XFT_WEIGHT_BOLD);	match = XftFontMatch (r->Xdisplay, XSCREEN, ppat, &fr);	r->TermWin.xftPfont = XftFontOpenPattern( r->Xdisplay, match);	/*	 * If we couldn't open the bold font, then use the regular font.	 */	if( !r->TermWin.xftPfont ) r->TermWin.xftPfont = r->TermWin.xftpfont;	/*	 * XXX gi1242 2006-01-27: Xft bug. Patterns passed to XftFontOpenPattern	 * can't always be safely freed.	 */#if 0	XftPatternDestroy( match);#endif	XftPatternDestroy( ppat);	rxvt_dbgmsg ((DBG_VERBOSE, DBG_MAIN, "Opened prop fonts %p, %p\n", r->TermWin.xftpfont, r->TermWin.xftPfont));    }        if (IS_NULL(r->TermWin.xftfont))	goto Failure;    r->TermWin.fwidth = r->TermWin.xftfont->max_advance_width;    r->TermWin.fheight = r->TermWin.xftfont->ascent +				r->TermWin.xftfont->descent;# ifndef NO_LINESPACE    r->TermWin.fheight += r->TermWin.lineSpace;# endif    /*     * Failure opening prop fonts can be handled gracefully: Fall back to the     * usual font.     */#ifdef MULTICHAR_SET    if (IS_NULL(r->TermWin.xftpfont) &&	isDoubleWidthFont(r->Xdisplay, r->TermWin.xftfont)       )    {	/*	 * 2006-04-28 gi1242: Double width fonts are only handled correctly by	 * the screen drawing functions. The problem is that these need to be	 * drawn one character at a time to get correct output, which is not	 * done by the menu / tabbar functions. It will be a waste to write	 * extra code to do that, so we pretend that we *have* a pfont.	 *	 * This will however make the font spacing in tab titles incorrect for	 * double width fonts.	 */	rxvt_msg (DBG_WARN, DBG_MAIN, "Warning: Double width font, with no pfont\n");	r->TermWin.xftpfont = r->TermWin.xftfont;	r->TermWin.xftPfont = r->TermWin.xftfont;    }#endif /* MULTICHAR_SET */    if( r->TermWin.xftpfont )    {	r->TermWin.pheight  = max( r->TermWin.xftpfont->height,		r->TermWin.xftPfont->height);	r->TermWin.pwidth   = r->TermWin.xftpfont->max_advance_width / 2;    }    else    {	r->TermWin.pheight  = r->TermWin.fheight;	r->TermWin.pwidth   = r->TermWin.fwidth;    }#ifdef DEBUG    face = XftLockFace (r->TermWin.xftfont);    XftUnlockFace (r->TermWin.xftfont);# endif    /*     * Do not trust the font width     */#ifdef MULTICHAR_SET    if( isDoubleWidthFont( r->Xdisplay, r->TermWin.xftfont ) )    {	rxvt_msg (DBG_INFO, DBG_MAIN, "Got double width font. Halving width\n");	r->TermWin.xftmono = 0;	r->TermWin.fwidth >>= 1;    }    else#endif    {	XftTextExtents8 (r->Xdisplay, r->TermWin.xftfont, (unsigned char*) "W",		1, &ext1);	XftTextExtents8 (r->Xdisplay, r->TermWin.xftfont, (unsigned char*) "i",		1, &ext2);	if (ext1.xOff == ext2.xOff)	    r->TermWin.xftfnmono = r->TermWin.xftmono = 1;	else	    r->TermWin.xftfnmono = r->TermWin.xftmono = 0;    }    rxvt_dbgmsg ((DBG_VERBOSE, DBG_MAIN, "xftfnmono is %d\n", r->TermWin.xftfnmono));# ifndef NO_BOLDFONT    rxvt_init_bfont_xft( r, xp );# endif# ifdef MULTICHAR_SET    if (!rxvt_init_mfont_xft (r, xp, (char*) ofname))	goto Failure;# endif	/* MULTICHAR_SET */    XftPatternDestroy (xp);    return 1;Failure:    if (xp)    {	XftPatternDestroy (xp);    }    if (r->TermWin.xftpattern && r->TermWin.xftpattern != xp)    {	XftPatternDestroy (r->TermWin.xftpattern);	SET_NULL(r->TermWin.xftpattern);    }    return 0;}/*----------------------------------------------------------------------*//* rxvt_init_font_fixed () - initialize fixed font *//* INTPROTO */voidrxvt_init_font_fixed (rxvt_t* r){    XFontStruct*    xfont;    rxvt_dbgmsg ((DBG_VERBOSE, DBG_MAIN, " load font (fixed)\n"));    xfont = XLoadQueryFont( r->Xdisplay, "fixed" );    if (IS_NULL(xfont))    {	rxvt_msg( DBG_FATAL, DBG_MAIN, "Could not load font 'fixed'.\n" );	exit(EXIT_FAILURE);    }    r->TermWin.font = xfont;#ifndef NO_BOLDFONT    /*    r->TermWin.bfont = r->TermWin.xftbfont? xfont : NULL;    */    SET_NULL(r->TermWin.bfont);#endif#ifdef MULTICHAR_SET    r->TermWin.mfont = xfont;#endif}#endif	/* XFT_SUPPORT *//* rxvt_init_font_x11 () - initialize font *//* EXTPROTO */voidrxvt_init_font_x11 (rxvt_t *r){    char*	    msg = "can't load font \"%s\"\n";    XFontStruct*    xfont;#ifndef NO_BOLDFONT    XFontStruct*    bfont;    int		    ckfont;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -