1
0
mirror of https://github.com/tmate-io/tmate-ssh-server.git synced 2020-11-18 19:53:51 -08:00

Sync OpenBSD patchset 611:

Permit !, + and - to be used for window targets to specify last window (!), or
next and previous window by number (+ and -).

Also tidy an if in cmd-new-window.c.
This commit is contained in:
Tiago Cunha 2010-01-22 17:28:34 +00:00
parent dcfa183cfe
commit 64c26cf8ce
3 changed files with 79 additions and 26 deletions

View File

@ -1,4 +1,4 @@
/* $Id: cmd-new-window.c,v 1.42 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id: cmd-new-window.c,v 1.43 2010-01-22 17:28:34 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -129,21 +129,19 @@ cmd_new_window_exec(struct cmd *self, struct cmd_ctx *ctx)
wl = NULL; wl = NULL;
if (idx != -1) if (idx != -1)
wl = winlink_find_by_index(&s->windows, idx); wl = winlink_find_by_index(&s->windows, idx);
if (wl != NULL) { if (wl != NULL && data->flag_kill) {
if (data->flag_kill) { /*
/* * Can't use session_detach as it will destroy session if this
* Can't use session_detach as it will destroy session * makes it empty.
* if this makes it empty. */
*/ session_alert_cancel(s, wl);
session_alert_cancel(s, wl); winlink_stack_remove(&s->lastw, wl);
winlink_stack_remove(&s->lastw, wl); winlink_remove(&s->windows, wl);
winlink_remove(&s->windows, wl);
/* Force select/redraw if current. */ /* Force select/redraw if current. */
if (wl == s->curw) { if (wl == s->curw) {
data->flag_detached = 0; data->flag_detached = 0;
s->curw = NULL; s->curw = NULL;
}
} }
} }

66
cmd.c
View File

