diff options
author | nicm <nicm> | 2016-06-16 10:55:47 +0000 |
---|---|---|
committer | nicm <nicm> | 2016-06-16 10:55:47 +0000 |
commit | 325cbe90d925d3deb90559463b6d968c31fa5924 (patch) | |
tree | 579aa5c9a0ddab9362560e5593e4843d5ca3c0a7 /cmd-display-panes.c | |
parent | 0c7ddae2abe67762b00fea10723d01251f3c156d (diff) |
Allow a command to be specified to display-panes, similar to
command-prompt, rather than always just selecting the pane.
Diffstat (limited to 'cmd-display-panes.c')
-rw-r--r-- | cmd-display-panes.c | 59 |
1 files changed, 54 insertions, 5 deletions
diff --git a/cmd-display-panes.c b/cmd-display-panes.c index eed3611e..db85c813 100644 --- a/cmd-display-panes.c +++ b/cmd-display-panes.c @@ -18,19 +18,25 @@ #include <sys/types.h> +#include <ctype.h> +#include <stdlib.h> + #include "tmux.h" /* * Display panes on a client. */ -enum cmd_retval cmd_display_panes_exec(struct cmd *, struct cmd_q *); +static enum cmd_retval cmd_display_panes_exec(struct cmd *, struct cmd_q *); + +static void cmd_display_panes_callback(struct client *, + struct window_pane *); const struct cmd_entry cmd_display_panes_entry = { .name = "display-panes", .alias = "displayp", - .args = { "t:", 0, 0 }, + .args = { "t:", 0, 1 }, .usage = CMD_TARGET_CLIENT_USAGE, .tflag = CMD_CLIENT, @@ -39,10 +45,53 @@ const struct cmd_entry cmd_display_panes_entry = { .exec = cmd_display_panes_exec }; -enum cmd_retval -cmd_display_panes_exec(__unused struct cmd *self, struct cmd_q *cmdq) +static enum cmd_retval +cmd_display_panes_exec(struct cmd *self, struct cmd_q *cmdq) { - server_set_identify(cmdq->state.c); + struct args *args = self->args; + struct client *c = cmdq->state.c; + + if (c->identify_callback != NULL) + return (CMD_RETURN_NORMAL); + + c->identify_callback = cmd_display_panes_callback; + if (args->argc != 0) + c->identify_callback_data = xstrdup(args->argv[0]); + else + c->identify_callback_data = xstrdup("select-pane -t '%%'"); + + server_set_identify(c); return (CMD_RETURN_NORMAL); } + +static void +cmd_display_panes_callback(struct client *c, struct window_pane *wp) +{ + struct cmd_list *cmdlist; + char *template, *cmd, *expanded, *cause; + + template = c->identify_callback_data; + if (wp != NULL) { + xasprintf(&expanded, "%%%u", wp->id); + cmd = cmd_template_replace(template, expanded, 1); + + if (cmd_string_parse(cmd, &cmdlist, NULL, 0, &cause) != 0) { + if (cause != NULL) { + *cause = toupper((u_char) *cause); + status_message_set(c, "%s", cause); + free(cause); + } + } else { + cmdq_run(c->cmdq, cmdlist, NULL); + cmd_list_free(cmdlist); + } + + free(cmd); + free(expanded); + } + + free(c->identify_callback_data); + c->identify_callback_data = NULL; + c->identify_callback = NULL; +} |