From 338ec859a463eaa4c0502116ef2857c566c9e468 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 11 Aug 2021 08:40:58 +0000 Subject: Make confirm-before optionally block the invoking client like run-shell, GitHub issue 2819. --- cmd-confirm-before.c | 38 +++++++++++++++++++++++++++++++------- tmux.1 | 7 ++++--- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c index 0b490b17..83f9a0f8 100644 --- a/cmd-confirm-before.c +++ b/cmd-confirm-before.c @@ -39,15 +39,17 @@ const struct cmd_entry cmd_confirm_before_entry = { .name = "confirm-before", .alias = "confirm", - .args = { "p:t:", 1, 1 }, - .usage = "[-p prompt] " CMD_TARGET_CLIENT_USAGE " command", + .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; + char *cmd; + struct cmdq_item *item; + struct cmd_parse_input pi; }; static enum cmd_retval @@ -59,6 +61,7 @@ cmd_confirm_before_exec(struct cmd *self, struct cmdq_item *item) 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,12 +75,24 @@ cmd_confirm_before_exec(struct cmd *self, struct cmdq_item *item) 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); - return (CMD_RETURN_NORMAL); + if (!wait) + return (CMD_RETURN_NORMAL); + return (CMD_RETURN_WAIT); } static int @@ -85,23 +100,32 @@ cmd_confirm_before_callback(struct client *c, void *data, const char *s, __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') - return (0); + goto out; if (tolower((u_char)s[0]) != 'y' || s[1] != '\0') - return (0); + goto out; - status = cmd_parse_and_append(cdata->cmd, NULL, c, NULL, &error); + 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); } diff --git a/tmux.1 b/tmux.1 index a2872535..95f1ba41 100644 --- a/tmux.1 +++ b/tmux.1 @@ -5507,6 +5507,7 @@ option: .It Li "Transpose characters" Ta "" Ta "C-t" .El .It Xo Ic confirm-before +.Op Fl b .Op Fl p Ar prompt .Op Fl t Ar target-client .Ar command @@ -5523,9 +5524,9 @@ is the prompt to display; otherwise a prompt is constructed from It may contain the special character sequences supported by the .Ic status-left option. -.Pp -This command works only from inside -.Nm . +With +.Fl b , +the prompt is shown in the background and the client. .It Xo Ic display-menu .Op Fl O .Op Fl c Ar target-client -- cgit From 901360007479f176164ab2756072808fc17608c1 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 11 Aug 2021 09:05:21 +0000 Subject: Return to applying pane-border-style to the area outside panes, GitHub issue 2816. --- screen-redraw.c | 17 ++++++++++++++--- tmux.h | 3 +++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/screen-redraw.c b/screen-redraw.c index 729bfb7e..4c4135a8 100644 --- a/screen-redraw.c +++ b/screen-redraw.c @@ -680,7 +680,10 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j) { struct client *c = ctx->c; struct session *s = c->session; + struct window *w = s->curw->window; + struct options *oo = w->options; struct tty *tty = &c->tty; + struct format_tree *ft; struct window_pane *wp; u_int cell_type, x = ctx->ox + i, y = ctx->oy + j; int pane_status = ctx->pane_status, isolates; @@ -694,9 +697,17 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j) if (cell_type == CELL_INSIDE) return; - if (wp == NULL) - memcpy(&gc, &grid_default_cell, sizeof gc); - else { + if (wp == NULL) { + if (!ctx->no_pane_gc_set) { + ft = format_create_defaults(NULL, c, s, s->curw, NULL); + memcpy(&ctx->no_pane_gc, &grid_default_cell, sizeof gc); + style_add(&ctx->no_pane_gc, oo, "pane-border-style", + ft); + format_free(ft); + ctx->no_pane_gc_set = 1; + } + memcpy(&gc, &ctx->no_pane_gc, sizeof gc); + } else { tmp = screen_redraw_draw_borders_style(ctx, x, y, wp); if (tmp == NULL) return; diff --git a/tmux.h b/tmux.h index b2d059a1..42f03bd6 100644 --- a/tmux.h +++ b/tmux.h @@ -886,6 +886,9 @@ struct screen_redraw_ctx { int pane_status; int pane_lines; + struct grid_cell no_pane_gc; + int no_pane_gc_set; + u_int sx; u_int sy; u_int ox; -- cgit