1 /* $OpenBSD: cmd-find-window.c,v 1.50 2020/05/29 13:42:13 nicm Exp $ */ 2 3 /* 4 * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER 15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <sys/types.h> 20 21 #include <stdlib.h> 22 23 #include "tmux.h" 24 25 /* 26 * Find window containing text. 27 */ 28 29 static enum cmd_retval cmd_find_window_exec(struct cmd *, struct cmdq_item *); 30 31 const struct cmd_entry cmd_find_window_entry = { 32 .name = "find-window", 33 .alias = "findw", 34 35 .args = { "CiNrt:TZ", 1, 1 }, 36 .usage = "[-CiNrTZ] " CMD_TARGET_PANE_USAGE " match-string", 37 38 .target = { 't', CMD_FIND_PANE, 0 }, 39 40 .flags = 0, 41 .exec = cmd_find_window_exec 42 }; 43 44 static enum cmd_retval 45 cmd_find_window_exec(struct cmd *self, struct cmdq_item *item) 46 { 47 struct args *args = cmd_get_args(self), *new_args; 48 struct cmd_find_state *target = cmdq_get_target(item); 49 struct window_pane *wp = target->wp; 50 const char *s = args->argv[0], *suffix = ""; 51 char *filter, *argv = { NULL }; 52 int C, N, T; 53 54 C = args_has(args, 'C'); 55 N = args_has(args, 'N'); 56 T = args_has(args, 'T'); 57 58 if (args_has(args, 'r') && args_has(args, 'i')) 59 suffix = "/ri"; 60 else if (args_has(args, 'r')) 61 suffix = "/r"; 62 else if (args_has(args, 'i')) 63 suffix = "/i"; 64 65 if (!C && !N && !T) 66 C = N = T = 1; 67 68 if (C && N && T) { 69 xasprintf(&filter, 70 "#{||:" 71 "#{C%s:%s},#{||:#{m%s:*%s*,#{window_name}}," 72 "#{m%s:*%s*,#{pane_title}}}}", 73 suffix, s, suffix, s, suffix, s); 74 } else if (C && N) { 75 xasprintf(&filter, 76 "#{||:#{C%s:%s},#{m%s:*%s*,#{window_name}}}", 77 suffix, s, suffix, s); 78 } else if (C && T) { 79 xasprintf(&filter, 80 "#{||:#{C%s:%s},#{m%s:*%s*,#{pane_title}}}", 81 suffix, s, suffix, s); 82 } else if (N && T) { 83 xasprintf(&filter, 84 "#{||:#{m%s:*%s*,#{window_name}}," 85 "#{m%s:*%s*,#{pane_title}}}", 86 suffix, s, suffix, s); 87 } else if (C) 88 xasprintf(&filter, "#{C%s:%s}", suffix, s); 89 else if (N) 90 xasprintf(&filter, "#{m%s:*%s*,#{window_name}}", suffix, s); 91 else 92 xasprintf(&filter, "#{m%s:*%s*,#{pane_title}}", suffix, s); 93 94 new_args = args_parse("", 1, &argv); 95 if (args_has(args, 'Z')) 96 args_set(new_args, 'Z', NULL); 97 args_set(new_args, 'f', filter); 98 99 window_pane_set_mode(wp, NULL, &window_tree_mode, target, new_args); 100 101 args_free(new_args); 102 free(filter); 103 104 return (CMD_RETURN_NORMAL); 105 } 106