diff --git a/render.c b/render.c index c4ea9bc6..e2e45430 100644 --- a/render.c +++ b/render.c @@ -1606,30 +1606,25 @@ frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_da wl_callback_destroy(wl_callback); term->window->frame_callback = NULL; - if (term->render.pending.csd) { - term->render.pending.csd = false; + bool grid = term->render.pending.grid; + bool csd = term->render.pending.csd; + bool search = term->render.pending.search; - if (term->window->use_csd == CSD_YES) { - quirk_weston_csd_on(term); - render_csd(term); - quirk_weston_csd_off(term); - } + term->render.pending.grid = false; + term->render.pending.csd = false; + term->render.pending.search = false; + + if (csd && term->window->use_csd == CSD_YES) { + quirk_weston_csd_on(term); + render_csd(term); + quirk_weston_csd_off(term); } - if (term->render.pending.search) { - term->render.pending.search = false; + if (search && term->is_searching) + render_search_box(term); - if (term->is_searching) - render_search_box(term); - } - - if (term->render.pending.grid) { - term->render.pending.grid = false; - - /* TODO: need to check if this breaks GNOME/weston */ - if (!term->delayed_render_timer.is_armed) - grid_render(term); - } + if (grid && (!term->delayed_render_timer.is_armed || csd || search)) + grid_render(term); } /* Move to terminal.c? */ @@ -1974,9 +1969,9 @@ fdm_hook_refresh_pending_terminals(struct fdm *fdm, void *data) grid_render(term); } else { /* Tells the frame callback to render again */ - term->render.pending.grid = grid; - term->render.pending.csd = csd; - term->render.pending.search = search; + term->render.pending.grid |= grid; + term->render.pending.csd |= csd; + term->render.pending.search |= search; } } diff --git a/terminal.c b/terminal.c index bac6e232..36f0e42b 100644 --- a/terminal.c +++ b/terminal.c @@ -409,9 +409,6 @@ 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; } @@ -421,6 +418,9 @@ fdm_delayed_render(struct fdm *fdm, int fd, int events, void *data) else if (ret2 > 0) LOG_DBG("upper delay timer expired"); + if (ret1 == 0 && ret2 == 0) + return true; + #if PTMX_TIMING last = (struct timespec){0}; #endif @@ -429,12 +429,9 @@ fdm_delayed_render(struct fdm *fdm, int fd, int events, void *data) 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); - } - + render_refresh(term); return true; }