For passthrough, don't write to clients attached to different sessions,
authornicm <nicm@openbsd.org>
Mon, 27 Mar 2023 08:31:32 +0000 (08:31 +0000)
committernicm <nicm@openbsd.org>
Mon, 27 Mar 2023 08:31:32 +0000 (08:31 +0000)
based on a fix from Sergei Grechanik.

usr.bin/tmux/screen-write.c
usr.bin/tmux/tty.c

index 945f454..c76adbe 100644 (file)
@@ -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)
index dea11be..f05bfea 100644 (file)
@@ -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);
        }
 }