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