📄 main.c
字号:
*/ 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 + -