aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2008-06-04 05:40:35 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2008-06-04 05:40:35 +0000
commit811e75da52a0b504db4221df4504d3594ba3cb8b (patch)
treec68e6c59f4d3814fea41e6dae6bfb795c98ee7a7
parent9e6090a7a2a0d25499bce0dc68fd67289f3a5e39 (diff)
downloadrtmux-811e75da52a0b504db4221df4504d3594ba3cb8b.tar.gz
rtmux-811e75da52a0b504db4221df4504d3594ba3cb8b.tar.bz2
rtmux-811e75da52a0b504db4221df4504d3594ba3cb8b.zip
Status bar left and right strings (set with status-left and status-right), and automatic update (at interval set by status-interval).
-rw-r--r--CHANGES11
-rw-r--r--cmd-set-option.c14
-rw-r--r--server.c14
-rw-r--r--status.c34
-rw-r--r--tmux.c6
-rw-r--r--tmux.h3
6 files changed, 71 insertions, 11 deletions
diff --git a/CHANGES b/CHANGES
index efcd7ece..47cd5ea4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,12 @@
+04 June 2008
+
+* Strings to display on the left and right of the status bar may now be set
+ with the status-left and status-right options. These are passed through
+ strftime(3) before being displayed. The status bar is automatically updated
+ at an interval set by the status-interval option. The default is to display
+ nothing on the left and the date and time on the left; the default update
+ interval is 15 seconds.
+
03 June 2008
* Per session options. Setting options without specifying a session sets the
@@ -382,4 +391,4 @@
(including mutt, emacs). No status bar yet and no key remapping or other
customisation.
-$Id: CHANGES,v 1.103 2008-06-03 21:42:36 nicm Exp $
+$Id: CHANGES,v 1.104 2008-06-04 05:40:35 nicm Exp $
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 3a47583f..49aac0d7 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-set-option.c,v 1.19 2008-06-03 21:42:37 nicm Exp $ */
+/* $Id: cmd-set-option.c,v 1.20 2008-06-04 05:40:35 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -242,6 +242,18 @@ cmd_set_option_exec(void *ptr, unused struct cmd_ctx *ctx)
return;
}
options_set_number(oo, "history-limit", number);
+ } else if (strcmp(data->option, "status-left") == 0) {
+ if (data->value == NULL) {
+ ctx->error(ctx, "invalid value");
+ return;
+ }
+ options_set_string(oo, "status-left", "%s", data->value);
+ } else if (strcmp(data->option, "status-right") == 0) {
+ if (data->value == NULL) {
+ ctx->error(ctx, "invalid value");
+ return;
+ }
+ options_set_string(oo, "status-right", "%s", data->value);
} else {
ctx->error(ctx, "unknown option: %s", data->option);
return;
diff --git a/server.c b/server.c
index 49f98fc1..ec2cff0e 100644
--- a/server.c
+++ b/server.c
@@ -1,4 +1,4 @@
-/* $Id: server.c,v 1.49 2008-06-03 21:42:37 nicm Exp $ */
+/* $Id: server.c,v 1.50 2008-06-04 05:40:35 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -163,7 +163,7 @@ server_main(const char *srv_path, int srv_fd)
/* Do the poll. */
log_debug("polling %d fds", nfds);
- if ((nfds = poll(pfds, nfds, INFTIM)) == -1) {
+ if ((nfds = poll(pfds, nfds, 500)) == -1) {
if (errno == EAGAIN || errno == EINTR)
continue;
fatal("poll failed");
@@ -290,11 +290,21 @@ void
server_handle_clients(struct pollfd **pfd)
{
struct client *c;
+ struct timespec now;
u_int i;
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i);
+ /* XXX REDRAW FLAGS */
+ if (c->session != NULL && options_get_number(
+ &c->session->options, "status-lines") != 0) {
+ if (clock_gettime(CLOCK_REALTIME, &now) != 0)
+ fatal("clock_gettime");
+ if (timespeccmp(&now, &c->status_ts, >))
+ server_status_client(c);
+ }
+
if (c != NULL) {
log_debug("testing client %d (%d)", (*pfd)->fd, c->fd);
if (buffer_poll(*pfd, c->in, c->out) != 0) {
diff --git a/status.c b/status.c
index ca177874..18f5b6a1 100644
--- a/status.c
+++ b/status.c
@@ -1,4 +1,4 @@
-/* $Id: status.c,v 1.19 2008-06-03 21:42:37 nicm Exp $ */
+/* $Id: status.c,v 1.20 2008-06-04 05:40:35 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -17,8 +17,10 @@
*/
#include <sys/types.h>
+#include <sys/time.h>
#include <stdarg.h>
+#include <string.h>
#include "tmux.h"
@@ -29,7 +31,9 @@ status_write_client(struct client *c)
{
struct screen_redraw_ctx ctx;
struct winlink *wl;
- char flag;
+ char flag, *left, *right;
+ char lbuf[BUFSIZ], rbuf[BUFSIZ];
+ size_t llen, rlen;
u_char scolour;
u_int slines;
@@ -38,8 +42,21 @@ status_write_client(struct client *c)
if (slines == 0 || c->sy <= slines)
return;
+ if (clock_gettime(CLOCK_REALTIME, &c->status_ts) != 0)
+ fatal("clock_gettime");
+
+ left = options_get_string(&c->session->options, "status-left");
+ strftime(lbuf, sizeof lbuf, left, localtime(&(c->status_ts.tv_sec)));
+ llen = strlen(lbuf) + 1;
+ right = options_get_string(&c->session->options, "status-right");
+ strftime(rbuf, sizeof rbuf, right, localtime(&(c->status_ts.tv_sec)));
+ rlen = strlen(rbuf) + 1;
+
+ c->status_ts.tv_sec +=
+ options_get_number(&c->session->options, "status-interval");
+
screen_redraw_start_client(&ctx, c);
- screen_redraw_move_cursor(&ctx, 0, c->sy - slines);
+ screen_redraw_move_cursor(&ctx, llen, c->sy - slines);
screen_redraw_set_attributes(&ctx, 0, scolour);
RB_FOREACH(wl, winlinks, &c->session->windows) {
@@ -53,14 +70,21 @@ status_write_client(struct client *c)
screen_redraw_write_string(
&ctx, "%d:%s%c ", wl->idx, wl->window->name, flag);
- if (ctx.s->cx > screen_last_x(ctx.s))
+ if (ctx.s->cx > screen_size_x(ctx.s) - rlen)
break;
}
- while (ctx.s->cx < screen_size_x(ctx.s)) {
+ while (ctx.s->cx < screen_size_x(ctx.s) - rlen) {
ctx.write(ctx.data, TTY_CHARACTER, ' ');
ctx.s->cx++;
}
+ screen_redraw_move_cursor(&ctx, 0, c->sy - slines);
+ screen_redraw_write_string(&ctx, "%s ", lbuf);
+
+ screen_redraw_move_cursor(
+ &ctx, screen_size_x(ctx.s) - rlen, c->sy - slines);
+ screen_redraw_write_string(&ctx, " %s", rbuf);
+
screen_redraw_stop(&ctx);
}
diff --git a/tmux.c b/tmux.c
index 8a8ebcdf..6efa87cd 100644
--- a/tmux.c
+++ b/tmux.c
@@ -1,4 +1,4 @@
-/* $Id: tmux.c,v 1.51 2008-06-03 21:42:37 nicm Exp $ */
+/* $Id: tmux.c,v 1.52 2008-06-04 05:40:35 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -204,6 +204,10 @@ main(int argc, char **argv)
options_set_number(&global_options, "bell-action", BELL_ANY);
options_set_number(&global_options, "history-limit", 2000);
options_set_number(&global_options, "prefix-key", META);
+ options_set_string(&global_options, "status-left", "");
+ options_set_string(
+ &global_options, "status-right", "%%H:%%M %%d-%%b-%%y");
+ options_set_number(&global_options, "status-interval", 15);
paste_buffer = NULL;
diff --git a/tmux.h b/tmux.h
index 6a212fc4..1e6c5759 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1,4 +1,4 @@
-/* $Id: tmux.h,v 1.125 2008-06-03 21:42:37 nicm Exp $ */
+/* $Id: tmux.h,v 1.126 2008-06-04 05:40:35 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -619,6 +619,7 @@ struct client {
struct buffer *out;
struct tty tty;
+ struct timespec status_ts;
u_int sx;
u_int sy;