summaryrefslogtreecommitdiffstats
path: root/cmd-find.c
diff options
context:
space:
mode:
authornicm <nicm>2015-12-15 00:00:01 +0000
committernicm <nicm>2015-12-15 00:00:01 +0000
commit12da13c9d1e0e015ed19761e352ee6b877b23aa4 (patch)
tree2e8a12562054300f12fb2fc782c57d54ae4a4853 /cmd-find.c
parentd5999f8b5cbbd3648d7a6c00100e5eab279a90bb (diff)
Make the marked pane a cmd_find_state.
Diffstat (limited to 'cmd-find.c')
-rw-r--r--cmd-find.c109
1 files changed, 70 insertions, 39 deletions
diff --git a/cmd-find.c b/cmd-find.c
index 8e118c00..b7728ea2 100644
--- a/cmd-find.c
+++ b/cmd-find.c
@@ -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)