diff options
author | Thomas Adam <thomas@xteddy.org> | 2017-07-07 10:01:09 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2017-07-07 10:01:09 +0100 |
commit | 1029f2b27753355d5ae48eaac91f9569a10b8785 (patch) | |
tree | 44bdd253b3eb54c4dea2acc4878f16a3dc563c59 | |
parent | 6b1ceca86a50d17fbb70a74b45240027f4075a98 (diff) | |
parent | 1f7ca973c5ddae22db18b1d3dbb9e5c7cb0f3a6a (diff) | |
download | rtmux-1029f2b27753355d5ae48eaac91f9569a10b8785.tar.gz rtmux-1029f2b27753355d5ae48eaac91f9569a10b8785.tar.bz2 rtmux-1029f2b27753355d5ae48eaac91f9569a10b8785.zip |
Merge branch 'obsd-master'
-rw-r--r-- | cmd-find.c | 67 |
1 files changed, 48 insertions, 19 deletions
@@ -95,6 +95,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) @@ -874,10 +890,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; @@ -1231,30 +1244,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. */ |