Skip to content

Commit

Permalink
add new patch
Browse files Browse the repository at this point in the history
  • Loading branch information
Squibid committed Sep 26, 2022
1 parent 6e49532 commit 6f6e0e6
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 5 deletions.
6 changes: 6 additions & 0 deletions config.def.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 6 additions & 0 deletions config.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Binary file modified st
Binary file not shown.
48 changes: 46 additions & 2 deletions st.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,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)
{
Expand Down Expand Up @@ -890,6 +917,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)
{
Expand All @@ -898,15 +928,15 @@ 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:
exit(0);
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 */
Expand Down Expand Up @@ -1067,6 +1097,7 @@ tsetdirtattr(int attr)
void
tfulldirt(void)
{
tsync_end();
for (int i = 0; i < term.row; i++)
term.dirty[i] = 1;
}
Expand Down Expand Up @@ -2208,6 +2239,12 @@ strhandle(void)
xsettitle(strescseq.args[0]);
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;
Expand Down Expand Up @@ -2747,6 +2784,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 */
Expand All @@ -2757,6 +2797,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;
Expand Down
1 change: 1 addition & 0 deletions st.info
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Binary file modified st.o
Binary file not shown.
22 changes: 19 additions & 3 deletions x.c
Original file line number Diff line number Diff line change
Expand Up @@ -1926,6 +1926,9 @@ resize(XEvent *e)
cresize(e->xconfigure.width, e->xconfigure.height);
}

int tinsync(uint);
int ttyread_pending();

void
run(void)
{
Expand Down Expand Up @@ -1960,7 +1963,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;
Expand All @@ -1974,7 +1977,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;
Expand All @@ -1998,7 +2002,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;
Expand All @@ -2009,6 +2013,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)) {
Expand Down
Binary file modified x.o
Binary file not shown.

0 comments on commit 6f6e0e6

Please sign in to comment.