=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-attach-session.c,v retrieving revision 1.3 retrieving revision 1.4 diff -c -r1.3 -r1.4 *** src/usr.bin/tmux/cmd-attach-session.c 2009/07/13 23:11:35 1.3 --- src/usr.bin/tmux/cmd-attach-session.c 2009/07/17 15:03:11 1.4 *************** *** 1,4 **** ! /* $OpenBSD: cmd-attach-session.c,v 1.3 2009/07/13 23:11:35 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-attach-session.c,v 1.4 2009/07/17 15:03:11 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 44,54 **** { struct cmd_target_data *data = self->data; struct session *s; char *cause; - if (ctx->curclient != NULL) - return (0); - if (ARRAY_LENGTH(&sessions) == 0) { ctx->error(ctx, "no sessions"); return (-1); --- 44,53 ---- { struct cmd_target_data *data = self->data; struct session *s; + struct client *c; char *cause; + u_int i; if (ARRAY_LENGTH(&sessions) == 0) { ctx->error(ctx, "no sessions"); return (-1); *************** *** 56,79 **** 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 (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; ! server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); recalculate_sizes(); - server_redraw_client(ctx->cmdclient); ! return (1); } --- 55,98 ---- if ((s = cmd_find_session(ctx, data->target)) == NULL) 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 (data->chflags & CMD_CHFLAG('d')) ! server_write_session(s, MSG_DETACH, NULL, 0); ! ctx->cmdclient->session = s; ! server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); ! server_redraw_client(ctx->cmdclient); ! } recalculate_sizes(); ! return (1); /* 1 means don't tell command client to exit */ }