summaryrefslogtreecommitdiffstats
path: root/usr.bin/tmux/cmd.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2012-11-27 09:20:03 +0000
committernicm <nicm@openbsd.org>2012-11-27 09:20:03 +0000
commitd030975780bbbfacc07e3bd16f763df90b065d33 (patch)
tree066d617fa5425545b721adb0a4ea4d5c90c3e742 /usr.bin/tmux/cmd.c
parentFix type typo (diff)
downloadwireguard-openbsd-d030975780bbbfacc07e3bd16f763df90b065d33.tar.xz
wireguard-openbsd-d030975780bbbfacc07e3bd16f763df90b065d33.zip
Fix session choice so that preferring unattached sessions actually
works, reported by Drew Frank.
Diffstat (limited to 'usr.bin/tmux/cmd.c')
-rw-r--r--usr.bin/tmux/cmd.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/usr.bin/tmux/cmd.c b/usr.bin/tmux/cmd.c
index 6cc0545bfed..cd46d13cec2 100644
--- a/usr.bin/tmux/cmd.c
+++ b/usr.bin/tmux/cmd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd.c,v 1.71 2012/09/24 13:05:10 nicm Exp $ */
+/* $OpenBSD: cmd.c,v 1.72 2012/11/27 09:20:03 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -116,6 +116,7 @@ const struct cmd_entry *cmd_table[] = {
NULL
};
+int cmd_session_better(struct session *, struct session *, int);
struct session *cmd_choose_session_list(struct sessionslist *);
struct session *cmd_choose_session(int);
struct client *cmd_choose_client(struct clients *);
@@ -371,6 +372,24 @@ cmd_current_session(struct cmd_ctx *ctx, int prefer_unattached)
return (cmd_choose_session(prefer_unattached));
}
+/* Is this session better? */
+int
+cmd_session_better(struct session *s, struct session *best,
+ int prefer_unattached)
+{
+ if (best == NULL)
+ return 1;
+ if (prefer_unattached) {
+ if (!(best->flags & SESSION_UNATTACHED) &&
+ (s->flags & SESSION_UNATTACHED))
+ return 1;
+ else if ((best->flags & SESSION_UNATTACHED) &&
+ !(s->flags & SESSION_UNATTACHED))
+ return 0;
+ }
+ return (timercmp(&s->activity_time, &best->activity_time, >));
+}
+
/*
* Find the most recently used session, preferring unattached if the flag is
* set.
@@ -378,21 +397,14 @@ cmd_current_session(struct cmd_ctx *ctx, int prefer_unattached)
struct session *
cmd_choose_session(int prefer_unattached)
{
- struct session *s, *sbest;
- struct timeval *tv = NULL;
+ struct session *s, *best;
- sbest = NULL;
+ best = NULL;
RB_FOREACH(s, sessions, &sessions) {
- if (tv == NULL || timercmp(&s->activity_time, tv, >) ||
- (prefer_unattached &&
- !(sbest->flags & SESSION_UNATTACHED) &&
- (s->flags & SESSION_UNATTACHED))) {
- sbest = s;
- tv = &s->activity_time;
- }
+ if (cmd_session_better(s, best, prefer_unattached))
+ best = s;
}
-
- return (sbest);
+ return (best);
}
/* Find the most recently used session from a list. */