Applied this and the attach-session diff it was based on, thanks!

On Tue, Dec 10, 2013 at 08:51:42PM +0100, Johannes Jakobsson wrote:
> Made a change (more like copy-paste) to conform with attach and it seems to 
> work fine.
> Also attached as a file.
> 
> From 0b2298d447d5409952d705eed5a7253947fe4c81 Mon Sep 17 00:00:00 2001
> From: Johannes Jakobsson <johannes.jakobs...@gmail.com>
> Date: Tue, 10 Dec 2013 20:43:51 +0100
> Subject: [PATCH] switch-client now conforms to '-t session:win.pane'
> 
> ---
>  cmd-switch-client.c | 41 ++++++++++++++++++++++++++++++++++-------
>  cmd.c               |  2 --
>  tmux.h              |  2 ++
>  3 files changed, 36 insertions(+), 9 deletions(-)
> 
> diff --git a/cmd-switch-client.c b/cmd-switch-client.c
> index d101c52..e97e3f8 100644
> --- a/cmd-switch-client.c
> +++ b/cmd-switch-client.c
> @@ -60,8 +60,13 @@ enum cmd_retval
>  cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
>  {
>       struct args     *args = self->args;
> -     struct client   *c;
> -     struct session  *s;
> +     struct client   *c = NULL;
> +     struct session  *s = NULL;
> +     struct winlink *wl = NULL;
> +     struct window_pane *wp = NULL;
> +     struct window *w = NULL;
> +
> +     const char *tflag = NULL;
>  
>       if ((c = cmd_find_client(cmdq, args_get(args, 'c'), 0)) == NULL)
>               return (CMD_RETURN_ERROR);
> @@ -76,7 +81,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
>               }
>       }
>  
> -     s = NULL;
> +     tflag = args_get(args, 't');
>       if (args_has(args, 'n')) {
>               if ((s = session_next_session(c->session)) == NULL) {
>                       cmdq_error(cmdq, "can't find next session");
> @@ -94,10 +99,32 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q 
> *cmdq)
>                       cmdq_error(cmdq, "can't find last session");
>                       return (CMD_RETURN_ERROR);
>               }
> -     } else
> -             s = cmd_find_session(cmdq, args_get(args, 't'), 0);
> -     if (s == NULL)
> -             return (CMD_RETURN_ERROR);
> +     } else {
> +             if (tflag == NULL) {
> +                     if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
> +                             return (CMD_RETURN_ERROR);
> +             } else if (tflag[strcspn(tflag, ":.")] != '\0') {
> +                     if ((wl = cmd_find_pane(cmdq, tflag, &s, &wp)) == NULL)
> +                             return (CMD_RETURN_ERROR);
> +             } else {
> +                     if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
> +                             return (CMD_RETURN_ERROR);
> +                     w = cmd_lookup_windowid(tflag);
> +                     if (w == NULL && (wp = cmd_lookup_paneid(tflag)) != 
> NULL)
> +                             w = wp->window;
> +                     if (w != NULL)
> +                             wl = winlink_find_by_window(&s->windows, w);
> +             }
> +
> +             if (cmdq->client == NULL)
> +                     return (CMD_RETURN_NORMAL);
> +
> +             if (wl != NULL) {
> +                     if (wp != NULL)
> +                             window_set_active_pane(wp->window, wp);
> +                     session_set_current(s, wl);
> +             }
> +     }
>  
>       if (c->session != NULL)
>               c->last_session = c->session;
> diff --git a/cmd.c b/cmd.c
> index 414c906..5e6b93a 100644
> --- a/cmd.c
> +++ b/cmd.c
> @@ -125,9 +125,7 @@ struct session    *cmd_lookup_session(const char *, int 
> *);
>  struct session       *cmd_lookup_session_id(const char *);
>  struct winlink       *cmd_lookup_window(struct session *, const char *, int 
> *);
>  int           cmd_lookup_index(struct session *, const char *, int *);
> -struct window_pane *cmd_lookup_paneid(const char *);
>  struct winlink       *cmd_lookup_winlink_windowid(struct session *, const 
> char *);
> -struct window        *cmd_lookup_windowid(const char *);
>  struct session       *cmd_window_session(struct cmd_q *, struct window *,
>                   struct winlink **);
>  struct winlink       *cmd_find_window_offset(const char *, struct session *, 
> int *);
> diff --git a/tmux.h b/tmux.h
> index dbc2c49..9c83892 100644
> --- a/tmux.h
> +++ b/tmux.h
> @@ -1732,6 +1732,8 @@ int              cmd_find_index(struct cmd_q *, const 
> char *,
>  struct winlink       *cmd_find_pane(struct cmd_q *, const char *, struct 
> session **,
>                    struct window_pane **);
>  char         *cmd_template_replace(const char *, const char *, int);
> +struct window  *cmd_lookup_windowid(const char *);
> +struct window_pane *cmd_lookup_paneid(const char *);
>  extern const struct cmd_entry *cmd_table[];
>  extern const struct cmd_entry cmd_attach_session_entry;
>  extern const struct cmd_entry cmd_bind_key_entry;
> -- 
> 1.8.3.2
> 
> 


> 
> On 10 12, 2013, at 18:32 , Johannes Jakobsson <johannes.jakobs...@gmail.com> 
> wrote:
> 
> > I take it that it is the ?-t session:window.pane? syntax you would prefer? 
> > I will make a new patch with that change.
> > 
> > On 10 12, 2013, at 16:49 , Nicholas Marriott <nicholas.marri...@gmail.com> 
> > wrote:
> > 
> >> Thanks but I don't like this way of doing it.
> >> 
> >> I think this should work the same way as attach-session.
> >> 
> >> Take a look at the mail I just sent in the thread subject "patch
> >> allowing attach to take and select a pane".
> >> 
> >> Both attach and switchc should work the same way, probably the way
> >> suggested in that thread.
> >> 
> >> The alternative is that -w or -p or some other flag indicates -t is a
> >> window or pane rather than a session, but this isn't as nice for the
> >> user.
> >> 
> >> 
> >> On Sun, Dec 08, 2013 at 11:25:57AM +0100, Johannes Jakobsson wrote:
> >>> Add [-w window] to switch-client to specify which window in the 
> >>> target-session to switch to.
> >>> 
> >>> //Johannes
> >>> 
> >>>> From d8efa53ec1104db86f4fd75be5a59d2317e7b673 Mon Sep 17 00:00:00 2001
> >>> From: Johannes Jakobsson <johannes.jakobs...@gmail.com>
> >>> Date: Sat, 7 Dec 2013 16:57:01 +0100
> >>> Subject: [PATCH] '-w' option to switch-client
> >>> 
> >>> Example: switch-client -t s1 -w w1
> >>> ---
> >>> cmd-switch-client.c | 22 ++++++++++++++++++++--
> >>> 1 file changed, 20 insertions(+), 2 deletions(-)
> >>> 
> >>> diff --git a/cmd-switch-client.c b/cmd-switch-client.c
> >>> index d101c52..68045c8 100644
> >>> --- a/cmd-switch-client.c
> >>> +++ b/cmd-switch-client.c
> >>> @@ -32,8 +32,8 @@ enum cmd_retval  cmd_switch_client_exec(struct cmd *, 
> >>> struct cmd_q *);
> >>> 
> >>> const struct cmd_entry cmd_switch_client_entry = {
> >>>   "switch-client", "switchc",
> >>> - "lc:npt:r", 0, 0,
> >>> - "[-lnpr] [-c target-client] [-t target-session]",
> >>> + "lc:npt:rw:", 0, 0,
> >>> + "[-lnpr] [-c target-client] [-t target-session] [-w window]",
> >>>   CMD_READONLY,
> >>>   cmd_switch_client_key_binding,
> >>>   cmd_switch_client_exec
> >>> @@ -62,6 +62,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q 
> >>> *cmdq)
> >>>   struct args     *args = self->args;
> >>>   struct client   *c;
> >>>   struct session  *s;
> >>> +  struct winlink *wl;
> >>> 
> >>>   if ((c = cmd_find_client(cmdq, args_get(args, 'c'), 0)) == NULL)
> >>>           return (CMD_RETURN_ERROR);
> >>> @@ -99,6 +100,23 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q 
> >>> *cmdq)
> >>>   if (s == NULL)
> >>>           return (CMD_RETURN_ERROR);
> >>> 
> >>> +  wl = NULL;
> >>> +  if (args_has(args, 'w')) {
> >>> +    /* Prepend the choosen session name in front of the
> >>> +     * window name to make cmd_find_window work.
> >>> +     */
> >>> +    char *sw;
> >>> +    const char *w_name = args_get(args, 'w');
> >>> +    xasprintf(&sw, "%s:%s", s->name, w_name);
> >>> +    wl = cmd_find_window(cmdq, sw, &s);
> >>> +    free(sw);
> >>> +    if (wl == NULL) {
> >>> +                 cmdq_error(cmdq, "can't find window");
> >>> +                 return (CMD_RETURN_ERROR);
> >>> +    }
> >>> +    session_set_current(s, wl);
> >>> +  }
> >>> +
> >>>   if (c->session != NULL)
> >>>           c->last_session = c->session;
> >>>   c->session = s;
> >>> -- 
> >>> 1.8.3.2
> >>> 
> >>> 
> >>> ------------------------------------------------------------------------------
> >>> Sponsored by Intel(R) XDK 
> >>> Develop, test and display web and hybrid apps with a single code base.
> >>> Download it for free now!
> >>> http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk
> >>> _______________________________________________
> >>> tmux-users mailing list
> >>> tmux-users@lists.sourceforge.net
> >>> https://lists.sourceforge.net/lists/listinfo/tmux-users
> > 
> 


------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today. 
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to