@ -1,4 +1,4 @@
/* $Id: cmd.c,v 1.136 2010-01-08 16:31:35 tcunha Exp $ */ /* $Id: cmd.c,v 1.137 2010-01-22 17:28:34 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -701,11 +701,19 @@ cmd_find_window(struct cmd_ctx *ctx, const char *arg, struct session **sp)
/* /*
* Then work out the window. An empty string is the current window, * Then work out the window. An empty string is the current window,
* otherwise try to look it up in the session. * otherwise try special cases then to look it up in the session.
*/ */
if (*winptr == '\0') if (*winptr == '\0')
wl = s->curw; wl = s->curw;
else if ((wl = cmd_lookup_window(s, winptr, &ambiguous)) == NULL) else if (winptr[0] == '!' && winptr[1] == '\0')
wl = TAILQ_FIRST(&s->lastw);
else if (winptr[0] == '+' && winptr[1] == '\0')
wl = winlink_next(s->curw);
else if (winptr[0] == '-' && winptr[1] == '\0')
wl = winlink_previous(s->curw);
else
wl = cmd_lookup_window(s, winptr, &ambiguous);
if (wl == NULL)
goto not_found; goto not_found;
if (sessptr != NULL) if (sessptr != NULL)
@ -713,8 +721,20 @@ cmd_find_window(struct cmd_ctx *ctx, const char *arg, struct session **sp)
return (wl); return (wl);
no_colon: no_colon:
/* No colon in the string, first try as a window then as a session. */ /*
if ((wl = cmd_lookup_window(s, arg, &ambiguous)) == NULL) { * No colon in the string, first try special cases, then as a window
* and lastly as a session.
*/
if (arg[0] == '!' && arg[1] == '\0') {
if ((wl = TAILQ_FIRST(&s->lastw)) == NULL)
goto not_found;
} else if (arg[0] == '+' && arg[1] == '\0') {
if ((wl = winlink_next(s->curw)) == NULL)
goto not_found;
} else if (arg[0] == '-' && arg[1] == '\0') {
if ((wl = winlink_previous(s->curw)) == NULL)
goto not_found;
} else if ((wl = cmd_lookup_window(s, arg, &ambiguous)) == NULL) {
if (ambiguous) if (ambiguous)
goto not_found; goto not_found;
if ((s = cmd_lookup_session(arg, &ambiguous)) == NULL) if ((s = cmd_lookup_session(arg, &ambiguous)) == NULL)
@ -756,6 +776,7 @@ int
cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp) cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp)
{ {
struct session *s; struct session *s;
struct winlink *wl;
const char *winptr; const char *winptr;
char *sessptr = NULL; char *sessptr = NULL;
int idx, ambiguous = 0; int idx, ambiguous = 0;
@ -801,8 +822,20 @@ cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp)
* try to look it up in the session. * try to look it up in the session.
*/ */
if (*winptr == '\0') if (*winptr == '\0')
idx = -1; idx = -1;
else if ((idx = cmd_lookup_index(s, winptr, &ambiguous)) == -1) { else if (winptr[0] == '!' && winptr[1] == '\0') {
if ((wl = TAILQ_FIRST(&s->lastw)) == NULL)
goto not_found;
idx = wl->idx;
} else if (winptr[0] == '+' && winptr[1] == '\0') {
if (s->curw->idx == INT_MAX)
goto not_found;
idx = s->curw->idx + 1;
} else if (winptr[0] == '-' && winptr[1] == '\0') {
if (s->curw->idx == 0)
goto not_found;
idx = s->curw->idx - 1;
} else if ((idx = cmd_lookup_index(s, winptr, &ambiguous)) == -1) {
if (ambiguous) if (ambiguous)
goto not_found; goto not_found;
ctx->error(ctx, "invalid index: %s", arg); ctx->error(ctx, "invalid index: %s", arg);
@ -814,8 +847,23 @@ cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp)
return (idx); return (idx);
no_colon: no_colon:
/* No colon in the string, first try as a window then as a session. */ /*
if ((idx = cmd_lookup_index(s, arg, &ambiguous)) == -1) { * No colon in the string, first try special cases, then as a window
* and lastly as a session.
*/
if (arg[0] == '!' && arg[1] == '\0') {
if ((wl = TAILQ_FIRST(&s->lastw)) == NULL)
goto not_found;
idx = wl->idx;
} else if (arg[0] == '+' && arg[1] == '\0') {
if (s->curw->idx == INT_MAX)
goto not_found;
idx = s->curw->idx + 1;
} else if (arg[0] == '-' && arg[1] == '\0') {
if (s->curw->idx == 0)
goto not_found;
idx = s->curw->idx - 1;
} else if ((idx = cmd_lookup_index(s, arg, &ambiguous)) == -1) {
if (ambiguous) if (ambiguous)
goto not_found; goto not_found;
if ((s = cmd_lookup_session(arg, &ambiguous)) == NULL) if ((s = cmd_lookup_session(arg, &ambiguous)) == NULL)

11
tmux.1
View File

@ -1,4 +1,4 @@
.\" $OpenBSD: tmux.1,v 1.139 2010/01/18 19:16:04 nicm Exp $ .\" $Id: tmux.1,v 1.222 2010-01-22 17:28:34 tcunha Exp $
.\" .\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\" .\"
@ -14,7 +14,7 @@
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: January 18 2010 $ .Dd $Mdocdate: January 19 2010 $
.Dt TMUX 1 .Dt TMUX 1
.Os .Os
.Sh NAME .Sh NAME
@ -307,6 +307,13 @@ commands)
otherwise the current window in otherwise the current window in
.Em session .Em session
is chosen. is chosen.
The special character
.Ql \&!
uses the last (previously current) window, or
.Ql +
and
.Ql -
are the next window or the previous window by number.
When the argument does not contain a colon, When the argument does not contain a colon,
.Nm .Nm
first attempts to parse it as window; if that fails, an attempt is made to first attempts to parse it as window; if that fails, an attempt is made to