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