For passthrough, don't write to clients attached to different sessions,

based on a fix from Sergei Grechanik.
pull/3573/head
nicm 2023-03-27 08:31:32 +00:00
parent a9ac614691
commit d73078838d
2 changed files with 20 additions and 13 deletions

View File

@ -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)

27
tty.c
View File

@ -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);
}
}