mirror of
https://github.com/tmux/tmux.git
synced 2025-04-24 22:01:01 +00:00
Simplify the code by using the generic _target functions.
This commit is contained in:
parent
6b148c8dce
commit
53dc88e276
@ -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
3
tmux.1
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user