graphic charset and a few more escapes.
This commit is contained in:
		
							parent
							
								
									0981437524
								
							
						
					
					
						commit
						e6b3f5c755
					
				
							
								
								
									
										35
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								config.h
									
									
									
									
									
								
							| @ -36,3 +36,38 @@ static Key key[] = { | ||||
| 	{ XK_Up,     "\033[A" }, | ||||
| 	{ XK_Down,   "\033[B" }, | ||||
| }; | ||||
| 
 | ||||
| static char gfx[] = { | ||||
| 	['}'] = 'f', | ||||
| 	['.'] = 'v', | ||||
| 	[','] = '<', | ||||
| 	['+'] = '>', | ||||
| 	['-'] = '^', | ||||
| 	['h'] = '#', | ||||
| 	['~'] = 'o', | ||||
| 	['a'] = ':', | ||||
| 	['f'] = '\\', | ||||
| 	['`'] = '+', | ||||
| 	['z'] = '>', | ||||
| 	['{'] = '*', | ||||
| 	['q'] = '-', | ||||
| 	['i'] = '#', | ||||
| 	['n'] = '+', | ||||
| 	['y'] = '<', | ||||
| 	['m'] = '+', | ||||
| 	['j'] = '+', | ||||
| 	['|'] = '!', | ||||
| 	['g'] = '#', | ||||
| 	['o'] = '~', | ||||
| 	['p'] = '-', | ||||
| 	['r'] = '-', | ||||
| 	['s'] = '_', | ||||
| 	['0'] = '#', | ||||
| 	['w'] = '+', | ||||
| 	['u'] = '+', | ||||
| 	['t'] = '+', | ||||
| 	['v'] = '+', | ||||
| 	['l'] = '+', | ||||
| 	['k'] = '+', | ||||
| 	['x'] = '|', | ||||
| }; | ||||
|  | ||||
							
								
								
									
										81
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								st.c
									
									
									
									
									
								
							| @ -38,11 +38,11 @@ | ||||
| #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg) | ||||
| 
 | ||||
| /* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */ | ||||
| enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4 }; | ||||
| enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSwrap, CSsave, CSload }; | ||||
| enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4, ATgfx=8 }; | ||||
| enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSsave, CSload }; | ||||
| enum { CRset=1, CRupdate=2 }; | ||||
| enum { TMwrap=1, TMinsert=2, TMtitle=4 }; | ||||
| enum { ESCin = 1, ESCcsi = 2, ESCosc = 4, ESCtitle = 8 }; | ||||
| enum { TMwrap=1, TMinsert=2 }; | ||||
| enum { ESCin=1, ESCcsi=2, ESCosc=4, ESCtitle=8, ESCcharset=16 }; | ||||
| enum { SCupdate, SCredraw }; | ||||
| 
 | ||||
