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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users