Simplify the code by using the generic _target functions.

pull/1/head
Tiago Cunha 2009-04-28 18:29:44 +00:00
parent 6b148c8dce
commit 53dc88e276
2 changed files with 31 additions and 107 deletions

View File

@ -1,4 +1,4 @@
/* $Id: cmd-confirm-before.c,v 1.3 2009-04-27 17:28:30 nicm Exp $ */ /* $Id: cmd-confirm-before.c,v 1.4 2009-04-28 18:29:44 tcunha Exp $ */
/* /*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org> * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@ -25,90 +25,53 @@
* Asks for confirmation before executing a command. * Asks for confirmation before executing a command.
*/ */
int cmd_confirm_before_parse(struct cmd *, int, char **, char **);
int cmd_confirm_before_exec(struct cmd *, struct cmd_ctx *); int cmd_confirm_before_exec(struct cmd *, struct cmd_ctx *);
void cmd_confirm_before_send(struct cmd *, struct buffer *);
void cmd_confirm_before_recv(struct cmd *, struct buffer *);
void cmd_confirm_before_free(struct cmd *);
void cmd_confirm_before_init(struct cmd *, int); void cmd_confirm_before_init(struct cmd *, int);
size_t cmd_confirm_before_print(struct cmd *, char *, size_t);
int cmd_confirm_before_callback(void *, const char *); int cmd_confirm_before_callback(void *, const char *);
struct cmd_confirm_before_data { struct cmd_confirm_before_data {
char *cmd; struct client *c;
}; char *cmd;
struct cmd_confirm_before_cdata {
struct client *c;
struct cmd_confirm_before_data data;
}; };
const struct cmd_entry cmd_confirm_before_entry = { const struct cmd_entry cmd_confirm_before_entry = {
"confirm-before", "confirm", "confirm-before", "confirm",
"command", CMD_TARGET_CLIENT_USAGE " command",
0, CMD_ARG1,
cmd_confirm_before_init, cmd_confirm_before_init,
cmd_confirm_before_parse, cmd_target_parse,
cmd_confirm_before_exec, cmd_confirm_before_exec,
cmd_confirm_before_send, cmd_target_send,
cmd_confirm_before_recv, cmd_target_recv,
cmd_confirm_before_free, cmd_target_free,
cmd_confirm_before_print cmd_target_print
}; };
void void
cmd_confirm_before_init(struct cmd *self, int key) cmd_confirm_before_init(struct cmd *self, int key)
{ {
struct cmd_confirm_before_data *data; struct cmd_target_data *data;
self->data = data = xmalloc(sizeof *data); cmd_target_init(self, key);
data->cmd = NULL; data = self->data;
switch (key) { switch (key) {
case '&': case '&':
data->cmd = xstrdup("kill-window"); data->arg = xstrdup("kill-window");
break; break;
case 'x': case 'x':
data->cmd = xstrdup("kill-pane"); data->arg = xstrdup("kill-pane");
break; break;
} }
} }
int
cmd_confirm_before_parse(struct cmd *self, int argc, char **argv, char **cause)
{
struct cmd_confirm_before_data *data;
int opt;
self->entry->init(self, 0);
data = self->data;
while ((opt = getopt(argc, argv, "")) != -1) {
switch (opt) {
default:
goto usage;
}
}
argc -= optind;
argv += optind;
if (argc != 1)
goto usage;
data->cmd = xstrdup(argv[0]);
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
self->entry->free(self);
return (-1);
}
int int
cmd_confirm_before_exec(unused struct cmd *self, struct cmd_ctx *ctx) cmd_confirm_before_exec(unused struct cmd *self, struct cmd_ctx *ctx)
{ {
struct cmd_confirm_before_cdata *cdata; struct cmd_target_data *data = self->data;
struct cmd_confirm_before_data *data = self->data; struct cmd_confirm_before_data *cdata;
struct client *c;
char *buf, *cmd, *ptr; char *buf, *cmd, *ptr;
if (ctx->curclient == NULL) { if (ctx->curclient == NULL) {
@ -116,15 +79,18 @@ cmd_confirm_before_exec(unused struct cmd *self, struct cmd_ctx *ctx)
return (-1); return (-1);
} }
ptr = xstrdup(data->cmd); if ((c = cmd_find_client(ctx, data->target)) == NULL)
return (-1);
ptr = xstrdup(data->arg);
if ((cmd = strtok(ptr, " \t")) == NULL) if ((cmd = strtok(ptr, " \t")) == NULL)
cmd = ptr; cmd = ptr;
xasprintf(&buf, "Confirm '%s'? (y/n) ", cmd); xasprintf(&buf, "Confirm '%s'? (y/n) ", cmd);
xfree(ptr); xfree(ptr);
cdata = xmalloc(sizeof *cdata); cdata = xmalloc(sizeof *cdata);
cdata->data.cmd = xstrdup(data->cmd); cdata->cmd = xstrdup(data->arg);
cdata->c = ctx->curclient; cdata->c = c;
status_prompt_set( status_prompt_set(
cdata->c, buf, cmd_confirm_before_callback, cdata, PROMPT_SINGLE); cdata->c, buf, cmd_confirm_before_callback, cdata, PROMPT_SINGLE);
@ -132,53 +98,10 @@ cmd_confirm_before_exec(unused struct cmd *self, struct cmd_ctx *ctx)
return (1); return (1);
} }
void
cmd_confirm_before_send(struct cmd *self, struct buffer *b)
{
struct cmd_confirm_before_data *data = self->data;
buffer_write(b, data, sizeof *data);
cmd_send_string(b, data->cmd);
}
void
cmd_confirm_before_recv(struct cmd *self, struct buffer *b)
{
struct cmd_confirm_before_data *data;
self->data = data = xmalloc(sizeof *data);
buffer_read(b, data, sizeof *data);
data->cmd = cmd_recv_string(b);
}
void
cmd_confirm_before_free(struct cmd *self)
{
struct cmd_confirm_before_data *data = self->data;
if (data->cmd != NULL)
xfree(data->cmd);
xfree(data);
}
size_t
cmd_confirm_before_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_confirm_before_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s ", self->entry->name);
if (data == NULL)
return (off);
if (off < len && data->cmd != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->cmd);
return (off);
}
int int
cmd_confirm_before_callback(void *data, const char *s) cmd_confirm_before_callback(void *data, const char *s)
{ {
struct cmd_confirm_before_cdata *cdata = data; struct cmd_confirm_before_data *cdata = data;
struct client *c = cdata->c; struct client *c = cdata->c;
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
struct cmd_ctx ctx; struct cmd_ctx ctx;
@ -187,7 +110,7 @@ cmd_confirm_before_callback(void *data, const char *s)
if (s == NULL || tolower((u_char) s[0]) != 'y' || s[1] != '\0') if (s == NULL || tolower((u_char) s[0]) != 'y' || s[1] != '\0')
goto out; goto out;
if (cmd_string_parse(cdata->data.cmd, &cmdlist, &cause) != 0) { if (cmd_string_parse(cdata->cmd, &cmdlist, &cause) != 0) {
if (cause != NULL) { if (cause != NULL) {
*cause = toupper((u_char) *cause); *cause = toupper((u_char) *cause);
status_message_set(c, cause); status_message_set(c, cause);
@ -210,8 +133,8 @@ cmd_confirm_before_callback(void *data, const char *s)
cmd_list_free(cmdlist); cmd_list_free(cmdlist);
out: out:
if (cdata->data.cmd != NULL) if (cdata->cmd != NULL)
xfree(cdata->data.cmd); xfree(cdata->cmd);
xfree(cdata); xfree(cdata);
return (0); return (0);

3
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.92 2009-04-27 14:50:22 nicm Exp $ .\" $Id: tmux.1,v 1.93 2009-04-28 18:29:44 tcunha Exp $
.\" .\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\" .\"
@ -495,6 +495,7 @@ If
is specified, it is used as the command; any %% in the template will be is specified, it is used as the command; any %% in the template will be
replaced by what is entered at the prompt. replaced by what is entered at the prompt.
.It Xo Ic confirm-before .It Xo Ic confirm-before
.Op Fl t Ar target-client
.Ar command .Ar command
.Xc .Xc
.D1 (alias: Ic confirm) .D1 (alias: Ic confirm)