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:
parent
dcfa183cfe
commit
64c26cf8ce
@ -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
66
cmd.c
@ -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
11
tmux.1
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user