diff --git a/server-client.c b/server-client.c index 6729c851..c27704a7 100644 --- a/server-client.c +++ b/server-client.c @@ -1037,6 +1037,7 @@ server_client_is_bracket_paste(struct client *c, key_code key) { if ((key & KEYC_MASK_KEY) == KEYC_PASTE_START) { c->flags |= CLIENT_BRACKETPASTING; + c->paste_time = current_time; log_debug("%s: bracket paste on", c->name); return (0); } @@ -1070,6 +1071,7 @@ server_client_is_assume_paste(struct client *c) if (c->flags & CLIENT_ASSUMEPASTING) return (1); c->flags |= CLIENT_ASSUMEPASTING; + c->paste_time = current_time; log_debug("%s: assume paste on", c->name); return (0); } @@ -2504,6 +2506,13 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg) c->out_fd = -1; } + /* If pasting has taken too long, turn it off. */ + if (c->flags & (CLIENT_BRACKETPASTING|CLIENT_ASSUMEPASTING) && + current_time - c->paste_time > CLIENT_PASTE_TIME_LIMIT) { + log_debug("%s: paste time limit exceeded", c->name); + c->flags &= ~(CLIENT_BRACKETPASTING|CLIENT_ASSUMEPASTING); + } + /* * If this is the first client, load configuration files. Any later * clients are allowed to continue with their command even if the diff --git a/tmux.h b/tmux.h index c94c6e07..d79beabb 100644 --- a/tmux.h +++ b/tmux.h @@ -1945,6 +1945,9 @@ struct client_window { }; RB_HEAD(client_windows, client_window); +/* Maximum time to be pasting. */ +#define CLIENT_PASTE_TIME_LIMIT 5 + /* Client connection. */ typedef int (*prompt_input_cb)(struct client *, void *, const char *, int); typedef void (*prompt_free_cb)(void *); @@ -2084,6 +2087,7 @@ struct client { struct key_table *keytable; key_code last_key; + time_t paste_time; uint64_t redraw_panes; uint64_t redraw_scrollbars;