From 90bf560fe4e0fa60bdeaa5c6ecd62187a58f118d Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Tue, 20 Mar 2012 17:09:48 +0000 Subject: Add -C -N -T flags to find-window to find in content, name, title. From Jonathan Daugherty. --- cmd-find-window.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 6 deletions(-) (limited to 'cmd-find-window.c') 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) { -- cgit v1.2.3