diff options
-rw-r--r-- | server-client.c | 32 | ||||
-rw-r--r-- | tty-features.c | 2 | ||||
-rw-r--r-- | tty.c | 1 |
3 files changed, 19 insertions, 16 deletions
diff --git a/server-client.c b/server-client.c index ca0ec5bd..1bdb103a 100644 --- a/server-client.c +++ b/server-client.c @@ -1535,6 +1535,7 @@ focused: static void server_client_reset_state(struct client *c) { + struct tty *tty = &c->tty; struct window *w = c->session->curw->window; struct window_pane *wp = w->active, *loop; struct screen *s; @@ -1545,6 +1546,10 @@ server_client_reset_state(struct client *c) if (c->flags & (CLIENT_CONTROL|CLIENT_SUSPENDED)) return; + /* Disable the block flag. */ + flags = (tty->flags & TTY_BLOCK); + tty->flags &= ~TTY_BLOCK; + /* Get mode from overlay if any, else from screen. */ if (c->overlay_draw != NULL) { s = NULL; @@ -1559,13 +1564,13 @@ server_client_reset_state(struct client *c) log_debug("%s: client %s mode %x", __func__, c->name, mode); /* Reset region and margin. */ - tty_region_off(&c->tty); - tty_margin_off(&c->tty); + tty_region_off(tty); + tty_margin_off(tty); /* Move cursor to pane cursor and offset. */ if (c->overlay_draw == NULL) { cursor = 0; - tty_window_offset(&c->tty, &ox, &oy, &sx, &sy); + tty_window_offset(tty, &ox, &oy, &sx, &sy); if (wp->xoff + s->cx >= ox && wp->xoff + s->cx <= ox + sx && wp->yoff + s->cy >= oy && wp->yoff + s->cy <= oy + sy) { cursor = 1; @@ -1579,7 +1584,8 @@ server_client_reset_state(struct client *c) if (!cursor) mode &= ~MODE_CURSOR; } - tty_cursor(&c->tty, cx, cy); + log_debug("%s: cursor to %u,%u", __func__, cx, cy); + tty_cursor(tty, cx, cy); /* * Set mouse mode if requested. To support dragging, always use button @@ -1602,18 +1608,12 @@ server_client_reset_state(struct client *c) mode &= ~MODE_BRACKETPASTE; /* Set the terminal mode and reset attributes. */ - tty_update_mode(&c->tty, mode, s); - tty_reset(&c->tty); + tty_update_mode(tty, mode, s); + tty_reset(tty); - /* - * All writing must be done, send a sync end (if it was started). It - * may have been started by redrawing so needs to go out even if the - * block flag is set. - */ - flags = (c->tty.flags & TTY_BLOCK); - c->tty.flags &= ~TTY_BLOCK; - tty_sync_end(&c->tty); - c->tty.flags |= flags; + /* All writing must be done, send a sync end (if it was started). */ + tty_sync_end(tty); + tty->flags |= flags; } /* Repeat time callback. */ @@ -1736,7 +1736,6 @@ server_client_check_redraw(struct client *c) } if (~c->flags & CLIENT_REDRAWWINDOW) { - c->redraw_panes = 0; TAILQ_FOREACH(wp, &w->panes, entry) { if (wp->flags & PANE_REDRAW) { log_debug("%s: pane %%%u needs redraw", @@ -1782,6 +1781,7 @@ server_client_check_redraw(struct client *c) tty_update_mode(tty, mode, NULL); screen_redraw_pane(c, wp); } + c->redraw_panes = 0; c->flags &= ~CLIENT_REDRAWPANES; } diff --git a/tty-features.c b/tty-features.c index 3b12b068..ae0869e1 100644 --- a/tty-features.c +++ b/tty-features.c @@ -74,6 +74,7 @@ static struct tty_feature tty_feature_clipboard = { * 256 palette. */ static const char *tty_feature_rgb_capabilities[] = { + "AX", "setrgbf=\\E[38;2;%p1%d;%p2%d;%p3%dm", "setrgbb=\\E[48;2;%p1%d;%p2%d;%p3%dm", "setab=\\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", @@ -88,6 +89,7 @@ static struct tty_feature tty_feature_rgb = { /* Terminal supports 256 colours. */ static const char *tty_feature_256_capabilities[] = { + "AX", "setab=\\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", "setaf=\\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", NULL @@ -1491,6 +1491,7 @@ tty_write(void (*cmdfn)(struct tty *, const struct tty_ctx *), * Redraw is already deferred to redraw another pane - * redraw this one also when that happens. */ + log_debug("adding %%%u to deferred redraw", wp->id); wp->flags |= PANE_REDRAW; break; } |