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

📄 main.c

📁 Mrxvt是一个小巧
💻 C
📖 第 1 页 / 共 5 页
字号:
	{		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 + -