version 1.13, 2013/01/17 20:30:43 |
version 1.14, 2013/03/21 16:08:24 |
|
|
enum cmd_retval cmd_choose_client_exec(struct cmd *, struct cmd_ctx *); |
enum cmd_retval cmd_choose_client_exec(struct cmd *, struct cmd_ctx *); |
|
|
void cmd_choose_client_callback(struct window_choose_data *); |
void cmd_choose_client_callback(struct window_choose_data *); |
void cmd_choose_client_free(struct window_choose_data *); |
|
|
|
const struct cmd_entry cmd_choose_client_entry = { |
const struct cmd_entry cmd_choose_client_entry = { |
"choose-client", NULL, |
"choose-client", NULL, |
|
|
cmd_choose_client_exec(struct cmd *self, struct cmd_ctx *ctx) |
cmd_choose_client_exec(struct cmd *self, struct cmd_ctx *ctx) |
{ |
{ |
struct args *args = self->args; |
struct args *args = self->args; |
|
struct client *c; |
|
struct client *c1; |
struct window_choose_data *cdata; |
struct window_choose_data *cdata; |
struct winlink *wl; |
struct winlink *wl; |
struct client *c; |
|
const char *template; |
const char *template; |
char *action; |
char *action; |
u_int i, idx, cur; |
u_int i, idx, cur; |
|
|
ctx->error(ctx, "must be run interactively"); |
ctx->error(ctx, "must be run interactively"); |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
} |
} |
|
c = ctx->curclient; |
|
|
if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL) |
if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL) |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
|
|
|
|
cur = idx = 0; |
cur = idx = 0; |
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { |
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { |
c = ARRAY_ITEM(&clients, i); |
c1 = ARRAY_ITEM(&clients, i); |
if (c == NULL || c->session == NULL) |
if (c1 == NULL || c1->session == NULL) |
continue; |
continue; |
if (c == ctx->curclient) |
if (c1 == ctx->curclient) |
cur = idx; |
cur = idx; |
idx++; |
idx++; |
|
|
cdata = window_choose_data_create(ctx); |
cdata = window_choose_data_create(TREE_OTHER, c, c->session); |
cdata->idx = i; |
cdata->idx = i; |
cdata->client->references++; |
|
|
|
cdata->ft_template = xstrdup(template); |
cdata->ft_template = xstrdup(template); |
format_add(cdata->ft, "line", "%u", i); |
format_add(cdata->ft, "line", "%u", i); |
format_session(cdata->ft, c->session); |
format_session(cdata->ft, c1->session); |
format_client(cdata->ft, c); |
format_client(cdata->ft, c1); |
|
|
cdata->command = cmd_template_replace(action, c->tty.path, 1); |
cdata->command = cmd_template_replace(action, c1->tty.path, 1); |
|
|
window_choose_add(wl->window->active, cdata); |
window_choose_add(wl->window->active, cdata); |
} |
} |
free(action); |
free(action); |
|
|
window_choose_ready(wl->window->active, |
window_choose_ready(wl->window->active, cur, |
cur, cmd_choose_client_callback, cmd_choose_client_free); |
cmd_choose_client_callback, NULL); |
|
|
return (CMD_RETURN_NORMAL); |
return (CMD_RETURN_NORMAL); |
} |
} |
|
|
|
|
if (cdata == NULL) |
if (cdata == NULL) |
return; |
return; |
if (cdata->client->flags & CLIENT_DEAD) |
if (cdata->start_client->flags & CLIENT_DEAD) |
return; |
return; |
|
|
if (cdata->idx > ARRAY_LENGTH(&clients) - 1) |
if (cdata->idx > ARRAY_LENGTH(&clients) - 1) |
|
|
if (c == NULL || c->session == NULL) |
if (c == NULL || c->session == NULL) |
return; |
return; |
|
|
window_choose_ctx(cdata); |
window_choose_data_run(cdata); |
} |
|
|
|
void |
|
cmd_choose_client_free(struct window_choose_data *cdata) |
|
{ |
|
if (cdata == NULL) |
|
return; |
|
|
|
cdata->client->references--; |
|
|
|
free(cdata->ft_template); |
|
free(cdata->command); |
|
format_free(cdata->ft); |
|
free(cdata); |
|
} |
} |