Merge branch 'obsd-master'

Conflicts:
	Makefile
	cmd-list-commands.c
	cmd-suspend-client.c
	job.c
	tmux.h
	xmalloc.c
This commit is contained in:
Thomas Adam
2014-10-21 07:11:44 +01:00
100 changed files with 432 additions and 757 deletions

99
cmd.c
View File

@ -120,7 +120,7 @@ struct session *cmd_choose_session_list(struct sessionslist *);
struct session *cmd_choose_session(int);
struct client *cmd_choose_client(struct clients *);
struct client *cmd_lookup_client(const char *);
struct session *cmd_lookup_session(const char *, int *);
struct session *cmd_lookup_session(struct cmd_q *, const char *, int *);
struct session *cmd_lookup_session_id(const char *);
struct winlink *cmd_lookup_window(struct session *, const char *, int *);
int cmd_lookup_index(struct session *, const char *, int *);
@ -221,7 +221,7 @@ cmd_stringify_argv(int argc, char **argv)
for (i = 0; i < argc; i++) {
len += strlen(argv[i]) + 1;
buf = xrealloc(buf, 1, len);
buf = xrealloc(buf, len);
if (i == 0)
*buf = '\0';
@ -584,9 +584,11 @@ cmd_lookup_session_id(const char *arg)
/* Lookup a session by name. If no session is found, NULL is returned. */
struct session *
cmd_lookup_session(const char *name, int *ambiguous)
cmd_lookup_session(struct cmd_q *cmdq, const char *name, int *ambiguous)
{
struct session *s, *sfound;
struct session *s, *sfound;
struct window *w;
struct window_pane *wp;
*ambiguous = 0;
@ -594,6 +596,12 @@ cmd_lookup_session(const char *name, int *ambiguous)
if ((s = cmd_lookup_session_id(name)) != NULL)
return (s);
/* Try as pane or window id. */
if ((wp = cmd_lookup_paneid(name)) != NULL)
return (cmd_window_session(cmdq, wp->window, NULL));
if ((w = cmd_lookup_windowid(name)) != NULL)
return (cmd_window_session(cmdq, w, NULL));
/*
* Look for matches. First look for exact matches - session names must
* be unique so an exact match can't be ambigious and can just be
@ -629,16 +637,30 @@ cmd_lookup_session(const char *name, int *ambiguous)
struct winlink *
cmd_lookup_window(struct session *s, const char *name, int *ambiguous)
{
struct winlink *wl, *wlfound;
const char *errstr;
u_int idx;
struct winlink *wl, *wlfound;
struct window *w;
struct window_pane *wp;
const char *errstr;
u_int idx;
*ambiguous = 0;
/* Try as a window id. */
/* Try as pane or window id. */
if ((wl = cmd_lookup_winlink_windowid(s, name)) != NULL)
return (wl);
/* Lookup as pane or window id. */
if ((wp = cmd_lookup_paneid(name)) != NULL) {
wl = winlink_find_by_window(&s->windows, wp->window);
if (wl != NULL)
return (wl);
}
if ((w = cmd_lookup_windowid(name)) != NULL) {
wl = winlink_find_by_window(&s->windows, w);
if (wl != 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) {
@ -785,13 +807,11 @@ cmd_window_session(struct cmd_q *cmdq, struct window *w, struct winlink **wlp)
struct session *
cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached)
{
struct session *s;
struct window_pane *wp;
struct window *w;
struct client *c;
char *tmparg;
size_t arglen;
int ambiguous;
struct session *s;
struct client *c;
char *tmparg;
size_t arglen;
int ambiguous;
/* A NULL argument means the current session. */
if (arg == NULL) {
@ -800,12 +820,6 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached)
return (s);
}
/* Lookup as pane id or window id. */
if ((wp = cmd_lookup_paneid(arg)) != NULL)
return (cmd_window_session(cmdq, wp->window, NULL));
if ((w = cmd_lookup_windowid(arg)) != NULL)
return (cmd_window_session(cmdq, w, NULL));
/* Trim a single trailing colon if any. */
tmparg = xstrdup(arg);
arglen = strlen(tmparg);
@ -821,7 +835,7 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached)
}
/* Find the session, if any. */
s = cmd_lookup_session(tmparg, &ambiguous);
s = cmd_lookup_session(cmdq, tmparg, &ambiguous);
/* If it doesn't, try to match it as a client. */
if (s == NULL && (c = cmd_lookup_client(tmparg)) != NULL)
@ -843,12 +857,11 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached)
struct winlink *
cmd_find_window(struct cmd_q *cmdq, const char *arg, struct session **sp)
{
struct session *s;
struct winlink *wl;
struct window_pane *wp;
const char *winptr;
char *sessptr = NULL;
int ambiguous = 0;
struct session *s;
struct winlink *wl;
const char *winptr;
char *sessptr = NULL;
int ambiguous = 0;
/*
* Find the current session. There must always be a current session, if
@ -866,14 +879,6 @@ cmd_find_window(struct cmd_q *cmdq, const char *arg, struct session **sp)
return (s->curw);
}
/* Lookup as pane id. */
if ((wp = cmd_lookup_paneid(arg)) != NULL) {
s = cmd_window_session(cmdq, wp->window, &wl);
if (sp != NULL)
*sp = s;
return (wl);
}
/* Time to look at the argument. If it is empty, that is an error. */
if (*arg == '\0')
goto not_found;
@ -888,7 +893,7 @@ cmd_find_window(struct cmd_q *cmdq, const char *arg, struct session **sp)
/* Try to lookup the session if present. */
if (*sessptr != '\0') {
if ((s = cmd_lookup_session(sessptr, &ambiguous)) == NULL)
if ((s = cmd_lookup_session(cmdq, sessptr, &ambiguous)) == NULL)
goto no_session;
}
if (sp != NULL)
@ -939,7 +944,8 @@ no_colon:
lookup_session:
if (ambiguous)
goto not_found;
if (*arg != '\0' && (s = cmd_lookup_session(arg, &ambiguous)) == NULL)
if (*arg != '\0' &&
(s = cmd_lookup_session(cmdq, arg, &ambiguous)) == NULL)
goto no_session;
if (sp != NULL)
@ -1029,7 +1035,7 @@ cmd_find_index(struct cmd_q *cmdq, const char *arg, struct session **sp)
/* Try to lookup the session if present. */
if (sessptr != NULL && *sessptr != '\0') {
if ((s = cmd_lookup_session(sessptr, &ambiguous)) == NULL)
if ((s = cmd_lookup_session(cmdq, sessptr, &ambiguous)) == NULL)
goto no_session;
}
if (sp != NULL)
@ -1077,7 +1083,8 @@ no_colon:
lookup_session:
if (ambiguous)
goto not_found;
if (*arg != '\0' && (s = cmd_lookup_session(arg, &ambiguous)) == NULL)
if (*arg != '\0' &&
(s = cmd_lookup_session(cmdq, arg, &ambiguous)) == NULL)
goto no_session;
if (sp != NULL)
@ -1191,7 +1198,13 @@ cmd_find_pane(struct cmd_q *cmdq,
*wpp = wl->window->active;
else if (paneptr[0] == '+' || paneptr[0] == '-')
*wpp = cmd_find_pane_offset(paneptr, wl);
else {
else if (paneptr[0] == '!' && paneptr[1] == '\0') {
if (wl->window->last == NULL) {
cmdq_error(cmdq, "no last pane");
goto error;
}
*wpp = wl->window->last;
} else {
idx = strtonum(paneptr, 0, INT_MAX, &errstr);
if (errstr != NULL)
goto lookup_string;
@ -1288,11 +1301,11 @@ cmd_template_replace(const char *template, const char *s, int idx)
ptr++;
len += strlen(s);
buf = xrealloc(buf, 1, len + 1);
buf = xrealloc(buf, len + 1);
strlcat(buf, s, len + 1);
continue;
}
buf = xrealloc(buf, 1, len + 2);
buf = xrealloc(buf, len + 2);
buf[len++] = ch;
buf[len] = '\0';
}