Support the DECSCUSR CSI escape sequence
This commit is contained in:
		
							parent
							
								
									86d1e432a8
								
							
						
					
					
						commit
						580302f317
					
				
							
								
								
									
										62
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								st.c
									
									
									
									
									
								
							| @ -197,14 +197,14 @@ typedef struct { | |||||||
| } TCursor; | } TCursor; | ||||||
| 
 | 
 | ||||||
| /* CSI Escape sequence structs */ | /* CSI Escape sequence structs */ | ||||||
| /* ESC '[' [[ [<priv>] <arg> [;]] <mode>] */ | /* ESC '[' [[ [<priv>] <arg> [;]] <mode> [<mode>]] */ | ||||||
| typedef struct { | typedef struct { | ||||||
| 	char buf[ESC_BUF_SIZ]; /* raw string */ | 	char buf[ESC_BUF_SIZ]; /* raw string */ | ||||||
| 	int len;               /* raw string length */ | 	int len;               /* raw string length */ | ||||||
| 	char priv; | 	char priv; | ||||||
| 	int arg[ESC_ARG_SIZ]; | 	int arg[ESC_ARG_SIZ]; | ||||||
| 	int narg;              /* nb of args */ | 	int narg;              /* nb of args */ | ||||||
| 	char mode; | 	char mode[2]; | ||||||
| } CSIEscape; | } CSIEscape; | ||||||
| 
 | 
 | ||||||
| /* STR Escape sequence structs */ | /* STR Escape sequence structs */ | ||||||
| @ -257,6 +257,7 @@ typedef struct { | |||||||
| 	int ch; /* char height */ | 	int ch; /* char height */ | ||||||
| 	int cw; /* char width  */ | 	int cw; /* char width  */ | ||||||
| 	char state; /* focus, redraw, visible */ | 	char state; /* focus, redraw, visible */ | ||||||
|  | 	int cursor; /* cursor style */ | ||||||
| } XWindow; | } XWindow; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| @ -1545,7 +1546,8 @@ csiparse(void) { | |||||||
| 			break; | 			break; | ||||||
| 		p++; | 		p++; | ||||||
| 	} | 	} | ||||||
| 	csiescseq.mode = *p; | 	csiescseq.mode[0] = *p++; | ||||||
|  | 	csiescseq.mode[1] = (p < csiescseq.buf+csiescseq.len) ? *p : '\0'; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* for absolute user moves, when decom is set */ | /* for absolute user moves, when decom is set */ | ||||||
| @ -1983,7 +1985,7 @@ csihandle(void) { | |||||||
| 	char buf[40]; | 	char buf[40]; | ||||||
| 	int len; | 	int len; | ||||||
| 
 | 
 | ||||||
| 	switch(csiescseq.mode) { | 	switch(csiescseq.mode[0]) { | ||||||
| 	default: | 	default: | ||||||
| 	unknown: | 	unknown: | ||||||
| 		fprintf(stderr, "erresc: unknown csi "); | 		fprintf(stderr, "erresc: unknown csi "); | ||||||
| @ -2171,6 +2173,19 @@ csihandle(void) { | |||||||
| 	case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */ | 	case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */ | ||||||
| 		tcursor(CURSOR_LOAD); | 		tcursor(CURSOR_LOAD); | ||||||
| 		break; | 		break; | ||||||
|  | 	case ' ': | ||||||
|  | 		switch (csiescseq.mode[1]) { | ||||||
|  | 			case 'q': /* DECSCUSR -- Set Cursor Style */ | ||||||
|  | 				DEFAULT(csiescseq.arg[0], 1); | ||||||
|  | 				if (!BETWEEN(csiescseq.arg[0], 0, 6)) { | ||||||
|  | 					goto unknown; | ||||||
|  | 				} | ||||||
|  | 				xw.cursor = csiescseq.arg[0]; | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				goto unknown; | ||||||
|  | 		} | ||||||
|  | 		break; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -3551,16 +3566,36 @@ xdrawcursor(void) { | |||||||
| 
 | 
 | ||||||
| 	/* draw the new one */ | 	/* draw the new one */ | ||||||
| 	if(xw.state & WIN_FOCUSED) { | 	if(xw.state & WIN_FOCUSED) { | ||||||
| 		if(IS_SET(MODE_REVERSE)) { | 		switch (xw.cursor) { | ||||||
| 			g.mode |= ATTR_REVERSE; | 			case 0: /* Blinking Block */ | ||||||
| 			g.fg = defaultcs; | 			case 1: /* Blinking Block (Default) */ | ||||||
| 			g.bg = defaultfg; | 			case 2: /* Steady Block */ | ||||||
| 		} | 				if(IS_SET(MODE_REVERSE)) { | ||||||
|  | 						g.mode |= ATTR_REVERSE; | ||||||
|  | 						g.fg = defaultcs; | ||||||
|  | 						g.bg = defaultfg; | ||||||
|  | 					} | ||||||
| 
 | 
 | ||||||
| 		sl = utf8len(g.c); | 				sl = utf8len(g.c); | ||||||
| 		width = (term.line[term.c.y][curx].mode & ATTR_WIDE)\ | 				width = (term.line[term.c.y][curx].mode & ATTR_WIDE)\ | ||||||
| 			? 2 : 1; | 					? 2 : 1; | ||||||
| 		xdraws(g.c, g, term.c.x, term.c.y, width, sl); | 				xdraws(g.c, g, term.c.x, term.c.y, width, sl); | ||||||
|  | 				break; | ||||||
|  | 			case 3: /* Blinking Underline */ | ||||||
|  | 			case 4: /* Steady Underline */ | ||||||
|  | 				XftDrawRect(xw.draw, &dc.col[defaultcs], | ||||||
|  | 						borderpx + curx * xw.cw, | ||||||
|  | 						borderpx + (term.c.y + 1) * xw.ch - 1, | ||||||
|  | 						xw.cw, 1); | ||||||
|  | 				break; | ||||||
|  | 			case 5: /* Blinking bar */ | ||||||
|  | 			case 6: /* Steady bar */ | ||||||
|  | 				XftDrawRect(xw.draw, &dc.col[defaultcs], | ||||||
|  | 								borderpx + curx * xw.cw, | ||||||
|  | 								borderpx + term.c.y * xw.ch, | ||||||
|  | 								1, xw.ch); | ||||||
|  | 				break; | ||||||
|  | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		XftDrawRect(xw.draw, &dc.col[defaultcs], | 		XftDrawRect(xw.draw, &dc.col[defaultcs], | ||||||
| 				borderpx + curx * xw.cw, | 				borderpx + curx * xw.cw, | ||||||
| @ -3985,6 +4020,7 @@ main(int argc, char *argv[]) { | |||||||
| 
 | 
 | ||||||
| 	xw.l = xw.t = 0; | 	xw.l = xw.t = 0; | ||||||
| 	xw.isfixed = False; | 	xw.isfixed = False; | ||||||
|  | 	xw.cursor = 0; | ||||||
| 
 | 
 | ||||||
| 	ARGBEGIN { | 	ARGBEGIN { | ||||||
| 	case 'a': | 	case 'a': | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user