diff options
author | 2012-11-27 09:20:03 +0000 | |
---|---|---|
committer | 2012-11-27 09:20:03 +0000 | |
commit | d030975780bbbfacc07e3bd16f763df90b065d33 (patch) | |
tree | 066d617fa5425545b721adb0a4ea4d5c90c3e742 /usr.bin/tmux/cmd.c | |
parent | Fix type typo (diff) | |
download | wireguard-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.c | 38 |
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. */ |