From 2488c3935bbd0cb8e920f294b31deec13cfb89bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 1 Sep 2020 07:33:44 +0200 Subject: [PATCH 1/3] render: implement render_refresh_margins() For now, it will reset term->render.last_buf to NULL, and then calls grid_render() to do a full screen refresh. --- render.c | 24 ++++++++++++++++++++++-- render.h | 1 + terminal.h | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/render.c b/render.c index db60e7ca..7910b0c5 100644 --- a/render.c +++ b/render.c @@ -1932,11 +1932,13 @@ frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_da term->window->frame_callback = NULL; bool grid = term->render.pending.grid; + bool margins = term->render.pending.margins; bool csd = term->render.pending.csd; bool search = term->render.pending.search; bool title = term->render.pending.title; term->render.pending.grid = false; + term->render.pending.margins = false; term->render.pending.csd = false; term->render.pending.search = false; term->render.pending.title = false; @@ -1953,8 +1955,14 @@ frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_da if (search && term->is_searching) render_search_box(term); - if (grid && (!term->delayed_render_timer.is_armed || csd || search)) + if (margins) + term->render.last_buf = NULL; + + if ((grid || margins) && + (!term->delayed_render_timer.is_armed || csd || search)) + { grid_render(term); + } } /* Move to terminal.c? */ @@ -2265,16 +2273,21 @@ fdm_hook_refresh_pending_terminals(struct fdm *fdm, void *data) assert(term->window->is_configured); bool grid = term->render.refresh.grid; + bool margins = term->render.refresh.margins; bool csd = term->render.refresh.csd; bool search = term->render.refresh.search; bool title = term->render.refresh.title; term->render.refresh.grid = false; + term->render.refresh.margins = false; term->render.refresh.csd = false; term->render.refresh.search = false; term->render.refresh.title = false; if (term->window->frame_callback == NULL) { + if (margins) + term->render.last_buf = NULL; + if (csd && term->window->use_csd == CSD_YES) { quirk_weston_csd_on(term); render_csd(term); @@ -2284,11 +2297,12 @@ fdm_hook_refresh_pending_terminals(struct fdm *fdm, void *data) render_update_title(term); if (search) render_search_box(term); - if (grid) + if (grid || margins) grid_render(term); } else { /* Tells the frame callback to render again */ term->render.pending.grid |= grid; + term->render.pending.margins |= margins; term->render.pending.csd |= csd; term->render.pending.search |= search; term->render.pending.title |= title; @@ -2319,6 +2333,12 @@ render_refresh(struct terminal *term) term->render.refresh.grid = true; } +void +render_refresh_margins(struct terminal *term) +{ + term->render.refresh.margins = true; +} + void render_refresh_csd(struct terminal *term) { diff --git a/render.h b/render.h index 05c79322..3f8cf540 100644 --- a/render.h +++ b/render.h @@ -13,6 +13,7 @@ bool render_resize(struct terminal *term, int width, int height); bool render_resize_force(struct terminal *term, int width, int height); void render_refresh(struct terminal *term); +void render_refresh_margins(struct terminal *term); void render_refresh_csd(struct terminal *term); void render_refresh_search(struct terminal *term); void render_refresh_title(struct terminal *term); diff --git a/terminal.h b/terminal.h index 4318f889..12e93ce2 100644 --- a/terminal.h +++ b/terminal.h @@ -373,6 +373,7 @@ struct terminal { /* Scheduled for rendering, as soon-as-possible */ struct { bool grid; + bool margins; bool csd; bool search; bool title; @@ -381,6 +382,7 @@ struct terminal { /* Scheduled for rendering, in the next frame callback */ struct { bool grid; + bool margins; bool csd; bool search; bool title; From d579c0e1e4f1cfd6d54a80e69c763003d337125a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 1 Sep 2020 07:34:41 +0200 Subject: [PATCH 2/3] osc: explicitly refresh margins on a background color change --- osc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osc.c b/osc.c index dcfaf524..50d6ab3b 100644 --- a/osc.c +++ b/osc.c @@ -619,6 +619,7 @@ osc_dispatch(struct terminal *term) term_damage_view(term); render_refresh(term); + render_refresh_margins(term); break; } @@ -706,6 +707,7 @@ osc_dispatch(struct terminal *term) term->colors.bg = term->colors.default_bg; term_damage_view(term); render_refresh(term); + render_refresh_margins(term); break; case 112: From b76d1965698d6c520b0b3c8733fa620d0eb193e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 1 Sep 2020 08:01:48 +0200 Subject: [PATCH 3/3] =?UTF-8?q?render:=20=E2=80=99redraw=5Fmargins?= =?UTF-8?q?=E2=80=99=20is=20now=20a=20parameter=20to=20grid=5Frender()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit render_refresh_margins() now passes ’true’ here, instead of re-setting term->render.last_buf to NULL. --- render.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/render.c b/render.c index 7910b0c5..08caabc7 100644 --- a/render.c +++ b/render.c @@ -1535,7 +1535,7 @@ static const struct wl_callback_listener frame_listener = { }; static void -grid_render(struct terminal *term) +grid_render(struct terminal *term, bool redraw_margins) { if (term->is_shutting_down) return; @@ -1554,14 +1554,16 @@ grid_render(struct terminal *term) /* If we resized the window, or is flashing, or just stopped flashing */ if (term->render.last_buf != buf || term->flash.active || term->render.was_flashing || - term->is_searching != term->render.was_searching) + term->is_searching != term->render.was_searching || + redraw_margins) { if (term->render.last_buf != NULL && term->render.last_buf->width == buf->width && term->render.last_buf->height == buf->height && !term->flash.active && !term->render.was_flashing && - term->is_searching == term->render.was_searching) + term->is_searching == term->render.was_searching && + !redraw_margins) { static bool has_warned = false; if (!has_warned) { @@ -1955,13 +1957,10 @@ frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_da if (search && term->is_searching) render_search_box(term); - if (margins) - term->render.last_buf = NULL; - if ((grid || margins) && (!term->delayed_render_timer.is_armed || csd || search)) { - grid_render(term); + grid_render(term, margins); } } @@ -2285,9 +2284,6 @@ fdm_hook_refresh_pending_terminals(struct fdm *fdm, void *data) term->render.refresh.title = false; if (term->window->frame_callback == NULL) { - if (margins) - term->render.last_buf = NULL; - if (csd && term->window->use_csd == CSD_YES) { quirk_weston_csd_on(term); render_csd(term); @@ -2298,7 +2294,7 @@ fdm_hook_refresh_pending_terminals(struct fdm *fdm, void *data) if (search) render_search_box(term); if (grid || margins) - grid_render(term); + grid_render(term, margins); } else { /* Tells the frame callback to render again */ term->render.pending.grid |= grid;