Have you started changing this yet? I can pick it up and make the changes if you want to get the next bit ready.
I'd like to get as much of the low impact bits in as possible in before the OpenBSD tree locks for 5.1, so I don't have to merge too much back from SF after it unlocks. On Sun, Jan 29, 2012 at 01:28:55AM +0000, Nicholas Marriott wrote: > 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