mirror of
https://github.com/tmux/tmux.git
synced 2024-10-31 22:58:49 +00:00
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.
This commit is contained in:
parent
53d4ed22e8
commit
1f7ca973c5
57
cmd-find.c
57
cmd-find.c
@ -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,21 +1245,25 @@ no_pane:
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
/* Find the current client. */
|
||||
static struct client *
|
||||
cmd_find_current_client(struct cmdq_item *item, int quiet)
|
||||
{
|
||||
struct client *c;
|
||||
struct session *s;
|
||||
char *copy;
|
||||
size_t size;
|
||||
struct window_pane *wp;
|
||||
struct cmd_find_state fs;
|
||||
|
||||
/* A NULL argument means the current client. */
|
||||
if (target == NULL) {
|
||||
c = NULL;
|
||||
if (item->client != NULL && item->client->session != NULL)
|
||||
c = item->client;
|
||||
else {
|
||||
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);
|
||||
@ -1256,6 +1273,18 @@ cmd_find_client(struct cmdq_item *item, const char *target, int quiet)
|
||||
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;
|
||||
char *copy;
|
||||
size_t size;
|
||||
|
||||
/* A NULL argument means the current client. */
|
||||
if (target == NULL)
|
||||
return (cmd_find_current_client(item, quiet));
|
||||
copy = xstrdup(target);
|
||||
|
||||
/* Trim a single trailing colon if any. */
|
||||
|
Loading…
Reference in New Issue
Block a user