version 1.8, 2009/08/25 13:32:14 |
version 1.9, 2009/09/07 21:01:50 |
|
|
}; |
}; |
|
|
struct cmd_choose_window_data { |
struct cmd_choose_window_data { |
u_int client; |
struct client *client; |
u_int session; |
struct session *session; |
char *template; |
char *template; |
}; |
}; |
|
|
|
|
} |
} |
|
|
cdata = xmalloc(sizeof *cdata); |
cdata = xmalloc(sizeof *cdata); |
if (session_index(s, &cdata->session) != 0) |
|
fatalx("session not found"); |
|
if (data->arg != NULL) |
if (data->arg != NULL) |
cdata->template = xstrdup(data->arg); |
cdata->template = xstrdup(data->arg); |
else |
else |
cdata->template = xstrdup("select-window -t '%%'"); |
cdata->template = xstrdup("select-window -t '%%'"); |
cdata->client = server_client_index(ctx->curclient); |
cdata->session = s; |
|
cdata->session->references++; |
|
cdata->client = ctx->curclient; |
|
cdata->client->references++; |
|
|
window_choose_ready(wl->window->active, |
window_choose_ready(wl->window->active, |
cur, cmd_choose_window_callback, cmd_choose_window_free, cdata); |
cur, cmd_choose_window_callback, cmd_choose_window_free, cdata); |
|
|
cmd_choose_window_callback(void *data, int idx) |
cmd_choose_window_callback(void *data, int idx) |
{ |
{ |
struct cmd_choose_window_data *cdata = data; |
struct cmd_choose_window_data *cdata = data; |
struct client *c; |
|
struct session *s; |
|
struct cmd_list *cmdlist; |
struct cmd_list *cmdlist; |
struct cmd_ctx ctx; |
struct cmd_ctx ctx; |
char *target, *template, *cause; |
char *target, *template, *cause; |
|
|
if (idx == -1) |
if (idx == -1) |
return; |
return; |
if (cdata->client > ARRAY_LENGTH(&clients) - 1) |
if (cdata->client->flags & CLIENT_DEAD) |
|
return; |
|
if (cdata->session->flags & SESSION_DEAD) |
return; |
return; |
c = ARRAY_ITEM(&clients, cdata->client); |
if (cdata->client->session != cdata->session) |
if (cdata->session > ARRAY_LENGTH(&sessions) - 1) |
|
return; |
return; |
s = ARRAY_ITEM(&sessions, cdata->session); |
|
if (c->session != s) |
|
return; |
|
|
|
xasprintf(&target, "%s:%d", s->name, idx); |
xasprintf(&target, "%s:%d", cdata->session->name, idx); |
template = cmd_template_replace(cdata->template, target, 1); |
template = cmd_template_replace(cdata->template, target, 1); |
xfree(target); |
xfree(target); |
|
|
if (cmd_string_parse(template, &cmdlist, &cause) != 0) { |
if (cmd_string_parse(template, &cmdlist, &cause) != 0) { |
if (cause != NULL) { |
if (cause != NULL) { |
*cause = toupper((u_char) *cause); |
*cause = toupper((u_char) *cause); |
status_message_set(c, "%s", cause); |
status_message_set(cdata->client, "%s", cause); |
xfree(cause); |
xfree(cause); |
} |
} |
xfree(template); |
xfree(template); |
|
|
xfree(template); |
xfree(template); |
|
|
ctx.msgdata = NULL; |
ctx.msgdata = NULL; |
ctx.curclient = c; |
ctx.curclient = cdata->client; |
|
|
ctx.error = key_bindings_error; |
ctx.error = key_bindings_error; |
ctx.print = key_bindings_print; |
ctx.print = key_bindings_print; |
|
|
{ |
{ |
struct cmd_choose_window_data *cdata = data; |
struct cmd_choose_window_data *cdata = data; |
|
|
|
cdata->session->references--; |
|
cdata->client->references--; |
xfree(cdata->template); |
xfree(cdata->template); |
xfree(cdata); |
xfree(cdata); |
} |
} |