summaryrefslogtreecommitdiff
path: root/x.c
diff options
context:
space:
mode:
authorGustaf Rydholm <gustaf.rydholm@gmail.com>2021-08-12 21:58:15 +0200
committerGustaf Rydholm <gustaf.rydholm@gmail.com>2021-08-12 21:58:15 +0200
commitae19d30bab16589623aa80ba316288d234e7fee9 (patch)
treedfa96b6907a8c5b1038ee2440e721ff111ce0014 /x.c
parent1bba714632c7e4a5f0d4431b56f396170bf9f3e4 (diff)
Apply appsync patch
Diffstat (limited to 'x.c')
-rw-r--r--x.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/x.c b/x.c
index 6c8a1d8..e0fa998 100644
--- a/x.c
+++ b/x.c
@@ -1889,6 +1889,9 @@ resize(XEvent *e)
cresize(e->xconfigure.width, e->xconfigure.height);
}
+int tinsync(uint);
+int ttyread_pending();
+
void
run(void)
{
@@ -1923,7 +1926,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;
@@ -1937,7 +1940,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;
@@ -1961,7 +1965,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;
@@ -1972,6 +1976,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)) {