From d34c8007f164741b488063fe7cb44e8566e1cdf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Thu, 10 Feb 2022 18:27:20 +0100 Subject: [PATCH] =?UTF-8?q?osc:=20don=E2=80=99t=20damage=20the=20entire=20?= =?UTF-8?q?view=20on=20a=20single=20color=20palette=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead, loop the viewport and dirty only those cells that are affected by the palette change. --- osc.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/osc.c b/osc.c index 1167aedc..9c3b326a 100644 --- a/osc.c +++ b/osc.c @@ -614,7 +614,47 @@ osc_dispatch(struct terminal *term) idx, term->colors.table[idx], color); term->colors.table[idx] = color; - term_damage_view(term); + + /* Dirty visible, affected cells */ + for (int r = 0; r < term->rows; r++) { + struct row *row = grid_row_in_view(term->grid, r); + struct cell *cell = &row->cells[0]; + + for (int c = 0; c < term->cols; c++, cell++) { + bool dirty = false; + + switch (cell->attrs.fg_src) { + case COLOR_BASE16: + case COLOR_BASE256: + if (cell->attrs.fg == idx) + dirty = true; + break; + + case COLOR_DEFAULT: + case COLOR_RGB: + /* Not affected */ + break; + } + + switch (cell->attrs.bg_src) { + case COLOR_BASE16: + case COLOR_BASE256: + if (cell->attrs.bg == idx) + dirty = true; + break; + + case COLOR_DEFAULT: + case COLOR_RGB: + /* Not affected */ + break; + } + + if (dirty) { + cell->attrs.clean = 0; + row->dirty = true; + } + } + } } }