1 | /* $OpenBSD$ */ |
2 | |
3 | /* |
4 | * Copyright (c) 2009 Nicholas Marriott <[email protected]> |
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 = { "CNrt:TZ" , 1, 1 }, |
36 | .usage = "[-CNrTZ] " 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 = self->args, *new_args; |
48 | struct window_pane *wp = item->target.wp; |
49 | const char *s = args->argv[0]; |
50 | char *filter, *argv = { NULL }; |
51 | int C, N, T; |
52 | |
53 | C = args_has(args, 'C'); |
54 | N = args_has(args, 'N'); |
55 | T = args_has(args, 'T'); |
56 | |
57 | if (!C && !N && !T) |
58 | C = N = T = 1; |
59 | |
60 | if (!args_has(args, 'r')) { |
61 | if (C && N && T) { |
62 | xasprintf(&filter, |
63 | "#{||:" |
64 | "#{C:%s},#{||:#{m:*%s*,#{window_name}}," |
65 | "#{m:*%s*,#{pane_title}}}}" , |
66 | s, s, s); |
67 | } else if (C && N) { |
68 | xasprintf(&filter, |
69 | "#{||:#{C:%s},#{m:*%s*,#{window_name}}}" , |
70 | s, s); |
71 | } else if (C && T) { |
72 | xasprintf(&filter, |
73 | "#{||:#{C:%s},#{m:*%s*,#{pane_title}}}" , |
74 | s, s); |
75 | } else if (N && T) { |
76 | xasprintf(&filter, |
77 | "#{||:#{m:*%s*,#{window_name}}," |
78 | "#{m:*%s*,#{pane_title}}}" , |
79 | s, s); |
80 | } else if (C) |
81 | xasprintf(&filter, "#{C:%s}" , s); |
82 | else if (N) |
83 | xasprintf(&filter, "#{m:*%s*,#{window_name}}" , s); |
84 | else |
85 | xasprintf(&filter, "#{m:*%s*,#{pane_title}}" , s); |
86 | } else { |
87 | if (C && N && T) { |
88 | xasprintf(&filter, |
89 | "#{||:" |
90 | "#{C/r:%s},#{||:#{m/r:%s,#{window_name}}," |
91 | "#{m/r:%s,#{pane_title}}}}" , |
92 | s, s, s); |
93 | } else if (C && N) { |
94 | xasprintf(&filter, |
95 | "#{||:#{C/r:%s},#{m/r:%s,#{window_name}}}" , |
96 | s, s); |
97 | } else if (C && T) { |
98 | xasprintf(&filter, |
99 | "#{||:#{C/r:%s},#{m/r:%s,#{pane_title}}}" , |
100 | s, s); |
101 | } else if (N && T) { |
102 | xasprintf(&filter, |
103 | "#{||:#{m/r:%s,#{window_name}}," |
104 | "#{m/r:%s,#{pane_title}}}" , |
105 | s, s); |
106 | } else if (C) |
107 | xasprintf(&filter, "#{C/r:%s}" , s); |
108 | else if (N) |
109 | xasprintf(&filter, "#{m/r:%s,#{window_name}}" , s); |
110 | else |
111 | xasprintf(&filter, "#{m/r:%s,#{pane_title}}" , s); |
112 | } |
113 | |
114 | new_args = args_parse("" , 1, &argv); |
115 | if (args_has(args, 'Z')) |
116 | args_set(new_args, 'Z', NULL); |
117 | args_set(new_args, 'f', filter); |
118 | |
119 | window_pane_set_mode(wp, &window_tree_mode, &item->target, new_args); |
120 | |
121 | args_free(new_args); |
122 | free(filter); |
123 | |
124 | return (CMD_RETURN_NORMAL); |
125 | } |
126 | |