version 1.35, 2015/06/04 23:27:51 |
version 1.36, 2015/06/07 21:39:39 |
|
|
|
|
const struct cmd_entry cmd_attach_session_entry = { |
const struct cmd_entry cmd_attach_session_entry = { |
"attach-session", "attach", |
"attach-session", "attach", |
"c:drt:", 0, 0, |
"c:dErt:", 0, 0, |
"[-dr] [-c working-directory] " CMD_TARGET_SESSION_USAGE, |
"[-dEr] [-c working-directory] " CMD_TARGET_SESSION_USAGE, |
CMD_STARTSERVER, |
CMD_STARTSERVER, |
cmd_attach_session_exec |
cmd_attach_session_exec |
}; |
}; |
|
|
enum cmd_retval |
enum cmd_retval |
cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag, |
cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag, |
const char *cflag) |
const char *cflag, int Eflag) |
{ |
{ |
struct session *s; |
struct session *s; |
struct client *c; |
struct client *c = cmdq->client, *c_loop; |
struct winlink *wl = NULL; |
struct winlink *wl = NULL; |
struct window *w = NULL; |
struct window *w = NULL; |
struct window_pane *wp = NULL; |
struct window_pane *wp = NULL; |
|
|
wl = winlink_find_by_window(&s->windows, w); |
wl = winlink_find_by_window(&s->windows, w); |
} |
} |
|
|
if (cmdq->client == NULL) |
if (c == NULL) |
return (CMD_RETURN_NORMAL); |
return (CMD_RETURN_NORMAL); |
if (server_client_check_nested(cmdq->client)) { |
if (server_client_check_nested(c)) { |
cmdq_error(cmdq, "sessions should be nested with care, " |
cmdq_error(cmdq, "sessions should be nested with care, " |
"unset $TMUX to force"); |
"unset $TMUX to force"); |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
|
|
session_set_current(s, wl); |
session_set_current(s, wl); |
} |
} |
|
|
if (cmdq->client->session != NULL) { |
if (c->session != NULL) { |
if (dflag) { |
if (dflag) { |
/* |
/* |
* Can't use server_write_session in case attaching to |
* Can't use server_write_session in case attaching to |
* the same session as currently attached to. |
* the same session as currently attached to. |
*/ |
*/ |
TAILQ_FOREACH(c, &clients, entry) { |
TAILQ_FOREACH(c_loop, &clients, entry) { |
if (c->session != s || c == cmdq->client) |
if (c_loop->session != s || c == c) |
continue; |
continue; |
server_write_client(c, MSG_DETACH, |
server_write_client(c, MSG_DETACH, |
c->session->name, |
c_loop->session->name, |
strlen(c->session->name) + 1); |
strlen(c_loop->session->name) + 1); |
} |
} |
} |
} |
|
|
|
|
s->cwd = fd; |
s->cwd = fd; |
} |
} |
|
|
cmdq->client->session = s; |
c->session = s; |
notify_attached_session_changed(cmdq->client); |
notify_attached_session_changed(c); |
session_update_activity(s); |
session_update_activity(s); |
server_redraw_client(cmdq->client); |
server_redraw_client(c); |
s->curw->flags &= ~WINLINK_ALERTFLAGS; |
s->curw->flags &= ~WINLINK_ALERTFLAGS; |
} else { |
} else { |
if (server_client_open(cmdq->client, &cause) != 0) { |
if (server_client_open(c, &cause) != 0) { |
cmdq_error(cmdq, "open terminal failed: %s", cause); |
cmdq_error(cmdq, "open terminal failed: %s", cause); |
free(cause); |
free(cause); |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
|
|
} |
} |
|
|
if (rflag) |
if (rflag) |
cmdq->client->flags |= CLIENT_READONLY; |
c->flags |= CLIENT_READONLY; |
|
|
if (dflag) { |
if (dflag) { |
server_write_session(s, MSG_DETACH, s->name, |
server_write_session(s, MSG_DETACH, s->name, |
strlen(s->name) + 1); |
strlen(s->name) + 1); |
} |
} |
|
|
update = options_get_string(&s->options, "update-environment"); |
if (!Eflag) { |
environ_update(update, &cmdq->client->environ, &s->environ); |
update = options_get_string(&s->options, |
|
"update-environment"); |
|
environ_update(update, &c->environ, &s->environ); |
|
} |
|
|
cmdq->client->session = s; |
c->session = s; |
notify_attached_session_changed(cmdq->client); |
notify_attached_session_changed(c); |
session_update_activity(s); |
session_update_activity(s); |
server_redraw_client(cmdq->client); |
server_redraw_client(c); |
s->curw->flags &= ~WINLINK_ALERTFLAGS; |
s->curw->flags &= ~WINLINK_ALERTFLAGS; |
|
|
server_write_ready(cmdq->client); |
server_write_ready(c); |
cmdq->client_exit = 0; |
cmdq->client_exit = 0; |
} |
} |
recalculate_sizes(); |
recalculate_sizes(); |
|
|
struct args *args = self->args; |
struct args *args = self->args; |
|
|
return (cmd_attach_session(cmdq, args_get(args, 't'), |
return (cmd_attach_session(cmdq, args_get(args, 't'), |
args_has(args, 'd'), args_has(args, 'r'), args_get(args, 'c'))); |
args_has(args, 'd'), args_has(args, 'r'), args_get(args, 'c'), |
|
args_has(args, 'E'))); |
} |
} |