mirror of
https://github.com/tmate-io/tmate.git
synced 2025-08-16 16:41:35 +02:00
Give each window a unique id, like panes but prefixed with @. Based on
work from George Nachman.
This commit is contained in:
73
cmd.c
73
cmd.c
@ -120,8 +120,10 @@ struct session *cmd_lookup_session(const char *, int *);
|
||||
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 session *cmd_pane_session(struct cmd_ctx *,
|
||||
struct window_pane *, struct winlink **);
|
||||
struct winlink *cmd_lookup_winlink_windowid(struct session *, const char *);
|
||||
struct window *cmd_lookup_windowid(const char *);
|
||||
struct session *cmd_window_session(struct cmd_ctx *,
|
||||
struct window *, struct winlink **);
|
||||
struct winlink *cmd_find_window_offset(const char *, struct session *, int *);
|
||||
int cmd_find_index_offset(const char *, struct session *, int *);
|
||||
struct window_pane *cmd_find_pane_offset(const char *, struct winlink *);
|
||||
@ -587,6 +589,10 @@ cmd_lookup_window(struct session *s, const char *name, int *ambiguous)
|
||||
|
||||
*ambiguous = 0;
|
||||
|
||||
/* Try as a window id. */
|
||||
if ((wl = cmd_lookup_winlink_windowid(s, name)) != NULL)
|
||||
return (wl);
|
||||
|
||||
/* First see if this is a valid window index in this session. */
|
||||
idx = strtonum(name, 0, INT_MAX, &errstr);
|
||||
if (errstr == NULL) {
|
||||
@ -649,10 +655,7 @@ cmd_lookup_index(struct session *s, const char *name, int *ambiguous)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Lookup pane id. An initial % means a pane id. sp must already point to the
|
||||
* current session.
|
||||
*/
|
||||
/* Lookup pane id. An initial % means a pane id. */
|
||||
struct window_pane *
|
||||
cmd_lookup_paneid(const char *arg)
|
||||
{
|
||||
@ -668,19 +671,50 @@ cmd_lookup_paneid(const char *arg)
|
||||
return (window_pane_find_by_id(paneid));
|
||||
}
|
||||
|
||||
/* Find session and winlink for pane. */
|
||||
/* Lookup window id in a session. An initial @ means a window id. */
|
||||
struct winlink *
|
||||
cmd_lookup_winlink_windowid(struct session *s, const char *arg)
|
||||
{
|
||||
const char *errstr;
|
||||
u_int windowid;
|
||||
|
||||
if (*arg != '@')
|
||||
return (NULL);
|
||||
|
||||
windowid = strtonum(arg + 1, 0, UINT_MAX, &errstr);
|
||||
if (errstr != NULL)
|
||||
return (NULL);
|
||||
return (winlink_find_by_window_id(&s->windows, windowid));
|
||||
}
|
||||
|
||||
/* Lookup window id. An initial @ means a window id. */
|
||||
struct window *
|
||||
cmd_lookup_windowid(const char *arg)
|
||||
{
|
||||
const char *errstr;
|
||||
u_int windowid;
|
||||
|
||||
if (*arg != '@')
|
||||
return (NULL);
|
||||
|
||||
windowid = strtonum(arg + 1, 0, UINT_MAX, &errstr);
|
||||
if (errstr != NULL)
|
||||
return (NULL);
|
||||
return (window_find_by_id(windowid));
|
||||
}
|
||||
|
||||
/* Find session and winlink for window. */
|
||||
struct session *
|
||||
cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
|
||||
struct winlink **wlp)
|
||||
cmd_window_session(struct cmd_ctx *ctx, struct window *w, struct winlink **wlp)
|
||||
{
|
||||
struct session *s;
|
||||
struct sessionslist ss;
|
||||
struct winlink *wl;
|
||||
|
||||
/* If this pane is in the current session, return that winlink. */
|
||||
/* If this window is in the current session, return that winlink. */
|
||||
s = cmd_current_session(ctx, 0);
|
||||
if (s != NULL) {
|
||||
wl = winlink_find_by_window(&s->windows, wp->window);
|
||||
wl = winlink_find_by_window(&s->windows, w);
|
||||
if (wl != NULL) {
|
||||
if (wlp != NULL)
|
||||
*wlp = wl;
|
||||
@ -688,16 +722,16 @@ cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
|
||||
}
|
||||
}
|
||||
|
||||
/* Otherwise choose from all sessions with this pane. */
|
||||
/* Otherwise choose from all sessions with this window. */
|
||||
ARRAY_INIT(&ss);
|
||||
RB_FOREACH(s, sessions, &sessions) {
|
||||
if (winlink_find_by_window(&s->windows, wp->window) != NULL)
|
||||
if (winlink_find_by_window(&s->windows, w) != NULL)
|
||||
ARRAY_ADD(&ss, s);
|
||||
}
|
||||
s = cmd_choose_session_list(&ss);
|
||||
ARRAY_FREE(&ss);
|
||||
if (wlp != NULL)
|
||||
*wlp = winlink_find_by_window(&s->windows, wp->window);
|
||||
*wlp = winlink_find_by_window(&s->windows, w);
|
||||
return (s);
|
||||
}
|
||||
|
||||
@ -707,6 +741,7 @@ cmd_find_session(struct cmd_ctx *ctx, const char *arg, int prefer_unattached)
|
||||
{
|
||||
struct session *s;
|
||||
struct window_pane *wp;
|
||||
struct window *w;
|
||||
struct client *c;
|
||||
char *tmparg;
|
||||
size_t arglen;
|
||||
@ -716,9 +751,11 @@ cmd_find_session(struct cmd_ctx *ctx, const char *arg, int prefer_unattached)
|
||||
if (arg == NULL)
|
||||
return (cmd_current_session(ctx, prefer_unattached));
|
||||
|
||||
/* Lookup as pane id. */
|
||||
/* Lookup as pane id or window id. */
|
||||
if ((wp = cmd_lookup_paneid(arg)) != NULL)
|
||||
return (cmd_pane_session(ctx, wp, NULL));
|
||||
return (cmd_window_session(ctx, wp->window, NULL));
|
||||
if ((w = cmd_lookup_windowid(arg)) != NULL)
|
||||
return (cmd_window_session(ctx, w, NULL));
|
||||
|
||||
/* Trim a single trailing colon if any. */
|
||||
tmparg = xstrdup(arg);
|
||||
@ -780,7 +817,7 @@ cmd_find_window(struct cmd_ctx *ctx, const char *arg, struct session **sp)
|
||||
|
||||
/* Lookup as pane id. */
|
||||
if ((wp = cmd_lookup_paneid(arg)) != NULL) {
|
||||
s = cmd_pane_session(ctx, wp, &wl);
|
||||
s = cmd_window_session(ctx, wp->window, &wl);
|
||||
if (sp != NULL)
|
||||
*sp = s;
|
||||
return (wl);
|
||||
@ -1081,7 +1118,7 @@ cmd_find_pane(struct cmd_ctx *ctx,
|
||||
|
||||
/* Lookup as pane id. */
|
||||
if ((*wpp = cmd_lookup_paneid(arg)) != NULL) {
|
||||
s = cmd_pane_session(ctx, *wpp, &wl);
|
||||
s = cmd_window_session(ctx, (*wpp)->window, &wl);
|
||||
if (sp != NULL)
|
||||
*sp = s;
|
||||
return (wl);
|
||||
|
Reference in New Issue
Block a user