From: nicm Date: Mon, 27 Mar 2023 08:31:32 +0000 (+0000) Subject: For passthrough, don't write to clients attached to different sessions, X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=fa3d3b2e492ee03e701f8689d3c3d015c2b40460;p=openbsd For passthrough, don't write to clients attached to different sessions, based on a fix from Sergei Grechanik. --- diff --git a/usr.bin/tmux/screen-write.c b/usr.bin/tmux/screen-write.c index 945f4545898..c76adbe2da2 100644 --- a/usr.bin/tmux/screen-write.c +++ b/usr.bin/tmux/screen-write.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen-write.c,v 1.213 2023/02/10 14:01:43 nicm Exp $ */ +/* $OpenBSD: screen-write.c,v 1.214 2023/03/27 08:31:32 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -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) diff --git a/usr.bin/tmux/tty.c b/usr.bin/tmux/tty.c index dea11be7058..f05bfea6a92 100644 --- a/usr.bin/tmux/tty.c +++ b/usr.bin/tmux/tty.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty.c,v 1.427 2023/01/12 18:49:11 nicm Exp $ */ +/* $OpenBSD: tty.c,v 1.428 2023/03/27 08:31:32 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -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); } }