Implementing line drawing right.
This commit is contained in:
		| @@ -79,14 +79,6 @@ static Key key[] = { | |||||||
| /* Set TERM to this */ | /* Set TERM to this */ | ||||||
| #define TNAME "st-256color" | #define TNAME "st-256color" | ||||||
|  |  | ||||||
| /* Line drawing characters (sometime specific to each font...) */ |  | ||||||
| static char gfx[] = { |  | ||||||
| 	['f'] = 'o', |  | ||||||
| 	['g'] = '+', |  | ||||||
| 	['i'] = '#', |  | ||||||
| 	[255] = 0, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /* double-click timeout (in milliseconds) between clicks for selection */ | /* double-click timeout (in milliseconds) between clicks for selection */ | ||||||
| #define DOUBLECLICK_TIMEOUT 300 | #define DOUBLECLICK_TIMEOUT 300 | ||||||
| #define TRIPLECLICK_TIMEOUT (2*DOUBLECLICK_TIMEOUT) | #define TRIPLECLICK_TIMEOUT (2*DOUBLECLICK_TIMEOUT) | ||||||
|   | |||||||
							
								
								
									
										52
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								st.c
									
									
									
									
									
								
							| @@ -1094,6 +1094,27 @@ tmoveto(int x, int y) { | |||||||
|  |  | ||||||
| void | void | ||||||
| tsetchar(char *c) { | tsetchar(char *c) { | ||||||
|  | 	/* | ||||||
|  | 	 * The table is proudly stolen from rxvt. | ||||||
|  | 	 */ | ||||||
|  | 	if(term.c.attr.mode & ATTR_GFX) { | ||||||
|  | 		char *vt100_0[62] = { /* 0x41 - 0x7e */ | ||||||
|  | 			"↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */ | ||||||
|  | 			0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ | ||||||
|  | 			0, 0, 0, 0, 0, 0, 0, 0, /* P - W */ | ||||||
|  | 			0, 0, 0, 0, 0, 0, 0, " ", /* X - _ */ | ||||||
|  | 			"◆", "▒", "␉", "␌", "␍", "␊", "°", "±", /* ` - g */ | ||||||
|  | 			"", "␋", "┘", "┐", "┌", "└", "┼", "⎺", /* h - o */ | ||||||
|  | 			"⎻", "─", "⎼", "⎽", "├", "┤", "┴", "┬", /* p - w */ | ||||||
|  | 			"│", "≤", "≥", "π", "≠", "£", "·", /* x - ~ */ | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		if(c[0] >= 0x41 && c[0] <= 0x7e | ||||||
|  | 				&& vt100_0[c[0] - 0x41]) { | ||||||
|  | 			c = vt100_0[c[0] - 0x41]; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	term.dirty[term.c.y] = 1; | 	term.dirty[term.c.y] = 1; | ||||||
| 	term.line[term.c.y][term.c.x] = term.c.attr; | 	term.line[term.c.y][term.c.x] = term.c.attr; | ||||||
| 	memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ); | 	memcpy(term.line[term.c.y][term.c.x].c, c, UTF_SIZ); | ||||||
| @@ -1177,7 +1198,7 @@ tsetattr(int *attr, int l) { | |||||||
| 		switch(attr[i]) { | 		switch(attr[i]) { | ||||||
| 		case 0: | 		case 0: | ||||||
| 			term.c.attr.mode &= ~(ATTR_REVERSE | ATTR_UNDERLINE | ATTR_BOLD \ | 			term.c.attr.mode &= ~(ATTR_REVERSE | ATTR_UNDERLINE | ATTR_BOLD \ | ||||||
| 					| ATTR_ITALIC | ATTR_BLINK | ATTR_GFX); | 					| ATTR_ITALIC | ATTR_BLINK); | ||||||
| 			term.c.attr.fg = DefaultFG; | 			term.c.attr.fg = DefaultFG; | ||||||
| 			term.c.attr.bg = DefaultBG; | 			term.c.attr.bg = DefaultBG; | ||||||
| 			break; | 			break; | ||||||
| @@ -1676,12 +1697,18 @@ tputc(char *c, int len) { | |||||||
| 				strhandle(); | 				strhandle(); | ||||||
| 		} else if(term.esc & ESC_ALTCHARSET) { | 		} else if(term.esc & ESC_ALTCHARSET) { | ||||||
| 			switch(ascii) { | 			switch(ascii) { | ||||||
| 			case '0': /* Line drawing crap */ | 			case '0': /* Line drawing set */ | ||||||
| 				term.c.attr.mode |= ATTR_GFX; | 				term.c.attr.mode |= ATTR_GFX; | ||||||
| 				break; | 				break; | ||||||
| 			case 'B': /* Back to regular text */ | 			case 'B': /* USASCII */ | ||||||
| 				term.c.attr.mode &= ~ATTR_GFX; | 				term.c.attr.mode &= ~ATTR_GFX; | ||||||
| 				break; | 				break; | ||||||
|  | 			case 'A': /* UK (IGNORED) */ | ||||||
|  | 			case '<': /* multinational charset (IGNORED) */ | ||||||
|  | 			case '5': /* Finnish (IGNORED) */ | ||||||
|  | 			case 'C': /* Finnish (IGNORED) */ | ||||||
|  | 			case 'K': /* German (IGNORED) */ | ||||||
|  | 				break; | ||||||
| 			default: | 			default: | ||||||
| 				fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii); | 				fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii); | ||||||
| 			} | 			} | ||||||
| @@ -1700,10 +1727,14 @@ tputc(char *c, int len) { | |||||||
| 				strescseq.type = ascii; | 				strescseq.type = ascii; | ||||||
| 				term.esc |= ESC_STR; | 				term.esc |= ESC_STR; | ||||||
| 				break; | 				break; | ||||||
| 			case ')': | 			case '(': /* set primary charset G0 */ | ||||||
| 			case '(': |  | ||||||
| 				term.esc |= ESC_ALTCHARSET; | 				term.esc |= ESC_ALTCHARSET; | ||||||
| 				break; | 				break; | ||||||
|  | 			case ')': /* set secondary charset G1 (IGNORED) */ | ||||||
|  | 			case '*': /* set tertiary charset G2 (IGNORED) */ | ||||||
|  | 			case '+': /* set quaternary charset G3 (IGNORED) */ | ||||||
|  | 				term.esc = 0; | ||||||
|  | 				break; | ||||||
| 			case 'D': /* IND -- Linefeed */ | 			case 'D': /* IND -- Linefeed */ | ||||||
| 				if(term.c.y == term.bot) | 				if(term.c.y == term.bot) | ||||||
| 					tscrollup(term.top, 1); | 					tscrollup(term.top, 1); | ||||||
| @@ -2067,7 +2098,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | |||||||
| 	int winx = BORDER+x*xw.cw, winy = BORDER+y*xw.ch + dc.font.ascent, width = charlen*xw.cw; | 	int winx = BORDER+x*xw.cw, winy = BORDER+y*xw.ch + dc.font.ascent, width = charlen*xw.cw; | ||||||
| 	Font *font = &dc.font; | 	Font *font = &dc.font; | ||||||
| 	XGlyphInfo extents; | 	XGlyphInfo extents; | ||||||
| 	int i; |  | ||||||
|  |  | ||||||
| 	/* only switch default fg/bg if term is in RV mode */ | 	/* only switch default fg/bg if term is in RV mode */ | ||||||
| 	if(IS_SET(MODE_REVERSE)) { | 	if(IS_SET(MODE_REVERSE)) { | ||||||
| @@ -2093,16 +2123,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | |||||||
| 	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]); | ||||||
|  |  | ||||||
| 	if(base.mode & ATTR_GFX) { |  | ||||||
| 		for(i = 0; i < bytelen; i++) { |  | ||||||
| 			char c = gfx[(uint)s[i] % 256]; |  | ||||||
| 			if(c) |  | ||||||
| 				s[i] = c; |  | ||||||
| 			else if(s[i] > 0x5f) |  | ||||||
| 				s[i] -= 0x5f; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	XftTextExtentsUtf8(xw.dpy, font->xft_set, (FcChar8 *)s, bytelen, &extents); | 	XftTextExtentsUtf8(xw.dpy, font->xft_set, (FcChar8 *)s, bytelen, &extents); | ||||||
| 	width = extents.xOff; | 	width = extents.xOff; | ||||||
| 	XftDrawRect(xw.xft_draw, &dc.xft_col[bg], winx, winy - font->ascent, width, xw.ch); | 	XftDrawRect(xw.xft_draw, &dc.xft_col[bg], winx, winy - font->ascent, width, xw.ch); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user