Introduce window_choose_data_create() and use struct window_choose_data
therein.
---
 trunk/tmux.h          |    6 +++++-
 trunk/window-choose.c |   55 ++++++++++++++++++++++++++++++++++---------------
 2 files changed, 43 insertions(+), 18 deletions(-)

diff --git a/trunk/tmux.h b/trunk/tmux.h
index 26c0ceb..f6c0c4c 100644
--- a/trunk/tmux.h
+++ b/trunk/tmux.h
@@ -2133,7 +2133,11 @@ void              window_choose_vadd(
 void            window_choose_add(struct window_pane *,
                         struct window_choose_data *);
 void            window_choose_ready(struct window_pane *,
-                    u_int, void (*)(void *, int), void (*)(void *), void *);
+                    u_int, void (*)(struct window_choose_data *),
+                    void (*)(struct window_choose_data *));
+struct window_choose_data      *window_choose_data_create(
+                       struct cmd_ctx *);
+void            window_choose_ctx(struct window_choose_data *);
 
 /* names.c */
 void            queue_window_name(struct window *);
diff --git a/trunk/window-choose.c b/trunk/window-choose.c
index 8196435..28c27a9 100644
--- a/trunk/window-choose.c
+++ b/trunk/window-choose.c
@@ -31,7 +31,8 @@ void  window_choose_key(struct window_pane *, struct session 
*, int);
 void   window_choose_mouse(
            struct window_pane *, struct session *, struct mouse_event *);
 
-void   window_choose_fire_callback(struct window_pane *, int);
+void   window_choose_fire_callback(
+           struct window_pane *, struct window_choose_data *);
 void   window_choose_redraw_screen(struct window_pane *);
 void   window_choose_write_line(
            struct window_pane *, struct screen_write_ctx *, u_int);
@@ -73,13 +74,14 @@ window_choose_add(struct window_pane *wp, struct 
window_choose_data *wcd)
        ARRAY_EXPAND(&data->list, 1);
        item = &ARRAY_LAST(&data->list);
 
-       item->name = format_expand(data->ft, data->ft_template);
+       item->name = format_expand(wcd->ft, wcd->ft_template);
        item->wcd = wcd;
 }
 
 void
 window_choose_ready(struct window_pane *wp, u_int cur,
-    void (*callbackfn)(void *, int), void (*freefn)(void *), void *cdata)
+    void (*callbackfn)(struct window_choose_data *),
+    void (*freefn)(struct window_choose_data *))
 {
        struct window_choose_mode_data  *data = wp->modedata;
        struct screen                   *s = &data->screen;
@@ -90,7 +92,6 @@ window_choose_ready(struct window_pane *wp, u_int cur,
 
        data->callbackfn = callbackfn;
        data->freefn = freefn;
-       data->data = cdata;
 
        window_choose_redraw_screen(wp);
 }
@@ -106,7 +107,6 @@ window_choose_init(struct window_pane *wp)
 
        data->callbackfn = NULL;
        data->freefn = NULL;
-       data->data = NULL;
 
        ARRAY_INIT(&data->list);
        data->top = 0;
@@ -126,17 +126,36 @@ window_choose_init(struct window_pane *wp)
        return (s);
 }
 
+struct window_choose_data *
+window_choose_data_create(struct cmd_ctx *ctx)
+{
+       struct window_choose_data       *wcd;
+
+       wcd = xmalloc(sizeof *wcd);
+       wcd->ft = format_create();
+       wcd->ft_template = NULL;
+       wcd->action = NULL;
+       wcd->raw_format = NULL;
+       wcd->client = ctx->curclient;
+       wcd->session = ctx->curclient->session;
+       wcd->idx = -1;
+
+       return (wcd);
+}
+
 void
 window_choose_free(struct window_pane *wp)
 {
        struct window_choose_mode_data  *data = wp->modedata;
+       struct window_choose_mode_item  *item;
        u_int                            i;
 
-       if (data->freefn != NULL && data->data != NULL)
-               data->freefn(data->data);
-
-       for (i = 0; i < ARRAY_LENGTH(&data->list); i++)
-               xfree(ARRAY_ITEM(&data->list, i).name);
+       for (i = 0; i < ARRAY_LENGTH(&data->list); i++) {
+               item = &ARRAY_ITEM(&data->list, i);
+               if (data->freefn != NULL && item->wcd != NULL)
+                       data->freefn(item->wcd);
+               xfree(item->name);
+       }
        ARRAY_FREE(&data->list);
 
        screen_free(&data->screen);
@@ -158,7 +177,8 @@ window_choose_resize(struct window_pane *wp, u_int sx, 
u_int sy)
 }
 
 void
-window_choose_fire_callback(struct window_pane *wp, int idx)
+window_choose_fire_callback(
+       struct window_pane *wp, struct window_choose_data *wcd)
 {
        struct window_choose_mode_data  *data = wp->modedata;
        const struct window_mode        *oldmode;
@@ -166,7 +186,7 @@ window_choose_fire_callback(struct window_pane *wp, int idx)
        oldmode = wp->mode;
        wp->mode = NULL;
 
-       data->callbackfn(data->data, idx);
+       data->callbackfn(wcd);
 
        wp->mode = oldmode;
 }
@@ -186,12 +206,12 @@ window_choose_key(struct window_pane *wp, unused struct 
session *sess, int key)
 
        switch (mode_key_lookup(&data->mdata, key)) {
        case MODEKEYCHOICE_CANCEL:
-               window_choose_fire_callback(wp, -1);
+               window_choose_fire_callback(wp, NULL);
                window_pane_reset_mode(wp);
                break;
        case MODEKEYCHOICE_CHOOSE:
                item = &ARRAY_ITEM(&data->list, data->selected);
-               window_choose_fire_callback(wp, item->idx);
+               window_choose_fire_callback(wp, item->wcd);
                window_pane_reset_mode(wp);
                break;
        case MODEKEYCHOICE_UP:
@@ -297,7 +317,7 @@ window_choose_key(struct window_pane *wp, unused struct 
session *sess, int key)
                data->selected = idx;
 
                item = &ARRAY_ITEM(&data->list, data->selected);
-               window_choose_fire_callback(wp, item->idx);
+               window_choose_fire_callback(wp, item->wcd);
                window_pane_reset_mode(wp);
                break;
        }
@@ -326,7 +346,7 @@ window_choose_mouse(
        data->selected = idx;
 
        item = &ARRAY_ITEM(&data->list, data->selected);
-       window_choose_fire_callback(wp, item->idx);
+       window_choose_fire_callback(wp, item->wcd);
        window_pane_reset_mode(wp);
 }
 
@@ -465,7 +485,8 @@ window_choose_ctx(struct window_choose_data *cdata)
        struct cmd_list         *cmdlist;
        char                    *template, *cause;
 
-       template = cmd_template_replace(cdata->template, cdata->raw_format, 1);
+       template = cmd_template_replace(cdata->action,
+                       cdata->raw_format, 1);
 
        if (cmd_string_parse(template, &cmdlist, &cause) != 0) {
                if (cause != NULL) {
-- 
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