From 811e75da52a0b504db4221df4504d3594ba3cb8b Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 4 Jun 2008 05:40:35 +0000 Subject: [PATCH] Status bar left and right strings (set with status-left and status-right), and automatic update (at interval set by status-interval). --- CHANGES | 11 ++++++++++- cmd-set-option.c | 14 +++++++++++++- server.c | 14 ++++++++++++-- status.c | 34 +++++++++++++++++++++++++++++----- tmux.c | 6 +++++- tmux.h | 3 ++- 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 @@ -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 @@ -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 @@ -17,8 +17,10 @@ */ #include +#include #include +#include #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 @@ -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 @@ -619,6 +619,7 @@ struct client { struct buffer *out; struct tty tty; + struct timespec status_ts; u_int sx; u_int sy;