Hi

So the comment in my last mail applies, I think probably we should just
change cmd_find_session to return a struct window ** and if the arg
matches a windowid it returns that window as well as doing a choose as
normal on the sessions it is a member of. So it does something like:

        /* Lookup as window id. */
        if ((w = cmd_lookup_windowid(arg)) != NULL) {
                *wwp = w;
                return (cmd_window_session(ctx, w, NULL));
        }

Similar to how it does with paneid, but returning the result.

I think all of cmd_find_session, cmd_find_window and cmd_find_pane need
to accept session and window ids as well as pane ids.

One other comment inline below.

Thanks

On Sat, Jan 28, 2012 at 03:32:41PM -0800, George Nachman wrote:
> The following patch includes these changes:
> - Define a window ID and a session ID that is unique for the lifetime
> of a tmux server. (session ID isn't yet exposed, but will be visible
> to control clients in a future patch)
> - Change layout_dump to include window pane IDs in its output
> - Define a window_id format
> - Change list-windows to accept either a window or session as its target
> - Change cmd_lookup_window to accept @number as a window ID.
> - Updates the man page to describe these changes.
> 
> Index: tmux.h
> ===================================================================
> --- tmux.h    (revision 2682)
> +++ tmux.h    (working copy)
> @@ -844,6 +844,7 @@
> 
>  /* Window structure. */
>  struct window {
> +     u_int            id;
>       char            *name;
>       struct event     name_timer;
>       struct timeval   silence_timer;
> @@ -947,6 +948,7 @@
> 
>  struct session {
>       u_int            idx;
> +     u_int            id;
> 
>       char            *name;
>       char            *cwd;
> @@ -1318,6 +1320,7 @@
>  #define CMD_TARGET_PANE_USAGE "[-t target-pane]"
>  #define CMD_TARGET_WINDOW_USAGE "[-t target-window]"
>  #define CMD_TARGET_SESSION_USAGE "[-t target-session]"
> +#define CMD_TARGET_SESSION_OR_WINDOW_USAGE "[-t target]"
>  #define CMD_TARGET_CLIENT_USAGE "[-t target-client]"
>  #define CMD_SRCDST_PANE_USAGE "[-s src-pane] [-t dst-pane]"
>  #define CMD_SRCDST_WINDOW_USAGE "[-s src-window] [-t dst-window]"
> @@ -1544,6 +1547,9 @@
>  struct client        *cmd_current_client(struct cmd_ctx *);
>  struct client        *cmd_find_client(struct cmd_ctx *, const char *);
>  struct session       *cmd_find_session(struct cmd_ctx *, const char *, int);
> +struct winlink       *cmd_find_session_or_window(
> +                 struct cmd_ctx *ctx, const char *arg, struct session **sp,
> +                 int prefer_unattached);
>  struct winlink       *cmd_find_window(
>                    struct cmd_ctx *, const char *, struct session **);
>  int           cmd_find_index(
> @@ -1897,6 +1903,7 @@
>  RB_PROTOTYPE(window_pane_tree, window_pane, tree_entry, window_pane_cmp);
>  struct winlink       *winlink_find_by_index(struct winlinks *, int);
>  struct winlink       *winlink_find_by_window(struct winlinks *, struct 
> window *);
> +struct winlink       *winlink_find_by_window_id(struct winlinks *, u_int);
>  int           winlink_next_index(struct winlinks *, int);
>  u_int                 winlink_count(struct winlinks *);
>  struct winlink       *winlink_add(struct winlinks *, int);
> Index: layout-custom.c
> ===================================================================
> --- layout-custom.c   (revision 2682)
> +++ layout-custom.c   (working copy)
> @@ -78,9 +78,15 @@
> 
>       if (len == 0)
>               return (-1);
> -
> -     tmplen = xsnprintf(tmp, sizeof tmp,
> -         "%ux%u,%u,%u", lc->sx, lc->sy, lc->xoff, lc->yoff);
> +     if (lc->wp) {
> +             tmplen = xsnprintf(tmp, sizeof tmp,
> +                 "%ux%u,%u,%u,%u", lc->sx, lc->sy, lc->xoff,
> +                 lc->yoff, lc->wp->id);
> +     } else {
> +             tmplen = xsnprintf(tmp, sizeof tmp,
> +                 "%ux%u,%u,%u,na", lc->sx, lc->sy, lc->xoff,
> +                 lc->yoff);

Does this actually happen where lc->wp is ever NULL? IIRC you can have
panes w/o cells but not vice versa?

Also you will need to change an sscanf somewhere for this to work I
guess, probably the one in layout_construct.

> +     }
>       if (tmplen > (sizeof tmp) - 1)
>               return (-1);
>       if (strlcat(buf, tmp, len) >= len)
> Index: session.c
> ===================================================================
> --- session.c (revision 2682)
> +++ session.c (working copy)
> @@ -34,6 +34,7 @@
> 
>  struct winlink *session_next_alert(struct winlink *);
>  struct winlink *session_previous_alert(struct winlink *);
> +u_int                next_session_id = 0;
> 
>  RB_GENERATE(sessions, session, entry, session_cmp);
> 
> @@ -91,6 +92,7 @@
>       struct session  *s;
> 
>       s = xmalloc(sizeof *s);
> +     s->id = next_session_id++;
>       s->references = 0;
>       s->flags = 0;
> 
> Index: format.c
> ===================================================================
> --- format.c  (revision 2682)
> +++ format.c  (working copy)
> @@ -71,7 +71,7 @@
>       "window_name",  /* W */
>       NULL,           /* X */
>       NULL,           /* Y */
> -     NULL            /* Z */
> +     NULL            /* Z */
>  };
> 
>  /* Create a new tree. */
> @@ -210,7 +210,7 @@
>       char            *buf, *ptr;
>       const char      *s;
>       size_t           off, len, n;
> -     int              ch;
> +     int              ch;
> 
>       len = 64;
>       buf = xmalloc(len);
> @@ -341,6 +341,7 @@
>       layout = layout_dump(w);
>       flags = window_printable_flags(s, wl);
> 
> +     format_add(ft, "window_id", "%u", w->id);
>       format_add(ft, "window_index", "%d", wl->idx);
>       format_add(ft, "window_name", "%s", w->name);
>       format_add(ft, "window_width", "%u", w->sx);
> Index: cmd-list-windows.c
> ===================================================================
> --- cmd-list-windows.c        (revision 2682)
> +++ cmd-list-windows.c        (working copy)
> @@ -30,12 +30,13 @@
> 
>  void cmd_list_windows_server(struct cmd *, struct cmd_ctx *);
>  void cmd_list_windows_session(
> -         struct cmd *, struct session *, struct cmd_ctx *, int);
> +         struct cmd *, struct session *,struct winlink *,
> +         struct cmd_ctx *, int);
> 
>  const struct cmd_entry cmd_list_windows_entry = {
>       "list-windows", "lsw",
>       "aF:t:", 0, 0,
> -     "[-a] [-F format] " CMD_TARGET_SESSION_USAGE,
> +     "[-a] [-F format] " CMD_TARGET_SESSION_OR_WINDOW_USAGE,
>       0,
>       NULL,
>       NULL,
> @@ -47,14 +48,16 @@
>  {
>       struct args     *args = self->args;
>       struct session  *s;
> +     struct winlink  *wl;
> 
>       if (args_has(args, 'a'))
>               cmd_list_windows_server(self, ctx);
>       else {
> -             s = cmd_find_session(ctx, args_get(args, 't'), 0);
> +             s = NULL;
> +             wl = cmd_find_session_or_window(ctx, args_get(args, 't'), &s, 
> 0);
>               if (s == NULL)
>                       return (-1);
> -             cmd_list_windows_session(self, s, ctx, 0);
> +             cmd_list_windows_session(self, s, wl, ctx, 0);
>       }
> 
>       return (0);
> @@ -66,12 +69,13 @@
>       struct session  *s;
> 
>       RB_FOREACH(s, sessions, &sessions)
> -             cmd_list_windows_session(self, s, ctx, 1);
> +             cmd_list_windows_session(self, s, NULL, ctx, 1);
>  }
> 
>  void
>  cmd_list_windows_session(
> -    struct cmd *self, struct session *s, struct cmd_ctx *ctx, int type)
> +    struct cmd *self, struct session *s, struct winlink *target_wl,
> +    struct cmd_ctx *ctx, int type)
>  {
>       struct args             *args = self->args;
>       struct winlink          *wl;
> @@ -102,6 +106,9 @@
> 
>       n = 0;
>       RB_FOREACH(wl, winlinks, &s->windows) {
> +             if (target_wl && target_wl->window->id != wl->window->id)
> +                     continue;
> +
>               ft = format_create();
>               format_add(ft, "line", "%u", n);
>               format_session(ft, s);
> Index: tmux.1
> ===================================================================
> --- tmux.1    (revision 2682)
> +++ tmux.1    (working copy)
> @@ -389,8 +389,9 @@
>  .Ar target-session ,
>  and
>  .Em window
> -is looked for in order: as a window index, for example mysession:1; as an 
> exact
> -window name, such as mysession:mywindow; then as an
> +is looked for in order: as a window index, for example mysession:1;
> +as a window id, such as @1;
> +as an exact window name, such as mysession:mywindow; then as an
>  .Xr fnmatch 3
>  pattern or the start of a window name, such as mysession:mywin* or
>  mysession:mywin.
> @@ -1200,14 +1201,18 @@
>  .It Xo Ic list-windows
>  .Op Fl a
>  .Op Fl F Ar format
> -.Op Fl t Ar target-session
> +.Op Fl t Ar target
>  .Xc
>  .D1 (alias: Ic lsw )
>  If
>  .Fl a
>  is given, list all windows on the server.
> -Otherwise, list windows in the current session or in
> -.Ar target-session .
> +Otherwise, list windows in the current session or, if
> +.Ar target
> +names a session, list all the windows in that session.
> +If
> +.Ar target
> +names a session and window, list only that window.
>  For the meaning of the
>  .Fl F
>  flag, see the
> Index: cmd.c
> ===================================================================
> --- cmd.c     (revision 2682)
> +++ cmd.c     (working copy)
> @@ -593,6 +593,20 @@
>                       return (wl);
>       }
> 
> +     /* Look up by window ID. @n gives an id. */
> +     if (name[0] == '@') {
> +             struct winlink *c_wl;
> +             errstr = NULL;
> +             u_int id = strtonum(name + 1, 0, INT_MAX, &errstr);
> +             if (errstr == NULL) {
> +                     RB_FOREACH(c_wl, winlinks, &s->windows) {
> +                             if (c_wl->window->id == id) {
> +                                     return (c_wl);
> +                             }
> +                     }
> +             }
> +     }
> +
>       /* Look for exact matches, error if more than one. */
>       wlfound = NULL;
>       RB_FOREACH(wl, winlinks, &s->windows) {
> @@ -750,6 +764,22 @@
>       return (s);
>  }
> 
> +/* The target may specify a session to find or "session:window". */
> +struct winlink *
> +cmd_find_session_or_window(struct cmd_ctx *ctx, const char *arg,
> +                        struct session **sp, int prefer_unattached)
> +{
> +    const char       *colon;
> +    if (arg)
> +     colon = strchr(arg, ':');
> +    if (arg && colon && colon[1])
> +     return cmd_find_window(ctx, arg, sp);
> +    else {
> +     *sp = cmd_find_session(ctx, arg, prefer_unattached);
> +     return NULL;
> +    }
> +}
> +
>  /* Find the target session and window or report an error and return NULL. */
>  struct winlink *
>  cmd_find_window(struct cmd_ctx *ctx, const char *arg, struct session **sp)
> Index: window.c
> ===================================================================
> --- window.c  (revision 2682)
> +++ window.c  (working copy)
> @@ -56,6 +56,7 @@
>  /* Global panes tree. */
>  struct window_pane_tree all_window_panes;
>  u_int        next_window_pane;
> +u_int        next_window;
> 
>  void window_pane_read_callback(struct bufferevent *, void *);
>  void window_pane_error_callback(struct bufferevent *, short, void *);
> @@ -101,6 +102,18 @@
>       return (RB_FIND(winlinks, wwl, &wl));
>  }
> 
> +struct winlink *
> +winlink_find_by_window_id(struct winlinks *wwl, u_int id)
> +{
> +     struct winlink *c_wl;
> +     RB_FOREACH(c_wl, winlinks, wwl) {
> +             if (c_wl->window->id == id) {
> +                     return (c_wl);
> +             }
> +     }
> +     return NULL;
> +}
> +
>  int
>  winlink_next_index(struct winlinks *wwl, int idx)
>  {
> @@ -252,6 +265,7 @@
>       u_int            i;
> 
>       w = xcalloc(1, sizeof *w);
> +     w->id = next_window++;
>       w->name = NULL;
>       w->flags = 0;
> 
> @@ -732,7 +746,7 @@
>  window_pane_read_callback(unused struct bufferevent *bufev, void *data)
>  {
>       struct window_pane     *wp = data;
> -     char                   *new_data;
> +     char                   *new_data;
>       size_t                  new_size;
> 
>       new_size = EVBUFFER_LENGTH(wp->event->input) - wp->pipe_off;
> @@ -964,7 +978,7 @@
>  {
>       struct screen   *s = &wp->base;
>       char            *newsearchstr, *line, *msg;
> -     u_int            i;
> +     u_int            i;
> 
>       msg = NULL;
>       xasprintf(&newsearchstr, "*%s*", searchstr);
> 
> ------------------------------------------------------------------------------
> Try before you buy = See our experts in action!
> The most comprehensive online learning library for Microsoft developers
> is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
> Metro Style Apps, more. Free future releases when you subscribe now!
> http://p.sf.net/sfu/learndevnow-dev2
> _______________________________________________
> tmux-users mailing list
> tmux-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/tmux-users

------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to