1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Fix changing colours in Change Settings.

Since ca9cd983e1, changing colour config mid-session had no effect
(until the palette was reset for some other reason). Now it does take
effect immediately (provided that the palette has not been overridden by
escape sequence -- this is new with ca9cd983e1).

This changes the semantics of palette_reset(): the only important
parameter when doing that is whether we keep escape sequence overrides
-- there's no harm in re-fetching config and platform colours whether or
not they've changed -- so that's what the parameter becomes (with a
sense that doesn't require changing the call sites). The other part of
this change is actually remembering to trigger this when the
configuration is changed.
This commit is contained in:
Jacob Nevins 2021-05-15 22:05:27 +01:00
parent 0c21eb4447
commit 1e726c94e8
3 changed files with 70 additions and 39 deletions

View File

@ -1790,7 +1790,7 @@ void term_keyinputw(Terminal *, const wchar_t * widebuf, int len);
void term_get_cursor_position(Terminal *term, int *x, int *y);
void term_setup_window_titles(Terminal *term, const char *title_hostname);
void term_notify_minimised(Terminal *term, bool minimised);
void term_notify_palette_overrides_changed(Terminal *term);
void term_notify_palette_changed(Terminal *term);
void term_notify_window_pos(Terminal *term, int x, int y);
void term_notify_window_size_pixels(Terminal *term, int x, int y);
void term_palette_override(Terminal *term, unsigned osc4_index, rgb rgb);

View File

@ -1629,6 +1629,7 @@ void term_reconfig(Terminal *term, Conf *conf)
* Mode, BCE, blinking text, character classes.
*/
bool reset_wrap, reset_decom, reset_bce, reset_tblink, reset_charclass;
bool palette_changed = false;
int i;
reset_wrap = (conf_get_bool(term->conf, CONF_wrap_mode) !=
@ -1674,6 +1675,29 @@ void term_reconfig(Terminal *term, Conf *conf)
}
}
/*
* Just setting conf is sufficient to cause colour setting changes
* to appear on the next ESC]R palette reset. But we should also
* check whether any colour settings have been changed, so that
* they can be updated immediately if they haven't been overridden
* by some escape sequence.
*/
{
int i, j;
for (i = 0; i < CONF_NCOLOURS; i++) {
for (j = 0; j < 3; j++)
if (conf_get_int_int(term->conf, CONF_colours, i*3+j) !=
conf_get_int_int(conf, CONF_colours, i*3+j))
break;
if (j < 3) {
/* Actually enacting the change has to be deferred
* until the new conf is installed. */
palette_changed = true;
break;
}
}
}
conf_free(term->conf);
term->conf = conf_copy(conf);
@ -1702,6 +1726,8 @@ void term_reconfig(Terminal *term, Conf *conf)
if (!conf_get_str(term->conf, CONF_printer)) {
term_print_finish(term);
}
if (palette_changed)
term_notify_palette_changed(term);
term_schedule_tblink(term);
term_schedule_cblink(term);
term_copy_stuff_from_conf(term);
@ -1829,44 +1855,41 @@ static void palette_rebuild(Terminal *term)
}
}
static void palette_reset(Terminal *term, bool overrides_only)
/*
* Rebuild the palette from configuration and platform colours.
* If 'keep_overrides' set, any escape-sequence-specified overrides will
* remain in place.
*/
static void palette_reset(Terminal *term, bool keep_overrides)
{
if (!overrides_only) {
for (unsigned i = 0; i < OSC4_NCOLOURS; i++)
term->subpalettes[SUBPAL_CONF].present[i] = true;
for (unsigned i = 0; i < OSC4_NCOLOURS; i++)
term->subpalettes[SUBPAL_CONF].present[i] = true;
/*
* Copy all the palette information out of the Conf.
*/
for (unsigned i = 0; i < CONF_NCOLOURS; i++) {
rgb *col = &term->subpalettes[SUBPAL_CONF].values[
colour_indices_conf_to_osc4[i]];
col->r = conf_get_int_int(term->conf, CONF_colours, i*3+0);
col->g = conf_get_int_int(term->conf, CONF_colours, i*3+1);
col->b = conf_get_int_int(term->conf, CONF_colours, i*3+2);
}
/*
* Copy all the palette information out of the Conf.
*/
for (unsigned i = 0; i < CONF_NCOLOURS; i++) {
rgb *col = &term->subpalettes[SUBPAL_CONF].values[
colour_indices_conf_to_osc4[i]];
col->r = conf_get_int_int(term->conf, CONF_colours, i*3+0);
col->g = conf_get_int_int(term->conf, CONF_colours, i*3+1);
col->b = conf_get_int_int(term->conf, CONF_colours, i*3+2);
}
/*
* Directly invent the rest of the xterm-256 colours.
*/
for (unsigned i = 0; i < 216; i++) {
rgb *col = &term->subpalettes[SUBPAL_CONF].values[i + 16];
int r = i / 36, g = (i / 6) % 6, b = i % 6;
col->r = r ? r * 40 + 55 : 0;
col->g = g ? g * 40 + 55 : 0;
col->b = b ? b * 40 + 55 : 0;
}
for (unsigned i = 0; i < 24; i++) {
rgb *col = &term->subpalettes[SUBPAL_CONF].values[i + 232];
int shade = i * 10 + 8;
col->r = col->g = col->b = shade;
}
/*
* Get rid of all escape-sequence configuration.
*/
for (unsigned i = 0; i < OSC4_NCOLOURS; i++)
term->subpalettes[SUBPAL_SESSION].present[i] = false;
/*
* Directly invent the rest of the xterm-256 colours.
*/
for (unsigned i = 0; i < 216; i++) {
rgb *col = &term->subpalettes[SUBPAL_CONF].values[i + 16];
int r = i / 36, g = (i / 6) % 6, b = i % 6;
col->r = r ? r * 40 + 55 : 0;
col->g = g ? g * 40 + 55 : 0;
col->b = b ? b * 40 + 55 : 0;
}
for (unsigned i = 0; i < 24; i++) {
rgb *col = &term->subpalettes[SUBPAL_CONF].values[i + 232];
int shade = i * 10 + 8;
col->r = col->g = col->b = shade;
}
/*
@ -1876,6 +1899,14 @@ static void palette_reset(Terminal *term, bool overrides_only)
term->subpalettes[SUBPAL_PLATFORM].present[i] = false;
win_palette_get_overrides(term->win, term);
if (!keep_overrides) {
/*
* Get rid of all escape-sequence configuration.
*/
for (unsigned i = 0; i < OSC4_NCOLOURS; i++)
term->subpalettes[SUBPAL_SESSION].present[i] = false;
}
/*
* Rebuild the composite palette.
*/
@ -7593,7 +7624,7 @@ void term_notify_minimised(Terminal *term, bool minimised)
term->minimised = minimised;
}
void term_notify_palette_overrides_changed(Terminal *term)
void term_notify_palette_changed(Terminal *term)
{
palette_reset(term, true);
}

View File

@ -2310,7 +2310,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
if (conf_get_bool(conf, CONF_system_colour) !=
conf_get_bool(prev_conf, CONF_system_colour))
term_notify_palette_overrides_changed(term);
term_notify_palette_changed(term);
/* Pass new config data to the terminal */
term_reconfig(term, conf);
@ -3300,7 +3300,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
case WM_SYSCOLORCHANGE:
if (conf_get_bool(conf, CONF_system_colour)) {
/* Refresh palette from system colours. */
term_notify_palette_overrides_changed(term);
term_notify_palette_changed(term);
init_palette();
/* Force a repaint of the terminal window. */
term_invalidate(term);