summaryrefslogtreecommitdiffstats
path: root/cmd-attach-session.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-07-17 15:03:11 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-07-17 15:03:11 +0000
commitce53936a2b56521903d69bac565391e37ad7e115 (patch)
tree5a77d399e686fe3db9687c157b109d5945eaf38e /cmd-attach-session.c
parent1938c994e7d9a27741735e6821217a16a134f039 (diff)
Tidy up new-session and attach-session and change them to work from inside
tmux, switching the current client to the new or requested session. Written with Josh Elsasser.
Diffstat (limited to 'cmd-attach-session.c')
-rw-r--r--cmd-attach-session.c55
1 files changed, 37 insertions, 18 deletions
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 196d5d13..aae8abe7 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -44,10 +44,9 @@ cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct session *s;
+ struct client *c;
char *cause;
-
- if (ctx->curclient != NULL)
- return (0);
+ u_int i;
if (ARRAY_LENGTH(&sessions) == 0) {
ctx->error(ctx, "no sessions");
@@ -56,24 +55,44 @@ cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx)
if ((s = cmd_find_session(ctx, data->target)) == NULL)
return (-1);
- if (!(ctx->cmdclient->flags & CLIENT_TERMINAL)) {
- ctx->error(ctx, "not a terminal");
- return (-1);
- }
+ if (ctx->cmdclient == NULL) {
+ if (data->chflags & CMD_CHFLAG('d')) {
+ /*
+ * Can't use server_write_session in case attaching to
+ * the same session as currently attached to.
+ */
+ for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
+ c = ARRAY_ITEM(&clients, i);
+ if (c == NULL || c->session != s)
+ continue;
+ if (c == ctx->curclient)
+ continue;
+ server_write_client(c, MSG_DETACH, NULL, 0);
+ }
+ }
+
+ ctx->curclient->session = s;
+ server_redraw_client(ctx->curclient);
+ } else {
+ if (!(ctx->cmdclient->flags & CLIENT_TERMINAL)) {
+ ctx->error(ctx, "not a terminal");
+ return (-1);
+ }
- if (tty_open(&ctx->cmdclient->tty, &cause) != 0) {
- ctx->error(ctx, "terminal open failed: %s", cause);
- xfree(cause);
- return (-1);
- }
+ if (tty_open(&ctx->cmdclient->tty, &cause) != 0) {
+ ctx->error(ctx, "terminal open failed: %s", cause);
+ xfree(cause);
+ return (-1);
+ }
- if (data->chflags & CMD_CHFLAG('d'))
- server_write_session(s, MSG_DETACH, NULL, 0);
- ctx->cmdclient->session = s;
+ if (data->chflags & CMD_CHFLAG('d'))
+ server_write_session(s, MSG_DETACH, NULL, 0);
- server_write_client(ctx->cmdclient, MSG_READY, NULL, 0);
+ ctx->cmdclient->session = s;
+ server_write_client(ctx->cmdclient, MSG_READY, NULL, 0);
+ server_redraw_client(ctx->cmdclient);
+ }
recalculate_sizes();
- server_redraw_client(ctx->cmdclient);
- return (1);
+ return (1); /* 1 means don't tell command client to exit */
}