Compare commits
	
		
			3 Commits
		
	
	
		
			feat/gruvb
			...
			feat/title
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 39cec0d572 | |||
| 539dfd0bac | |||
| af62c87aa8 | 
							
								
								
									
										52
									
								
								config.def.h
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								config.def.h
									
									
									
									
									
								
							@@ -56,6 +56,12 @@ int allowwindowops = 0;
 | 
			
		||||
static double minlatency = 8;
 | 
			
		||||
static double maxlatency = 33;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Synchronized-Update timeout in ms
 | 
			
		||||
 * https://gitlab.com/gnachman/iterm2/-/wikis/synchronized-updates-spec
 | 
			
		||||
 */
 | 
			
		||||
static uint su_timeout = 200;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * blinking timeout (set to 0 to disable blinking) for the terminal blinking
 | 
			
		||||
 * attribute.
 | 
			
		||||
@@ -99,32 +105,24 @@ float alpha = 0.8;
 | 
			
		||||
/* Terminal colors (16 first used in escape sequence) */
 | 
			
		||||
static const char *colorname[] = {
 | 
			
		||||
	/* 8 normal colors */
 | 
			
		||||
	"black",
 | 
			
		||||
	"red3",
 | 
			
		||||
	"green3",
 | 
			
		||||
	"yellow3",
 | 
			
		||||
	"blue2",
 | 
			
		||||
	"magenta3",
 | 
			
		||||
	"cyan3",
 | 
			
		||||
	"gray90",
 | 
			
		||||
	[0] = "#282828", /* hard contrast: #1d2021 / soft contrast: #32302f */
 | 
			
		||||
	[1] = "#cc241d", /* red     */
 | 
			
		||||
	[2] = "#98971a", /* green   */
 | 
			
		||||
	[3] = "#d79921", /* yellow  */
 | 
			
		||||
	[4] = "#458588", /* blue    */
 | 
			
		||||
	[5] = "#b16286", /* magenta */
 | 
			
		||||
	[6] = "#689d6a", /* cyan    */
 | 
			
		||||
	[7] = "#a89984", /* white   */
 | 
			
		||||
 | 
			
		||||
	/* 8 bright colors */
 | 
			
		||||
	"gray50",
 | 
			
		||||
	"red",
 | 
			
		||||
	"green",
 | 
			
		||||
	"yellow",
 | 
			
		||||
	"#5c5cff",
 | 
			
		||||
	"magenta",
 | 
			
		||||
	"cyan",
 | 
			
		||||
	"white",
 | 
			
		||||
 | 
			
		||||
	[255] = 0,
 | 
			
		||||
 | 
			
		||||
	/* more colors can be added after 255 to use with DefaultXX */
 | 
			
		||||
	"#cccccc",
 | 
			
		||||
	"#555555",
 | 
			
		||||
	"gray90", /* default foreground colour */
 | 
			
		||||
	"black", /* default background colour */
 | 
			
		||||
	[8]  = "#928374", /* black   */
 | 
			
		||||
	[9]  = "#fb4934", /* red     */
 | 
			
		||||
	[10] = "#b8bb26", /* green   */
 | 
			
		||||
	[11] = "#fabd2f", /* yellow  */
 | 
			
		||||
	[12] = "#83a598", /* blue    */
 | 
			
		||||
	[13] = "#d3869b", /* magenta */
 | 
			
		||||
	[14] = "#8ec07c", /* cyan    */
 | 
			
		||||
	[15] = "#ebdbb2", /* white   */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -132,9 +130,9 @@ static const char *colorname[] = {
 | 
			
		||||
 * Default colors (colorname index)
 | 
			
		||||
 * foreground, background, cursor, reverse cursor
 | 
			
		||||
 */
 | 
			
		||||
unsigned int defaultfg = 258;
 | 
			
		||||
unsigned int defaultbg = 259;
 | 
			
		||||
unsigned int defaultcs = 256;
 | 
			
		||||
unsigned int defaultfg = 15;
 | 
			
		||||
unsigned int defaultbg = 0;
 | 
			
		||||
unsigned int defaultcs = 15;
 | 
			
		||||
static unsigned int defaultrcs = 257;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										82
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								st.c
									
									
									
									
									
								
							@@ -42,6 +42,8 @@
 | 
			
		||||
#define ISCONTROLC1(c)		(BETWEEN(c, 0x80, 0x9f))
 | 
			
		||||
#define ISCONTROL(c)		(ISCONTROLC0(c) || ISCONTROLC1(c))
 | 
			
		||||
#define ISDELIM(u)		(u && wcschr(worddelimiters, u))
 | 
			
		||||
#define STRESCARGREST(n)	((n) == 0 ? strescseq.buf : strescseq.argp[(n)-1] + 1)
 | 
			
		||||
#define STRESCARGJUST(n)	(*(strescseq.argp[n]) = '\0', STRESCARGREST(n))
 | 
			
		||||
 | 
			
		||||
enum term_mode {
 | 
			
		||||
	MODE_WRAP        = 1 << 0,
 | 
			
		||||
@@ -148,7 +150,7 @@ typedef struct {
 | 
			
		||||
	char *buf;             /* allocated raw string */
 | 
			
		||||
	size_t siz;            /* allocation size */
 | 
			
		||||
	size_t len;            /* raw string length */
 | 
			
		||||
	char *args[STR_ARG_SIZ];
 | 
			
		||||
	char *argp[STR_ARG_SIZ]; /* pointers to the end of nth argument */
 | 
			
		||||
	int narg;              /* nb of args */
 | 
			
		||||
} STREscape;
 | 
			
		||||
 | 
			
		||||
@@ -232,6 +234,33 @@ static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
 | 
			
		||||
static const Rune utfmin[UTF_SIZ + 1] = {       0,    0,  0x80,  0x800,  0x10000};
 | 
			
		||||
static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
 | 
			
		||||
 | 
			
		||||
#include <time.h>
 | 
			
		||||
static int su = 0;
 | 
			
		||||
struct timespec sutv;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
tsync_begin()
 | 
			
		||||
{
 | 
			
		||||
	clock_gettime(CLOCK_MONOTONIC, &sutv);
 | 
			
		||||
	su = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
tsync_end()
 | 
			
		||||
{
 | 
			
		||||
	su = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
tinsync(uint timeout)
 | 
			
		||||
{
 | 
			
		||||
	struct timespec now;
 | 
			
		||||
	if (su && !clock_gettime(CLOCK_MONOTONIC, &now)
 | 
			
		||||
	       && TIMEDIFF(now, sutv) >= timeout)
 | 
			
		||||
		su = 0;
 | 
			
		||||
	return su;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ssize_t
 | 
			
		||||
xwrite(int fd, const char *s, size_t len)
 | 
			
		||||
{
 | 
			
		||||
@@ -814,6 +843,9 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
 | 
			
		||||
	return cmdfd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int twrite_aborted = 0;
 | 
			
		||||
int ttyread_pending() { return twrite_aborted; }
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
ttyread(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -822,7 +854,7 @@ ttyread(void)
 | 
			
		||||
	int ret, written;
 | 
			
		||||
 | 
			
		||||
	/* append read bytes to unprocessed bytes */
 | 
			
		||||
	ret = read(cmdfd, buf+buflen, LEN(buf)-buflen);
 | 
			
		||||
	ret = twrite_aborted ? 1 : read(cmdfd, buf+buflen, LEN(buf)-buflen);
 | 
			
		||||
 | 
			
		||||
	switch (ret) {
 | 
			
		||||
	case 0:
 | 
			
		||||
@@ -830,7 +862,7 @@ ttyread(void)
 | 
			
		||||
	case -1:
 | 
			
		||||
		die("couldn't read from shell: %s\n", strerror(errno));
 | 
			
		||||
	default:
 | 
			
		||||
		buflen += ret;
 | 
			
		||||
		buflen += twrite_aborted ? 0 : ret;
 | 
			
		||||
		written = twrite(buf, buflen, 0);
 | 
			
		||||
		buflen -= written;
 | 
			
		||||
		/* keep any incomplete UTF-8 byte sequence for the next call */
 | 
			
		||||
@@ -990,6 +1022,7 @@ tsetdirtattr(int attr)
 | 
			
		||||
void
 | 
			
		||||
tfulldirt(void)
 | 
			
		||||
{
 | 
			
		||||
	tsync_end();
 | 
			
		||||
	tsetdirt(0, term.row-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1879,29 +1912,30 @@ strhandle(void)
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	term.esc &= ~(ESC_STR_END|ESC_STR);
 | 
			
		||||
	strparse();
 | 
			
		||||
	par = (narg = strescseq.narg) ? atoi(strescseq.args[0]) : 0;
 | 
			
		||||
	strescseq.buf[strescseq.len] = '\0';
 | 
			
		||||
 | 
			
		||||
	switch (strescseq.type) {
 | 
			
		||||
	case ']': /* OSC -- Operating System Command */
 | 
			
		||||
		strparse();
 | 
			
		||||
		par = (narg = strescseq.narg) ? atoi(STRESCARGJUST(0)) : 0;
 | 
			
		||||
		switch (par) {
 | 
			
		||||
		case 0:
 | 
			
		||||
			if (narg > 1) {
 | 
			
		||||
				xsettitle(strescseq.args[1]);
 | 
			
		||||
				xseticontitle(strescseq.args[1]);
 | 
			
		||||
				xsettitle(STRESCARGREST(1));
 | 
			
		||||
				xseticontitle(STRESCARGREST(1));
 | 
			
		||||
			}
 | 
			
		||||
			return;
 | 
			
		||||
		case 1:
 | 
			
		||||
			if (narg > 1)
 | 
			
		||||
				xseticontitle(strescseq.args[1]);
 | 
			
		||||
				xseticontitle(STRESCARGREST(1));
 | 
			
		||||
			return;
 | 
			
		||||
		case 2:
 | 
			
		||||
			if (narg > 1)
 | 
			
		||||
				xsettitle(strescseq.args[1]);
 | 
			
		||||
				xsettitle(STRESCARGREST(1));
 | 
			
		||||
			return;
 | 
			
		||||
		case 52:
 | 
			
		||||
			if (narg > 2 && allowwindowops) {
 | 
			
		||||
				dec = base64dec(strescseq.args[2]);
 | 
			
		||||
				dec = base64dec(STRESCARGJUST(2));
 | 
			
		||||
				if (dec) {
 | 
			
		||||
					xsetsel(dec);
 | 
			
		||||
					xclipcopy();
 | 
			
		||||
@@ -1915,7 +1949,7 @@ strhandle(void)
 | 
			
		||||
		case 12:
 | 
			
		||||
			if (narg < 2)
 | 
			
		||||
				break;
 | 
			
		||||
			p = strescseq.args[1];
 | 
			
		||||
			p = STRESCARGREST(1);
 | 
			
		||||
			if ((j = par - 10) < 0 || j >= LEN(osc_table))
 | 
			
		||||
				break; /* shouldn't be possible */
 | 
			
		||||
 | 
			
		||||
@@ -1931,10 +1965,10 @@ strhandle(void)
 | 
			
		||||
		case 4: /* color set */
 | 
			
		||||
			if (narg < 3)
 | 
			
		||||
				break;
 | 
			
		||||
			p = strescseq.args[2];
 | 
			
		||||
			p = STRESCARGJUST(2);
 | 
			
		||||
			/* FALLTHROUGH */
 | 
			
		||||
		case 104: /* color reset */
 | 
			
		||||
			j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
 | 
			
		||||
			j = (narg > 1) ? atoi(STRESCARGJUST(1)) : -1;
 | 
			
		||||
 | 
			
		||||
			if (p && !strcmp(p, "?")) {
 | 
			
		||||
				osc_color_response(j, 0, 1);
 | 
			
		||||
@@ -1956,9 +1990,15 @@ strhandle(void)
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case 'k': /* old title set compatibility */
 | 
			
		||||
		xsettitle(strescseq.args[0]);
 | 
			
		||||
		xsettitle(strescseq.buf);
 | 
			
		||||
		return;
 | 
			
		||||
	case 'P': /* DCS -- Device Control String */
 | 
			
		||||
		/* https://gitlab.com/gnachman/iterm2/-/wikis/synchronized-updates-spec */
 | 
			
		||||
		if (strstr(strescseq.buf, "=1s") == strescseq.buf)
 | 
			
		||||
			tsync_begin();  /* BSU */
 | 
			
		||||
		else if (strstr(strescseq.buf, "=2s") == strescseq.buf)
 | 
			
		||||
			tsync_end();  /* ESU */
 | 
			
		||||
		return;
 | 
			
		||||
	case '_': /* APC -- Application Program Command */
 | 
			
		||||
	case '^': /* PM -- Privacy Message */
 | 
			
		||||
		return;
 | 
			
		||||
@@ -1975,18 +2015,17 @@ strparse(void)
 | 
			
		||||
	char *p = strescseq.buf;
 | 
			
		||||
 | 
			
		||||
	strescseq.narg = 0;
 | 
			
		||||
	strescseq.buf[strescseq.len] = '\0';
 | 
			
		||||
 | 
			
		||||
	if (*p == '\0')
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	while (strescseq.narg < STR_ARG_SIZ) {
 | 
			
		||||
		strescseq.args[strescseq.narg++] = p;
 | 
			
		||||
		while ((c = *p) != ';' && c != '\0')
 | 
			
		||||
			++p;
 | 
			
		||||
			p++;
 | 
			
		||||
		strescseq.argp[strescseq.narg++] = p;
 | 
			
		||||
		if (c == '\0')
 | 
			
		||||
			return;
 | 
			
		||||
		*p++ = '\0';
 | 
			
		||||
		p++;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -2507,6 +2546,9 @@ twrite(const char *buf, int buflen, int show_ctrl)
 | 
			
		||||
	Rune u;
 | 
			
		||||
	int n;
 | 
			
		||||
 | 
			
		||||
	int su0 = su;
 | 
			
		||||
	twrite_aborted = 0;
 | 
			
		||||
 | 
			
		||||
	for (n = 0; n < buflen; n += charsize) {
 | 
			
		||||
		if (IS_SET(MODE_UTF8)) {
 | 
			
		||||
			/* process a complete utf8 char */
 | 
			
		||||
@@ -2517,6 +2559,10 @@ twrite(const char *buf, int buflen, int show_ctrl)
 | 
			
		||||
			u = buf[n] & 0xFF;
 | 
			
		||||
			charsize = 1;
 | 
			
		||||
		}
 | 
			
		||||
		if (su0 && !su) {
 | 
			
		||||
			twrite_aborted = 1;
 | 
			
		||||
			break;  // ESU - allow rendering before a new BSU
 | 
			
		||||
		}
 | 
			
		||||
		if (show_ctrl && ISCONTROL(u)) {
 | 
			
		||||
			if (u & 0x80) {
 | 
			
		||||
				u &= 0x7f;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								st.info
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								st.info
									
									
									
									
									
								
							@@ -191,6 +191,7 @@ st-mono| simpleterm monocolor,
 | 
			
		||||
	Ms=\E]52;%p1%s;%p2%s\007,
 | 
			
		||||
	Se=\E[2 q,
 | 
			
		||||
	Ss=\E[%p1%d q,
 | 
			
		||||
	Sync=\EP=%p1%ds\E\\,
 | 
			
		||||
 | 
			
		||||
st| simpleterm,
 | 
			
		||||
	use=st-mono,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								x.c
									
									
									
									
									
								
							@@ -1943,6 +1943,9 @@ resize(XEvent *e)
 | 
			
		||||
	cresize(e->xconfigure.width, e->xconfigure.height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int tinsync(uint);
 | 
			
		||||
int ttyread_pending();
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
run(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -1977,7 +1980,7 @@ run(void)
 | 
			
		||||
		FD_SET(ttyfd, &rfd);
 | 
			
		||||
		FD_SET(xfd, &rfd);
 | 
			
		||||
 | 
			
		||||
		if (XPending(xw.dpy))
 | 
			
		||||
		if (XPending(xw.dpy) || ttyread_pending())
 | 
			
		||||
			timeout = 0;  /* existing events might not set xfd */
 | 
			
		||||
 | 
			
		||||
		seltv.tv_sec = timeout / 1E3;
 | 
			
		||||
@@ -1991,7 +1994,8 @@ run(void)
 | 
			
		||||
		}
 | 
			
		||||
		clock_gettime(CLOCK_MONOTONIC, &now);
 | 
			
		||||
 | 
			
		||||
		if (FD_ISSET(ttyfd, &rfd))
 | 
			
		||||
		int ttyin = FD_ISSET(ttyfd, &rfd) || ttyread_pending();
 | 
			
		||||
		if (ttyin)
 | 
			
		||||
			ttyread();
 | 
			
		||||
 | 
			
		||||
		xev = 0;
 | 
			
		||||
@@ -2015,7 +2019,7 @@ run(void)
 | 
			
		||||
		 * maximum latency intervals during `cat huge.txt`, and perfect
 | 
			
		||||
		 * sync with periodic updates from animations/key-repeats/etc.
 | 
			
		||||
		 */
 | 
			
		||||
		if (FD_ISSET(ttyfd, &rfd) || xev) {
 | 
			
		||||
		if (ttyin || xev) {
 | 
			
		||||
			if (!drawing) {
 | 
			
		||||
				trigger = now;
 | 
			
		||||
				drawing = 1;
 | 
			
		||||
@@ -2026,6 +2030,18 @@ run(void)
 | 
			
		||||
				continue;  /* we have time, try to find idle */
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (tinsync(su_timeout)) {
 | 
			
		||||
			/*
 | 
			
		||||
			 * on synchronized-update draw-suspension: don't reset
 | 
			
		||||
			 * drawing so that we draw ASAP once we can (just after
 | 
			
		||||
			 * ESU). it won't be too soon because we already can
 | 
			
		||||
			 * draw now but we skip. we set timeout > 0 to draw on
 | 
			
		||||
			 * SU-timeout even without new content.
 | 
			
		||||
			 */
 | 
			
		||||
			timeout = minlatency;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* idle detected or maxlatency exhausted -> draw */
 | 
			
		||||
		timeout = -1;
 | 
			
		||||
		if (blinktimeout && tattrset(ATTR_BLINK)) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user