cmd-find-window.c revision 1.1.1.2 1 1.1.1.2 jmmv /* $Id: cmd-find-window.c,v 1.1.1.2 2011/08/17 18:40:04 jmmv Exp $ */
2 1.1 jmmv
3 1.1 jmmv /*
4 1.1 jmmv * Copyright (c) 2009 Nicholas Marriott <nicm (at) users.sourceforge.net>
5 1.1 jmmv *
6 1.1 jmmv * Permission to use, copy, modify, and distribute this software for any
7 1.1 jmmv * purpose with or without fee is hereby granted, provided that the above
8 1.1 jmmv * copyright notice and this permission notice appear in all copies.
9 1.1 jmmv *
10 1.1 jmmv * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 1.1 jmmv * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 1.1 jmmv * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 1.1 jmmv * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 1.1 jmmv * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 1.1 jmmv * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 1.1 jmmv * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 1.1 jmmv */
18 1.1 jmmv
19 1.1 jmmv #include <sys/types.h>
20 1.1 jmmv
21 1.1 jmmv #include <fnmatch.h>
22 1.1 jmmv #include <string.h>
23 1.1 jmmv
24 1.1 jmmv #include "tmux.h"
25 1.1 jmmv
26 1.1 jmmv /*
27 1.1 jmmv * Find window containing text.
28 1.1 jmmv */
29 1.1 jmmv
30 1.1 jmmv int cmd_find_window_exec(struct cmd *, struct cmd_ctx *);
31 1.1 jmmv
32 1.1 jmmv void cmd_find_window_callback(void *, int);
33 1.1 jmmv void cmd_find_window_free(void *);
34 1.1 jmmv
35 1.1 jmmv const struct cmd_entry cmd_find_window_entry = {
36 1.1 jmmv "find-window", "findw",
37 1.1.1.2 jmmv "t:", 1, 1,
38 1.1 jmmv CMD_TARGET_WINDOW_USAGE " match-string",
39 1.1.1.2 jmmv 0,
40 1.1.1.2 jmmv NULL,
41 1.1.1.2 jmmv NULL,
42 1.1.1.2 jmmv cmd_find_window_exec
43 1.1 jmmv };
44 1.1 jmmv
45 1.1 jmmv struct cmd_find_window_data {
46 1.1 jmmv struct session *session;
47 1.1 jmmv };
48 1.1 jmmv
49 1.1 jmmv int
50 1.1 jmmv cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
51 1.1 jmmv {
52 1.1.1.2 jmmv struct args *args = self->args;
53 1.1 jmmv struct cmd_find_window_data *cdata;
54 1.1 jmmv struct session *s;
55 1.1 jmmv struct winlink *wl, *wm;
56 1.1 jmmv struct window *w;
57 1.1 jmmv struct window_pane *wp;
58 1.1 jmmv ARRAY_DECL(, u_int) list_idx;
59 1.1 jmmv ARRAY_DECL(, char *) list_ctx;
60 1.1.1.2 jmmv char *str, *sres, *sctx, *searchstr;
61 1.1 jmmv u_int i, line;
62 1.1 jmmv
63 1.1 jmmv if (ctx->curclient == NULL) {
64 1.1 jmmv ctx->error(ctx, "must be run interactively");
65 1.1 jmmv return (-1);
66 1.1 jmmv }
67 1.1 jmmv s = ctx->curclient->session;
68 1.1 jmmv
69 1.1.1.2 jmmv if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL)
70 1.1 jmmv return (-1);
71 1.1 jmmv
72 1.1.1.2 jmmv str = args->argv[0];
73 1.1.1.2 jmmv
74 1.1 jmmv ARRAY_INIT(&list_idx);
75 1.1 jmmv ARRAY_INIT(&list_ctx);
76 1.1 jmmv
77 1.1.1.2 jmmv xasprintf(&searchstr, "*%s*", str);
78 1.1 jmmv RB_FOREACH(wm, winlinks, &s->windows) {
79 1.1 jmmv i = 0;
80 1.1 jmmv TAILQ_FOREACH(wp, &wm->window->panes, entry) {
81 1.1 jmmv i++;
82 1.1 jmmv
83 1.1 jmmv if (fnmatch(searchstr, wm->window->name, 0) == 0)
84 1.1 jmmv sctx = xstrdup("");
85 1.1 jmmv else {
86 1.1.1.2 jmmv sres = window_pane_search(wp, str, &line);
87 1.1 jmmv if (sres == NULL &&
88 1.1 jmmv fnmatch(searchstr, wp->base.title, 0) != 0)
89 1.1 jmmv continue;
90 1.1 jmmv
91 1.1 jmmv if (sres == NULL) {
92 1.1 jmmv xasprintf(&sctx,
93 1.1 jmmv "pane %u title: \"%s\"", i - 1,
94 1.1 jmmv wp->base.title);
95 1.1 jmmv } else {
96 1.1 jmmv xasprintf(&sctx,
97 1.1 jmmv "pane %u line %u: \"%s\"", i - 1,
98 1.1 jmmv line + 1, sres);
99 1.1 jmmv xfree(sres);
100 1.1 jmmv }
101 1.1 jmmv }
102 1.1 jmmv
103 1.1 jmmv ARRAY_ADD(&list_idx, wm->idx);
104 1.1 jmmv ARRAY_ADD(&list_ctx, sctx);
105 1.1 jmmv }
106 1.1 jmmv }
107 1.1 jmmv xfree(searchstr);
108 1.1 jmmv
109 1.1 jmmv if (ARRAY_LENGTH(&list_idx) == 0) {
110 1.1.1.2 jmmv ctx->error(ctx, "no windows matching: %s", str);
111 1.1 jmmv ARRAY_FREE(&list_idx);
112 1.1 jmmv ARRAY_FREE(&list_ctx);
113 1.1 jmmv return (-1);
114 1.1 jmmv }
115 1.1 jmmv
116 1.1 jmmv if (ARRAY_LENGTH(&list_idx) == 1) {
117 1.1 jmmv if (session_select(s, ARRAY_FIRST(&list_idx)) == 0)
118 1.1 jmmv server_redraw_session(s);
119 1.1 jmmv recalculate_sizes();
120 1.1 jmmv goto out;
121 1.1 jmmv }
122 1.1 jmmv
123 1.1 jmmv if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
124 1.1 jmmv goto out;
125 1.1 jmmv
126 1.1 jmmv for (i = 0; i < ARRAY_LENGTH(&list_idx); i++) {
127 1.1 jmmv wm = winlink_find_by_index(
128 1.1 jmmv &s->windows, ARRAY_ITEM(&list_idx, i));
129 1.1 jmmv w = wm->window;
130 1.1 jmmv
131 1.1 jmmv sctx = ARRAY_ITEM(&list_ctx, i);
132 1.1 jmmv window_choose_add(wl->window->active,
133 1.1 jmmv wm->idx, "%3d: %s [%ux%u] (%u panes) %s", wm->idx, w->name,
134 1.1 jmmv w->sx, w->sy, window_count_panes(w), sctx);
135 1.1 jmmv xfree(sctx);
136 1.1 jmmv }
137 1.1 jmmv
138 1.1 jmmv cdata = xmalloc(sizeof *cdata);
139 1.1 jmmv cdata->session = s;
140 1.1 jmmv cdata->session->references++;
141 1.1 jmmv
142 1.1 jmmv window_choose_ready(wl->window->active,
143 1.1 jmmv 0, cmd_find_window_callback, cmd_find_window_free, cdata);
144 1.1 jmmv
145 1.1 jmmv out:
146 1.1 jmmv ARRAY_FREE(&list_idx);
147 1.1 jmmv ARRAY_FREE(&list_ctx);
148 1.1 jmmv
149 1.1 jmmv return (0);
150 1.1 jmmv }
151 1.1 jmmv
152 1.1 jmmv void
153 1.1 jmmv cmd_find_window_callback(void *data, int idx)
154 1.1 jmmv {
155 1.1 jmmv struct cmd_find_window_data *cdata = data;
156 1.1 jmmv struct session *s = cdata->session;
157 1.1 jmmv
158 1.1 jmmv if (idx == -1)
159 1.1 jmmv return;
160 1.1 jmmv if (!session_alive(s))
161 1.1 jmmv return;
162 1.1 jmmv
163 1.1 jmmv if (session_select(s, idx) == 0) {
164 1.1 jmmv server_redraw_session(s);
165 1.1 jmmv recalculate_sizes();
166 1.1 jmmv }
167 1.1 jmmv }
168 1.1 jmmv
169 1.1 jmmv void
170 1.1 jmmv cmd_find_window_free(void *data)
171 1.1 jmmv {
172 1.1 jmmv struct cmd_find_window_data *cdata = data;
173 1.1 jmmv
174 1.1 jmmv cdata->session->references--;
175 1.1 jmmv xfree(cdata);
176 1.1 jmmv }
177