summaryrefslogtreecommitdiffstats
path: root/cmd-display-panes.c
diff options
context:
space:
mode:
authornicm <nicm>2016-06-16 10:55:47 +0000
committernicm <nicm>2016-06-16 10:55:47 +0000
commit325cbe90d925d3deb90559463b6d968c31fa5924 (patch)
tree579aa5c9a0ddab9362560e5593e4843d5ca3c0a7 /cmd-display-panes.c
parent0c7ddae2abe67762b00fea10723d01251f3c156d (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.c59
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;
+}