summaryrefslogtreecommitdiffstats
path: root/cmd.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2012-01-31 12:01:43 +0000
committerTiago Cunha <tcunha@gmx.com>2012-01-31 12:01:43 +0000
commit2ee0d851d92c00c13998c112618feb84df323ad2 (patch)
tree926ca8c1888921a00edc20a78f954fa60117e1f2 /cmd.c
parentc08a532440a5aeeed58ce10b8e4ac9a409555ea7 (diff)
Sync OpenBSD patchset 1017:
Give each window a unique id, like panes but prefixed with @. Based on work from George Nachman.
Diffstat (limited to 'cmd.c')
-rw-r--r--cmd.c73
1 files changed, 55 insertions, 18 deletions
diff --git a/cmd.c b/cmd.c
index 9fcdfde7..3c9aeeee 100644
--- a/cmd.c
+++ b/cmd.c
@@ -119,8 +119,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 *);
@@ -586,6 +588,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) {
@@ -648,10 +654,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)
{
@@ -667,19 +670,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;
@@ -687,16 +721,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);
}
@@ -706,6 +740,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;
@@ -715,9 +750,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);
@@ -779,7 +816,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);
@@ -1080,7 +1117,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);