📄 main.c
字号:
{ 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); } /* font weight */ if (r->h->rs[Rs_xftwt]) { if (0 == STRCASECMP (r->h->rs[Rs_xftwt], "light")) XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_LIGHT); else if (0 == STRCASECMP (r->h->rs[Rs_xftwt], "medium")) XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_MEDIUM); else if (0 == STRCASECMP (r->h->rs[Rs_xftwt], "demibold")) XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_DEMIBOLD); else if (0 == STRCASECMP (r->h->rs[Rs_xftwt], "bold")) XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_BOLD); else if (0 == STRCASECMP (r->h->rs[Rs_xftwt], "black")) XftPatternAddInteger (xp, XFT_WEIGHT, XFT_WEIGHT_BLACK); else /* default is medium */ XftPatternAddInteger (xp, XFT_WEIGHT, 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 (NULL == r->TermWin.xftpattern) goto Failure; /* globaladvance */ if (r->Options2 & Opt2_xftGlobalAdvance) { XftPatternDel (r->TermWin.xftpattern, FC_GLOBAL_ADVANCE); XftPatternAddBool (r->TermWin.xftpattern, FC_GLOBAL_ADVANCE, FcTrue); }# ifdef DEBUG_VERBOSE 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 (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(ofname, fname, len)) ) rxvt_print_error ("Cannot open font '%s'. Using font '%s' instead.", fname, ofname); DBG_MSG(1, (stderr, "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( r->h->rs[Rs_xftpfn] == NULL ) fname = DEFAULT_XFT_PFONT_NAME; else if( !STRCASECMP( r->h->rs[Rs_xftpfn], "none")) fname = NULL; else fname = (char *) r->h->rs[Rs_xftpfn]; if( fname && r->TermWin.xftpfont == NULL && r->TermWin.xftPfont == NULL) { 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); DBG_MSG( 1, ( stderr, "Opened prop fonts %p, %p\n", r->TermWin.xftpfont, r->TermWin.xftPfont)); } if (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 ( r->TermWin.xftpfont == NULL && 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. */ DBG_MSG( 1, ( stderr, "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 ) ) { DBG_MSG( 1, ( stderr, "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; } DBG_MSG(1, (stderr, "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, 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); r->TermWin.xftpattern = NULL; } return 0;}/*----------------------------------------------------------------------*//* rxvt_init_font_fixed () - initialize fixed font *//* INTPROTO */voidrxvt_init_font_fixed (rxvt_t* r){ XFontStruct* xfont; DBG_MSG(1,(stderr, " load font (fixed)\n")); xfont = XLoadQueryFont (r->Xdisplay, "fixed"); if (NULL == xfont) { rxvt_print_error("fatal error, aborting..."); exit(EXIT_FAILURE); } r->TermWin.font = xfont;#ifndef NO_BOLDFONT /* r->TermWin.bfont = r->TermWin.xftbfont? xfont : NULL; */ r->TermWin.bfont = NULL;#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\""; XFontStruct* xfont;#ifndef NO_BOLDFONT XFontStruct* bfont; int ckfont;#endif int fh = 0, fw = 0; int idx = 0; /* index into rs_font[] */ DBG_MSG(1,(stderr, "rxvt_init_font_x11 \n"));#ifdef XFT_SUPPORT /* Only load fixed font if we use freetype font */ if ((r->Options & Opt_xft) && r->TermWin.xftfont) { rxvt_init_font_fixed (r); return; }#endif r->h->fnum = FONT0_IDX; idx = FNUM2IDX(r->h->fnum); /* OK, now it's time to load the default font */ DBG_MSG(1,(stderr, " load font (%s)\n", r->h->rs[Rs_font+idx])); xfont = XLoadQueryFont (r->Xdisplay, r->h->rs[Rs_font+idx]); if (NULL == xfont) { /* failed to load font */ rxvt_print_error(msg, r->h->rs[Rs_font+idx]); /* try to load fixed font */ r->h->rs[Rs_font+idx] = "fixed"; DBG_MSG(1,(stderr, " load font (%s)\n", r->h->rs[Rs_font+idx])); xfont = XLoadQueryFont(r->Xdisplay, r->h->rs[Rs_font+idx]); if (NULL == xfont) { /* still failed to load font */ rxvt_print_error(msg, r->h->rs[Rs_font+idx]); /* cannot load any font, fatal error, abort the program */ goto Abort; } } /* Font loading succeeded */ if (NULL != xfont) { r->TermWin.font = xfont; } /* set the font sizes */ fw = rxvt_get_font_widest (r->TermWin.font); fh = r->TermWin.font->ascent + r->TermWin.font->descent;#ifndef NO_LINESPACE fh += r->TermWin.lineSpace;#endif if (fw == r->TermWin.font->min_bounds.width) /* Mono-spaced (fixed width) font */ r->TermWin.propfont &= ~PROPFONT_NORMAL; else /* Proportional font */ r->TermWin.propfont |= PROPFONT_NORMAL;#ifndef NO_BOLDFONT ckfont = !(fw == r->TermWin.fwidth && fh == r->TermWin.fheight);#endif r->TermWin.fwidth = fw; r->TermWin.fheight = fh;#ifdef XFT_SUPPORT r->TermWin.pwidth = fw; r->TermWin.pheight = fh;#endif#ifndef NO_BOLDFONT bfont = NULL; if (ckfont) { /* try to load boldFont, fail silently */ if (NULL != r->h->rs[Rs_boldFont+idx]) { DBG_MSG(1,(stderr, " load bfont (%s)\n", r->h->rs[Rs_boldFont+idx])); bfont = XLoadQueryFont (r->Xdisplay, r->h->rs[Rs_boldFont+idx]); } if (NULL != bfont) { /* Loading bold font succeeded */ fw = rxvt_get_font_widest (bfont); fh = bfont->ascent + bfont->descent;#ifndef NO_LINESPACE fh += r->TermWin.lineSpace;#endif if (fw <= r->TermWin.fwidth && fh <= r->TermWin.fheight) { r->TermWin.bfont = bfont; if (fw == r->TermWin.fwidth) r->TermWin.propfont &= ~PROPFONT_NORMAL; else r->TermWin.propfont |= PROPFONT_NORMAL; } else { XFreeFont (r->Xdisplay, bfont); } } }#endif /* NO_BOLDFONT */#ifdef MULTICHAR_SET /* load font or substitute */ DBG_MSG(1,(stderr, " load mfont (%s)\n", r->h->rs[Rs_mfont+idx])); xfont = XLoadQueryFont(r->Xdisplay, r->h->rs[Rs_mfont+idx]); if (NULL == xfont) { char* ptr; /* failed to load font */ rxvt_print_error(msg, r->h->rs[Rs_mfont+idx]); ptr = rxvt_fallback_mfont_x11 (r); DBG_MSG(1,(stderr, " load mfont (%s)\n", ptr)); xfont = XLoadQueryFont(r->Xdisplay, ptr); if (NULL != xfont) r->h->rs[Rs_mfont+idx] = ptr; else { /* still failed to load font */ rxvt_print_error(msg, ptr); /* cannot load any mfont, fatal error, abort the program */ goto Abort; } } if (NULL != xfont) { r->TermWin.mfont = xfont; }#endif /* MULTICHAR_SET */ /* Succeeded to load font, return now */ return ;Abort: rxvt_print_error("fatal error, aborting..."); exit(EXIT_FAILURE);}#ifdef XFT_SUPPORT# ifdef MULTICHAR_SET/* * 2006-04-27 gi1242: Stolen from xterm-207. Some fonts (e.g. aquafont) report * their width to be double the actual width (see below). Test for this here. */# define HALF_WIDTH_TEST_STRING "1234567890"/* '1234567890' in Chinese characters in UTF-8 */# define FULL_WIDTH_TEST_STRING "\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89" \ "\xe5\x9b\x9b\xe4\xba\x94" \ "\xef\xa7\x91\xe4\xb8\x83\xe5\x85\xab" \ "\xe4\xb9\x9d\xef\xa6\xb2"/* '1234567890' in Korean script in UTF-8 */# define FULL_WIDTH_TEST_STRING2 "\xec\x9d\xbc\xec\x9d\xb4\xec\x82\xbc" \ "\xec\x82\xac\xec\x98\xa4" \ "\xec\x9c\xa1\xec\xb9\xa0\xed\x8c\x94" \ "\xea\xb5\xac\xec\x98\x81"# define HALF_WIDTH_CHAR1 0x0031 /* 'l' */# define HALF_WIDTH_CHAR2 0x0057 /* 'W' */# define FULL_WIDTH_CHAR1 0x4E00 /* CJK Ideograph 'number one' */# define FULL_WIDTH_CHAR2 0xAC00 /* Korean script syllable 'Ka' *//*INTPROTO*/intisDoubleWidthFont(Display * dpy, XftFont * font){ XGlyphInfo gi1, gi2; FcChar32 c1 = HALF_WIDTH_CHAR1, c2 = HALF_WIDTH_CHAR2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -