diff --git a/render.c b/render.c index 7189c9ba..8cefc833 100644 --- a/render.c +++ b/render.c @@ -1606,7 +1606,10 @@ frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_da if (term->render.pending.grid) { term->render.pending.grid = false; - grid_render(term); + + /* TODO: need to check if this breaks GNOME/weston */ + if (!term->delayed_render_timer.is_armed) + grid_render(term); } } diff --git a/terminal.c b/terminal.c index b39bb8d9..bac6e232 100644 --- a/terminal.c +++ b/terminal.c @@ -32,6 +32,8 @@ #define min(x, y) ((x) < (y) ? (x) : (y)) #define max(x, y) ((x) > (y) ? (x) : (y)) +#define PTMX_TIMING 0 + static const char *const XCURSOR_LEFT_PTR = "left_ptr"; static const char *const XCURSOR_TEXT = "text"; static const char *const XCURSOR_HAND2 = "hand2"; @@ -125,8 +127,6 @@ fdm_ptmx_out(struct fdm *fdm, int fd, int events, void *data) return true; } -#define PTMX_TIMING 0 - #if PTMX_TIMING static struct timespec last = {0}; #endif @@ -197,9 +197,10 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data) * compositor anyway. The delay we introduce here only * has any effect when the renderer is idle. */ - if (term->window->frame_callback == NULL) { - /* First timeout - reset each time we receive input. */ + uint64_t lower_ns = term->conf->tweak.delayed_render_lower_ns; + uint64_t upper_ns = term->conf->tweak.delayed_render_upper_ns; + if (lower_ns > 0 && upper_ns > 0) { #if PTMX_TIMING struct timespec now; @@ -215,8 +216,6 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data) last = now; #endif - uint64_t lower_ns = term->conf->tweak.delayed_render_lower_ns; - uint64_t upper_ns = term->conf->tweak.delayed_render_upper_ns; assert(lower_ns < 1000000000); assert(upper_ns < 1000000000); assert(upper_ns > lower_ns); @@ -236,7 +235,7 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data) term->delayed_render_timer.is_armed = true; } } else - term->render.pending.grid = true; + render_refresh(term); } if (hup) { @@ -396,8 +395,6 @@ fdm_delayed_render(struct fdm *fdm, int fd, int events, void *data) return false; struct terminal *term = data; - if (!term->delayed_render_timer.is_armed) - return true; uint64_t unused; ssize_t ret1 = 0; @@ -412,6 +409,9 @@ fdm_delayed_render(struct fdm *fdm, int fd, int events, void *data) if (errno == EAGAIN) return true; + if (!term->delayed_render_timer.is_armed) + return true; + LOG_ERRNO("failed to read timeout timer"); return false; } @@ -425,13 +425,15 @@ fdm_delayed_render(struct fdm *fdm, int fd, int events, void *data) last = (struct timespec){0}; #endif - render_refresh(term); - /* Reset timers */ struct itimerspec reset = {{0}}; timerfd_settime(term->delayed_render_timer.lower_fd, 0, &reset, NULL); timerfd_settime(term->delayed_render_timer.upper_fd, 0, &reset, NULL); - term->delayed_render_timer.is_armed = false; + + if (term->delayed_render_timer.is_armed) { + term->delayed_render_timer.is_armed = false; + render_refresh(term); + } return true; }