From 325cbe90d925d3deb90559463b6d968c31fa5924 Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 16 Jun 2016 10:55:47 +0000 Subject: Allow a command to be specified to display-panes, similar to command-prompt, rather than always just selecting the pane. --- cmd-display-panes.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 5 deletions(-) (limited to 'cmd-display-panes.c') 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 +#include +#include + #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; +} -- cgit v1.2.3