summaryrefslogtreecommitdiffstats
path: root/cmd.c
diff options
context:
space:
mode:
authornicm <nicm>2019-05-25 10:44:09 +0000
committernicm <nicm>2019-05-25 10:44:09 +0000
commitd7586d3d65bb1361928205751ea7a69f69a4aa87 (patch)
treea2bdf9d4d8b3b5ecca462d8e1696d4d3fcc4932a /cmd.c
parentf8d3d247d884a9dc0b23f2799944c15630cab28f (diff)
Use client name when logging command queue.
Diffstat (limited to 'cmd.c')
-rw-r--r--cmd.c85
1 files changed, 82 insertions, 3 deletions
diff --git a/cmd.c b/cmd.c
index ee443614..a071dec5 100644
--- a/cmd.c
+++ b/cmd.c
@@ -205,6 +205,8 @@ const struct cmd_entry *cmd_table[] = {
NULL
};
+static u_int cmd_list_next_group = 1;
+
void printflike(3, 4)
cmd_log_argv(int argc, char **argv, const char *fmt, ...)
{
@@ -381,9 +383,9 @@ cmd_get_alias(const char *name)
static const struct cmd_entry *
cmd_find(const char *name, char **cause)
{
- const struct cmd_entry **loop, *entry, *found = NULL;
- int ambiguous;
- char s[BUFSIZ];
+ const struct cmd_entry **loop, *entry, *found = NULL;
+ int ambiguous;
+ char s[BUFSIZ];
ambiguous = 0;
for (loop = cmd_table; *loop != NULL; loop++) {
@@ -502,6 +504,83 @@ cmd_print(struct cmd *cmd)
return (out);
}
+struct cmd_list *
+cmd_list_new(void)
+{
+ struct cmd_list *cmdlist;
+
+ cmdlist = xcalloc(1, sizeof *cmdlist);
+ cmdlist->references = 1;
+ cmdlist->group = cmd_list_next_group++;
+ TAILQ_INIT(&cmdlist->list);
+ return (cmdlist);
+}
+
+void
+cmd_list_append(struct cmd_list *cmdlist, struct cmd *cmd)
+{
+ cmd->group = cmdlist->group;
+ TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
+}
+
+void
+cmd_list_move(struct cmd_list *cmdlist, struct cmd_list *from)
+{
+ struct cmd *cmd, *cmd1;
+
+ TAILQ_FOREACH_SAFE(cmd, &from->list, qentry, cmd1) {
+ TAILQ_REMOVE(&from->list, cmd, qentry);
+ TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
+ }
+ cmdlist->group = cmd_list_next_group++;
+}
+
+void
+cmd_list_free(struct cmd_list *cmdlist)
+{
+ struct cmd *cmd, *cmd1;
+
+ if (--cmdlist->references != 0)
+ return;
+
+ TAILQ_FOREACH_SAFE(cmd, &cmdlist->list, qentry, cmd1) {
+ TAILQ_REMOVE(&cmdlist->list, cmd, qentry);
+ cmd_free(cmd);
+ }
+
+ free(cmdlist);
+}
+
+char *
+cmd_list_print(struct cmd_list *cmdlist, int escaped)
+{
+ struct cmd *cmd;
+ char *buf, *this;
+ size_t len;
+
+ len = 1;
+ buf = xcalloc(1, len);
+
+ TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
+ this = cmd_print(cmd);
+
+ len += strlen(this) + 4;
+ buf = xrealloc(buf, len);
+
+ strlcat(buf, this, len);
+ if (TAILQ_NEXT(cmd, qentry) != NULL) {
+ if (escaped)
+ strlcat(buf, " \\; ", len);
+ else
+ strlcat(buf, " ; ", len);
+ }
+
+ free(this);
+ }
+
+ return (buf);
+}
+
/* Adjust current mouse position for a pane. */
int
cmd_mouse_at(struct window_pane *wp, struct mouse_event *m, u_int *xp,