From c767d62329597b9152c0e1b33ba2656be8e0bced Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 2 Sep 2023 20:03:10 +0000 Subject: [PATCH] Request terminal colours again on SIGWINCH but at most once every 30 seconds, GitHub issue 3582. --- server-client.c | 1 + tmux.h | 6 +++--- tty-keys.c | 4 ---- tty.c | 26 ++++++++++++++++++++++---- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/server-client.c b/server-client.c index 0f26ad37..644d69e2 100644 --- a/server-client.c +++ b/server-client.c @@ -2770,6 +2770,7 @@ server_client_dispatch(struct imsg *imsg, void *arg) break; server_client_update_latest(c); tty_resize(&c->tty); + tty_repeat_requests(&c->tty); recalculate_sizes(); if (c->overlay_resize == NULL) server_client_clear_overlay(c); diff --git a/tmux.h b/tmux.h index 4ce4d1dd..0a842094 100644 --- a/tmux.h +++ b/tmux.h @@ -1386,6 +1386,7 @@ struct tty { struct client *client; struct event start_timer; struct event clipboard_timer; + time_t last_requests; u_int sx; u_int sy; @@ -1437,10 +1438,8 @@ struct tty { #define TTY_HAVEXDA 0x200 #define TTY_SYNCING 0x400 #define TTY_HAVEDA2 0x800 /* Secondary DA. */ -#define TTY_HAVEFG 0x1000 -#define TTY_HAVEBG 0x2000 #define TTY_ALL_REQUEST_FLAGS \ - (TTY_HAVEDA|TTY_HAVEDA2|TTY_HAVEXDA|TTY_HAVEFG|TTY_HAVEBG) + (TTY_HAVEDA|TTY_HAVEDA2|TTY_HAVEXDA) int flags; struct tty_term *term; @@ -2333,6 +2332,7 @@ void tty_resize(struct tty *); void tty_set_size(struct tty *, u_int, u_int, u_int, u_int); void tty_start_tty(struct tty *); void tty_send_requests(struct tty *); +void tty_repeat_requests(struct tty *); void tty_stop_tty(struct tty *); void tty_set_title(struct tty *, const char *); void tty_set_path(struct tty *, const char *); diff --git a/tty-keys.c b/tty-keys.c index e3000e5a..de5dd8f2 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -1492,8 +1492,6 @@ tty_keys_colours(struct tty *tty, const char *buf, size_t len, size_t *size) int n; *size = 0; - if ((tty->flags & TTY_HAVEFG) && (tty->flags & TTY_HAVEBG)) - return (-1); /* First four bytes are always \033]1 and 0 or 1 and ;. */ if (buf[0] != '\033') @@ -1539,11 +1537,9 @@ tty_keys_colours(struct tty *tty, const char *buf, size_t len, size_t *size) if (n != -1 && buf[3] == '0') { log_debug("%s: foreground is %s", c->name, colour_tostring(n)); tty->fg = n; - tty->flags |= TTY_HAVEFG; } else if (n != -1) { log_debug("%s: background is %s", c->name, colour_tostring(n)); tty->bg = n; - tty->flags |= TTY_HAVEBG; } return (0); diff --git a/tty.c b/tty.c index 4bcc68d9..8c576306 100644 --- a/tty.c +++ b/tty.c @@ -82,6 +82,7 @@ static void tty_check_overlay_range(struct tty *, u_int, u_int, u_int, #define TTY_BLOCK_STOP(tty) (1 + ((tty)->sx * (tty)->sy) / 8) #define TTY_QUERY_TIMEOUT 5 +#define TTY_REQUEST_LIMIT 30 void tty_create_log(void) @@ -369,12 +370,29 @@ tty_send_requests(struct tty *tty) tty_puts(tty, "\033[>c"); if (~tty->flags & TTY_HAVEXDA) tty_puts(tty, "\033[>q"); - if (~tty->flags & TTY_HAVEFG) - tty_puts(tty, "\033]10;?\033\\"); - if (~tty->flags & TTY_HAVEBG) - tty_puts(tty, "\033]11;?\033\\"); + tty_puts(tty, "\033]10;?\033\\"); + tty_puts(tty, "\033]11;?\033\\"); } else tty->flags |= TTY_ALL_REQUEST_FLAGS; + tty->last_requests = time (NULL); +} + +void +tty_repeat_requests(struct tty *tty) +{ + time_t t = time (NULL); + + if (~tty->flags & TTY_STARTED) + return; + + if (t - tty->last_requests <= TTY_REQUEST_LIMIT) + return; + tty->last_requests = t; + + if (tty->term->flags & TERM_VT100LIKE) { + tty_puts(tty, "\033]10;?\033\\"); + tty_puts(tty, "\033]11;?\033\\"); + } } void