summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2023-03-27 08:31:33 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2023-03-27 08:31:33 +0000
commit53b667ca58b6b603dcbecd34f3d292f817be4297 (patch)
treeee49d0388bd5b8efbed5aa6954f1a3ab393324f6 /usr.bin
parentfa107de3fb39afb29918ab6f9f8d2f136f559098 (diff)
For passthrough, don't write to clients attached to different sessions,
based on a fix from Sergei Grechanik.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/screen-write.c8
-rw-r--r--usr.bin/tmux/tty.c29
2 files changed, 22 insertions, 15 deletions
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 <nicholas.marriott@gmail.com>
@@ -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 <nicholas.marriott@gmail.com>
@@ -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);
}
}