summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2011-04-05 19:37:01 +0000
committerNicholas Marriott <nicm@openbsd.org>2011-04-05 19:37:01 +0000
commit5d519ba526feffb08003e2c11c7230a6f2cc1d9e (patch)
tree446bc8a565b04861e848231e7d25dd49b1c96d8f
parentf16ea60cc0eceeb1e0bd580129d99aff4423ec19 (diff)
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@.
-rw-r--r--cmd-attach-session.c2
-rw-r--r--cmd-has-session.c2
-rw-r--r--cmd-kill-session.c2
-rw-r--r--cmd-list-panes.c2
-rw-r--r--cmd-list-windows.c2
-rw-r--r--cmd-lock-server.c2
-rw-r--r--cmd-new-session.c2
-rw-r--r--cmd-rename-session.c2
-rw-r--r--cmd-select-window.c2
-rw-r--r--cmd-set-environment.c2
-rw-r--r--cmd-set-option.c2
-rw-r--r--cmd-show-buffer.c2
-rw-r--r--cmd-show-environment.c2
-rw-r--r--cmd-show-options.c2
-rw-r--r--cmd-switch-client.c2
-rw-r--r--cmd.c32
-rw-r--r--tmux.111
-rw-r--r--tmux.h4
18 files changed, 47 insertions, 30 deletions
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index f320056d..1a1e3c5c 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -51,7 +51,7 @@ cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx)
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);
if (ctx->cmdclient == NULL && ctx->curclient == NULL)
diff --git a/cmd-has-session.c b/cmd-has-session.c
index d5d806a1..cfaf032b 100644
--- a/cmd-has-session.c
+++ b/cmd-has-session.c
@@ -41,7 +41,7 @@ cmd_has_session_exec(struct cmd *self, struct cmd_ctx *ctx)
{
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 (0);
diff --git a/cmd-kill-session.c b/cmd-kill-session.c
index 086dbc67..69caef9e 100644
--- a/cmd-kill-session.c
+++ b/cmd-kill-session.c
@@ -45,7 +45,7 @@ cmd_kill_session_exec(struct cmd *self, struct cmd_ctx *ctx)
struct args *args = self->args;
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);
server_destroy_session(s);
diff --git a/cmd-list-panes.c b/cmd-list-panes.c
index 830b8620..60324e64 100644
--- a/cmd-list-panes.c
+++ b/cmd-list-panes.c
@@ -52,7 +52,7 @@ cmd_list_panes_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(args, 'a'))
cmd_list_panes_server(ctx);
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)
return (-1);
cmd_list_panes_session(s, ctx);
diff --git a/cmd-list-windows.c b/cmd-list-windows.c
index 9233ab75..11d38412 100644
--- a/cmd-list-windows.c
+++ b/cmd-list-windows.c
@@ -50,7 +50,7 @@ cmd_list_windows_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(args, 'a'))
cmd_list_windows_server(ctx);
else {
- s = cmd_find_session(ctx, args_get(args, 't'));
+ s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL)
return (-1);
cmd_list_windows_session(s, ctx);
diff --git a/cmd-lock-server.c b/cmd-lock-server.c
index 955de11f..ecbcee9b 100644
--- a/cmd-lock-server.c
+++ b/cmd-lock-server.c
@@ -71,7 +71,7 @@ cmd_lock_server_exec(struct cmd *self, unused struct cmd_ctx *ctx)
if (self->entry == &cmd_lock_server_entry)
server_lock();
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);
server_lock_session(s);
} else {
diff --git a/cmd-new-session.c b/cmd-new-session.c
index f5e1316f..fc847bd2 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -75,7 +75,7 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
target = args_get(args, 't');
if (target != NULL) {
- groupwith = cmd_find_session(ctx, target);
+ groupwith = cmd_find_session(ctx, target, 0);
if (groupwith == NULL)
return (-1);
} else
diff --git a/cmd-rename-session.c b/cmd-rename-session.c
index 9ca43a7d..018e537f 100644
--- a/cmd-rename-session.c
+++ b/cmd-rename-session.c
@@ -51,7 +51,7 @@ cmd_rename_session_exec(struct cmd *self, struct cmd_ctx *ctx)
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);
RB_REMOVE(sessions, &sessions, s);
diff --git a/cmd-select-window.c b/cmd-select-window.c
index 0e1b9543..2e076ae9 100644
--- a/cmd-select-window.c
+++ b/cmd-select-window.c
@@ -102,7 +102,7 @@ cmd_select_window_exec(struct cmd *self, struct cmd_ctx *ctx)
last = 1;
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)
return (-1);
diff --git a/cmd-set-environment.c b/cmd-set-environment.c
index 3075fb07..b43de458 100644
--- a/cmd-set-environment.c
+++ b/cmd-set-environment.c
@@ -65,7 +65,7 @@ cmd_set_environment_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(self->args, 'g'))
env = &global_environ;
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);
env = &s->environ;
}
diff --git a/cmd-set-option.c b/cmd-set-option.c
index a0f7f447..9ddfba9c 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -164,7 +164,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(self->args, 'g'))
oo = &global_s_options;
else {
- s = cmd_find_session(ctx, args_get(args, 't'));
+ s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL)
return (-1);
oo = &s->options;
diff --git a/cmd-show-buffer.c b/cmd-show-buffer.c
index 256818f5..23490169 100644
--- a/cmd-show-buffer.c
+++ b/cmd-show-buffer.c
@@ -49,7 +49,7 @@ cmd_show_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
size_t size, len;
u_int width;
- if ((s = cmd_find_session(ctx, NULL)) == NULL)
+ if ((s = cmd_find_session(ctx, NULL, 0)) == NULL)
return (-1);
if (!args_has(args, 'b')) {
diff --git a/cmd-show-environment.c b/cmd-show-environment.c
index f52efbca..e84ff685 100644
--- a/cmd-show-environment.c
+++ b/cmd-show-environment.c
@@ -50,7 +50,7 @@ cmd_show_environment_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(self->args, 'g'))
env = &global_environ;
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);
env = &s->environ;
}
diff --git a/cmd-show-options.c b/cmd-show-options.c
index cc11ed64..2a4adb0f 100644
--- a/cmd-show-options.c
+++ b/cmd-show-options.c
@@ -79,7 +79,7 @@ cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx)
if (args_has(self->args, 'g'))
oo = &global_s_options;
else {
- s = cmd_find_session(ctx, args_get(args, 't'));
+ s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL)
return (-1);
oo = &s->options;
diff --git a/cmd-switch-client.c b/cmd-switch-client.c
index 66eae88b..25a57965 100644
--- a/cmd-switch-client.c
+++ b/cmd-switch-client.c
@@ -86,7 +86,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx)
return (-1);
}
} else
- s = cmd_find_session(ctx, args_get(args, 't'));
+ s = cmd_find_session(ctx, args_get(args, 't'), 0);
if (s == NULL)
return (-1);
diff --git a/cmd.c b/cmd.c
index 11910aac..ac66f6e8 100644
--- a/cmd.c
+++ b/cmd.c
@@ -112,7 +112,7 @@ const struct cmd_entry *cmd_table[] = {
};
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_lookup_client(const char *);
struct session *cmd_lookup_session(const char *, int *);
@@ -316,7 +316,7 @@ cmd_print(struct cmd *cmd, char *buf, size_t len)
* session from all sessions.
*/
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 client *c = ctx->cmdclient;
@@ -365,19 +365,25 @@ cmd_current_session(struct cmd_ctx *ctx)
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 *
-cmd_choose_session(void)
+cmd_choose_session(int prefer_unattached)
{
struct session *s, *sbest;
struct timeval *tv = NULL;
sbest = NULL;
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;
tv = &s->activity_time;
}
@@ -428,7 +434,7 @@ cmd_current_client(struct cmd_ctx *ctx)
* No current client set. Find the current session and return the
* newest of its clients.
*/
- s = cmd_current_session(ctx);
+ s = cmd_current_session(ctx, 0);
if (s != NULL && !(s->flags & SESSION_UNATTACHED)) {
ARRAY_INIT(&cc);
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
@@ -671,7 +677,7 @@ cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
struct winlink *wl;
/* 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) {
wl = winlink_find_by_window(&s->windows, wp->window);
if (wl != NULL) {
@@ -696,7 +702,7 @@ cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
/* Find the target session or report an error and return NULL. */
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 window_pane *wp;
@@ -707,7 +713,7 @@ cmd_find_session(struct cmd_ctx *ctx, const char *arg)
/* A NULL argument means the current session. */
if (arg == NULL)
- return (cmd_current_session(ctx));
+ return (cmd_current_session(ctx, prefer_unattached));
tmparg = xstrdup(arg);
/* Lookup as pane id. */
@@ -753,7 +759,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
* 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");
return (NULL);
}
@@ -900,7 +906,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
* 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");
return (-2);
}
@@ -1054,7 +1060,7 @@ cmd_find_pane(struct cmd_ctx *ctx,
u_int idx;
/* 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");
return (NULL);
}
diff --git a/tmux.1 b/tmux.1
index 3b563b2c..7c5ea455 100644
--- a/tmux.1
+++ b/tmux.1
@@ -562,6 +562,17 @@ If no server is started,
.Ic attach-session
will attempt to start it; this will fail unless sessions are created in the
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
.Op Fl P
.Op Fl t Ar target-client
diff --git a/tmux.h b/tmux.h
index b3e9868f..a2af2a87 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1487,10 +1487,10 @@ struct cmd *cmd_parse(int, char **, char **);
int cmd_exec(struct cmd *, struct cmd_ctx *);
void cmd_free(struct cmd *);
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_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 cmd_ctx *, const char *, struct session **);
int cmd_find_index(