diff --git a/server-client.c b/server-client.c index 3c63a9d5..4fe1a00a 100644 --- a/server-client.c +++ b/server-client.c @@ -1209,6 +1209,14 @@ server_client_check_exit(struct client *c) c->flags &= ~CLIENT_EXIT; } +/* Redraw timer callback. */ +static void +server_client_redraw_timer(__unused int fd, __unused short events, + __unused void* data) +{ + log_debug("redraw timer fired"); +} + /* Check for client redraws. */ static void server_client_check_redraw(struct client *c) @@ -1216,11 +1224,53 @@ server_client_check_redraw(struct client *c) struct session *s = c->session; struct tty *tty = &c->tty; struct window_pane *wp; - int flags, masked; + int needed, flags, masked; + struct timeval tv = { .tv_usec = 1000 }; + static struct event ev; + size_t left; if (c->flags & (CLIENT_CONTROL|CLIENT_SUSPENDED)) return; + /* + * If there is outstanding data, defer the redraw until it has been + * consumed. We can just add a timer to get out of the event loop and + * end up back here. + */ + needed = 0; + if (c->flags & CLIENT_REDRAW) + needed = 1; + else { + TAILQ_FOREACH(wp, &c->session->curw->window->panes, entry) { + if (wp->flags & PANE_REDRAW) { + needed = 1; + break; + } + } + } + if (needed) { + left = EVBUFFER_LENGTH(tty->out); + if (left != 0) { + log_debug("%s: redraw deferred (%zu left)", c->name, left); + if (evtimer_initialized(&ev) && evtimer_pending(&ev, NULL)) + return; + log_debug("redraw timer started"); + evtimer_set(&ev, server_client_redraw_timer, NULL); + evtimer_add(&ev, &tv); + + /* + * We may have got here for a single pane redraw, but + * force a full redraw next time in case other panes + * have been updated. + */ + c->flags |= CLIENT_REDRAW; + return; + } + if (evtimer_initialized(&ev)) + evtimer_del(&ev); + log_debug("%s: redraw needed", c->name); + } + if (c->flags & (CLIENT_REDRAW|CLIENT_STATUS)) { if (options_get_number(s->options, "set-titles")) server_client_set_title(c); diff --git a/tmux.h b/tmux.h index 4ee6904b..e571c286 100644 --- a/tmux.h +++ b/tmux.h @@ -1075,7 +1075,6 @@ struct tty { TTY_VT220, TTY_VT320, TTY_VT420, - TTY_ITERM2, TTY_UNKNOWN } term_type; @@ -1090,8 +1089,7 @@ struct tty { struct tty_key *key_tree; }; #define TTY_TYPES \ - { "VT100", "VT101", "VT102", "VT220", "VT320", "VT420", "iTerm2", \ - "Unknown" } + { "VT100", "VT101", "VT102", "VT220", "VT320", "VT420", "Unknown" } /* TTY command context. */ struct tty_ctx { diff --git a/tty-keys.c b/tty-keys.c index 9cd61e19..a011fcab 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -46,8 +46,6 @@ static void tty_keys_callback(int, short, void *); static int tty_keys_mouse(struct tty *, const char *, size_t, size_t *); static int tty_keys_device_attributes(struct tty *, const char *, size_t, size_t *); -static int tty_keys_iterm2_version(struct tty *, const char *, size_t, - size_t *); /* Default raw keys. */ struct tty_default_key_raw { @@ -555,17 +553,6 @@ tty_keys_next(struct tty *tty) goto partial_key; } - /* Or a response from iTerm2? */ - switch (tty_keys_iterm2_version(tty, buf, len, &size)) { - case 0: /* yes */ - key = KEYC_UNKNOWN; - goto complete_key; - case -1: /* no, or not valid */ - break; - case 1: /* partial */ - goto partial_key; - } - /* Is this a mouse key press? */ switch (tty_keys_mouse(tty, buf, len, &size)) { case 0: /* yes */ @@ -925,34 +912,3 @@ tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len, types[type]); return (0); } - -/* - * Handle a version response from iTerm2. Returns 0 for success, -1 for - * failure, 1 for partial. - */ -static int -tty_keys_iterm2_version(struct tty *tty, const char *buf, size_t len, - size_t *size) -{ - struct client *c = tty->client; - u_int i; - - *size = 0; - - if (memcmp("\033[ITERM2 ", buf, (len > 9) ? 9 : len) != 0) - return (-1); - if (len < 10) - return (1); - for (i = 9; i < len; i++) { - if (buf[i] == 'n') - break; - } - if (i == len) - return (1); - *size = i + 1; - - tty_set_type(tty, TTY_ITERM2); - - log_debug("%s: this is iTerm2", c->name); - return (0); -} diff --git a/tty.c b/tty.c index 82fcbeba..73aeb91f 100644 --- a/tty.c +++ b/tty.c @@ -74,7 +74,7 @@ static void tty_default_attributes(struct tty *, const struct window_pane *, #define tty_use_acs(tty) \ (tty_term_has((tty)->term, TTYC_ACSC) && !((tty)->flags & TTY_UTF8)) #define tty_use_margin(tty) \ - ((tty)->term_type == TTY_VT420 || (tty)->term_type == TTY_ITERM2) + ((tty)->term_type == TTY_VT420) #define tty_pane_full_width(tty, ctx) \ ((ctx)->xoff == 0 && screen_size_x((ctx)->wp->screen) >= (tty)->sx) @@ -251,7 +251,7 @@ tty_start_tty(struct tty *tty) tty->flags |= TTY_FOCUS; tty_puts(tty, "\033[?1004h"); } - tty_puts(tty, "\033[c\033[1337n"); + tty_puts(tty, "\033[c"); } tty->flags |= TTY_STARTED;