Make the marked pane a cmd_find_state.

This commit is contained in:
nicm
2015-12-15 00:00:01 +00:00
parent d5999f8b5c
commit 12da13c9d1
6 changed files with 95 additions and 89 deletions

View File

@ -792,6 +792,67 @@ cmd_find_clear_state(struct cmd_find_state *fs, struct cmd_q *cmdq, int flags)
fs->idx = -1;
}
/* Check if a state if valid. */
int
cmd_find_valid_state(struct cmd_find_state *fs)
{
struct winlink *wl;
if (fs->s == NULL || fs->wl == NULL || fs->w == NULL || fs->wp == NULL)
return (0);
if (!session_alive(fs->s))
return (0);
RB_FOREACH(wl, winlinks, &fs->s->windows) {
if (wl->window == fs->w && wl == fs->wl)
break;
}
if (wl == NULL)
return (0);
if (fs->w != fs->wl->window)
return (0);
if (!window_has_pane(fs->w, fs->wp))
return (0);
return (window_pane_visible(fs->wp));
}
/* Copy a state. */
void
cmd_find_copy_state(struct cmd_find_state *dst, struct cmd_find_state *src)
{
dst->s = src->s;
dst->wl = src->wl;
dst->idx = dst->wl->idx;
dst->w = dst->wl->window;
dst->wp = src->wp;
}
/* Log the result. */
void
cmd_find_log_state(const char *prefix, struct cmd_find_state *fs)
{
if (fs->s != NULL)
log_debug("%s: s=$%u", prefix, fs->s->id);
else
log_debug("%s: s=none", prefix);
if (fs->wl != NULL) {
log_debug("%s: wl=%u %d w=@%u %s", prefix, fs->wl->idx,
fs->wl->window == fs->w, fs->w->id, fs->w->name);
} else
log_debug("%s: wl=none", prefix);
if (fs->wp != NULL)
log_debug("%s: wp=%%%u", prefix, fs->wp->id);
else
log_debug("%s: wp=none", prefix);
if (fs->idx != -1)
log_debug("%s: idx=%d", prefix, fs->idx);
else
log_debug("%s: idx=none", prefix);
}
/*
* Split target into pieces and resolve for the given type. Fills in the given
* state. Returns 0 on success or -1 on error.
@ -814,17 +875,14 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
/* Find current state. */
cmd_find_clear_state(&current, cmdq, flags);
if (server_check_marked() && (flags & CMD_FIND_DEFAULT_MARKED)) {
current.s = marked_session;
current.wl = marked_winlink;
current.idx = current.wl->idx;
current.w = current.wl->window;
current.wp = marked_window_pane;
}
if (current.s == NULL && cmd_find_current_session(&current) != 0) {
if (~flags & CMD_FIND_QUIET)
cmdq_error(cmdq, "no current session");
goto error;
if (server_check_marked() && (flags & CMD_FIND_DEFAULT_MARKED))
cmd_find_copy_state(&current, &marked_pane);
else {
if (cmd_find_current_session(&current) != 0) {
if (~flags & CMD_FIND_QUIET)
cmdq_error(cmdq, "no current session");
goto error;
}
}
/* Clear new state. */
@ -868,11 +926,7 @@ cmd_find_target(struct cmd_find_state *fs, struct cmd_q *cmdq,
cmdq_error(cmdq, "no marked target");
goto error;
}
fs->s = marked_session;
fs->wl = marked_winlink;
fs->idx = fs->wl->idx;
fs->w = fs->wl->window;
fs->wp = marked_window_pane;
cmd_find_copy_state(fs, &marked_pane);
goto found;
}
@ -1068,29 +1122,6 @@ no_pane:
goto error;
}
/* Log the result. */
void
cmd_find_log_state(const char *prefix, struct cmd_find_state *fs)
{
if (fs->s != NULL)
log_debug("%s: s=$%u", prefix, fs->s->id);
else
log_debug("%s: s=none", prefix);
if (fs->wl != NULL) {
log_debug("%s: wl=%u %d w=@%u %s", prefix, fs->wl->idx,
fs->wl->window == fs->w, fs->w->id, fs->w->name);
} else
log_debug("%s: wl=none", prefix);
if (fs->wp != NULL)
log_debug("%s: wp=%%%u", prefix, fs->wp->id);
else
log_debug("%s: wp=none", prefix);
if (fs->idx != -1)
log_debug("%s: idx=%d", prefix, fs->idx);
else
log_debug("%s: idx=none", prefix);
}
/* Find the target client or report an error and return NULL. */
struct client *
cmd_find_client(struct cmd_q *cmdq, const char *target, int quiet)