Add support for OSC color sequences
This commit is contained in:
		
				
					committed by
					
						
						Hiltjo Posthuma
					
				
			
			
				
	
			
			
			
						parent
						
							2f6e597ed8
						
					
				
				
					commit
					8e31030390
				
			@@ -120,6 +120,8 @@ static const char *colorname[] = {
 | 
				
			|||||||
	/* more colors can be added after 255 to use with DefaultXX */
 | 
						/* more colors can be added after 255 to use with DefaultXX */
 | 
				
			||||||
	"#cccccc",
 | 
						"#cccccc",
 | 
				
			||||||
	"#555555",
 | 
						"#555555",
 | 
				
			||||||
 | 
						"gray90", /* default foreground colour */
 | 
				
			||||||
 | 
						"black", /* default background colour */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -127,9 +129,9 @@ static const char *colorname[] = {
 | 
				
			|||||||
 * Default colors (colorname index)
 | 
					 * Default colors (colorname index)
 | 
				
			||||||
 * foreground, background, cursor, reverse cursor
 | 
					 * foreground, background, cursor, reverse cursor
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
unsigned int defaultfg = 7;
 | 
					unsigned int defaultfg = 258;
 | 
				
			||||||
unsigned int defaultbg = 0;
 | 
					unsigned int defaultbg = 259;
 | 
				
			||||||
static unsigned int defaultcs = 256;
 | 
					unsigned int defaultcs = 256;
 | 
				
			||||||
static unsigned int defaultrcs = 257;
 | 
					static unsigned int defaultrcs = 257;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										80
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								st.c
									
									
									
									
									
								
							@@ -1842,6 +1842,42 @@ csireset(void)
 | 
				
			|||||||
	memset(&csiescseq, 0, sizeof(csiescseq));
 | 
						memset(&csiescseq, 0, sizeof(csiescseq));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					osc4_color_response(int num)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						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);
 | 
				
			||||||
 | 
							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]%d;rgb:%02x%02x/%02x%02x/%02x%02x\007",
 | 
				
			||||||
 | 
							     num, r, r, g, g, b, b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ttywrite(buf, n, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
strhandle(void)
 | 
					strhandle(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1880,6 +1916,45 @@ strhandle(void)
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return;
 | 
								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
 | 
				
			||||||
 | 
									redraw();
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							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
 | 
				
			||||||
 | 
									redraw();
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 12:
 | 
				
			||||||
 | 
								if (narg < 2)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								p = strescseq.args[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (!strcmp(p, "?"))
 | 
				
			||||||
 | 
									osc_color_response(defaultcs, 12);
 | 
				
			||||||
 | 
								else if (xsetcolorname(defaultcs, p))
 | 
				
			||||||
 | 
									fprintf(stderr, "erresc: invalid cursor color: %s\n", p);
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									redraw();
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case 4: /* color set */
 | 
							case 4: /* color set */
 | 
				
			||||||
			if (narg < 3)
 | 
								if (narg < 3)
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
@@ -1887,7 +1962,10 @@ strhandle(void)
 | 
				
			|||||||
			/* FALLTHROUGH */
 | 
								/* FALLTHROUGH */
 | 
				
			||||||
		case 104: /* color reset, here p = NULL */
 | 
							case 104: /* color reset, here p = NULL */
 | 
				
			||||||
			j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
 | 
								j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
 | 
				
			||||||
			if (xsetcolorname(j, p)) {
 | 
					
 | 
				
			||||||
 | 
								if (!strcmp(p, "?"))
 | 
				
			||||||
 | 
									osc4_color_response(j);
 | 
				
			||||||
 | 
								else if (xsetcolorname(j, p)) {
 | 
				
			||||||
				if (par == 104 && narg <= 1)
 | 
									if (par == 104 && narg <= 1)
 | 
				
			||||||
					return; /* color reset without parameter */
 | 
										return; /* color reset without parameter */
 | 
				
			||||||
				fprintf(stderr, "erresc: invalid color j=%d, p=%s\n",
 | 
									fprintf(stderr, "erresc: invalid color j=%d, p=%s\n",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								st.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								st.h
									
									
									
									
									
								
							@@ -111,6 +111,8 @@ void *xmalloc(size_t);
 | 
				
			|||||||
void *xrealloc(void *, size_t);
 | 
					void *xrealloc(void *, size_t);
 | 
				
			||||||
char *xstrdup(const char *);
 | 
					char *xstrdup(const char *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* config.h globals */
 | 
					/* config.h globals */
 | 
				
			||||||
extern char *utmp;
 | 
					extern char *utmp;
 | 
				
			||||||
extern char *scroll;
 | 
					extern char *scroll;
 | 
				
			||||||
@@ -123,3 +125,4 @@ extern char *termname;
 | 
				
			|||||||
extern unsigned int tabspaces;
 | 
					extern unsigned int tabspaces;
 | 
				
			||||||
extern unsigned int defaultfg;
 | 
					extern unsigned int defaultfg;
 | 
				
			||||||
extern unsigned int defaultbg;
 | 
					extern unsigned int defaultbg;
 | 
				
			||||||
 | 
					extern unsigned int defaultcs;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								x.c
									
									
									
									
									
								
							@@ -799,6 +799,19 @@ xloadcols(void)
 | 
				
			|||||||
	loaded = 1;
 | 
						loaded = 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!BETWEEN(x, 0, dc.collen))
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*r = dc.col[x].color.red >> 8;
 | 
				
			||||||
 | 
						*g = dc.col[x].color.green >> 8;
 | 
				
			||||||
 | 
						*b = dc.col[x].color.blue >> 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
xsetcolorname(int x, const char *name)
 | 
					xsetcolorname(int x, const char *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user