From d394293ba59fc932085eb8c01592822a9b1ec1f7 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 15 Sep 2023 06:31:49 +0000 Subject: [PATCH] Add -t to source-file, GitHub issue 3473. --- cfg.c | 23 +++++++++++------------ cmd-queue.c | 4 +++- cmd-source-file.c | 9 ++++++--- input.c | 39 +++++++++++++++++++++++++++++++-------- tmux.1 | 1 + tmux.h | 10 ++++++---- 6 files changed, 58 insertions(+), 28 deletions(-) diff --git a/cfg.c b/cfg.c index e92ce36f..98254fdb 100644 --- a/cfg.c +++ b/cfg.c @@ -67,6 +67,7 @@ start_cfg(void) { struct client *c; u_int i; + int flags = 0; /* * Configuration files are loaded without a client, so commands are run @@ -84,19 +85,17 @@ start_cfg(void) cmdq_append(c, cfg_item); } - for (i = 0; i < cfg_nfiles; i++) { - if (cfg_quiet) - load_cfg(cfg_files[i], c, NULL, CMD_PARSE_QUIET, NULL); - else - load_cfg(cfg_files[i], c, NULL, 0, NULL); - } + if (cfg_quiet) + flags = CMD_PARSE_QUIET; + for (i = 0; i < cfg_nfiles; i++) + load_cfg(cfg_files[i], c, NULL, NULL, flags, NULL); cmdq_append(NULL, cmdq_get_callback(cfg_done, NULL)); } int -load_cfg(const char *path, struct client *c, struct cmdq_item *item, int flags, - struct cmdq_item **new_item) +load_cfg(const char *path, struct client *c, struct cmdq_item *item, + struct cmd_find_state *current, int flags, struct cmdq_item **new_item) { FILE *f; struct cmd_parse_input pi; @@ -135,7 +134,7 @@ load_cfg(const char *path, struct client *c, struct cmdq_item *item, int flags, } if (item != NULL) - state = cmdq_copy_state(cmdq_get_state(item)); + state = cmdq_copy_state(cmdq_get_state(item), current); else state = cmdq_new_state(NULL, NULL, 0); cmdq_add_format(state, "current_file", "%s", pi.file); @@ -155,8 +154,8 @@ load_cfg(const char *path, struct client *c, struct cmdq_item *item, int flags, int load_cfg_from_buffer(const void *buf, size_t len, const char *path, - struct client *c, struct cmdq_item *item, int flags, - struct cmdq_item **new_item) + struct client *c, struct cmdq_item *item, struct cmd_find_state *current, + int flags, struct cmdq_item **new_item) { struct cmd_parse_input pi; struct cmd_parse_result *pr; @@ -187,7 +186,7 @@ load_cfg_from_buffer(const void *buf, size_t len, const char *path, } if (item != NULL) - state = cmdq_copy_state(cmdq_get_state(item)); + state = cmdq_copy_state(cmdq_get_state(item), current); else state = cmdq_new_state(NULL, NULL, 0); cmdq_add_format(state, "current_file", "%s", pi.file); diff --git a/cmd-queue.c b/cmd-queue.c index ce6cab38..e197cd28 100644 --- a/cmd-queue.c +++ b/cmd-queue.c @@ -237,8 +237,10 @@ cmdq_link_state(struct cmdq_state *state) /* Make a copy of a state. */ struct cmdq_state * -cmdq_copy_state(struct cmdq_state *state) +cmdq_copy_state(struct cmdq_state *state, struct cmd_find_state *current) { + if (current != NULL) + return (cmdq_new_state(current, &state->event, state->flags)); return (cmdq_new_state(&state->current, &state->event, state->flags)); } diff --git a/cmd-source-file.c b/cmd-source-file.c index 0bc02e05..38d56d31 100644 --- a/cmd-source-file.c +++ b/cmd-source-file.c @@ -36,8 +36,10 @@ const struct cmd_entry cmd_source_file_entry = { .name = "source-file", .alias = "source", - .args = { "Fnqv", 1, -1, NULL }, - .usage = "[-Fnqv] path ...", + .args = { "t:Fnqv", 1, -1, NULL }, + .usage = "[-Fnqv] " CMD_TARGET_PANE_USAGE " path ...", + + .target = { 't', CMD_FIND_PANE, CMD_FIND_CANFAIL }, .flags = 0, .exec = cmd_source_file_exec @@ -93,6 +95,7 @@ cmd_source_file_done(struct client *c, const char *path, int error, size_t bsize = EVBUFFER_LENGTH(buffer); u_int n; struct cmdq_item *new_item; + struct cmd_find_state *target = cmdq_get_target(item); if (!closed) return; @@ -101,7 +104,7 @@ cmd_source_file_done(struct client *c, const char *path, int error, cmdq_error(item, "%s: %s", path, strerror(error)); else if (bsize != 0) { if (load_cfg_from_buffer(bdata, bsize, path, c, cdata->after, - cdata->flags, &new_item) < 0) + target, cdata->flags, &new_item) < 0) cdata->retval = CMD_RETURN_ERROR; else if (new_item != NULL) cdata->after = new_item; diff --git a/input.c b/input.c index 090d61ab..70a0f5da 100644 --- a/input.c +++ b/input.c @@ -169,6 +169,7 @@ static void input_csi_dispatch_rm(struct input_ctx *); static void input_csi_dispatch_rm_private(struct input_ctx *); static void input_csi_dispatch_sm(struct input_ctx *); static void input_csi_dispatch_sm_private(struct input_ctx *); +static void input_csi_dispatch_sm_graphics(struct input_ctx *); static void input_csi_dispatch_winops(struct input_ctx *); static void input_csi_dispatch_sgr_256(struct input_ctx *, int, u_int *); static void input_csi_dispatch_sgr_rgb(struct input_ctx *, int, u_int *); @@ -203,7 +204,7 @@ enum input_esc_type { INPUT_ESC_SCSG0_ON, INPUT_ESC_SCSG1_OFF, INPUT_ESC_SCSG1_ON, - INPUT_ESC_ST, + INPUT_ESC_ST }; /* Escape command table. */ @@ -259,11 +260,12 @@ enum input_csi_type { INPUT_CSI_SGR, INPUT_CSI_SM, INPUT_CSI_SM_PRIVATE, + INPUT_CSI_SM_GRAPHICS, INPUT_CSI_SU, INPUT_CSI_TBC, INPUT_CSI_VPA, INPUT_CSI_WINOPS, - INPUT_CSI_XDA, + INPUT_CSI_XDA }; /* Control (CSI) command table. */ @@ -283,6 +285,7 @@ static const struct input_table_entry input_csi_table[] = { { 'M', "", INPUT_CSI_DL }, { 'P', "", INPUT_CSI_DCH }, { 'S', "", INPUT_CSI_SU }, + { 'S', "?", INPUT_CSI_SM_GRAPHICS }, { 'T', "", INPUT_CSI_SD }, { 'X', "", INPUT_CSI_ECH }, { 'Z', "", INPUT_CSI_CBT }, @@ -306,7 +309,7 @@ static const struct input_table_entry input_csi_table[] = { { 'r', "", INPUT_CSI_DECSTBM }, { 's', "", INPUT_CSI_SCP }, { 't', "", INPUT_CSI_WINOPS }, - { 'u', "", INPUT_CSI_RCP }, + { 'u', "", INPUT_CSI_RCP } }; /* Input transition. */ @@ -1595,6 +1598,9 @@ input_csi_dispatch(struct input_ctx *ictx) case INPUT_CSI_SM_PRIVATE: input_csi_dispatch_sm_private(ictx); break; + case INPUT_CSI_SM_GRAPHICS: + input_csi_dispatch_sm_graphics(ictx); + break; case INPUT_CSI_SU: n = input_get(ictx, 0, 1, 1); if (n != -1) @@ -1827,6 +1833,12 @@ input_csi_dispatch_sm_private(struct input_ctx *ictx) } } +/* Handle CSI graphics SM. */ +static void +input_csi_dispatch_sm_graphics(__unused struct input_ctx *ictx) +{ +} + /* Handle CSI window operations. */ static void input_csi_dispatch_winops(struct input_ctx *ictx) @@ -1834,6 +1846,7 @@ input_csi_dispatch_winops(struct input_ctx *ictx) struct screen_write_ctx *sctx = &ictx->ctx; struct screen *s = sctx->s; struct window_pane *wp = ictx->wp; + struct window *w = wp->window; u_int x = screen_size_x(s), y = screen_size_y(s); int n, m; @@ -1847,8 +1860,6 @@ input_csi_dispatch_winops(struct input_ctx *ictx) case 7: case 11: case 13: - case 14: - case 19: case 20: case 21: case 24: @@ -1866,6 +1877,21 @@ input_csi_dispatch_winops(struct input_ctx *ictx) if (input_get(ictx, m, 0, -1) == -1) return; break; + case 14: + input_reply(ictx, "\033[4;%u;%ut", y * w->ypixel, x * w->xpixel); + break; + case 15: + input_reply(ictx, "\033[5;%u;%ut", y * w->ypixel, x * w->xpixel); + break; + case 16: + input_reply(ictx, "\033[6;%u;%ut", w->ypixel, w->xpixel); + break; + case 18: + input_reply(ictx, "\033[8;%u;%ut", y, x); + break; + case 19: + input_reply(ictx, "\033[9;%u;%ut", y, x); + break; case 22: m++; switch (input_get(ictx, m, 0, -1)) { @@ -1893,9 +1919,6 @@ input_csi_dispatch_winops(struct input_ctx *ictx) break; } break; - case 18: - input_reply(ictx, "\033[8;%u;%ut", y, x); - break; default: log_debug("%s: unknown '%c'", __func__, ictx->ch); break; diff --git a/tmux.1 b/tmux.1 index abe88ba3..b64275c9 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1546,6 +1546,7 @@ show debugging information about jobs and terminals. .Tg source .It Xo Ic source-file .Op Fl Fnqv +.Op Fl t Ar target-pane .Ar path ... .Xc .D1 Pq alias: Ic source diff --git a/tmux.h b/tmux.h index 0a842094..e12903db 100644 --- a/tmux.h +++ b/tmux.h @@ -2102,10 +2102,11 @@ extern char **cfg_files; extern u_int cfg_nfiles; extern int cfg_quiet; void start_cfg(void); -int load_cfg(const char *, struct client *, struct cmdq_item *, int, - struct cmdq_item **); +int load_cfg(const char *, struct client *, struct cmdq_item *, + struct cmd_find_state *, int, struct cmdq_item **); int load_cfg_from_buffer(const void *, size_t, const char *, - struct client *, struct cmdq_item *, int, struct cmdq_item **); + struct client *, struct cmdq_item *, struct cmd_find_state *, + int, struct cmdq_item **); void printflike(1, 2) cfg_add_cause(const char *, ...); void cfg_print_causes(struct cmdq_item *); void cfg_show_causes(struct session *); @@ -2551,7 +2552,8 @@ struct cmd_parse_result *cmd_parse_from_arguments(struct args_value *, u_int, struct cmdq_state *cmdq_new_state(struct cmd_find_state *, struct key_event *, int); struct cmdq_state *cmdq_link_state(struct cmdq_state *); -struct cmdq_state *cmdq_copy_state(struct cmdq_state *); +struct cmdq_state *cmdq_copy_state(struct cmdq_state *, + struct cmd_find_state *); void cmdq_free_state(struct cmdq_state *); void printflike(3, 4) cmdq_add_format(struct cmdq_state *, const char *, const char *, ...);