From b79ed6f3e476a18e7fccb63af0c90b3b69cb5b84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 24 Mar 2020 17:41:33 +0100 Subject: [PATCH 1/2] term: delayed rendering: failure to read timers is always an error --- terminal.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) 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; } From be8b6e8c75683e912034dd69ec5a68bbc84605ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 24 Mar 2020 17:42:29 +0100 Subject: [PATCH 2/2] render: fdm refresh handler: don't clear pending flags The pending flags may already be set (from a previous call to the FDM hook). In this case, they should not be cleared. --- render.c | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/render.c b/render.c index 85879733..46e849a4 100644 --- a/render.c +++ b/render.c @@ -1455,30 +1455,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? */ @@ -1823,9 +1818,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; } }