summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2017-04-19 00:01:15 +0100
committerThomas Adam <thomas@xteddy.org>2017-04-19 00:01:15 +0100
commita71c262d5f1ff2125797569d474ff21efb7ddc91 (patch)
treef7066cfd84ac5950ab0b2dc3f5de69204511fa73
parentde4f817bd61d60ac4310052d51ba437826016df0 (diff)
parentf731ae4a2dc6aca565b20dffd6ddf661e585cbb5 (diff)
Merge branch 'obsd-master'
-rw-r--r--server-client.c52
-rw-r--r--tmux.h4
-rw-r--r--tty-keys.c44
-rw-r--r--tty.c4
4 files changed, 54 insertions, 50 deletions
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;