diff options
Diffstat (limited to 'cmd-choose-session.c')
-rw-r--r-- | cmd-choose-session.c | 91 |
1 files changed, 31 insertions, 60 deletions
diff --git a/cmd-choose-session.c b/cmd-choose-session.c index ad13b151..b26d9d8f 100644 --- a/cmd-choose-session.c +++ b/cmd-choose-session.c @@ -28,8 +28,8 @@ int cmd_choose_session_exec(struct cmd *, struct cmd_ctx *); -void cmd_choose_session_callback(void *, int); -void cmd_choose_session_free(void *); +void cmd_choose_session_callback(struct window_choose_data *); +void cmd_choose_session_free(struct window_choose_data *); const struct cmd_entry cmd_choose_session_entry = { "choose-session", NULL, @@ -41,21 +41,14 @@ const struct cmd_entry cmd_choose_session_entry = { cmd_choose_session_exec }; -struct cmd_choose_session_data { - struct client *client; - char *template; -}; - int cmd_choose_session_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; - struct cmd_choose_session_data *cdata; + struct window_choose_data *cdata; struct winlink *wl; struct session *s; - struct format_tree *ft; const char *template; - char *line; u_int idx, cur; if (ctx->curclient == NULL) { @@ -78,80 +71,58 @@ cmd_choose_session_exec(struct cmd *self, struct cmd_ctx *ctx) cur = idx; idx++; - ft = format_create(); - format_add(ft, "line", "%u", idx); - format_session(ft, s); + cdata = window_choose_data_create(ctx); + if (args->argc != 0) + cdata->action = xstrdup(args->argv[0]); + else + cdata->action = xstrdup("switch-client -t '%%'"); + cdata->idx = s->idx; - line = format_expand(ft, template); - window_choose_add(wl->window->active, s->idx, "%s", line); - xfree(line); + cdata->client->references++; + cdata->session->references++; - format_free(ft); - } + cdata->ft_template = xstrdup(template); + format_add(cdata->ft, "line", "%u", idx); + format_session(cdata->ft, s); - cdata = xmalloc(sizeof *cdata); - if (args->argc != 0) - cdata->template = xstrdup(args->argv[0]); - else - cdata->template = xstrdup("switch-client -t '%%'"); - cdata->client = ctx->curclient; - cdata->client->references++; + window_choose_add(wl->window->active, cdata); + } window_choose_ready(wl->window->active, - cur, cmd_choose_session_callback, cmd_choose_session_free, cdata); + cur, cmd_choose_session_callback, cmd_choose_session_free); return (0); } void -cmd_choose_session_callback(void *data, int idx) +cmd_choose_session_callback(struct window_choose_data *cdata) { - struct cmd_choose_session_data *cdata = data; - struct session *s; - struct cmd_list *cmdlist; - struct cmd_ctx ctx; - char *template, *cause; + struct session *s; - if (idx == -1) + if (cdata == NULL) return; if (cdata->client->flags & CLIENT_DEAD) return; - s = session_find_by_index(idx); + s = session_find_by_index(cdata->idx); if (s == NULL) return; - template = cmd_template_replace(cdata->template, s->name, 1); - - if (cmd_string_parse(template, &cmdlist, &cause) != 0) { - if (cause != NULL) { - *cause = toupper((u_char) *cause); - status_message_set(cdata->client, "%s", cause); - xfree(cause); - } - xfree(template); - return; - } - xfree(template); - - ctx.msgdata = NULL; - ctx.curclient = cdata->client; - - ctx.error = key_bindings_error; - ctx.print = key_bindings_print; - ctx.info = key_bindings_info; - ctx.cmdclient = NULL; - - cmd_list_exec(cmdlist, &ctx); - cmd_list_free(cmdlist); + cdata->raw_format = xstrdup(s->name); + window_choose_ctx(cdata); } void -cmd_choose_session_free(void *data) +cmd_choose_session_free(struct window_choose_data *cdata) { - struct cmd_choose_session_data *cdata = data; + if (cdata == NULL) + return; cdata->client->references--; - xfree(cdata->template); + cdata->session->references--; + + xfree(cdata->ft_template); + xfree(cdata->action); + format_free(cdata->ft); xfree(cdata); } |