diff options
| author | Christoph Lohmann <20h@r-36.net> | 2012-09-26 20:21:08 +0200 | 
|---|---|---|
| committer | Christoph Lohmann <20h@r-36.net> | 2012-09-26 20:21:08 +0200 | 
| commit | 3a095984b053ebb159956368eb3258f51f50e352 (patch) | |
| tree | 89f6c65b351ef48f5de8dddcaee3dba236c926d3 | |
| parent | c3b0e2202b908834d3c08e3eaf70e0ac282cf319 (diff) | |
Implementing line drawing right.
| -rw-r--r-- | config.def.h | 8 | ||||
| -rw-r--r-- | st.c | 52 | 
2 files changed, 36 insertions, 24 deletions
| diff --git a/config.def.h b/config.def.h index 1f0291e..5a49b9d 100644 --- a/config.def.h +++ b/config.def.h @@ -79,14 +79,6 @@ static Key key[] = {  /* Set TERM to this */  #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 */  #define DOUBLECLICK_TIMEOUT 300  #define TRIPLECLICK_TIMEOUT (2*DOUBLECLICK_TIMEOUT) @@ -1094,6 +1094,27 @@ tmoveto(int x, int y) {  void  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.line[term.c.y][term.c.x] = term.c.attr;  	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]) {  		case 0:  			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.bg = DefaultBG;  			break; @@ -1676,12 +1697,18 @@ tputc(char *c, int len) {  				strhandle();  		} else if(term.esc & ESC_ALTCHARSET) {  			switch(ascii) { -			case '0': /* Line drawing crap */ +			case '0': /* Line drawing set */  				term.c.attr.mode |= ATTR_GFX;  				break; -			case 'B': /* Back to regular text */ +			case 'B': /* USASCII */  				term.c.attr.mode &= ~ATTR_GFX;  				break; +			case 'A': /* UK (IGNORED) */ +			case '<': /* multinational charset (IGNORED) */ +			case '5': /* Finnish (IGNORED) */ +			case 'C': /* Finnish (IGNORED) */ +			case 'K': /* German (IGNORED) */ +				break;  			default:  				fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii);  			} @@ -1700,10 +1727,14 @@ tputc(char *c, int len) {  				strescseq.type = ascii;  				term.esc |= ESC_STR;  				break; -			case ')': -			case '(': +			case '(': /* set primary charset G0 */  				term.esc |= ESC_ALTCHARSET;  				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 */  				if(term.c.y == term.bot)  					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;  	Font *font = &dc.font;  	XGlyphInfo extents; -	int i;  	/* only switch default fg/bg if term is in RV mode */  	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]);  	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);  	width = extents.xOff;  	XftDrawRect(xw.xft_draw, &dc.xft_col[bg], winx, winy - font->ascent, width, xw.ch); | 
