summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/cmd-find.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2017-07-07 07:13:15 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2017-07-07 07:13:15 +0000
commit3c72809ef1b90b0e1c6786bfd3311f3c9bc21995 (patch)
tree62c2b15faec27e3e5ac31278bd7f419e1de12adc /usr.bin/tmux/cmd-find.c
parent36acc91d866dc5c740e583ffd5a3bd4d9544c609 (diff)
When working out the current client (for example for switch-client with
no target), prefer clients attached to the current session if there is one. GitHub issue 995 from Jan Larres.
Diffstat (limited to 'usr.bin/tmux/cmd-find.c')
-rw-r--r--usr.bin/tmux/cmd-find.c69
1 files changed, 49 insertions, 20 deletions
diff --git a/usr.bin/tmux/cmd-find.c b/usr.bin/tmux/cmd-find.c
index 9310af7031a..57999483718 100644
--- a/usr.bin/tmux/cmd-find.c
+++ b/usr.bin/tmux/cmd-find.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-find.c,v 1.54 2017/06/16 15:12:38 nicm Exp $ */
+/* $OpenBSD: cmd-find.c,v 1.55 2017/07/07 07:13:14 nicm Exp $ */
/*
* Copyright (c) 2015 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -96,6 +96,22 @@ cmd_find_try_TMUX(struct client *c)
return (session_find_by_id(session));
}
+/* Find pane containing client if any. */
+static struct window_pane *
+cmd_find_inside_pane(struct client *c)
+{
+ struct window_pane *wp;
+
+ if (c == NULL)
+ return (NULL);
+
+ RB_FOREACH(wp, window_pane_tree, &all_window_panes) {
+ if (strcmp(wp->tty, c->ttyname) == 0)
+ break;
+ }
+ return (wp);
+}
+
/* Is this client better? */
static int
cmd_find_client_better(struct client *c, struct client *than)
@@ -875,10 +891,7 @@ cmd_find_from_client(struct cmd_find_state *fs, struct client *c)
* If this is an unattached client running in a pane, we can use that
* to limit the list of sessions to those containing that pane.
*/
- RB_FOREACH(wp, window_pane_tree, &all_window_panes) {
- if (strcmp(wp->tty, c->ttyname) == 0)
- break;
- }
+ wp = cmd_find_inside_pane(c);
if (wp == NULL)
goto unknown_pane;
@@ -1232,30 +1245,46 @@ no_pane:
goto error;
}
+/* Find the current client. */
+static struct client *
+cmd_find_current_client(struct cmdq_item *item, int quiet)
+{
+ struct client *c;
+ struct session *s;
+ struct window_pane *wp;
+ struct cmd_find_state fs;
+
+ if (item->client != NULL && item->client->session != NULL)
+ return (item->client);
+
+ c = NULL;
+ if ((wp = cmd_find_inside_pane(item->client)) != NULL) {
+ cmd_find_clear_state(&fs, CMD_FIND_QUIET);
+ fs.w = wp->window;
+ if (cmd_find_best_session_with_window(&fs) == 0)
+ c = cmd_find_best_client(fs.s);
+ } else {
+ s = cmd_find_best_session(NULL, 0, CMD_FIND_QUIET);
+ if (s != NULL)
+ c = cmd_find_best_client(s);
+ }
+ if (c == NULL && !quiet)
+ cmdq_error(item, "no current client");
+ log_debug("%s: no target, return %p", __func__, c);
+ return (c);
+}
+
/* Find the target client or report an error and return NULL. */
struct client *
cmd_find_client(struct cmdq_item *item, const char *target, int quiet)
{
struct client *c;
- struct session *s;
char *copy;
size_t size;
/* A NULL argument means the current client. */
- if (target == NULL) {
- c = NULL;
- if (item->client != NULL && item->client->session != NULL)
- c = item->client;
- else {
- s = cmd_find_best_session(NULL, 0, CMD_FIND_QUIET);
- if (s != NULL)
- c = cmd_find_best_client(s);
- }
- if (c == NULL && !quiet)
- cmdq_error(item, "no current client");
- log_debug("%s: no target, return %p", __func__, c);
- return (c);
- }
+ if (target == NULL)
+ return (cmd_find_current_client(item, quiet));
copy = xstrdup(target);
/* Trim a single trailing colon if any. */