Merge remote-tracking branch 'upstream/master'
						commit
						e53dc84a9d
					
				|  | @ -33,6 +33,7 @@ STLDFLAGS  = $(LIBS) $(LDFLAGS) | |||
| #LIBS = -L$(X11LIB) -lm -lX11 -lutil -lXft \
 | ||||
| #       `$(PKG_CONFIG) --libs fontconfig` \
 | ||||
| #       `$(PKG_CONFIG) --libs freetype2`
 | ||||
| #MANPREFIX = ${PREFIX}/man
 | ||||
| 
 | ||||
| # compiler and linker
 | ||||
| CC = cc | ||||
|  |  | |||
							
								
								
									
										90
									
								
								st.c
								
								
								
								
							
							
						
						
									
										90
									
								
								st.c
								
								
								
								
							|  | @ -168,6 +168,7 @@ static void csidump(void); | |||
| static void csihandle(void); | ||||
| static void csiparse(void); | ||||
| static void csireset(void); | ||||
| static void osc_color_response(int, int, int); | ||||
| static int eschandle(uchar); | ||||
| static void strdump(void); | ||||
| static void strhandle(void); | ||||
|  | @ -948,7 +949,7 @@ ttyresize(int tw, int th) | |||
| } | ||||
| 
 | ||||
| void | ||||
| ttyhangup() | ||||
| ttyhangup(void) | ||||
| { | ||||
| 	/* Send SIGHUP to shell */ | ||||
| 	kill(pid, SIGHUP); | ||||
|  | @ -1905,39 +1906,28 @@ csireset(void) | |||
| } | ||||
| 
 | ||||
