|PatchSet 882

|Date: 2011/04/05 20:37:01
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Add a flag to cmd_find_session so that attach-session can prefer
|unattached sessions when choosing the most recently used (if -t is not
|given). Suggested by claudio@.
pull/1/head
Nicholas Marriott 2011-04-06 22:24:01 +00:00
parent ae5954d30a
commit 4e452a2e11
18 changed files with 65 additions and 48 deletions

View File

@ -1,4 +1,4 @@
/* $Id: cmd-attach-session.c,v 1.39 2011-01-07 14:45:33 tcunha Exp $ */ /* $Id: cmd-attach-session.c,v 1.40 2011-04-06 22:24:00 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -51,7 +51,7 @@ cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx)
return (-1); return (-1);
} }
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL) if ((s = cmd_find_session(ctx, args_get(args, 't'), 1)) == NULL)
return (-1); return (-1);
if (ctx->cmdclient == NULL && ctx->curclient == NULL) if (ctx->cmdclient == NULL && ctx->curclient == NULL)

View File

@ -1,4 +1,4 @@
/* $Id: cmd-has-session.c,v 1.16 2011-01-07 14:45:34 tcunha Exp $ */ /* $Id: cmd-has-session.c,v 1.17 2011-04-06 22:24:00 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -41,7 +41,7 @@ cmd_has_session_exec(struct cmd *self, struct cmd_ctx *ctx)
{ {
struct args *args = self->args; struct args *args = self->args;
if (cmd_find_session(ctx, args_get(args, 't')) == NULL) if (cmd_find_session(ctx, args_get(args, 't'), 0) == NULL)
return (-1); return (-1);
return (0); return (0);

View File

@ -1,4 +1,4 @@
/* $Id: cmd-kill-session.c,v 1.19 2011-01-07 14:45:34 tcunha Exp $ */ /* $Id: cmd-kill-session.c,v 1.20 2011-04-06 22:24:00 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -45,7 +45,7 @@ cmd_kill_session_exec(struct cmd *self, struct cmd_ctx *ctx)
struct args *args = self->args; struct args *args = self->args;
struct session *s; struct session *s;
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL) if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
return (-1); return (-1);
server_destroy_session(s); server_destroy_session(s);

View File

@ -1,4 +1,4 @@
/* $Id: cmd-list-panes.c,v 1.9 2011-04-06 22:20:16 nicm Exp $ */ /* $Id: cmd-list-panes.c,v 1.10 2011-04-06 22:24:00 nicm Exp $ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@ -52,7 +52,7 @@ cmd_list_panes_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(args, 'a')) if (args_has(args, 'a'))
cmd_list_panes_server(ctx); cmd_list_panes_server(ctx);
else if (args_has(args, 's')) { else if (args_has(args, 's')) {
s = cmd_find_session(ctx, args_get(args, 't')); s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL) if (s == NULL)
return (-1); return (-1);
cmd_list_panes_session(s, ctx); cmd_list_panes_session(s, ctx);

View File

@ -1,4 +1,4 @@
/* $Id: cmd-list-windows.c,v 1.46 2011-04-06 22:20:16 nicm Exp $ */ /* $Id: cmd-list-windows.c,v 1.47 2011-04-06 22:24:00 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -50,7 +50,7 @@ cmd_list_windows_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(args, 'a')) if (args_has(args, 'a'))
cmd_list_windows_server(ctx); cmd_list_windows_server(ctx);
else { else {
s = cmd_find_session(ctx, args_get(args, 't')); s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL) if (s == NULL)
return (-1); return (-1);
cmd_list_windows_session(s, ctx); cmd_list_windows_session(s, ctx);

View File

@ -1,4 +1,4 @@
/* $Id: cmd-lock-server.c,v 1.11 2011-01-07 15:02:38 tcunha Exp $ */ /* $Id: cmd-lock-server.c,v 1.12 2011-04-06 22:24:00 nicm Exp $ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@ -71,7 +71,7 @@ cmd_lock_server_exec(struct cmd *self, unused struct cmd_ctx *ctx)
if (self->entry == &cmd_lock_server_entry) if (self->entry == &cmd_lock_server_entry)
server_lock(); server_lock();
else if (self->entry == &cmd_lock_session_entry) { else if (self->entry == &cmd_lock_session_entry) {
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL) if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
return (-1); return (-1);
server_lock_session(s); server_lock_session(s);
} else { } else {

View File

@ -1,4 +1,4 @@
/* $Id: cmd-new-session.c,v 1.84 2011-02-15 15:25:48 tcunha Exp $ */ /* $Id: cmd-new-session.c,v 1.85 2011-04-06 22:24:00 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -75,7 +75,7 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
target = args_get(args, 't'); target = args_get(args, 't');
if (target != NULL) { if (target != NULL) {
groupwith = cmd_find_session(ctx, target); groupwith = cmd_find_session(ctx, target, 0);
if (groupwith == NULL) if (groupwith == NULL)
return (-1); return (-1);
} else } else

View File

@ -1,4 +1,4 @@
/* $Id: cmd-rename-session.c,v 1.22 2011-01-07 14:45:34 tcunha Exp $ */ /* $Id: cmd-rename-session.c,v 1.23 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -51,7 +51,7 @@ cmd_rename_session_exec(struct cmd *self, struct cmd_ctx *ctx)
return (-1); return (-1);
} }
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL) if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
return (-1); return (-1);
RB_REMOVE(sessions, &sessions, s); RB_REMOVE(sessions, &sessions, s);

View File

@ -1,4 +1,4 @@
/* $Id: cmd-select-window.c,v 1.26 2011-01-07 15:02:38 tcunha Exp $ */ /* $Id: cmd-select-window.c,v 1.27 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -102,7 +102,7 @@ cmd_select_window_exec(struct cmd *self, struct cmd_ctx *ctx)
last = 1; last = 1;
if (next || previous || last) { if (next || previous || last) {
s = cmd_find_session(ctx, args_get(args, 't')); s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL) if (s == NULL)
return (-1); return (-1);

View File

@ -1,4 +1,4 @@
/* $Id: cmd-set-environment.c,v 1.4 2011-01-07 14:45:34 tcunha Exp $ */ /* $Id: cmd-set-environment.c,v 1.5 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@ -65,7 +65,7 @@ cmd_set_environment_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(self->args, 'g')) if (args_has(self->args, 'g'))
env = &global_environ; env = &global_environ;
else { else {
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL) if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
return (-1); return (-1);
env = &s->environ; env = &s->environ;
} }

View File

@ -1,4 +1,4 @@
/* $Id: cmd-set-option.c,v 1.111 2011-04-06 22:22:49 nicm Exp $ */ /* $Id: cmd-set-option.c,v 1.112 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -164,7 +164,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(self->args, 'g')) if (args_has(self->args, 'g'))
oo = &global_s_options; oo = &global_s_options;
else { else {
s = cmd_find_session(ctx, args_get(args, 't')); s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL) if (s == NULL)
return (-1); return (-1);
oo = &s->options; oo = &s->options;

View File

@ -1,4 +1,4 @@
/* $Id: cmd-show-buffer.c,v 1.14 2011-01-07 14:45:34 tcunha Exp $ */ /* $Id: cmd-show-buffer.c,v 1.15 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -47,7 +47,7 @@ cmd_show_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
size_t size, len; size_t size, len;
u_int width; u_int width;
if ((s = cmd_find_session(ctx, NULL)) == NULL) if ((s = cmd_find_session(ctx, NULL, 0)) == NULL)
return (-1); return (-1);
if (!args_has(args, 'b')) { if (!args_has(args, 'b')) {

View File

@ -1,4 +1,4 @@
/* $Id: cmd-show-environment.c,v 1.3 2011-01-07 14:45:34 tcunha Exp $ */ /* $Id: cmd-show-environment.c,v 1.4 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@ -50,7 +50,7 @@ cmd_show_environment_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(self->args, 'g')) if (args_has(self->args, 'g'))
env = &global_environ; env = &global_environ;
else { else {
if ((s = cmd_find_session(ctx, args_get(args, 't'))) == NULL) if ((s = cmd_find_session(ctx, args_get(args, 't'), 0)) == NULL)
return (-1); return (-1);
env = &s->environ; env = &s->environ;
} }

View File

@ -1,4 +1,4 @@
/* $Id: cmd-show-options.c,v 1.24 2011-01-07 15:02:38 tcunha Exp $ */ /* $Id: cmd-show-options.c,v 1.25 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -79,7 +79,7 @@ cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(self->args, 'g')) if (args_has(self->args, 'g'))
oo = &global_s_options; oo = &global_s_options;
else { else {
s = cmd_find_session(ctx, args_get(args, 't')); s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL) if (s == NULL)
return (-1); return (-1);
oo = &s->options; oo = &s->options;

View File

@ -1,4 +1,4 @@
/* $Id: cmd-switch-client.c,v 1.25 2011-01-07 14:45:34 tcunha Exp $ */ /* $Id: cmd-switch-client.c,v 1.26 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -86,7 +86,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx)
return (-1); return (-1);
} }
} else } else
s = cmd_find_session(ctx, args_get(args, 't')); s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL) if (s == NULL)
return (-1); return (-1);

34
cmd.c
View File

@ -1,4 +1,4 @@
/* $Id: cmd.c,v 1.150 2011-04-06 22:16:33 nicm Exp $ */ /* $Id: cmd.c,v 1.151 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -111,7 +111,7 @@ const struct cmd_entry *cmd_table[] = {
}; };
struct session *cmd_choose_session_list(struct sessionslist *); struct session *cmd_choose_session_list(struct sessionslist *);
struct session *cmd_choose_session(void); struct session *cmd_choose_session(int);
struct client *cmd_choose_client(struct clients *); struct client *cmd_choose_client(struct clients *);
struct client *cmd_lookup_client(const char *); struct client *cmd_lookup_client(const char *);
struct session *cmd_lookup_session(const char *, int *); struct session *cmd_lookup_session(const char *, int *);
@ -315,7 +315,7 @@ cmd_print(struct cmd *cmd, char *buf, size_t len)
* session from all sessions. * session from all sessions.
*/ */
struct session * struct session *
cmd_current_session(struct cmd_ctx *ctx) cmd_current_session(struct cmd_ctx *ctx, int prefer_unattached)
{ {
struct msg_command_data *data = ctx->msgdata; struct msg_command_data *data = ctx->msgdata;
struct client *c = ctx->cmdclient; struct client *c = ctx->cmdclient;
@ -364,19 +364,25 @@ cmd_current_session(struct cmd_ctx *ctx)
return (s); return (s);
} }
return (cmd_choose_session()); return (cmd_choose_session(prefer_unattached));
} }
/* Find the most recently used session. */ /*
* Find the most recently used session, preferring unattached if the flag is
* set.
*/
struct session * struct session *
cmd_choose_session(void) cmd_choose_session(int prefer_unattached)
{ {
struct session *s, *sbest; struct session *s, *sbest;
struct timeval *tv = NULL; struct timeval *tv = NULL;
sbest = NULL; sbest = NULL;
RB_FOREACH(s, sessions, &sessions) { RB_FOREACH(s, sessions, &sessions) {
if (tv == NULL || timercmp(&s->activity_time, tv, >)) { if (tv == NULL || timercmp(&s->activity_time, tv, >) ||
(prefer_unattached &&
!(sbest->flags & SESSION_UNATTACHED) &&
(s->flags & SESSION_UNATTACHED))) {
sbest = s; sbest = s;
tv = &s->activity_time; tv = &s->activity_time;
} }
@ -427,7 +433,7 @@ cmd_current_client(struct cmd_ctx *ctx)
* No current client set. Find the current session and return the * No current client set. Find the current session and return the
* newest of its clients. * newest of its clients.
*/ */
s = cmd_current_session(ctx); s = cmd_current_session(ctx, 0);
if (s != NULL && !(s->flags & SESSION_UNATTACHED)) { if (s != NULL && !(s->flags & SESSION_UNATTACHED)) {
ARRAY_INIT(&cc); ARRAY_INIT(&cc);
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
@ -670,7 +676,7 @@ cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
struct winlink *wl; struct winlink *wl;
/* If this pane is in the current session, return that winlink. */ /* If this pane is in the current session, return that winlink. */
s = cmd_current_session(ctx); s = cmd_current_session(ctx, 0);
if (s != NULL) { if (s != NULL) {
wl = winlink_find_by_window(&s->windows, wp->window); wl = winlink_find_by_window(&s->windows, wp->window);
if (wl != NULL) { if (wl != NULL) {
@ -695,7 +701,7 @@ cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
/* Find the target session or report an error and return NULL. */ /* Find the target session or report an error and return NULL. */
struct session * struct session *
cmd_find_session(struct cmd_ctx *ctx, const char *arg) cmd_find_session(struct cmd_ctx *ctx, const char *arg, int prefer_unattached)
{ {
struct session *s; struct session *s;
struct window_pane *wp; struct window_pane *wp;
@ -706,7 +712,7 @@ cmd_find_session(struct cmd_ctx *ctx, const char *arg)
/* A NULL argument means the current session. */ /* A NULL argument means the current session. */
if (arg == NULL) if (arg == NULL)
return (cmd_current_session(ctx)); return (cmd_current_session(ctx, prefer_unattached));
tmparg = xstrdup(arg); tmparg = xstrdup(arg);
/* Lookup as pane id. */ /* Lookup as pane id. */
@ -752,7 +758,7 @@ cmd_find_window(struct cmd_ctx *ctx, const char *arg, struct session **sp)
* Find the current session. There must always be a current session, if * Find the current session. There must always be a current session, if
* it can't be found, report an error. * it can't be found, report an error.
*/ */
if ((s = cmd_current_session(ctx)) == NULL) { if ((s = cmd_current_session(ctx, 0)) == NULL) {
ctx->error(ctx, "can't establish current session"); ctx->error(ctx, "can't establish current session");
return (NULL); return (NULL);
} }
@ -899,7 +905,7 @@ cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp)
* Find the current session. There must always be a current session, if * Find the current session. There must always be a current session, if
* it can't be found, report an error. * it can't be found, report an error.
*/ */
if ((s = cmd_current_session(ctx)) == NULL) { if ((s = cmd_current_session(ctx, 0)) == NULL) {
ctx->error(ctx, "can't establish current session"); ctx->error(ctx, "can't establish current session");
return (-2); return (-2);
} }
@ -1053,7 +1059,7 @@ cmd_find_pane(struct cmd_ctx *ctx,
u_int idx; u_int idx;
/* Get the current session. */ /* Get the current session. */
if ((s = cmd_current_session(ctx)) == NULL) { if ((s = cmd_current_session(ctx, 0)) == NULL) {
ctx->error(ctx, "can't establish current session"); ctx->error(ctx, "can't establish current session");
return (NULL); return (NULL);
} }

13
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.301 2011-04-06 22:23:14 nicm Exp $ .\" $Id: tmux.1,v 1.302 2011-04-06 22:24:01 nicm Exp $
.\" .\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\" .\"
@ -566,6 +566,17 @@ If no server is started,
.Ic attach-session .Ic attach-session
will attempt to start it; this will fail unless sessions are created in the will attempt to start it; this will fail unless sessions are created in the
configuration file. configuration file.
.Pp
The
.Ar target-session
rules for
.Ic attach-session
are slightly adjusted: if
.Nm
needs to select the most recently used session, it will prefer the most
recently used
.Em unattached
session.
.It Xo Ic detach-client .It Xo Ic detach-client
.Op Fl P .Op Fl P
.Op Fl t Ar target-client .Op Fl t Ar target-client

6
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.616 2011-04-06 22:21:02 nicm Exp $ */ /* $Id: tmux.h,v 1.617 2011-04-06 22:24:01 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -1483,10 +1483,10 @@ struct cmd *cmd_parse(int, char **, char **);
int cmd_exec(struct cmd *, struct cmd_ctx *); int cmd_exec(struct cmd *, struct cmd_ctx *);
void cmd_free(struct cmd *); void cmd_free(struct cmd *);
size_t cmd_print(struct cmd *, char *, size_t); size_t cmd_print(struct cmd *, char *, size_t);
struct session *cmd_current_session(struct cmd_ctx *); struct session *cmd_current_session(struct cmd_ctx *, int);
struct client *cmd_current_client(struct cmd_ctx *); struct client *cmd_current_client(struct cmd_ctx *);
struct client *cmd_find_client(struct cmd_ctx *, const char *); struct client *cmd_find_client(struct cmd_ctx *, const char *);
struct session *cmd_find_session(struct cmd_ctx *, const char *); struct session *cmd_find_session(struct cmd_ctx *, const char *, int);
struct winlink *cmd_find_window( struct winlink *cmd_find_window(
struct cmd_ctx *, const char *, struct session **); struct cmd_ctx *, const char *, struct session **);
int cmd_find_index( int cmd_find_index(