---
 trunk/cmd-find-window.c |   56 ++++++++++++++++++++++-------------------------
 1 file changed, 26 insertions(+), 30 deletions(-)

diff --git a/trunk/cmd-find-window.c b/trunk/cmd-find-window.c
index ff8405f..88f84e7 100644
--- a/trunk/cmd-find-window.c
+++ b/trunk/cmd-find-window.c
@@ -30,8 +30,8 @@
 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 *);
+void   cmd_find_window_callback(struct window_choose_data *);
+void   cmd_find_window_free(struct window_choose_data *);
 
 /* Flags for determining matching behavior. */
 #define CMD_FIND_WINDOW_BY_TITLE   0x1
@@ -54,10 +54,6 @@ const struct cmd_entry cmd_find_window_entry = {
        cmd_find_window_exec
 };
 
-struct cmd_find_window_data {
-       struct session  *session;
-};
-
 u_int
 cmd_find_window_match_flags(struct args *args)
 {
@@ -82,15 +78,13 @@ int
 cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 {
        struct args                     *args = self->args;
-       struct cmd_find_window_data     *cdata;
+       struct window_choose_data       *cdata;
        struct session                  *s;
        struct winlink                  *wl, *wm;
        struct window_pane              *wp;
-       struct format_tree              *ft;
        ARRAY_DECL(, u_int)              list_idx;
        ARRAY_DECL(, char *)             list_ctx;
        char                            *str, *sres, *sctx, *searchstr;
-       char                            *find_line;
        const char                      *template;
        u_int                            i, line, match_flags;
 
@@ -173,29 +167,25 @@ cmd_find_window_exec(struct cmd *self, struct cmd_ctx 
*ctx)
                wm = winlink_find_by_index(
                    &s->windows, ARRAY_ITEM(&list_idx, i));
 
-               ft = format_create();
-               format_add(ft, "line", "%u", i);
-               format_add(ft, "window_find_matches", "%s",
-                       ARRAY_ITEM(&list_ctx, i));
-               format_session(ft, s);
-               format_winlink(ft, s, wm);
+               cdata = window_choose_data_create(ctx);
+               cdata->idx = wm->idx;
+               cdata->client->references++;
 
-               find_line = format_expand(ft, template);
-
-               window_choose_add(wl->window->active, wm->idx, "%s", find_line);
+               cdata->ft_template = xstrdup(template);
+               format_add(cdata->ft, "line", "%u", i);
+               format_add(cdata->ft, "window_find_matches", "%s",
+                       ARRAY_ITEM(&list_ctx, i));
+               format_session(cdata->ft, s);
+               format_winlink(cdata->ft, s, wm);
 
-               xfree(find_line);
-               format_free(ft);
+               window_choose_add(wl->window->active, cdata);
        }
 
-       cdata = xmalloc(sizeof *cdata);
-       cdata->session = s;
-       cdata->session->references++;
-
        window_choose_ready(wl->window->active,
-           0, cmd_find_window_callback, cmd_find_window_free, cdata);
+           0, cmd_find_window_callback, cmd_find_window_free);
 
 out:
+
        ARRAY_FREE(&list_idx);
        ARRAY_FREE(&list_ctx);
 
@@ -203,16 +193,18 @@ out:
 }
 
 void
-cmd_find_window_callback(void *data, int idx)
+cmd_find_window_callback(struct window_choose_data *cdata)
 {
-       struct cmd_find_window_data     *cdata = data;
        struct session                  *s = cdata->session;
+       u_int                            idx;
 
-       if (idx == -1)
+       if (cdata == NULL)
                return;
        if (!session_alive(s))
                return;
 
+       idx = cdata->idx;
+
        if (session_select(s, idx) == 0) {
                server_redraw_session(s);
                recalculate_sizes();
@@ -220,10 +212,14 @@ cmd_find_window_callback(void *data, int idx)
 }
 
 void
-cmd_find_window_free(void *data)
+cmd_find_window_free(struct window_choose_data *cdata)
 {
-       struct cmd_find_window_data     *cdata = data;
+       if (cdata == NULL)
+               return;
 
        cdata->session->references--;
+
+       xfree(cdata->ft_template);
+       format_free(cdata->ft);
        xfree(cdata);
 }
-- 
1.7.10


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to