From 17cf1b21c6c30a2d7b8cf7d9a29f495a9b01c475 Mon Sep 17 00:00:00 2001
From: nicm <nicm>
Date: Wed, 30 Aug 2017 10:33:57 +0000
Subject: [PATCH] Pass flags into cmd_find_from_* to fix prefer-unattached,
 reported by Thomas Sattler.

---
 cmd-attach-session.c |  4 +--
 cmd-break-pane.c     |  2 +-
 cmd-find.c           | 58 ++++++++++++++++++++++----------------------
 cmd-join-pane.c      |  2 +-
 cmd-new-session.c    |  4 +--
 cmd-new-window.c     |  4 +--
 cmd-queue.c          |  2 +-
 cmd-rotate-window.c  |  4 +--
 cmd-run-shell.c      |  2 +-
 cmd-select-pane.c    |  4 +--
 cmd-select-window.c  |  6 ++---
 cmd-split-window.c   |  4 +--
 cmd-switch-client.c  |  2 +-
 notify.c             | 16 ++++++------
 server-client.c      |  4 +--
 tmux.h               | 20 ++++++++-------
 window-tree.c        |  2 +-
 17 files changed, 71 insertions(+), 69 deletions(-)

diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 81ed4a87..38d9f8a2 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -90,9 +90,9 @@ cmd_attach_session(struct cmdq_item *item, const char *tflag, int dflag,
 			window_set_active_pane(wp->window, wp);
 		session_set_current(s, wl);
 		if (wp != NULL)
-			cmd_find_from_winlink_pane(current, wl, wp);
+			cmd_find_from_winlink_pane(current, wl, wp, 0);
 		else
-			cmd_find_from_winlink(current, wl);
+			cmd_find_from_winlink(current, wl, 0);
 	}
 
 	if (cflag != NULL) {
diff --git a/cmd-break-pane.c b/cmd-break-pane.c
index b92c5077..74ecce6f 100644
--- a/cmd-break-pane.c
+++ b/cmd-break-pane.c
@@ -97,7 +97,7 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
 	wl = session_attach(dst_s, w, idx, &cause); /* can't fail */
 	if (!args_has(self->args, 'd')) {
 		session_select(dst_s, wl->idx);
-		cmd_find_from_session(current, dst_s);
+		cmd_find_from_session(current, dst_s, 0);
 	}
 
 	server_redraw_session(src_s);
diff --git a/cmd-find.c b/cmd-find.c
index 8fd98c94..358161a9 100644
--- a/cmd-find.c
+++ b/cmd-find.c
@@ -728,9 +728,9 @@ cmd_find_log_state(const char *prefix, struct cmd_find_state *fs)
 
 /* Find state from a session. */
 void
-cmd_find_from_session(struct cmd_find_state *fs, struct session *s)
+cmd_find_from_session(struct cmd_find_state *fs, struct session *s, int flags)
 {
-	cmd_find_clear_state(fs, 0);
+	cmd_find_clear_state(fs, flags);
 
 	fs->s = s;
 	fs->wl = fs->s->curw;
@@ -742,9 +742,9 @@ cmd_find_from_session(struct cmd_find_state *fs, struct session *s)
 
 /* Find state from a winlink. */
 void
-cmd_find_from_winlink(struct cmd_find_state *fs, struct winlink *wl)
+cmd_find_from_winlink(struct cmd_find_state *fs, struct winlink *wl, int flags)
 {
-	cmd_find_clear_state(fs, 0);
+	cmd_find_clear_state(fs, flags);
 
 	fs->s = wl->session;
 	fs->wl = wl;
@@ -757,14 +757,14 @@ cmd_find_from_winlink(struct cmd_find_state *fs, struct winlink *wl)
 /* Find state from a session and window. */
 int
 cmd_find_from_session_window(struct cmd_find_state *fs, struct session *s,
-    struct window *w)
+    struct window *w, int flags)
 {
-	cmd_find_clear_state(fs, 0);
+	cmd_find_clear_state(fs, flags);
 
 	fs->s = s;
 	fs->w = w;
 	if (cmd_find_best_winlink_with_window(fs) != 0) {
-		cmd_find_clear_state(fs, 0);
+		cmd_find_clear_state(fs, flags);
 		return (-1);
 	}
 	fs->wp = fs->w->active;
@@ -775,17 +775,17 @@ cmd_find_from_session_window(struct cmd_find_state *fs, struct session *s,
 
 /* Find state from a window. */
 int
-cmd_find_from_window(struct cmd_find_state *fs, struct window *w)
+cmd_find_from_window(struct cmd_find_state *fs, struct window *w, int flags)
 {
-	cmd_find_clear_state(fs, 0);
+	cmd_find_clear_state(fs, flags);
 
 	fs->w = w;
 	if (cmd_find_best_session_with_window(fs) != 0) {
-		cmd_find_clear_state(fs, 0);
+		cmd_find_clear_state(fs, flags);
 		return (-1);
 	}
 	if (cmd_find_best_winlink_with_window(fs) != 0) {
-		cmd_find_clear_state(fs, 0);
+		cmd_find_clear_state(fs, flags);
 		return (-1);
 	}
 	fs->wp = fs->w->active;
@@ -797,9 +797,9 @@ cmd_find_from_window(struct cmd_find_state *fs, struct window *w)
 /* Find state from a winlink and pane. */
 void
 cmd_find_from_winlink_pane(struct cmd_find_state *fs, struct winlink *wl,
-    struct window_pane *wp)
+    struct window_pane *wp, int flags)
 {
-	cmd_find_clear_state(fs, 0);
+	cmd_find_clear_state(fs, flags);
 
 	fs->s = wl->session;
 	fs->wl = wl;
@@ -812,9 +812,9 @@ cmd_find_from_winlink_pane(struct cmd_find_state *fs, struct winlink *wl,
 
 /* Find state from a pane. */
 int
-cmd_find_from_pane(struct cmd_find_state *fs, struct window_pane *wp)
+cmd_find_from_pane(struct cmd_find_state *fs, struct window_pane *wp, int flags)
 {
-	if (cmd_find_from_window(fs, wp->window) != 0)
+	if (cmd_find_from_window(fs, wp->window, flags) != 0)
 		return (-1);
 	fs->wp = wp;
 
@@ -824,13 +824,13 @@ cmd_find_from_pane(struct cmd_find_state *fs, struct window_pane *wp)
 
 /* Find state from nothing. */
 int
-cmd_find_from_nothing(struct cmd_find_state *fs)
+cmd_find_from_nothing(struct cmd_find_state *fs, int flags)
 {
-	cmd_find_clear_state(fs, 0);
+	cmd_find_clear_state(fs, flags);
 
-	fs->s = cmd_find_best_session(NULL, 0, fs->flags);
+	fs->s = cmd_find_best_session(NULL, 0, flags);
 	if (fs->s == NULL) {
-		cmd_find_clear_state(fs, 0);
+		cmd_find_clear_state(fs, flags);
 		return (-1);
 	}
 	fs->wl = fs->s->curw;
@@ -844,16 +844,16 @@ cmd_find_from_nothing(struct cmd_find_state *fs)
 
 /* Find state from mouse. */
 int
-cmd_find_from_mouse(struct cmd_find_state *fs, struct mouse_event *m)
+cmd_find_from_mouse(struct cmd_find_state *fs, struct mouse_event *m, int flags)
 {
-	cmd_find_clear_state(fs, 0);
+	cmd_find_clear_state(fs, flags);
 
 	if (!m->valid)
 		return (-1);
 
 	fs->wp = cmd_mouse_pane(m, &fs->s, &fs->wl);
 	if (fs->wp == NULL) {
-		cmd_find_clear_state(fs, 0);
+		cmd_find_clear_state(fs, flags);
 		return (-1);
 	}
 	fs->w = fs->wl->window;
@@ -864,7 +864,7 @@ cmd_find_from_mouse(struct cmd_find_state *fs, struct mouse_event *m)
 
 /* Find state from client. */
 int
-cmd_find_from_client(struct cmd_find_state *fs, struct client *c)
+cmd_find_from_client(struct cmd_find_state *fs, struct client *c, int flags)
 {
 	struct session		*s;
 	struct winlink		*wl;
@@ -872,14 +872,14 @@ cmd_find_from_client(struct cmd_find_state *fs, struct client *c)
 
 	/* If no client, treat as from nothing. */
 	if (c == NULL)
-		return (cmd_find_from_nothing(fs));
+		return (cmd_find_from_nothing(fs, flags));
 
 	/* If this is an attached client, all done. */
 	if (c->session != NULL) {
-		cmd_find_from_session(fs, c->session);
+		cmd_find_from_session(fs, c->session, flags);
 		return (0);
 	}
-	cmd_find_clear_state(fs, 0);
+	cmd_find_clear_state(fs, flags);
 
 	/*
 	 * If this is an unattached client running in a pane, we can use that
@@ -938,12 +938,12 @@ unknown_pane:
 	 */
 	s = cmd_find_try_TMUX(c);
 	if (s != NULL) {
-		cmd_find_from_session(fs, s);
+		cmd_find_from_session(fs, s, flags);
 		return (0);
 	}
 
 	/* Otherwise we need to guess. */
-	return (cmd_find_from_nothing(fs));
+	return (cmd_find_from_nothing(fs, flags));
 }
 
 /*
@@ -989,7 +989,7 @@ cmd_find_target(struct cmd_find_state *fs, struct cmdq_item *item,
 	} else if (cmd_find_valid_state(&item->shared->current)) {
 		fs->current = &item->shared->current;
 		log_debug("%s: current is from queue", __func__);
-	} else if (cmd_find_from_client(&current, item->client) == 0) {
+	} else if (cmd_find_from_client(&current, item->client, flags) == 0) {
 		fs->current = &current;
 		log_debug("%s: current is from client", __func__);
 	} else {
diff --git a/cmd-join-pane.c b/cmd-join-pane.c
index a4ab81f7..79bc1c9d 100644
--- a/cmd-join-pane.c
+++ b/cmd-join-pane.c
@@ -147,7 +147,7 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item)
 	if (!args_has(args, 'd')) {
 		window_set_active_pane(dst_w, src_wp);
 		session_select(dst_s, dst_idx);
-		cmd_find_from_session(current, dst_s);
+		cmd_find_from_session(current, dst_s, 0);
 		server_redraw_session(dst_s);
 	} else
 		server_status_session(dst_s);
diff --git a/cmd-new-session.c b/cmd-new-session.c
index 81c2f467..2d671275 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -325,10 +325,10 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
 
 	if (!detached) {
 		c->flags |= CLIENT_ATTACHED;
-		cmd_find_from_session(&item->shared->current, s);
+		cmd_find_from_session(&item->shared->current, s, 0);
 	}
 
-	cmd_find_from_session(&fs, s);
+	cmd_find_from_session(&fs, s, 0);
 	hooks_insert(s->hooks, item, &fs, "after-new-session");
 
 	free(to_free);
diff --git a/cmd-new-window.c b/cmd-new-window.c
index 7cb83f58..4baf8f0c 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -133,7 +133,7 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
 	}
 	if (!detached) {
 		session_select(s, wl->idx);
-		cmd_find_from_winlink(current, wl);
+		cmd_find_from_winlink(current, wl, 0);
 		server_redraw_session_group(s);
 	} else
 		server_status_session_group(s);
@@ -146,7 +146,7 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
 		free(cp);
 	}
 
-	cmd_find_from_winlink(&fs, wl);
+	cmd_find_from_winlink(&fs, wl, 0);
 	hooks_insert(s->hooks, item, &fs, "after-new-window");
 
 	free(to_free);
diff --git a/cmd-queue.c b/cmd-queue.c
index db802339..ec65bd80 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -241,7 +241,7 @@ cmdq_fire_command(struct cmdq_item *item)
 			fsp = &item->target;
 		else if (cmd_find_valid_state(&item->shared->current))
 			fsp = &item->shared->current;
-		else if (cmd_find_from_client(&fs, item->client) == 0)
+		else if (cmd_find_from_client(&fs, item->client, 0) == 0)
 			fsp = &fs;
 		else
 			goto out;
diff --git a/cmd-rotate-window.c b/cmd-rotate-window.c
index 7a1d9b28..5a900a13 100644
--- a/cmd-rotate-window.c
+++ b/cmd-rotate-window.c
@@ -78,7 +78,7 @@ cmd_rotate_window_exec(struct cmd *self, struct cmdq_item *item)
 		if ((wp = TAILQ_PREV(w->active, window_panes, entry)) == NULL)
 			wp = TAILQ_LAST(&w->panes, window_panes);
 		window_set_active_pane(w, wp);
-		cmd_find_from_winlink_pane(current, wl, wp);
+		cmd_find_from_winlink_pane(current, wl, wp, 0);
 		server_redraw_window(w);
 	} else {
 		wp = TAILQ_FIRST(&w->panes);
@@ -106,7 +106,7 @@ cmd_rotate_window_exec(struct cmd *self, struct cmdq_item *item)
 		if ((wp = TAILQ_NEXT(w->active, entry)) == NULL)
 			wp = TAILQ_FIRST(&w->panes);
 		window_set_active_pane(w, wp);
-		cmd_find_from_winlink_pane(current, wl, wp);
+		cmd_find_from_winlink_pane(current, wl, wp, 0);
 		server_redraw_window(w);
 	}
 
diff --git a/cmd-run-shell.c b/cmd-run-shell.c
index f77fb36a..0d73dd2b 100644
--- a/cmd-run-shell.c
+++ b/cmd-run-shell.c
@@ -68,7 +68,7 @@ cmd_run_shell_print(struct job *job, const char *msg)
 			cmdq_print(cdata->item, "%s", msg);
 			return;
 		}
-		if (cmd_find_from_nothing(&fs) != 0)
+		if (cmd_find_from_nothing(&fs, 0) != 0)
 			return;
 		wp = fs.wp;
 		if (wp == NULL)
diff --git a/cmd-select-pane.c b/cmd-select-pane.c
index 03e48513..21bda8e4 100644
--- a/cmd-select-pane.c
+++ b/cmd-select-pane.c
@@ -77,7 +77,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
 			server_unzoom_window(w);
 			window_redraw_active_switch(w, lastwp);
 			if (window_set_active_pane(w, lastwp)) {
-				cmd_find_from_winlink(current, wl);
+				cmd_find_from_winlink(current, wl, 0);
 				server_status_window(w);
 				server_redraw_window_borders(w);
 			}
@@ -156,7 +156,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
 	}
 	window_redraw_active_switch(w, wp);
 	if (window_set_active_pane(w, wp)) {
-		cmd_find_from_winlink_pane(current, wl, wp);
+		cmd_find_from_winlink_pane(current, wl, wp, 0);
 		hooks_insert(s->hooks, item, current, "after-select-pane");
 		server_status_window(w);
 		server_redraw_window_borders(w);
diff --git a/cmd-select-window.c b/cmd-select-window.c
index 27a66b04..f35b8202 100644
--- a/cmd-select-window.c
+++ b/cmd-select-window.c
@@ -117,7 +117,7 @@ cmd_select_window_exec(struct cmd *self, struct cmdq_item *item)
 				return (CMD_RETURN_ERROR);
 			}
 		}
-		cmd_find_from_session(current, s);
+		cmd_find_from_session(current, s, 0);
 		server_redraw_session(s);
 		hooks_insert(s->hooks, item, current, "after-select-window");
 	} else {
@@ -131,10 +131,10 @@ cmd_select_window_exec(struct cmd *self, struct cmdq_item *item)
 				return (-1);
 			}
 			if (current->s == s)
-				cmd_find_from_session(current, s);
+				cmd_find_from_session(current, s, 0);
 			server_redraw_session(s);
 		} else if (session_select(s, wl->idx) == 0) {
-			cmd_find_from_session(current, s);
+			cmd_find_from_session(current, s, 0);
 			server_redraw_session(s);
 		}
 		hooks_insert(s->hooks, item, current, "after-select-window");
diff --git a/cmd-split-window.c b/cmd-split-window.c
index ad403196..8d47e350 100644
--- a/cmd-split-window.c
+++ b/cmd-split-window.c
@@ -158,7 +158,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
 	if (!args_has(args, 'd')) {
 		window_set_active_pane(w, new_wp);
 		session_select(s, wl->idx);
-		cmd_find_from_session(current, s);
+		cmd_find_from_session(current, s, 0);
 		server_redraw_session(s);
 	} else
 		server_status_session(s);
@@ -172,7 +172,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
 	}
 	notify_window("window-layout-changed", w);
 
-	cmd_find_from_winlink_pane(&fs, wl, new_wp);
+	cmd_find_from_winlink_pane(&fs, wl, new_wp, 0);
 	hooks_insert(s->hooks, item, &fs, "after-split-window");
 
 	free(to_free);
diff --git a/cmd-switch-client.c b/cmd-switch-client.c
index a24f0276..180635df 100644
--- a/cmd-switch-client.c
+++ b/cmd-switch-client.c
@@ -116,7 +116,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmdq_item *item)
 			if (wp != NULL)
 				window_set_active_pane(wp->window, wp);
 			session_set_current(s, wl);
-			cmd_find_from_session(&item->shared->current, s);
+			cmd_find_from_session(&item->shared->current, s, 0);
 		}
 	}
 
diff --git a/notify.c b/notify.c
index 9d3a91e3..0dc8c5cf 100644
--- a/notify.c
+++ b/notify.c
@@ -46,7 +46,7 @@ notify_hook(struct cmdq_item *item, struct notify_entry *ne)
 
 	cmd_find_clear_state(&fs, 0);
 	if (cmd_find_empty_state(&ne->fs) || !cmd_find_valid_state(&ne->fs))
-		cmd_find_from_nothing(&fs);
+		cmd_find_from_nothing(&fs, 0);
 	else
 		cmd_find_copy_state(&fs, &ne->fs);
 
@@ -170,7 +170,7 @@ notify_client(const char *name, struct client *c)
 {
 	struct cmd_find_state	fs;
 
-	cmd_find_from_client(&fs, c);
+	cmd_find_from_client(&fs, c, 0);
 	notify_add(name, &fs, c, NULL, NULL, NULL);
 }
 
@@ -180,9 +180,9 @@ notify_session(const char *name, struct session *s)
 	struct cmd_find_state	fs;
 
 	if (session_alive(s))
-		cmd_find_from_session(&fs, s);
+		cmd_find_from_session(&fs, s, 0);
 	else
-		cmd_find_from_nothing(&fs);
+		cmd_find_from_nothing(&fs, 0);
 	notify_add(name, &fs, NULL, s, NULL, NULL);
 }
 
@@ -191,7 +191,7 @@ notify_winlink(const char *name, struct winlink *wl)
 {
 	struct cmd_find_state	fs;
 
-	cmd_find_from_winlink(&fs, wl);
+	cmd_find_from_winlink(&fs, wl, 0);
 	notify_add(name, &fs, NULL, wl->session, wl->window, NULL);
 }
 
@@ -200,7 +200,7 @@ notify_session_window(const char *name, struct session *s, struct window *w)
 {
 	struct cmd_find_state	fs;
 
-	cmd_find_from_session_window(&fs, s, w);
+	cmd_find_from_session_window(&fs, s, w, 0);
 	notify_add(name, &fs, NULL, s, w, NULL);
 }
 
@@ -209,7 +209,7 @@ notify_window(const char *name, struct window *w)
 {
 	struct cmd_find_state	fs;
 
-	cmd_find_from_window(&fs, w);
+	cmd_find_from_window(&fs, w, 0);
 	notify_add(name, &fs, NULL, NULL, w, NULL);
 }
 
@@ -218,6 +218,6 @@ notify_pane(const char *name, struct window_pane *wp)
 {
 	struct cmd_find_state	fs;
 
-	cmd_find_from_pane(&fs, wp);
+	cmd_find_from_pane(&fs, wp, 0);
 	notify_add(name, &fs, NULL, NULL, NULL, wp);
 }
diff --git a/server-client.c b/server-client.c
index c51fd2bb..2263deca 100644
--- a/server-client.c
+++ b/server-client.c
@@ -877,8 +877,8 @@ server_client_handle_key(struct client *c, key_code key)
 		m->valid = 0;
 
 	/* Find affected pane. */
-	if (!KEYC_IS_MOUSE(key) || cmd_find_from_mouse(&fs, m) != 0)
-		cmd_find_from_session(&fs, s);
+	if (!KEYC_IS_MOUSE(key) || cmd_find_from_mouse(&fs, m, 0) != 0)
+		cmd_find_from_session(&fs, s, 0);
 	wp = fs.wp;
 
 	/* Forward mouse keys if disabled. */
diff --git a/tmux.h b/tmux.h
index 7a54823b..8b88c55a 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1768,20 +1768,22 @@ void		 cmd_find_copy_state(struct cmd_find_state *,
 		     struct cmd_find_state *);
 void		 cmd_find_log_state(const char *, struct cmd_find_state *);
 void		 cmd_find_from_session(struct cmd_find_state *,
-		     struct session *);
+		     struct session *, int);
 void		 cmd_find_from_winlink(struct cmd_find_state *,
-		     struct winlink *);
+		     struct winlink *, int);
 int		 cmd_find_from_session_window(struct cmd_find_state *,
-		     struct session *, struct window *);
-int		 cmd_find_from_window(struct cmd_find_state *, struct window *);
+		     struct session *, struct window *, int);
+int		 cmd_find_from_window(struct cmd_find_state *, struct window *,
+		     int);
 void		 cmd_find_from_winlink_pane(struct cmd_find_state *,
-		     struct winlink *, struct window_pane *);
+		     struct winlink *, struct window_pane *, int);
 int		 cmd_find_from_pane(struct cmd_find_state *,
-		     struct window_pane *);
-int		 cmd_find_from_client(struct cmd_find_state *, struct client *);
+		     struct window_pane *, int);
+int		 cmd_find_from_client(struct cmd_find_state *, struct client *,
+		     int);
 int		 cmd_find_from_mouse(struct cmd_find_state *,
-		     struct mouse_event *);
-int		 cmd_find_from_nothing(struct cmd_find_state *);
+		     struct mouse_event *, int);
+int		 cmd_find_from_nothing(struct cmd_find_state *, int);
 
 /* cmd.c */
 int		 cmd_pack_argv(int, char **, char *, size_t);
diff --git a/window-tree.c b/window-tree.c
index a0aed955..cbabd67e 100644
--- a/window-tree.c
+++ b/window-tree.c
@@ -874,7 +874,7 @@ window_tree_get_target(struct window_tree_itemdata *item,
 	if (target == NULL)
 		cmd_find_clear_state(fs, 0);
 	else
-		cmd_find_from_winlink_pane(fs, wl, wp);
+		cmd_find_from_winlink_pane(fs, wl, wp, 0);
 	return (target);
 }