| typedef int Color; | ||||
| @ -399,7 +399,7 @@ tcursor(int dir) { | ||||
| 		break; | ||||
| 	case CSleft: | ||||
| 		xf--; | ||||
| 		if(xf < 0) { | ||||
| 		if(term.mode & TMwrap && xf < 0) { | ||||
| 			xf = term.col-1, yf--; | ||||
| 			if(yf < term.top) | ||||
| 				yf = term.top, xf = 0; | ||||
| @ -407,7 +407,7 @@ tcursor(int dir) { | ||||
| 		break; | ||||
| 	case CSright: | ||||
| 		xf++; | ||||
| 		if(xf >= term.col) { | ||||
| 		if(term.mode & TMwrap && xf >= term.col) { | ||||
| 			xf = 0, yf++; | ||||
| 			if(yf > term.bot) | ||||
| 				yf = term.bot, tscroll(); | ||||
| @ -535,7 +535,7 @@ tsetattr(int *attr, int l) { | ||||
| 	for(i = 0; i < l; i++) { | ||||
| 		switch(attr[i]) { | ||||
| 		case 0: | ||||
| 			memset(&term.c.attr, 0, sizeof(term.c.attr)); | ||||
| 			term.c.attr.mode &= ~(ATreverse | ATunderline | ATbold); | ||||
| 			term.c.attr.fg = DefaultFG; | ||||
| 			term.c.attr.bg = DefaultBG; | ||||
| 			break; | ||||
| @ -593,7 +593,10 @@ tsetscroll(int t, int b) { | ||||
| 
 | ||||
| void | ||||
| csihandle(void) { | ||||
| 	if(escseq.priv) | ||||
| 		csidump(); | ||||
| 	switch(escseq.mode) { | ||||
| 	unknown: | ||||
| 	default: | ||||
| 		fprintf(stderr, "erresc: unknown sequence\n"); | ||||
| 		csidump(); | ||||
| @ -672,9 +675,17 @@ csihandle(void) { | ||||
| 		tinsertblankline(escseq.arg[0]); | ||||
| 		break; | ||||
| 	case 'l': | ||||
| 		if(escseq.priv && escseq.arg[0] == 25) | ||||
| 		if(escseq.priv) { | ||||
| 			switch(escseq.arg[0]) { | ||||
| 			case 7: | ||||
| 				term.mode &= ~TMwrap; | ||||
| 				break; | ||||
| 			case 25: | ||||
| 				term.c.hidden = 1; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 		break; | ||||
| 	case 'M': /* Delete <n> lines */ | ||||
| 		DEFAULT(escseq.arg[0], 1); | ||||
| 		tdeleteline(escseq.arg[0]); | ||||
| @ -689,15 +700,25 @@ csihandle(void) { | ||||
| 		tmoveto(term.c.x, escseq.arg[0]-1); | ||||
| 		break; | ||||
| 	case 'h': /* Set terminal mode */ | ||||
| 		if(escseq.priv && escseq.arg[0] == 25) | ||||
| 		if(escseq.priv) | ||||
| 			switch(escseq.arg[0]) { | ||||
| 			case 7: | ||||
| 				term.mode |= TMwrap; | ||||
| 				break; | ||||
| 			case 25: | ||||
| 				term.c.hidden = 0; | ||||
| 				break; | ||||
| 			case 1034: | ||||
| 				/* XXX: Interpret "meta" key, sets eighth bit. */ | ||||
| 				break; | ||||
| 			} | ||||
| 		break; | ||||
| 	case 'm': /* Terminal attribute (color) */ | ||||
| 		tsetattr(escseq.arg, escseq.narg); | ||||
| 		break; | ||||
| 	case 'r': | ||||
| 		if(escseq.priv) | ||||
| 			; | ||||
| 			goto unknown; | ||||
| 		else { | ||||
| 			DEFAULT(escseq.arg[0], 1); | ||||
| 			DEFAULT(escseq.arg[1], term.row); | ||||
| @ -766,6 +787,17 @@ tputc(char c) { | ||||
| 			} else { | ||||
| 				term.title[term.titlelen++] = c; | ||||
| 			} | ||||
| 		} else if(term.esc & ESCcharset) { | ||||
| 			printf("ESC ( %c\n", c); | ||||
| 			switch(c) { | ||||
| 			case '0': /* Line drawing crap */ | ||||
| 				term.c.attr.mode |= ATgfx; | ||||
| 				break; | ||||
| 			case 'B': /* Back to regular text */ | ||||
| 				term.c.attr.mode &= ~ATgfx; | ||||
| 				break; | ||||
| 			} | ||||
| 			term.esc = 0; | ||||
| 		} else {		 | ||||
| 			switch(c) { | ||||
| 			case '[': | ||||
| @ -774,6 +806,23 @@ tputc(char c) { | ||||
| 			case ']': | ||||
| 				term.esc |= ESCosc; | ||||
| 				break; | ||||
| 			case '(': | ||||
| 				term.esc |= ESCcharset; | ||||
| 				break; | ||||
| 			case 'A': | ||||
| 				tmoveto(term.c.x, term.c.y-1); | ||||
| 				break; | ||||
| 			case 'B': | ||||
| 				tmoveto(term.c.x, term.c.y+1); | ||||
| 				break; | ||||
| 			case 'C': | ||||
| 				tmoveto(term.c.x+1, term.c.y); | ||||
| 				break; | ||||
| 			case 'D': | ||||
| 				tmoveto(term.c.x-1, term.c.y); | ||||
| 				break; | ||||
| 			default: | ||||
| 				fprintf(stderr, "erresc: unknown sequence ESC %02X '%c'\n", c, isprint(c)?c:'.'); | ||||
| 			} | ||||
| 		} | ||||
| 	} else { | ||||
| @ -931,6 +980,8 @@ void | ||||
| xdraws (char *s, Glyph base, int x, int y, int len) { | ||||
| 	unsigned long xfg, xbg; | ||||
| 	int winx = x*xw.cw, winy = y*xw.ch + dc.font->ascent, width = len*xw.cw; | ||||
| 	int i; | ||||
| 
 | ||||
| 	if(base.mode & ATreverse) | ||||
| 		xfg = dc.col[base.bg], xbg = dc.col[base.fg]; | ||||
| 	else | ||||
| @ -938,6 +989,13 @@ xdraws (char *s, Glyph base, int x, int y, int len) { | ||||
| 
 | ||||
| 	XSetBackground(xw.dis, dc.gc, xbg); | ||||
| 	XSetForeground(xw.dis, dc.gc, xfg); | ||||
| 	 | ||||
| 	if(base.mode & ATgfx) { | ||||
| 	    | ||||
| 		for(i = 0; i < len; i++) | ||||
| 			s[i] = gfx[s[i]]; | ||||
| 	} | ||||
| 	 | ||||
| 	XDrawImageString(xw.dis, xw.win, dc.gc, winx, winy, s, len); | ||||
| 	 | ||||
| 	if(base.mode & ATunderline) | ||||
| @ -1006,6 +1064,7 @@ draw(int redraw_all) { | ||||
| 		} | ||||
| 		xdraws(buf, base, ox, y, i); | ||||
| 	} | ||||
| 	if(!term.c.hidden) | ||||
| 		xcursor(CSdraw); | ||||
| } | ||||
| 
 | ||||
| @ -1014,7 +1073,7 @@ expose(XEvent *ev) { | ||||
| 	draw(SCredraw); | ||||
| } | ||||
| 
 | ||||
| char * | ||||
| char* | ||||
| kmap(KeySym k) { | ||||
| 	int i; | ||||
| 	for(i = 0; i < LEN(key); i++) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user