summaryrefslogtreecommitdiffstats
path: root/cmd-find-window.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2012-03-20 17:09:48 +0000
committerNicholas Marriott <nicm@openbsd.org>2012-03-20 17:09:48 +0000
commit90bf560fe4e0fa60bdeaa5c6ecd62187a58f118d (patch)
tree23fd9e84492f3124d67640b32394b6f5d6e9e5e3 /cmd-find-window.c
parent5672f2ce6bc87dc5c5215576f8f9a2b6bdadc07a (diff)
Add -C -N -T flags to find-window to find in content, name, title. From
Jonathan Daugherty.
Diffstat (limited to 'cmd-find-window.c')
-rw-r--r--cmd-find-window.c58
1 files changed, 52 insertions, 6 deletions
diff --git a/cmd-find-window.c b/cmd-find-window.c
index 6c3c48ce..bba1398f 100644
--- a/cmd-find-window.c
+++ b/cmd-find-window.c
@@ -29,13 +29,25 @@
int cmd_find_window_exec(struct cmd *, struct cmd_ctx *);
+u_int cmd_find_window_match_flags(struct args *);
void cmd_find_window_callback(void *, int);
void cmd_find_window_free(void *);
+/* Flags for determining matching behavior. */
+#define CMD_FIND_WINDOW_BY_TITLE 0x1
+#define CMD_FIND_WINDOW_BY_CONTENT 0x2
+#define CMD_FIND_WINDOW_BY_NAME 0x4
+
+#define CMD_FIND_WINDOW_ALL \
+ (CMD_FIND_WINDOW_BY_TITLE | \
+ CMD_FIND_WINDOW_BY_CONTENT | \
+ CMD_FIND_WINDOW_BY_NAME)
+
+
const struct cmd_entry cmd_find_window_entry = {
"find-window", "findw",
- "t:", 1, 1,
- CMD_TARGET_WINDOW_USAGE " match-string",
+ "CNt:T", 1, 4,
+ "[-CNT] " CMD_TARGET_WINDOW_USAGE " match-string",
0,
NULL,
NULL,
@@ -46,6 +58,26 @@ struct cmd_find_window_data {
struct session *session;
};
+u_int
+cmd_find_window_match_flags(struct args *args)
+{
+ u_int match_flags = 0;
+
+ /* Turn on flags based on the options. */
+ if (args_has(args, 'T'))
+ match_flags |= CMD_FIND_WINDOW_BY_TITLE;
+ if (args_has(args, 'C'))
+ match_flags |= CMD_FIND_WINDOW_BY_CONTENT;
+ if (args_has(args, 'N'))
+ match_flags |= CMD_FIND_WINDOW_BY_NAME;
+
+ /* If none of the flags were set, default to matching anything. */
+ if (match_flags == 0)
+ match_flags = CMD_FIND_WINDOW_ALL;
+
+ return match_flags;
+}
+
int
cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{
@@ -58,7 +90,7 @@ cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
ARRAY_DECL(, u_int) list_idx;
ARRAY_DECL(, char *) list_ctx;
char *str, *sres, *sctx, *searchstr;
- u_int i, line;
+ u_int i, line, match_flags;
if (ctx->curclient == NULL) {
ctx->error(ctx, "must be run interactively");
@@ -69,6 +101,7 @@ cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL)
return (-1);
+ match_flags = cmd_find_window_match_flags(args);
str = args->argv[0];
ARRAY_INIT(&list_idx);
@@ -80,12 +113,25 @@ cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
TAILQ_FOREACH(wp, &wm->window->panes, entry) {
i++;
- if (fnmatch(searchstr, wm->window->name, 0) == 0)
+ if ((match_flags & CMD_FIND_WINDOW_BY_NAME) &&
+ fnmatch(searchstr, wm->window->name, 0) == 0)
sctx = xstrdup("");
else {
- sres = window_pane_search(wp, str, &line);
+ sres = NULL;
+ if (match_flags & CMD_FIND_WINDOW_BY_CONTENT) {
+ sres = window_pane_search(
+ wp, str, &line);
+ }
+
+ /*
+ * If match_title isn't set we don't want to
+ * bother checking the title, but that also
+ * constitutes a failure to match so we still
+ * want to abort.
+ */
if (sres == NULL &&
- fnmatch(searchstr, wp->base.title, 0) != 0)
+ (!(match_flags & CMD_FIND_WINDOW_BY_TITLE) ||
+ fnmatch(searchstr, wp->base.title, 0) != 0))
continue;
if (sres == NULL) {