=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/Attic/cmd-choose-session.c,v retrieving revision 1.4 retrieving revision 1.5 diff -c -r1.4 -r1.5 *** src/usr.bin/tmux/Attic/cmd-choose-session.c 2009/07/26 12:58:44 1.4 --- src/usr.bin/tmux/Attic/cmd-choose-session.c 2009/08/25 12:18:51 1.5 *************** *** 1,4 **** ! /* $OpenBSD: cmd-choose-session.c,v 1.4 2009/07/26 12:58:44 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-choose-session.c,v 1.5 2009/08/25 12:18:51 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 27,37 **** int cmd_choose_session_exec(struct cmd *, struct cmd_ctx *); void cmd_choose_session_callback(void *, int); const struct cmd_entry cmd_choose_session_entry = { "choose-session", NULL, ! CMD_TARGET_WINDOW_USAGE, ! 0, 0, cmd_target_init, cmd_target_parse, cmd_choose_session_exec, --- 27,38 ---- 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 " [template]", ! CMD_ARG01, 0, cmd_target_init, cmd_target_parse, cmd_choose_session_exec, *************** *** 40,46 **** }; struct cmd_choose_session_data { ! u_int client; }; int --- 41,48 ---- }; struct cmd_choose_session_data { ! u_int client; ! char *template; }; int *************** *** 79,88 **** } cdata = xmalloc(sizeof *cdata); cdata->client = server_client_index(ctx->curclient); ! window_choose_ready( ! wl->window->active, cur, cmd_choose_session_callback, xfree, cdata); return (0); } --- 81,94 ---- } 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, cmd_choose_session_free, cdata); return (0); } *************** *** 92,104 **** { 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); } } } --- 98,150 ---- { struct cmd_choose_session_data *cdata = data; struct 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); }