How is this different from synchronize-panes?

On Tue, Jul 11, 2017 at 12:11:44AM +0300, Rytis Karpuska wrote:
> 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.

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