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