=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-confirm-before.c,v retrieving revision 1.43 retrieving revision 1.44 diff -c -r1.43 -r1.44 *** src/usr.bin/tmux/cmd-confirm-before.c 2021/06/10 07:50:03 1.43 --- src/usr.bin/tmux/cmd-confirm-before.c 2021/08/11 08:40:58 1.44 *************** *** 1,4 **** ! /* $OpenBSD: cmd-confirm-before.c,v 1.43 2021/06/10 07:50:03 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha --- 1,4 ---- ! /* $OpenBSD: cmd-confirm-before.c,v 1.44 2021/08/11 08:40:58 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha *************** *** 39,53 **** .name = "confirm-before", .alias = "confirm", ! .args = { "p:t:", 1, 1 }, ! .usage = "[-p prompt] " CMD_TARGET_CLIENT_USAGE " command", .flags = CMD_CLIENT_TFLAG, .exec = cmd_confirm_before_exec }; struct cmd_confirm_before_data { ! char *cmd; }; static enum cmd_retval --- 39,55 ---- .name = "confirm-before", .alias = "confirm", ! .args = { "bp:t:", 1, 1 }, ! .usage = "[-b] [-p prompt] " CMD_TARGET_CLIENT_USAGE " command", .flags = CMD_CLIENT_TFLAG, .exec = cmd_confirm_before_exec }; struct cmd_confirm_before_data { ! char *cmd; ! struct cmdq_item *item; ! struct cmd_parse_input pi; }; static enum cmd_retval *************** *** 59,64 **** --- 61,67 ---- struct cmd_find_state *target = cmdq_get_target(item); char *cmd, *copy, *new_prompt, *ptr; const char *prompt; + int wait = !args_has(args, 'b'); if ((prompt = args_get(args, 'p')) != NULL) xasprintf(&new_prompt, "%s ", prompt); *************** *** 72,83 **** cdata = xmalloc(sizeof *cdata); cdata->cmd = xstrdup(args->argv[0]); status_prompt_set(tc, target, new_prompt, NULL, cmd_confirm_before_callback, cmd_confirm_before_free, cdata, PROMPT_SINGLE, PROMPT_TYPE_COMMAND); free(new_prompt); ! return (CMD_RETURN_NORMAL); } static int --- 75,98 ---- cdata = xmalloc(sizeof *cdata); cdata->cmd = xstrdup(args->argv[0]); + memset(&cdata->pi, 0, sizeof cdata->pi); + cmd_get_source(self, &cdata->pi.file, &cdata->pi.line); + if (wait) + cdata->pi.item = item; + cdata->pi.c = tc; + cmd_find_copy_state(&cdata->pi.fs, target); + + if (wait) + cdata->item = item; + status_prompt_set(tc, target, new_prompt, NULL, cmd_confirm_before_callback, cmd_confirm_before_free, cdata, PROMPT_SINGLE, PROMPT_TYPE_COMMAND); free(new_prompt); ! if (!wait) ! return (CMD_RETURN_NORMAL); ! return (CMD_RETURN_WAIT); } static int *************** *** 85,107 **** __unused int done) { struct cmd_confirm_before_data *cdata = data; char *error; enum cmd_parse_status status; if (c->flags & CLIENT_DEAD) return (0); if (s == NULL || *s == '\0') ! return (0); if (tolower((u_char)s[0]) != 'y' || s[1] != '\0') ! return (0); ! status = cmd_parse_and_append(cdata->cmd, NULL, c, NULL, &error); if (status == CMD_PARSE_ERROR) { cmdq_append(c, cmdq_get_error(error)); free(error); } return (0); } --- 100,131 ---- __unused int done) { struct cmd_confirm_before_data *cdata = data; + const char *cmd = cdata->cmd; char *error; + struct cmdq_item *item = cdata->item; enum cmd_parse_status status; if (c->flags & CLIENT_DEAD) return (0); if (s == NULL || *s == '\0') ! goto out; if (tolower((u_char)s[0]) != 'y' || s[1] != '\0') ! goto out; ! if (item != NULL) { ! status = cmd_parse_and_insert(cmd, &cdata->pi, item, ! cmdq_get_state(item), &error); ! } else ! status = cmd_parse_and_append(cmd, &cdata->pi, c, NULL, &error); if (status == CMD_PARSE_ERROR) { cmdq_append(c, cmdq_get_error(error)); free(error); } + out: + if (item != NULL) + cmdq_continue(item); return (0); }