Implement italic font support.
This commit is contained in:
		
							
								
								
									
										1
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								TODO
									
									
									
									
									
								
							| @@ -4,7 +4,6 @@ vt emulation | |||||||
| * implement BCE right | * implement BCE right | ||||||
| * color definition in CSI | * color definition in CSI | ||||||
| 	* implement CSI parsing | 	* implement CSI parsing | ||||||
| * implement real italic |  | ||||||
| * make the keypad keys really work | * make the keypad keys really work | ||||||
| 	* kf0 .. kf44 | 	* kf0 .. kf44 | ||||||
| 	* kend, kel, kent, kfnd, ked, kext | 	* kend, kel, kent, kfnd, ked, kext | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								config.def.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								config.def.h
									
									
									
									
									
								
							| @@ -1,6 +1,8 @@ | |||||||
|  |  | ||||||
| #define FONT "-*-*-medium-r-*-*-*-120-75-75-*-60-*-*" | #define FONT "-*-*-medium-r-*-*-*-120-75-75-*-60-*-*" | ||||||
| #define BOLDFONT "-*-*-bold-r-*-*-*-120-75-75-*-60-*-*" | #define BOLDFONT "-*-*-bold-r-*-*-*-120-75-75-*-60-*-*" | ||||||
|  | /* If italic is not availbel, fall back to bold. */ | ||||||
|  | #define ITALICFONT "-*-*-medium-o-*-*-*-120-75-75-*-60-*-*," BOLDFONT | ||||||
|  |  | ||||||
| /* Space in pixels around the terminal buffer */ | /* Space in pixels around the terminal buffer */ | ||||||
| #define BORDER 2 | #define BORDER 2 | ||||||
| @@ -29,9 +31,9 @@ static const char *colorname[] = { | |||||||
| 	"magenta", | 	"magenta", | ||||||
| 	"cyan", | 	"cyan", | ||||||
| 	"white", | 	"white", | ||||||
| 	 |  | ||||||
| 	[255] = 0, | 	[255] = 0, | ||||||
| 	 |  | ||||||
| 	/* more colors can be added after 255 to use with DefaultXX */ | 	/* more colors can be added after 255 to use with DefaultXX */ | ||||||
| 	"#cccccc", | 	"#cccccc", | ||||||
| 	"#333333", | 	"#333333", | ||||||
| @@ -50,11 +52,11 @@ static const char *colorname[] = { | |||||||
|    Mask value: |    Mask value: | ||||||
|    * Use XK_ANY_MOD to match the key no matter modifiers state |    * Use XK_ANY_MOD to match the key no matter modifiers state | ||||||
|    * Use XK_NO_MOD to match the key alone (no modifiers) |    * Use XK_NO_MOD to match the key alone (no modifiers) | ||||||
|     |  | ||||||
|       key,        mask,  output */ |       key,        mask,  output */ | ||||||
| static Key key[] = { | static Key key[] = { | ||||||
| 	{ XK_BackSpace, XK_NO_MOD, "\177" }, | 	{ XK_BackSpace, XK_NO_MOD, "\177" }, | ||||||
|    	{ XK_Insert,    XK_NO_MOD, "\033[2~" }, | 	{ XK_Insert,    XK_NO_MOD, "\033[2~" }, | ||||||
| 	{ XK_Delete,    XK_NO_MOD, "\033[3~" }, | 	{ XK_Delete,    XK_NO_MOD, "\033[3~" }, | ||||||
| 	{ XK_Home,      XK_NO_MOD, "\033[1~" }, | 	{ XK_Home,      XK_NO_MOD, "\033[1~" }, | ||||||
| 	{ XK_End,       XK_NO_MOD, "\033[4~" }, | 	{ XK_End,       XK_NO_MOD, "\033[4~" }, | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								st.c
									
									
									
									
									
								
							| @@ -76,6 +76,7 @@ enum glyph_attribute { | |||||||
| 	ATTR_UNDERLINE = 2, | 	ATTR_UNDERLINE = 2, | ||||||
| 	ATTR_BOLD      = 4, | 	ATTR_BOLD      = 4, | ||||||
| 	ATTR_GFX       = 8, | 	ATTR_GFX       = 8, | ||||||
|  | 	ATTR_ITALIC    = 16, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| enum cursor_movement { | enum cursor_movement { | ||||||
| @@ -238,7 +239,7 @@ typedef struct { | |||||||
| 		short lbearing; | 		short lbearing; | ||||||
| 		short rbearing; | 		short rbearing; | ||||||
| 		XFontSet set; | 		XFontSet set; | ||||||
| 	} font, bfont; | 	} font, bfont, ifont; | ||||||
| } DC; | } DC; | ||||||
|  |  | ||||||
| static void die(const char*, ...); | static void die(const char*, ...); | ||||||
| @@ -1122,8 +1123,8 @@ tsetattr(int *attr, int l) { | |||||||
| 		case 1: | 		case 1: | ||||||
| 			term.c.attr.mode |= ATTR_BOLD; | 			term.c.attr.mode |= ATTR_BOLD; | ||||||
| 			break; | 			break; | ||||||
| 		case 3: /* enter standout (highlight) mode TODO: make it italic */ | 		case 3: /* enter standout (highlight) */ | ||||||
| 			term.c.attr.mode |= ATTR_REVERSE; | 			term.c.attr.mode |= ATTR_ITALIC; | ||||||
| 			break; | 			break; | ||||||
| 		case 4: | 		case 4: | ||||||
| 			term.c.attr.mode |= ATTR_UNDERLINE; | 			term.c.attr.mode |= ATTR_UNDERLINE; | ||||||
| @@ -1134,8 +1135,8 @@ tsetattr(int *attr, int l) { | |||||||
| 		case 22: | 		case 22: | ||||||
| 			term.c.attr.mode &= ~ATTR_BOLD; | 			term.c.attr.mode &= ~ATTR_BOLD; | ||||||
| 			break; | 			break; | ||||||
| 		case 23: /* leave standout (highlight) mode TODO: make it italic */ | 		case 23: /* leave standout (highlight) mode */ | ||||||
| 			term.c.attr.mode &= ~ATTR_REVERSE; | 			term.c.attr.mode &= ~ATTR_ITALIC; | ||||||
| 			break; | 			break; | ||||||
| 		case 24: | 		case 24: | ||||||
| 			term.c.attr.mode &= ~ATTR_UNDERLINE; | 			term.c.attr.mode &= ~ATTR_UNDERLINE; | ||||||
| @@ -1886,14 +1887,20 @@ xgetfontinfo(XFontSet set, int *ascent, int *descent, short *lbearing, short *rb | |||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| initfonts(char *fontstr, char *bfontstr) { | initfonts(char *fontstr, char *bfontstr, char *ifontstr) { | ||||||
| 	if((dc.font.set = xinitfont(fontstr)) == NULL || | 	if((dc.font.set = xinitfont(fontstr)) == NULL) | ||||||
| 	   (dc.bfont.set = xinitfont(bfontstr)) == NULL) | 		die("Can't load font %s\n", fontstr); | ||||||
| 		die("Can't load font %s\n", dc.font.set ? BOLDFONT : FONT); | 	if((dc.bfont.set = xinitfont(bfontstr)) == NULL) | ||||||
|  | 		die("Can't load bfont %s\n", bfontstr); | ||||||
|  | 	if((dc.ifont.set = xinitfont(ifontstr)) == NULL) | ||||||
|  | 		die("Can't load ifont %s\n", ifontstr); | ||||||
|  |  | ||||||
| 	xgetfontinfo(dc.font.set, &dc.font.ascent, &dc.font.descent, | 	xgetfontinfo(dc.font.set, &dc.font.ascent, &dc.font.descent, | ||||||
| 	    &dc.font.lbearing, &dc.font.rbearing); | 	    &dc.font.lbearing, &dc.font.rbearing); | ||||||
| 	xgetfontinfo(dc.bfont.set, &dc.bfont.ascent, &dc.bfont.descent, | 	xgetfontinfo(dc.bfont.set, &dc.bfont.ascent, &dc.bfont.descent, | ||||||
| 	    &dc.bfont.lbearing, &dc.bfont.rbearing); | 	    &dc.bfont.lbearing, &dc.bfont.rbearing); | ||||||
|  | 	xgetfontinfo(dc.ifont.set, &dc.ifont.ascent, &dc.ifont.descent, | ||||||
|  | 	    &dc.ifont.lbearing, &dc.ifont.rbearing); | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| @@ -1927,7 +1934,7 @@ xinit(void) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* font */ | 	/* font */ | ||||||
| 	initfonts(FONT, BOLDFONT); | 	initfonts(FONT, BOLDFONT, ITALICFONT); | ||||||
|  |  | ||||||
| 	/* XXX: Assuming same size for bold font */ | 	/* XXX: Assuming same size for bold font */ | ||||||
| 	xw.cw = dc.font.rbearing - dc.font.lbearing; | 	xw.cw = dc.font.rbearing - dc.font.lbearing; | ||||||
| @@ -2002,6 +2009,9 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | |||||||
| 		fontset = dc.bfont.set; | 		fontset = dc.bfont.set; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if(base.mode & ATTR_ITALIC) | ||||||
|  | 		fontset = dc.ifont.set; | ||||||
|  |  | ||||||
| 	XSetBackground(xw.dpy, dc.gc, dc.col[bg]); | 	XSetBackground(xw.dpy, dc.gc, dc.col[bg]); | ||||||
| 	XSetForeground(xw.dpy, dc.gc, dc.col[fg]); | 	XSetForeground(xw.dpy, dc.gc, dc.col[fg]); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								st.info
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								st.info
									
									
									
									
									
								
							| @@ -83,15 +83,16 @@ st| simpleterm, | |||||||
| 	op=\E[39;49m, | 	op=\E[39;49m, | ||||||
| 	pairs#64, | 	pairs#64, | ||||||
| 	rc=\E8, | 	rc=\E8, | ||||||
| 	rs1=\Ec, |  | ||||||
| 	rs2=\E[4l\E>, |  | ||||||
| 	rev=\E[7m, | 	rev=\E[7m, | ||||||
| 	ri=\EM, | 	ri=\EM, | ||||||
|  | 	ritm=\E[23m, | ||||||
| 	rmacs=\E(B, | 	rmacs=\E(B, | ||||||
| 	rmcup=\E[?1049l, | 	rmcup=\E[?1049l, | ||||||
| 	rmkx=\E>, | #	rmkx=\E>, | ||||||
| 	rmso=\E[23m, | 	rmso=\E[23m, | ||||||
| 	rmul=\E[m, | 	rmul=\E[m, | ||||||
|  | 	rs1=\Ec, | ||||||
|  | 	rs2=\E[4l\E>, | ||||||
| 	sc=\E7, | 	sc=\E7, | ||||||
| 	setab=\E[4%p1%dm, | 	setab=\E[4%p1%dm, | ||||||
| 	setaf=\E[3%p1%dm, | 	setaf=\E[3%p1%dm, | ||||||
| @@ -99,9 +100,10 @@ st| simpleterm, | |||||||
| 	setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, | 	setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, | ||||||
| 	sgr0=\E[0m, | 	sgr0=\E[0m, | ||||||
| 	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, | 	sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, | ||||||
|  | 	sitm=\E[3m, | ||||||
| 	smacs=\E(0, | 	smacs=\E(0, | ||||||
| 	smcup=\E[?1049h, | 	smcup=\E[?1049h, | ||||||
| 	smkx=\E=, | #	smkx=\E=, | ||||||
| 	smso=\E[3m, | 	smso=\E[3m, | ||||||
| 	smul=\E[4m, | 	smul=\E[4m, | ||||||
| 	tbc=\E[3g, | 	tbc=\E[3g, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user