version 1.2, 2009/08/25 13:32:14 |
version 1.3, 2009/09/07 21:01:50 |
|
|
}; |
}; |
|
|
struct cmd_choose_client_data { |
struct cmd_choose_client_data { |
u_int client; |
struct client *client; |
char *template; |
char *template; |
}; |
}; |
|
|
|
|
cdata->template = xstrdup(data->arg); |
cdata->template = xstrdup(data->arg); |
else |
else |
cdata->template = xstrdup("detach-client -t '%%'"); |
cdata->template = xstrdup("detach-client -t '%%'"); |
cdata->client = server_client_index(ctx->curclient); |
cdata->client = ctx->curclient; |
|
cdata->client->references++; |
|
|
window_choose_ready(wl->window->active, |
window_choose_ready(wl->window->active, |
cur, cmd_choose_client_callback, cmd_choose_client_free, cdata); |
cur, cmd_choose_client_callback, cmd_choose_client_free, cdata); |
|
|
cmd_choose_client_callback(void *data, int idx) |
cmd_choose_client_callback(void *data, int idx) |
{ |
{ |
struct cmd_choose_client_data *cdata = data; |
struct cmd_choose_client_data *cdata = data; |
struct client *c, *c2; |
struct client *c; |
struct cmd_list *cmdlist; |
struct cmd_list *cmdlist; |
struct cmd_ctx ctx; |
struct cmd_ctx ctx; |
char *template, *cause; |
char *template, *cause; |
|
|
if (idx == -1) |
if (idx == -1) |
return; |
return; |
if (cdata->client > ARRAY_LENGTH(&clients) - 1) |
if (cdata->client->flags & CLIENT_DEAD) |
return; |
return; |
c = ARRAY_ITEM(&clients, cdata->client); |
|
|
|
if ((u_int) idx > ARRAY_LENGTH(&clients) - 1) |
if ((u_int) idx > ARRAY_LENGTH(&clients) - 1) |
return; |
return; |
c2 = ARRAY_ITEM(&clients, idx); |
c = ARRAY_ITEM(&clients, idx); |
if (c2 == NULL || c2->session == NULL) |
if (c == NULL || c->session == NULL) |
return; |
return; |
template = cmd_template_replace(cdata->template, c2->tty.path, 1); |
template = cmd_template_replace(cdata->template, c->tty.path, 1); |
|
|
if (cmd_string_parse(template, &cmdlist, &cause) != 0) { |
if (cmd_string_parse(template, &cmdlist, &cause) != 0) { |
if (cause != NULL) { |
if (cause != NULL) { |
|
|
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_client_data *cdata = data; |
struct cmd_choose_client_data *cdata = data; |
|
|
|
cdata->client->references--; |
xfree(cdata->template); |
xfree(cdata->template); |
xfree(cdata); |
xfree(cdata); |
} |
} |