From 233a909160e6e590e6947f9dbfcaa9d0e3c57729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 16 Mar 2020 17:05:44 +0100 Subject: [PATCH] term: ptmx: don't enqueue extra frame render when app sync updates have been changed Track whether app-sync updates were enabled or disabled while handling the current chunk of PTMX data. This fixes and issue where we called render_refresh() unnecessarily under (at least) the following conditions: * Application sent "BSU ESU" in the *same* chunk. In this case we never saw that app sync was enabled and triggered delayed rendering as usual. * Application sent ESU. While we had noticed app sync updates being enabled in earlier PTMX reads, when it was disabled *in the current* PTMX read, we treated it as if it had not been enabled at all. This caused us to trigger delayed rendering. Now we call render_refresh() directly from ESU, and detect the "flip off" case in PTMX read and avoid triggering a delayed rendering. The end result of all this is that each key press (for e.g. scrolling in a pager application) went from two frames being rendered, to a single frame. --- terminal.c | 14 ++++++++++++-- terminal.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/terminal.c b/terminal.c index 552b8d2a..bd55c41a 100644 --- a/terminal.c +++ b/terminal.c @@ -153,6 +153,8 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data) /* Prevent blinking while typing */ term_cursor_blink_restart(term); + term->render.app_sync_updates.flipped = false; + uint8_t buf[24 * 1024]; ssize_t count = sizeof(buf); @@ -198,8 +200,11 @@ fdm_ptmx(struct fdm *fdm, int fd, int events, void *data) * has any effect when the renderer is idle. */ if (term->window->frame_callback == NULL) { - if (term->render.app_sync_updates.enabled) - term->render.refresh.grid = true; + if (term->render.app_sync_updates.enabled || + term->render.app_sync_updates.flipped) + { + ; + } else { /* First timeout - reset each time we receive input. */ @@ -2032,6 +2037,9 @@ term_spawn_new(const struct terminal *term) void term_enable_app_sync_updates(struct terminal *term) { + if (!term->render.app_sync_updates.enabled) + term->render.app_sync_updates.flipped = true; + term->render.app_sync_updates.enabled = true; if (timerfd_settime( @@ -2057,6 +2065,8 @@ term_disable_app_sync_updates(struct terminal *term) return; term->render.app_sync_updates.enabled = false; + term->render.app_sync_updates.flipped = true; + render_refresh(term); /* Reset timers */ timerfd_settime( diff --git a/terminal.h b/terminal.h index 67785399..3685c0d7 100644 --- a/terminal.h +++ b/terminal.h @@ -350,6 +350,7 @@ struct terminal { struct { bool enabled; int timer_fd; + bool flipped; } app_sync_updates; /* Render threads + synchronization primitives */