Request terminal colours again on SIGWINCH but at most once every 30

seconds, GitHub issue 3582.
This commit is contained in:
nicm 2023-09-02 20:03:10 +00:00
parent d209fe9b1e
commit c767d62329
4 changed files with 26 additions and 11 deletions

View File

@ -2770,6 +2770,7 @@ server_client_dispatch(struct imsg *imsg, void *arg)
break; break;
server_client_update_latest(c); server_client_update_latest(c);
tty_resize(&c->tty); tty_resize(&c->tty);
tty_repeat_requests(&c->tty);
recalculate_sizes(); recalculate_sizes();
if (c->overlay_resize == NULL) if (c->overlay_resize == NULL)
server_client_clear_overlay(c); server_client_clear_overlay(c);

6
tmux.h
View File

@ -1386,6 +1386,7 @@ struct tty {
struct client *client; struct client *client;
struct event start_timer; struct event start_timer;
struct event clipboard_timer; struct event clipboard_timer;
time_t last_requests;
u_int sx; u_int sx;
u_int sy; u_int sy;
@ -1437,10 +1438,8 @@ struct tty {
#define TTY_HAVEXDA 0x200 #define TTY_HAVEXDA 0x200
#define TTY_SYNCING 0x400 #define TTY_SYNCING 0x400
#define TTY_HAVEDA2 0x800 /* Secondary DA. */ #define TTY_HAVEDA2 0x800 /* Secondary DA. */
#define TTY_HAVEFG 0x1000
#define TTY_HAVEBG 0x2000
#define TTY_ALL_REQUEST_FLAGS \ #define TTY_ALL_REQUEST_FLAGS \
(TTY_HAVEDA|TTY_HAVEDA2|TTY_HAVEXDA|TTY_HAVEFG|TTY_HAVEBG) (TTY_HAVEDA|TTY_HAVEDA2|TTY_HAVEXDA)
int flags; int flags;
struct tty_term *term; 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_set_size(struct tty *, u_int, u_int, u_int, u_int);
void tty_start_tty(struct tty *); void tty_start_tty(struct tty *);
void tty_send_requests(struct tty *); void tty_send_requests(struct tty *);
void tty_repeat_requests(struct tty *);
void tty_stop_tty(struct tty *); void tty_stop_tty(struct tty *);
void tty_set_title(struct tty *, const char *); void tty_set_title(struct tty *, const char *);
void tty_set_path(struct tty *, const char *); void tty_set_path(struct tty *, const char *);

View File

@ -1492,8 +1492,6 @@ tty_keys_colours(struct tty *tty, const char *buf, size_t len, size_t *size)
int n; int n;
*size = 0; *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 ;. */ /* First four bytes are always \033]1 and 0 or 1 and ;. */
if (buf[0] != '\033') 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') { if (n != -1 && buf[3] == '0') {
log_debug("%s: foreground is %s", c->name, colour_tostring(n)); log_debug("%s: foreground is %s", c->name, colour_tostring(n));
tty->fg = n; tty->fg = n;
tty->flags |= TTY_HAVEFG;
} else if (n != -1) { } else if (n != -1) {
log_debug("%s: background is %s", c->name, colour_tostring(n)); log_debug("%s: background is %s", c->name, colour_tostring(n));
tty->bg = n; tty->bg = n;
tty->flags |= TTY_HAVEBG;
} }
return (0); return (0);

26
tty.c
View File

@ -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_BLOCK_STOP(tty) (1 + ((tty)->sx * (tty)->sy) / 8)
#define TTY_QUERY_TIMEOUT 5 #define TTY_QUERY_TIMEOUT 5
#define TTY_REQUEST_LIMIT 30
void void
tty_create_log(void) tty_create_log(void)
@ -369,12 +370,29 @@ tty_send_requests(struct tty *tty)
tty_puts(tty, "\033[>c"); tty_puts(tty, "\033[>c");
if (~tty->flags & TTY_HAVEXDA) if (~tty->flags & TTY_HAVEXDA)
tty_puts(tty, "\033[>q"); tty_puts(tty, "\033[>q");
if (~tty->flags & TTY_HAVEFG) tty_puts(tty, "\033]10;?\033\\");
tty_puts(tty, "\033]10;?\033\\"); tty_puts(tty, "\033]11;?\033\\");
if (~tty->flags & TTY_HAVEBG)
tty_puts(tty, "\033]11;?\033\\");
} else } else
tty->flags |= TTY_ALL_REQUEST_FLAGS; 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 void