diff options
Diffstat (limited to 'cmd-choose-session.c')
-rw-r--r-- | cmd-choose-session.c | 70 |
1 files changed, 58 insertions, 12 deletions
diff --git a/cmd-choose-session.c b/cmd-choose-session.c index cf5e3c82..3028df22 100644 --- a/cmd-choose-session.c +++ b/cmd-choose-session.c @@ -27,11 +27,12 @@ int cmd_choose_session_exec(struct cmd *, struct cmd_ctx *); void cmd_choose_session_callback(void *, int); +void cmd_choose_session_free(void *); const struct cmd_entry cmd_choose_session_entry = { "choose-session", NULL, - CMD_TARGET_WINDOW_USAGE, - 0, 0, + CMD_TARGET_WINDOW_USAGE " [template]", + CMD_ARG01, 0, cmd_target_init, cmd_target_parse, cmd_choose_session_exec, @@ -40,7 +41,8 @@ const struct cmd_entry cmd_choose_session_entry = { }; struct cmd_choose_session_data { - u_int client; + u_int client; + char *template; }; int @@ -79,10 +81,14 @@ cmd_choose_session_exec(struct cmd *self, struct cmd_ctx *ctx) } cdata = xmalloc(sizeof *cdata); + if (data->arg != NULL) + cdata->template = xstrdup(data->arg); + else + cdata->template = xstrdup("switch-client -t '%%'"); cdata->client = server_client_index(ctx->curclient); - window_choose_ready( - wl->window->active, cur, cmd_choose_session_callback, xfree, cdata); + window_choose_ready(wl->window->active, + cur, cmd_choose_session_callback, cmd_choose_session_free, cdata); return (0); } @@ -92,13 +98,53 @@ cmd_choose_session_callback(void *data, int idx) { struct cmd_choose_session_data *cdata = data; struct client *c; - - if (idx != -1 && cdata->client <= ARRAY_LENGTH(&clients) - 1) { - c = ARRAY_ITEM(&clients, cdata->client); - if (c != NULL && (u_int) idx <= ARRAY_LENGTH(&sessions) - 1) { - c->session = ARRAY_ITEM(&sessions, idx); - recalculate_sizes(); - server_redraw_client(c); + struct session *s; + struct cmd_list *cmdlist; + struct cmd_ctx ctx; + char *template, *cause; + + if (idx == -1) + return; + if (cdata->client > ARRAY_LENGTH(&clients) - 1) + return; + c = ARRAY_ITEM(&clients, cdata->client); + + if ((u_int) idx > ARRAY_LENGTH(&sessions) - 1) + return; + s = ARRAY_ITEM(&sessions, 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(c, "%s", cause); + xfree(cause); } + xfree(template); + return; } + xfree(template); + + ctx.msgdata = NULL; + ctx.curclient = c; + + 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); +} + +void +cmd_choose_session_free(void *data) +{ + struct cmd_choose_session_data *cdata = data; + + xfree(cdata->template); + xfree(cdata); } |