aboutsummaryrefslogtreecommitdiff
path: root/status.c
diff options
context:
space:
mode:
Diffstat (limited to 'status.c')
-rw-r--r--status.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/status.c b/status.c
new file mode 100644
index 00000000..862bd310
--- /dev/null
+++ b/status.c
@@ -0,0 +1,80 @@
+/* $Id: status.c,v 1.1 2007-10-01 14:53:29 nicm Exp $ */
+
+/*
+ * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+
+#include <stdarg.h>
+
+#include "tmux.h"
+
+void status_print(struct buffer *, size_t *, const char *, ...);
+
+void
+status_write(struct client *c)
+{
+ struct screen *s = &c->session->window->screen;
+ struct buffer *b = c->out;
+ struct window *w;
+ size_t size;
+ u_int i;
+
+ input_store_zero(b, CODE_CURSOROFF);
+ input_store_two(b, CODE_CURSORMOVE, s->sy + 1, 1);
+ input_store_two(b, CODE_ATTRIBUTES, ATTR_REVERSE, 0x20);
+
+ size = s->sx;
+ for (i = 0; i < ARRAY_LENGTH(&c->session->windows); i++) {
+ w = ARRAY_ITEM(&c->session->windows, i);
+ if (w == NULL)
+ continue;
+ status_print(b, &size,
+ "%u:%s%s ", i, w->name, w == c->session->window ? "*" : "");
+ if (size == 0)
+ break;
+ }
+ while (size-- > 0)
+ input_store8(b, ' ');
+
+ input_store_two(b, CODE_ATTRIBUTES, s->attr, s->colr);
+ input_store_two(b, CODE_CURSORMOVE, s->cy + 1, s->cx + 1);
+ if (s->mode & MODE_CURSOR)
+ input_store_zero(b, CODE_CURSORON);
+}
+
+void
+status_print(struct buffer *b, size_t *size, const char *fmt, ...)
+{
+ va_list ap;
+ char *msg, *ptr;
+ int n;
+
+ va_start(ap, fmt);
+ n = xvasprintf(&msg, fmt, ap);
+ va_end(ap);
+
+ if ((size_t) n > *size) {
+ msg[*size] = '\0';
+ n = *size;
+ }
+
+ for (ptr = msg; *ptr != '\0'; ptr++)
+ input_store8(b, *ptr);
+ (*size) -= n;
+
+ xfree(msg);
+}