Hey,

I often need to do some work in a cluster of linux servers, therefore
it would be very convenient if tmux could duplicate input to all panes
of current window. This patch adds this functionality togglable with
command. Hopefully it will be helpful for other people also :).

Rytis.

---
 Makefile.am                  |  1 +
 cmd-toggle-duplicate-stdin.c | 50 ++++++++++++++++++++++++++++++++++++++++++++
 cmd.c                        |  3 +++
 server-client.c              | 10 ++++++++-
 tmux.1                       |  2 ++
 tmux.h                       |  1 +
 6 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 cmd-toggle-duplicate-stdin.c

diff --git a/Makefile.am b/Makefile.am
index bdc752c..bf5e02a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -124,6 +124,7 @@ dist_tmux_SOURCES = \
        cmd-switch-client.c \
        cmd-unbind-key.c \
        cmd-wait-for.c \
+       cmd-toggle-duplicate-stdin.c \
        cmd.c \
        colour.c \
        compat.h \
diff --git a/cmd-toggle-duplicate-stdin.c b/cmd-toggle-duplicate-stdin.c
new file mode 100644
index 0000000..e5fd402
--- /dev/null
+++ b/cmd-toggle-duplicate-stdin.c
@@ -0,0 +1,50 @@
+/* $OpenBSD$ */
+
+/*
+ * Copyright (c) 2017 Rytis Karpuska <[email protected]>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+
+#include "tmux.h"
+
+/*
+ * Toggle stdin duplication to all panes of current window.
+ */
+
+static enum cmd_retval cmd_toggle_duplicate_stdin_exec(struct cmd *, struct 
cmdq_item *);
+
+const struct cmd_entry cmd_toggle_duplicate_stdin_entry = {
+       .name = "toggle-duplicate-stdin",
+       .alias = NULL,
+
+       .args = { "", 0, 0},
+       .usage = "",
+
+       .target = { 't', CMD_FIND_WINDOW, 0 },
+
+       .flags = 0,
+       .exec = cmd_toggle_duplicate_stdin_exec
+};
+
+static enum cmd_retval
+cmd_toggle_duplicate_stdin_exec(struct cmd *self __unused, struct cmdq_item 
*item)
+{
+       struct window           *w = item->target.w;
+       w->flags = w->flags ^ WINDOW_DUPLICATE_STDIN;
+
+       return (CMD_RETURN_NORMAL);
+}
+
diff --git a/cmd.c b/cmd.c
index 45f83c2..26a0636 100644
--- a/cmd.c
+++ b/cmd.c
@@ -112,6 +112,8 @@ extern const struct cmd_entry cmd_unbind_key_entry;
 extern const struct cmd_entry cmd_unlink_window_entry;
 extern const struct cmd_entry cmd_up_pane_entry;
 extern const struct cmd_entry cmd_wait_for_entry;
+extern const struct cmd_entry cmd_toggle_duplicate_stdin_entry;
+
 
 const struct cmd_entry *cmd_table[] = {
        &cmd_attach_session_entry,
@@ -197,6 +199,7 @@ const struct cmd_entry *cmd_table[] = {
        &cmd_unbind_key_entry,
        &cmd_unlink_window_entry,
        &cmd_wait_for_entry,
+       &cmd_toggle_duplicate_stdin_entry,
        NULL
 };
 
diff --git a/server-client.c b/server-client.c
index 1fd6eb6..4fa9c34 100644
--- a/server-client.c
+++ b/server-client.c
@@ -1000,8 +1000,16 @@ retry:
 forward:
        if (c->flags & CLIENT_READONLY)
                return;
-       if (wp != NULL)
+       if (w->flags & WINDOW_DUPLICATE_STDIN)
+       {
+               TAILQ_FOREACH(wp, &w->panes, entry) {
+                       window_pane_key(wp, c, s, key, m);
+               }
+       }
+       else if (wp != NULL)
+       {
                window_pane_key(wp, c, s, key, m);
+       }
 }
 
 /* Client functions that need to happen every loop. */
diff --git a/tmux.1 b/tmux.1
index da97dd7..c6c782c 100644
--- a/tmux.1
+++ b/tmux.1
@@ -2076,6 +2076,8 @@ if
 .Fl k
 is specified and the window is linked to only one session, it is unlinked and
 destroyed.
+.It Ic toggle-duplicate-stdin
+Toggle duplication of input to all panes of current window. Useful for 
interactively executing identical commands in several terminal sessions.
 .El
 .Sh KEY BINDINGS
 .Nm
diff --git a/tmux.h b/tmux.h
index 7b79544..e5437bc 100644
--- a/tmux.h
+++ b/tmux.h
@@ -857,6 +857,7 @@ struct window {
 #define WINDOW_FORCEHEIGHT 0x4000
 #define WINDOW_STYLECHANGED 0x8000
 #define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE)
+#define WINDOW_DUPLICATE_STDIN 0x10000
 
        int              alerts_queued;
        TAILQ_ENTRY(window) alerts_entry;
-- 
2.7.4

-- 
You received this message because you are subscribed to the Google Groups 
"tmux-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to