From d73078838dc9cadb42e0f4762847806076684cc8 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 27 Mar 2023 08:31:32 +0000 Subject: [PATCH 1/9] For passthrough, don't write to clients attached to different sessions, based on a fix from Sergei Grechanik. --- screen-write.c | 6 ++++++ tty.c | 27 ++++++++++++++------------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/screen-write.c b/screen-write.c index b82a43dc..8a440052 100644 --- a/screen-write.c +++ b/screen-write.c @@ -132,6 +132,12 @@ screen_write_set_client_cb(struct tty_ctx *ttyctx, struct client *c) { struct window_pane *wp = ttyctx->arg; + if (ttyctx->allow_invisible_panes) { + if (session_has(c->session, wp->window)) + return (1); + return (0); + } + if (c->session->curw->window != wp->window) return (0); if (wp->layout_cell == NULL) diff --git a/tty.c b/tty.c index c8a2a6ee..62707f2a 100644 --- a/tty.c +++ b/tty.c @@ -34,8 +34,6 @@ static int tty_log_fd = -1; -static int tty_client_ready(struct client *); - static void tty_set_italics(struct tty *); static int tty_try_colour(struct tty *, int, const char *); static void tty_force_cursor_colour(struct tty *, int); @@ -1607,11 +1605,21 @@ tty_sync_end(struct tty *tty) } static int -tty_client_ready(struct client *c) +tty_client_ready(const struct tty_ctx *ctx, struct client *c) { if (c->session == NULL || c->tty.term == NULL) return (0); - if (c->flags & (CLIENT_REDRAWWINDOW|CLIENT_SUSPENDED)) + if (c->flags & CLIENT_SUSPENDED) + return (0); + + /* + * If invisible panes are allowed (used for passthrough), don't care if + * redrawing or frozen. + */ + if (ctx->allow_invisible_panes) + return (1); + + if (c->flags & CLIENT_REDRAWWINDOW) return (0); if (c->tty.flags & TTY_FREEZE) return (0); @@ -1628,21 +1636,14 @@ tty_write(void (*cmdfn)(struct tty *, const struct tty_ctx *), if (ctx->set_client_cb == NULL) return; TAILQ_FOREACH(c, &clients, entry) { - if (ctx->allow_invisible_panes) { - if (c->session == NULL || - c->tty.term == NULL || - c->flags & CLIENT_SUSPENDED) - continue; - } else { - if (!tty_client_ready(c)) - continue; + if (tty_client_ready(ctx, c)) { state = ctx->set_client_cb(ctx, c); if (state == -1) break; if (state == 0) continue; + cmdfn(&c->tty, ctx); } - cmdfn(&c->tty, ctx); } } From c21af7e446beafd27a7a0384186bc480fd2e126d Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 27 Mar 2023 08:47:57 +0000 Subject: [PATCH 2/9] Add a format to show if there are unseen changes while in a mode, from Dan Aloni in GitHub issue 3498. --- format.c | 15 +++++++++++++++ input.c | 4 ++++ tmux.1 | 1 + tmux.h | 1 + window.c | 1 + 5 files changed, 22 insertions(+) diff --git a/format.c b/format.c index 2e1787ef..dec4022a 100644 --- a/format.c +++ b/format.c @@ -1885,6 +1885,18 @@ format_cb_pane_input_off(struct format_tree *ft) return (NULL); } +/* Callback for pane_unseen_changes. */ +static void * +format_cb_pane_unseen_changes(struct format_tree *ft) +{ + if (ft->wp != NULL) { + if (ft->wp->flags & PANE_UNSEENCHANGES) + return (xstrdup("1")); + return (xstrdup("0")); + } + return (NULL); +} + /* Callback for pane_last. */ static void * format_cb_pane_last(struct format_tree *ft) @@ -2953,6 +2965,9 @@ static const struct format_table_entry format_table[] = { { "pane_tty", FORMAT_TABLE_STRING, format_cb_pane_tty }, + { "pane_unseen_changes", FORMAT_TABLE_STRING, + format_cb_pane_unseen_changes + }, { "pane_width", FORMAT_TABLE_STRING, format_cb_pane_width }, diff --git a/input.c b/input.c index adbea179..5a14104b 100644 --- a/input.c +++ b/input.c @@ -971,6 +971,10 @@ input_parse_buffer(struct window_pane *wp, u_char *buf, size_t len) window_update_activity(wp->window); wp->flags |= PANE_CHANGED; + /* Flag new input while in a mode. */ + if (!TAILQ_EMPTY(&wp->modes)) + wp->flags |= PANE_UNSEENCHANGES; + /* NULL wp if there is a mode set as don't want to update the tty. */ if (TAILQ_EMPTY(&wp->modes)) screen_write_start_pane(sctx, wp, &wp->base); diff --git a/tmux.1 b/tmux.1 index 7c568ef6..071e3f11 100644 --- a/tmux.1 +++ b/tmux.1 @@ -5257,6 +5257,7 @@ The following variables are available, where appropriate: .It Li "pane_title" Ta "#T" Ta "Title of pane (can be set by application)" .It Li "pane_top" Ta "" Ta "Top of pane" .It Li "pane_tty" Ta "" Ta "Pseudo terminal of pane" +.It Li "pane_unseen_changes" Ta "" Ta "1 if there were changes in pane while in mode" .It Li "pane_width" Ta "" Ta "Width of pane" .It Li "pid" Ta "" Ta "Server PID" .It Li "rectangle_toggle" Ta "" Ta "1 if rectangle selection is activated" diff --git a/tmux.h b/tmux.h index 3a389948..a422ed83 100644 --- a/tmux.h +++ b/tmux.h @@ -1045,6 +1045,7 @@ struct window_pane { #define PANE_STATUSDRAWN 0x400 #define PANE_EMPTY 0x800 #define PANE_STYLECHANGED 0x1000 +#define PANE_UNSEENCHANGES 0x2000 int argc; char **argv; diff --git a/window.c b/window.c index 0fd71c74..8f650a96 100644 --- a/window.c +++ b/window.c @@ -1120,6 +1120,7 @@ window_pane_reset_mode(struct window_pane *wp) next = TAILQ_FIRST(&wp->modes); if (next == NULL) { + wp->flags &= ~PANE_UNSEENCHANGES; log_debug("%s: no next mode", __func__); wp->screen = &wp->base; } else { From a2018b2c3ffd488824c599c340c2c67095f04919 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 3 Apr 2023 07:39:37 +0000 Subject: [PATCH 3/9] Clarify text for new -A slightly, GitHub issue 3508. --- tmux.1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tmux.1 b/tmux.1 index 071e3f11..30c655eb 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1278,7 +1278,10 @@ behave like .Ic attach-session if .Ar session-name -already exists; in this case, +already exists; +if +.Fl A +is given, .Fl D behaves like .Fl d From 280fe77eddc877f3d0a58ad3195a1e5856ac91c4 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 17 Apr 2023 17:57:35 +0000 Subject: [PATCH 4/9] Discard mouse sequences that have the right form but actually are invalid (for example have column zero rather than one). --- tty-keys.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tty-keys.c b/tty-keys.c index 5677f133..25956c4d 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -1008,7 +1008,8 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len, /* * Handle mouse key input. Returns 0 for success, -1 for failure, 1 for partial - * (probably a mouse sequence but need more data). + * (probably a mouse sequence but need more data), -2 if an invalid mouse + * sequence. */ static int tty_keys_mouse(struct tty *tty, const char *buf, size_t len, size_t *size, @@ -1069,7 +1070,7 @@ tty_keys_mouse(struct tty *tty, const char *buf, size_t len, size_t *size, if (b < MOUSE_PARAM_BTN_OFF || x < MOUSE_PARAM_POS_OFF || y < MOUSE_PARAM_POS_OFF) - return (-1); + return (-2); b -= MOUSE_PARAM_BTN_OFF; x -= MOUSE_PARAM_POS_OFF; y -= MOUSE_PARAM_POS_OFF; @@ -1111,7 +1112,7 @@ tty_keys_mouse(struct tty *tty, const char *buf, size_t len, size_t *size, /* Check and return the mouse input. */ if (x < 1 || y < 1) - return (-1); + return (-2); x--; y--; b = sgr_b; From bcafe51378b1b16a9a9429d9ad074d5a5d700144 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 17 Apr 2023 17:58:35 +0000 Subject: [PATCH 5/9] Make the check if printing is allowed the same as writing which is less confusing. --- file.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/file.c b/file.c index 6c83caac..91698a4c 100644 --- a/file.c +++ b/file.c @@ -177,9 +177,9 @@ file_fire_read(struct client_file *cf) int file_can_print(struct client *c) { - if (c == NULL) - return (0); - if (c->session != NULL && (~c->flags & CLIENT_CONTROL)) + if (c == NULL || + (c->flags & CLIENT_ATTACHED) || + (c->flags & CLIENT_CONTROL)) return (0); return (1); } From 9f605178c375b3722408c241a93f6d18090eead1 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 17 Apr 2023 18:00:19 +0000 Subject: [PATCH 6/9] It seems silly to use progname for version, just always say tmux. --- tmux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmux.c b/tmux.c index 0d752221..39856136 100644 --- a/tmux.c +++ b/tmux.c @@ -401,7 +401,7 @@ main(int argc, char **argv) cfg_quiet = 0; break; case 'V': - printf("%s %s\n", getprogname(), getversion()); + printf("tmux %s\n", getversion()); exit(0); case 'l': flags |= CLIENT_LOGIN; From 48eba4c195165fb0f51afeb8b1eb56739b31431d Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 17 Apr 2023 18:22:24 +0000 Subject: [PATCH 7/9] Ignore the user keys range when checking if a key is Unicode. --- status.c | 2 -- tmux.h | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/status.c b/status.c index 08952f58..2bb42c0c 100644 --- a/status.c +++ b/status.c @@ -1471,8 +1471,6 @@ process_key: return (0); append_key: - if (key <= 0x1f || (key >= KEYC_BASE && key < KEYC_BASE_END)) - return (0); if (key <= 0x7f) utf8_set(&tmp, key); else if (KEYC_IS_UNICODE(key)) diff --git a/tmux.h b/tmux.h index a422ed83..5ea6c315 100644 --- a/tmux.h +++ b/tmux.h @@ -157,7 +157,9 @@ struct winlink; #define KEYC_IS_UNICODE(key) \ (((key) & KEYC_MASK_KEY) > 0x7f && \ (((key) & KEYC_MASK_KEY) < KEYC_BASE || \ - ((key) & KEYC_MASK_KEY) >= KEYC_BASE_END)) + ((key) & KEYC_MASK_KEY) >= KEYC_BASE_END) && \ + (((key) & KEYC_MASK_KEY) < KEYC_USER || \ + ((key) & KEYC_MASK_KEY) >= KEYC_USER + KEYC_NUSER)) /* Multiple click timeout. */ #define KEYC_CLICK_TIMEOUT 300 From 551e0c36d95b1a9de1febf8f062fdc9d64b682df Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 25 Apr 2023 09:24:44 +0000 Subject: [PATCH 8/9] Invalidate cached tty state after changing features since they may change what the terminal can do and need mouse sequences or similar to be sent again, GitHub issue 3513. --- tty.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tty.c b/tty.c index 62707f2a..1003c6b0 100644 --- a/tty.c +++ b/tty.c @@ -482,6 +482,8 @@ tty_update_features(struct tty *tty) tty_puts(tty, tty_term_string(tty->term, TTYC_ENFCS)); if (tty->term->flags & TERM_VT100LIKE) tty_puts(tty, "\033[?7727h"); + + tty_invalidate(tty); } void From 8f34504736cf3547992c4ba948c1e65f3813715c Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 25 Apr 2023 09:31:50 +0000 Subject: [PATCH 9/9] Tidy tparm wrapper functions to have more obvious names and check tparm return value. --- tmux.h | 26 +++++------ tty-term.c | 47 +++++++++++++++----- tty.c | 124 ++++++++++++++++++++++++++--------------------------- 3 files changed, 111 insertions(+), 86 deletions(-) diff --git a/tmux.h b/tmux.h index 5ea6c315..11d8b26c 100644 --- a/tmux.h +++ b/tmux.h @@ -2296,12 +2296,12 @@ void tty_margin_off(struct tty *); void tty_cursor(struct tty *, u_int, u_int); void tty_clipboard_query(struct tty *); void tty_putcode(struct tty *, enum tty_code_code); -void tty_putcode1(struct tty *, enum tty_code_code, int); -void tty_putcode2(struct tty *, enum tty_code_code, int, int); -void tty_putcode3(struct tty *, enum tty_code_code, int, int, int); -void tty_putcode_ptr1(struct tty *, enum tty_code_code, const void *); -void tty_putcode_ptr2(struct tty *, enum tty_code_code, const void *, - const void *); +void tty_putcode_i(struct tty *, enum tty_code_code, int); +void tty_putcode_ii(struct tty *, enum tty_code_code, int, int); +void tty_putcode_iii(struct tty *, enum tty_code_code, int, int, int); +void tty_putcode_s(struct tty *, enum tty_code_code, const char *); +void tty_putcode_ss(struct tty *, enum tty_code_code, const char *, + const char *); void tty_puts(struct tty *, const char *); void tty_putc(struct tty *, u_char); void tty_putn(struct tty *, const void *, size_t, u_int); @@ -2365,15 +2365,15 @@ int tty_term_read_list(const char *, int, char ***, u_int *, void tty_term_free_list(char **, u_int); int tty_term_has(struct tty_term *, enum tty_code_code); const char *tty_term_string(struct tty_term *, enum tty_code_code); -const char *tty_term_string1(struct tty_term *, enum tty_code_code, int); -const char *tty_term_string2(struct tty_term *, enum tty_code_code, int, +const char *tty_term_string_i(struct tty_term *, enum tty_code_code, int); +const char *tty_term_string_ii(struct tty_term *, enum tty_code_code, int, int); -const char *tty_term_string3(struct tty_term *, enum tty_code_code, int, +const char *tty_term_string_iii(struct tty_term *, enum tty_code_code, int, int, int); -const char *tty_term_ptr1(struct tty_term *, enum tty_code_code, - const void *); -const char *tty_term_ptr2(struct tty_term *, enum tty_code_code, - const void *, const void *); +const char *tty_term_string_s(struct tty_term *, enum tty_code_code, + const char *); +const char *tty_term_string_ss(struct tty_term *, enum tty_code_code, + const char *, const char *); int tty_term_number(struct tty_term *, enum tty_code_code); int tty_term_flag(struct tty_term *, enum tty_code_code); const char *tty_term_describe(struct tty_term *, enum tty_code_code); diff --git a/tty-term.c b/tty-term.c index 7998f657..94d2f66c 100644 --- a/tty-term.c +++ b/tty-term.c @@ -754,35 +754,60 @@ tty_term_string(struct tty_term *term, enum tty_code_code code) } const char * -tty_term_string1(struct tty_term *term, enum tty_code_code code, int a) +tty_term_string_i(struct tty_term *term, enum tty_code_code code, int a) { - return (tparm((char *) tty_term_string(term, code), a)); + const char *x = tty_term_string(term, code), *s; + + s = tparm((char *)x, a); + if (s == NULL) + fatalx("could not expand %s", tty_term_codes[code].name); + return (s); } const char * -tty_term_string2(struct tty_term *term, enum tty_code_code code, int a, int b) +tty_term_string_ii(struct tty_term *term, enum tty_code_code code, int a, int b) { - return (tparm((char *) tty_term_string(term, code), a, b)); + const char *x = tty_term_string(term, code), *s; + + s = tparm((char *)x, a, b); + if (s == NULL) + fatalx("could not expand %s", tty_term_codes[code].name); + return (s); } const char * -tty_term_string3(struct tty_term *term, enum tty_code_code code, int a, int b, +tty_term_string_iii(struct tty_term *term, enum tty_code_code code, int a, int b, int c) { - return (tparm((char *) tty_term_string(term, code), a, b, c)); + const char *x = tty_term_string(term, code), *s; + + s = tparm((char *)x, a, b, c); + if (s == NULL) + fatalx("could not expand %s", tty_term_codes[code].name); + return (s); } const char * -tty_term_ptr1(struct tty_term *term, enum tty_code_code code, const void *a) +tty_term_string_s(struct tty_term *term, enum tty_code_code code, const char *a) { - return (tparm((char *) tty_term_string(term, code), a)); + const char *x = tty_term_string(term, code), *s; + + s = tparm((char *)x, (long)a); + if (s == NULL) + fatalx("could not expand %s", tty_term_codes[code].name); + return (s); } const char * -tty_term_ptr2(struct tty_term *term, enum tty_code_code code, const void *a, - const void *b) +tty_term_string_ss(struct tty_term *term, enum tty_code_code code, const char *a, + const char *b) { - return (tparm((char *) tty_term_string(term, code), a, b)); + const char *x = tty_term_string(term, code), *s; + + s = tparm((char *)x, (long)a, (long)b); + if (s == NULL) + fatalx("could not expand %s", tty_term_codes[code].name); + return (s); } int diff --git a/tty.c b/tty.c index 1003c6b0..225d0058 100644 --- a/tty.c +++ b/tty.c @@ -405,7 +405,7 @@ tty_stop_tty(struct tty *tty) if (tcsetattr(c->fd, TCSANOW, &tty->tio) == -1) return; - tty_raw(tty, tty_term_string2(tty->term, TTYC_CSR, 0, ws.ws_row - 1)); + tty_raw(tty, tty_term_string_ii(tty->term, TTYC_CSR, 0, ws.ws_row - 1)); if (tty_acs_needed(tty)) tty_raw(tty, tty_term_string(tty->term, TTYC_RMACS)); tty_raw(tty, tty_term_string(tty->term, TTYC_SGR0)); @@ -415,7 +415,7 @@ tty_stop_tty(struct tty *tty) if (tty_term_has(tty->term, TTYC_SE)) tty_raw(tty, tty_term_string(tty->term, TTYC_SE)); else if (tty_term_has(tty->term, TTYC_SS)) - tty_raw(tty, tty_term_string1(tty->term, TTYC_SS, 0)); + tty_raw(tty, tty_term_string_i(tty->term, TTYC_SS, 0)); } if (tty->ccolour != -1) tty_raw(tty, tty_term_string(tty->term, TTYC_CR)); @@ -514,42 +514,42 @@ tty_putcode(struct tty *tty, enum tty_code_code code) } void -tty_putcode1(struct tty *tty, enum tty_code_code code, int a) +tty_putcode_i(struct tty *tty, enum tty_code_code code, int a) { if (a < 0) return; - tty_puts(tty, tty_term_string1(tty->term, code, a)); + tty_puts(tty, tty_term_string_i(tty->term, code, a)); } void -tty_putcode2(struct tty *tty, enum tty_code_code code, int a, int b) +tty_putcode_ii(struct tty *tty, enum tty_code_code code, int a, int b) { if (a < 0 || b < 0) return; - tty_puts(tty, tty_term_string2(tty->term, code, a, b)); + tty_puts(tty, tty_term_string_ii(tty->term, code, a, b)); } void -tty_putcode3(struct tty *tty, enum tty_code_code code, int a, int b, int c) +tty_putcode_iii(struct tty *tty, enum tty_code_code code, int a, int b, int c) { if (a < 0 || b < 0 || c < 0) return; - tty_puts(tty, tty_term_string3(tty->term, code, a, b, c)); + tty_puts(tty, tty_term_string_iii(tty->term, code, a, b, c)); } void -tty_putcode_ptr1(struct tty *tty, enum tty_code_code code, const void *a) +tty_putcode_s(struct tty *tty, enum tty_code_code code, const char *a) { if (a != NULL) - tty_puts(tty, tty_term_ptr1(tty->term, code, a)); + tty_puts(tty, tty_term_string_s(tty->term, code, a)); } void -tty_putcode_ptr2(struct tty *tty, enum tty_code_code code, const void *a, - const void *b) +tty_putcode_ss(struct tty *tty, enum tty_code_code code, const char *a, + const char *b) { if (a != NULL && b != NULL) - tty_puts(tty, tty_term_ptr2(tty->term, code, a, b)); + tty_puts(tty, tty_term_string_ss(tty->term, code, a, b)); } static void @@ -611,7 +611,7 @@ tty_putc(struct tty *tty, u_char ch) * it works on sensible terminals as well. */ if (tty->term->flags & TERM_NOAM) - tty_putcode2(tty, TTYC_CUP, tty->cy, tty->cx); + tty_putcode_ii(tty, TTYC_CUP, tty->cy, tty->cx); } else tty->cx++; } @@ -690,7 +690,7 @@ tty_force_cursor_colour(struct tty *tty, int c) else { colour_split_rgb(c, &r, &g, &b); xsnprintf(s, sizeof s, "rgb:%02hhx/%02hhx/%02hhx", r, g, b); - tty_putcode_ptr1(tty, TTYC_CS, s); + tty_putcode_s(tty, TTYC_CS, s); } tty->ccolour = c; } @@ -751,7 +751,7 @@ tty_update_cursor(struct tty *tty, int mode, struct screen *s) if (tty_term_has(tty->term, TTYC_SE)) tty_putcode(tty, TTYC_SE); else - tty_putcode1(tty, TTYC_SS, 0); + tty_putcode_i(tty, TTYC_SS, 0); } if (cmode & (MODE_CURSOR_BLINKING|MODE_CURSOR_VERY_VISIBLE)) tty_putcode(tty, TTYC_CVVIS); @@ -759,27 +759,27 @@ tty_update_cursor(struct tty *tty, int mode, struct screen *s) case SCREEN_CURSOR_BLOCK: if (tty_term_has(tty->term, TTYC_SS)) { if (cmode & MODE_CURSOR_BLINKING) - tty_putcode1(tty, TTYC_SS, 1); + tty_putcode_i(tty, TTYC_SS, 1); else - tty_putcode1(tty, TTYC_SS, 2); + tty_putcode_i(tty, TTYC_SS, 2); } else if (cmode & MODE_CURSOR_BLINKING) tty_putcode(tty, TTYC_CVVIS); break; case SCREEN_CURSOR_UNDERLINE: if (tty_term_has(tty->term, TTYC_SS)) { if (cmode & MODE_CURSOR_BLINKING) - tty_putcode1(tty, TTYC_SS, 3); + tty_putcode_i(tty, TTYC_SS, 3); else - tty_putcode1(tty, TTYC_SS, 4); + tty_putcode_i(tty, TTYC_SS, 4); } else if (cmode & MODE_CURSOR_BLINKING) tty_putcode(tty, TTYC_CVVIS); break; case SCREEN_CURSOR_BAR: if (tty_term_has(tty->term, TTYC_SS)) { if (cmode & MODE_CURSOR_BLINKING) - tty_putcode1(tty, TTYC_SS, 5); + tty_putcode_i(tty, TTYC_SS, 5); else - tty_putcode1(tty, TTYC_SS, 6); + tty_putcode_i(tty, TTYC_SS, 6); } else if (cmode & MODE_CURSOR_BLINKING) tty_putcode(tty, TTYC_CVVIS); break; @@ -835,7 +835,7 @@ tty_emulate_repeat(struct tty *tty, enum tty_code_code code, enum tty_code_code code1, u_int n) { if (tty_term_has(tty->term, code)) - tty_putcode1(tty, code, n); + tty_putcode_i(tty, code, n); else { while (n-- > 0) tty_putcode(tty, code1); @@ -1124,7 +1124,7 @@ tty_clear_line(struct tty *tty, const struct grid_cell *defaults, u_int py, /* Section of line. Use ECH if possible. */ if (tty_term_has(tty->term, TTYC_ECH)) { tty_cursor(tty, px, py); - tty_putcode1(tty, TTYC_ECH, nx); + tty_putcode_i(tty, TTYC_ECH, nx); return; } } @@ -1265,7 +1265,7 @@ tty_clear_area(struct tty *tty, const struct grid_cell *defaults, u_int py, tty_term_has(tty->term, TTYC_INDN)) { tty_region(tty, py, py + ny - 1); tty_margin_off(tty); - tty_putcode1(tty, TTYC_INDN, ny); + tty_putcode_i(tty, TTYC_INDN, ny); return; } @@ -1280,7 +1280,7 @@ tty_clear_area(struct tty *tty, const struct grid_cell *defaults, u_int py, tty_term_has(tty->term, TTYC_INDN)) { tty_region(tty, py, py + ny - 1); tty_margin(tty, px, px + nx - 1); - tty_putcode1(tty, TTYC_INDN, ny); + tty_putcode_i(tty, TTYC_INDN, ny); return; } } @@ -1587,7 +1587,7 @@ tty_sync_start(struct tty *tty) if (tty_term_has(tty->term, TTYC_SYNC)) { log_debug("%s sync start", tty->client->name); - tty_putcode1(tty, TTYC_SYNC, 1); + tty_putcode_i(tty, TTYC_SYNC, 1); } } @@ -1602,7 +1602,7 @@ tty_sync_end(struct tty *tty) if (tty_term_has(tty->term, TTYC_SYNC)) { log_debug("%s sync end", tty->client->name); - tty_putcode1(tty, TTYC_SYNC, 2); + tty_putcode_i(tty, TTYC_SYNC, 2); } } @@ -1820,7 +1820,7 @@ tty_cmd_reverseindex(struct tty *tty, const struct tty_ctx *ctx) if (tty_term_has(tty->term, TTYC_RI)) tty_putcode(tty, TTYC_RI); else - tty_putcode1(tty, TTYC_RIN, 1); + tty_putcode_i(tty, TTYC_RIN, 1); } void @@ -1901,7 +1901,7 @@ tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx) tty_cursor(tty, 0, 0); else tty_cursor(tty, 0, tty->cy); - tty_putcode1(tty, TTYC_INDN, ctx->num); + tty_putcode_i(tty, TTYC_INDN, ctx->num); } } @@ -1932,7 +1932,7 @@ tty_cmd_scrolldown(struct tty *tty, const struct tty_ctx *ctx) tty_cursor_pane(tty, ctx, ctx->ocx, ctx->orupper); if (tty_term_has(tty->term, TTYC_RIN)) - tty_putcode1(tty, TTYC_RIN, ctx->num); + tty_putcode_i(tty, TTYC_RIN, ctx->num); else { for (i = 0; i < ctx->num; i++) tty_putcode(tty, TTYC_RI); @@ -2137,7 +2137,7 @@ tty_set_selection(struct tty *tty, const char *flags, const char *buf, b64_ntop(buf, len, encoded, size); tty->flags |= TTY_NOBLOCK; - tty_putcode_ptr2(tty, TTYC_MS, flags, encoded); + tty_putcode_ss(tty, TTYC_MS, flags, encoded); free(encoded); } @@ -2210,7 +2210,7 @@ tty_reset(struct tty *tty) if (!grid_cells_equal(gc, &grid_default_cell)) { if (gc->link != 0) - tty_putcode_ptr2(tty, TTYC_HLS, "", ""); + tty_putcode_ss(tty, TTYC_HLS, "", ""); if ((gc->attr & GRID_ATTR_CHARSET) && tty_acs_needed(tty)) tty_putcode(tty, TTYC_RMACS); tty_putcode(tty, TTYC_SGR0); @@ -2285,7 +2285,7 @@ tty_region(struct tty *tty, u_int rupper, u_int rlower) tty_cursor(tty, 0, tty->cy); } - tty_putcode2(tty, TTYC_CSR, tty->rupper, tty->rlower); + tty_putcode_ii(tty, TTYC_CSR, tty->rupper, tty->rlower); tty->cx = tty->cy = UINT_MAX; } @@ -2313,7 +2313,7 @@ tty_margin(struct tty *tty, u_int rleft, u_int rright) if (tty->rleft == rleft && tty->rright == rright) return; - tty_putcode2(tty, TTYC_CSR, tty->rupper, tty->rlower); + tty_putcode_ii(tty, TTYC_CSR, tty->rupper, tty->rlower); tty->rleft = rleft; tty->rright = rright; @@ -2321,7 +2321,7 @@ tty_margin(struct tty *tty, u_int rleft, u_int rright) if (rleft == 0 && rright == tty->sx - 1) tty_putcode(tty, TTYC_CLMG); else - tty_putcode2(tty, TTYC_CMG, rleft, rright); + tty_putcode_ii(tty, TTYC_CMG, rleft, rright); tty->cx = tty->cy = UINT_MAX; } @@ -2431,7 +2431,7 @@ tty_cursor(struct tty *tty, u_int cx, u_int cy) * the cursor with CUB/CUF. */ if ((u_int) abs(change) > cx && tty_term_has(term, TTYC_HPA)) { - tty_putcode1(tty, TTYC_HPA, cx); + tty_putcode_i(tty, TTYC_HPA, cx); goto out; } else if (change > 0 && tty_term_has(term, TTYC_CUB) && @@ -2441,12 +2441,12 @@ tty_cursor(struct tty *tty, u_int cx, u_int cy) tty_putcode(tty, TTYC_CUB1); goto out; } - tty_putcode1(tty, TTYC_CUB, change); + tty_putcode_i(tty, TTYC_CUB, change); goto out; } else if (change < 0 && tty_term_has(term, TTYC_CUF) && !tty_use_margin(tty)) { - tty_putcode1(tty, TTYC_CUF, -change); + tty_putcode_i(tty, TTYC_CUF, -change); goto out; } } else if (cx == thisx) { @@ -2479,21 +2479,21 @@ tty_cursor(struct tty *tty, u_int cx, u_int cy) (change < 0 && cy - change > tty->rlower) || (change > 0 && cy - change < tty->rupper)) { if (tty_term_has(term, TTYC_VPA)) { - tty_putcode1(tty, TTYC_VPA, cy); + tty_putcode_i(tty, TTYC_VPA, cy); goto out; } } else if (change > 0 && tty_term_has(term, TTYC_CUU)) { - tty_putcode1(tty, TTYC_CUU, change); + tty_putcode_i(tty, TTYC_CUU, change); goto out; } else if (change < 0 && tty_term_has(term, TTYC_CUD)) { - tty_putcode1(tty, TTYC_CUD, -change); + tty_putcode_i(tty, TTYC_CUD, -change); goto out; } } absolute: /* Absolute movement. */ - tty_putcode2(tty, TTYC_CUP, cy, cx); + tty_putcode_ii(tty, TTYC_CUP, cy, cx); out: tty->cx = cx; @@ -2514,9 +2514,9 @@ tty_hyperlink(struct tty *tty, const struct grid_cell *gc, return; if (gc->link == 0 || !hyperlinks_get(hl, gc->link, &uri, NULL, &id)) - tty_putcode_ptr2(tty, TTYC_HLS, "", ""); + tty_putcode_ss(tty, TTYC_HLS, "", ""); else - tty_putcode_ptr2(tty, TTYC_HLS, id, uri); + tty_putcode_ss(tty, TTYC_HLS, id, uri); } void @@ -2593,13 +2593,13 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc, !tty_term_has(tty->term, TTYC_SMULX)) tty_putcode(tty, TTYC_SMUL); else if (changed & GRID_ATTR_UNDERSCORE_2) - tty_putcode1(tty, TTYC_SMULX, 2); + tty_putcode_i(tty, TTYC_SMULX, 2); else if (changed & GRID_ATTR_UNDERSCORE_3) - tty_putcode1(tty, TTYC_SMULX, 3); + tty_putcode_i(tty, TTYC_SMULX, 3); else if (changed & GRID_ATTR_UNDERSCORE_4) - tty_putcode1(tty, TTYC_SMULX, 4); + tty_putcode_i(tty, TTYC_SMULX, 4); else if (changed & GRID_ATTR_UNDERSCORE_5) - tty_putcode1(tty, TTYC_SMULX, 5); + tty_putcode_i(tty, TTYC_SMULX, 5); } if (changed & GRID_ATTR_BLINK) tty_putcode(tty, TTYC_BLINK); @@ -2656,14 +2656,14 @@ tty_colours(struct tty *tty, const struct grid_cell *gc) if (have_ax) tty_puts(tty, "\033[39m"); else if (tc->fg != 7) - tty_putcode1(tty, TTYC_SETAF, 7); + tty_putcode_i(tty, TTYC_SETAF, 7); tc->fg = gc->fg; } if (COLOUR_DEFAULT(gc->bg) && !COLOUR_DEFAULT(tc->bg)) { if (have_ax) tty_puts(tty, "\033[49m"); else if (tc->bg != 0) - tty_putcode1(tty, TTYC_SETAB, 0); + tty_putcode_i(tty, TTYC_SETAB, 0); tc->bg = gc->bg; } } @@ -2833,12 +2833,12 @@ tty_colours_fg(struct tty *tty, const struct grid_cell *gc) xsnprintf(s, sizeof s, "\033[%dm", gc->fg); tty_puts(tty, s); } else - tty_putcode1(tty, TTYC_SETAF, gc->fg - 90 + 8); + tty_putcode_i(tty, TTYC_SETAF, gc->fg - 90 + 8); goto save; } /* Otherwise set the foreground colour. */ - tty_putcode1(tty, TTYC_SETAF, gc->fg); + tty_putcode_i(tty, TTYC_SETAF, gc->fg); save: /* Save the new values in the terminal current cell. */ @@ -2865,12 +2865,12 @@ tty_colours_bg(struct tty *tty, const struct grid_cell *gc) xsnprintf(s, sizeof s, "\033[%dm", gc->bg + 10); tty_puts(tty, s); } else - tty_putcode1(tty, TTYC_SETAB, gc->bg - 90 + 8); + tty_putcode_i(tty, TTYC_SETAB, gc->bg - 90 + 8); goto save; } /* Otherwise set the background colour. */ - tty_putcode1(tty, TTYC_SETAB, gc->bg); + tty_putcode_i(tty, TTYC_SETAB, gc->bg); save: /* Save the new values in the terminal current cell. */ @@ -2906,10 +2906,10 @@ tty_colours_us(struct tty *tty, const struct grid_cell *gc) * non-RGB version may be wrong. */ if (tty_term_has(tty->term, TTYC_SETULC)) - tty_putcode1(tty, TTYC_SETULC, c); + tty_putcode_i(tty, TTYC_SETULC, c); else if (tty_term_has(tty->term, TTYC_SETAL) && tty_term_has(tty->term, TTYC_RGB)) - tty_putcode1(tty, TTYC_SETAL, c); + tty_putcode_i(tty, TTYC_SETAL, c); save: /* Save the new values in the terminal current cell. */ @@ -2923,18 +2923,18 @@ tty_try_colour(struct tty *tty, int colour, const char *type) if (colour & COLOUR_FLAG_256) { if (*type == '3' && tty_term_has(tty->term, TTYC_SETAF)) - tty_putcode1(tty, TTYC_SETAF, colour & 0xff); + tty_putcode_i(tty, TTYC_SETAF, colour & 0xff); else if (tty_term_has(tty->term, TTYC_SETAB)) - tty_putcode1(tty, TTYC_SETAB, colour & 0xff); + tty_putcode_i(tty, TTYC_SETAB, colour & 0xff); return (0); } if (colour & COLOUR_FLAG_RGB) { colour_split_rgb(colour & 0xffffff, &r, &g, &b); if (*type == '3' && tty_term_has(tty->term, TTYC_SETRGBF)) - tty_putcode3(tty, TTYC_SETRGBF, r, g, b); + tty_putcode_iii(tty, TTYC_SETRGBF, r, g, b); else if (tty_term_has(tty->term, TTYC_SETRGBB)) - tty_putcode3(tty, TTYC_SETRGBB, r, g, b); + tty_putcode_iii(tty, TTYC_SETRGBB, r, g, b); return (0); } @@ -3018,7 +3018,7 @@ tty_clipboard_query(struct tty *tty) if ((~tty->flags & TTY_STARTED) || (tty->flags & TTY_OSC52QUERY)) return; - tty_putcode_ptr2(tty, TTYC_MS, "", "?"); + tty_putcode_ss(tty, TTYC_MS, "", "?"); tty->flags |= TTY_OSC52QUERY; evtimer_set(&tty->clipboard_timer, tty_clipboard_query_callback, tty);