| void | ||||
| osc4_color_response(int num) | ||||
| osc_color_response(int num, int index, int is_osc4) | ||||
| { | ||||
| 	int n; | ||||
| 	char buf[32]; | ||||
| 	unsigned char r, g, b; | ||||
| 
 | ||||
| 	if (xgetcolor(num, &r, &g, &b)) { | ||||
| 		fprintf(stderr, "erresc: failed to fetch osc4 color %d\n", num); | ||||
| 	if (xgetcolor(is_osc4 ? num : index, &r, &g, &b)) { | ||||
| 		fprintf(stderr, "erresc: failed to fetch %s color %d\n", | ||||
| 		        is_osc4 ? "osc4" : "osc", | ||||
| 		        is_osc4 ? num : index); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	n = snprintf(buf, sizeof buf, "\033]4;%d;rgb:%02x%02x/%02x%02x/%02x%02x\007", | ||||
| 		     num, r, r, g, g, b, b); | ||||
| 
 | ||||
| 	ttywrite(buf, n, 1); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| osc_color_response(int index, int num) | ||||
| { | ||||
| 	int n; | ||||
| 	char buf[32]; | ||||
| 	unsigned char r, g, b; | ||||
| 
 | ||||
| 	if (xgetcolor(index, &r, &g, &b)) { | ||||
| 		fprintf(stderr, "erresc: failed to fetch osc color %d\n", index); | ||||
| 		return; | ||||
| 	n = snprintf(buf, sizeof buf, "\033]%s%d;rgb:%02x%02x/%02x%02x/%02x%02x\007", | ||||
| 	             is_osc4 ? "4;" : "", num, r, r, g, g, b, b); | ||||
| 	if (n < 0 || n >= sizeof(buf)) { | ||||
| 		fprintf(stderr, "error: %s while printing %s response\n", | ||||
| 		        n < 0 ? "snprintf failed" : "truncation occurred", | ||||
| 		        is_osc4 ? "osc4" : "osc"); | ||||
| 	} else { | ||||
| 		ttywrite(buf, n, 1); | ||||
| 	} | ||||
| 
 | ||||
| 	n = snprintf(buf, sizeof buf, "\033]%d;rgb:%02x%02x/%02x%02x/%02x%02x\007", | ||||
| 		     num, r, r, g, g, b, b); | ||||
| 
 | ||||
| 	ttywrite(buf, n, 1); | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  | @ -1945,6 +1935,11 @@ strhandle(void) | |||
| { | ||||
| 	char *p = NULL, *dec; | ||||
| 	int j, narg, par; | ||||
| 	const struct { int idx; char *str; } osc_table[] = { | ||||
| 		{ defaultfg, "foreground" }, | ||||
| 		{ defaultbg, "background" }, | ||||
| 		{ defaultcs, "cursor" } | ||||
| 	}; | ||||
| 
 | ||||
| 	term.esc &= ~(ESC_STR_END|ESC_STR); | ||||
| 	strparse(); | ||||
|  | @ -1979,43 +1974,22 @@ strhandle(void) | |||
| 			} | ||||
| 			return; | ||||
| 		case 10: | ||||
| 			if (narg < 2) | ||||
| 				break; | ||||
| 
 | ||||
| 			p = strescseq.args[1]; | ||||
| 
 | ||||
| 			if (!strcmp(p, "?")) | ||||
| 				osc_color_response(defaultfg, 10); | ||||
| 			else if (xsetcolorname(defaultfg, p)) | ||||
| 				fprintf(stderr, "erresc: invalid foreground color: %s\n", p); | ||||
| 			else | ||||
| 				tfulldirt(); | ||||
| 			return; | ||||
| 		case 11: | ||||
| 			if (narg < 2) | ||||
| 				break; | ||||
| 
 | ||||
| 			p = strescseq.args[1]; | ||||
| 
 | ||||
| 			if (!strcmp(p, "?")) | ||||
| 				osc_color_response(defaultbg, 11); | ||||
| 			else if (xsetcolorname(defaultbg, p)) | ||||
| 				fprintf(stderr, "erresc: invalid background color: %s\n", p); | ||||
| 			else | ||||
| 				tfulldirt(); | ||||
| 			return; | ||||
| 		case 12: | ||||
| 			if (narg < 2) | ||||
| 				break; | ||||
| 
 | ||||
| 			p = strescseq.args[1]; | ||||
| 			if ((j = par - 10) < 0 || j >= LEN(osc_table)) | ||||
| 				break; /* shouldn't be possible */ | ||||
| 
 | ||||
| 			if (!strcmp(p, "?")) | ||||
| 				osc_color_response(defaultcs, 12); | ||||
| 			else if (xsetcolorname(defaultcs, p)) | ||||
| 				fprintf(stderr, "erresc: invalid cursor color: %s\n", p); | ||||
| 			else | ||||
| 			if (!strcmp(p, "?")) { | ||||
| 				osc_color_response(par, osc_table[j].idx, 0); | ||||
| 			} else if (xsetcolorname(osc_table[j].idx, p)) { | ||||
| 				fprintf(stderr, "erresc: invalid %s color: %s\n", | ||||
| 				        osc_table[j].str, p); | ||||
| 			} else { | ||||
| 				tfulldirt(); | ||||
| 			} | ||||
| 			return; | ||||
| 		case 4: /* color set */ | ||||
| 			if (narg < 3) | ||||
|  | @ -2025,9 +1999,9 @@ strhandle(void) | |||
| 		case 104: /* color reset */ | ||||
| 			j = (narg > 1) ? atoi(strescseq.args[1]) : -1; | ||||
| 
 | ||||
| 			if (p && !strcmp(p, "?")) | ||||
| 				osc4_color_response(j); | ||||
| 			else if (xsetcolorname(j, p)) { | ||||
| 			if (p && !strcmp(p, "?")) { | ||||
| 				osc_color_response(j, 0, 1); | ||||
| 			} else if (xsetcolorname(j, p)) { | ||||
| 				if (par == 104 && narg <= 1) | ||||
| 					return; /* color reset without parameter */ | ||||
| 				fprintf(stderr, "erresc: invalid color j=%d, p=%s\n", | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue