diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2008-06-19 18:27:55 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2008-06-19 18:27:55 +0000 |
commit | 9ef5bdc7c058854f902dd42f79b6b7454331a98e (patch) | |
tree | 6a51725cd572de82098ea450422b5510a938e169 /server-fn.c | |
parent | 99df48d70f10dcf8f95d4684262a3392d72ee9c6 (diff) | |
download | rtmux-9ef5bdc7c058854f902dd42f79b6b7454331a98e.tar.gz rtmux-9ef5bdc7c058854f902dd42f79b6b7454331a98e.tar.bz2 rtmux-9ef5bdc7c058854f902dd42f79b6b7454331a98e.zip |
Show status messages without blocking the server.
Diffstat (limited to 'server-fn.c')
-rw-r--r-- | server-fn.c | 66 |
1 files changed, 29 insertions, 37 deletions
diff --git a/server-fn.c b/server-fn.c index 8547fbf7..9893d409 100644 --- a/server-fn.c +++ b/server-fn.c @@ -1,4 +1,4 @@ -/* $Id: server-fn.c,v 1.42 2008-06-16 17:35:40 nicm Exp $ */ +/* $Id: server-fn.c,v 1.43 2008-06-19 18:27:55 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -24,6 +24,31 @@ #include "tmux.h" void +server_set_client_message(struct client *c, const char *msg) +{ + struct timespec ts = { 0, 750000000L }; + + c->message_string = xstrdup(msg); + if (clock_gettime(CLOCK_REALTIME, &c->message_timer) != 0) + fatal("clock_gettime"); + timespecadd(&c->message_timer, &ts, &c->message_timer); + + c->flags |= CLIENT_STATUS; +} + +void +server_clear_client_message(struct client *c) +{ + if (c->message_string == NULL) + return; + + xfree(c->message_string); + c->message_string = NULL; + + c->flags |= CLIENT_STATUS; +} + +void server_write_client( struct client *c, enum hdrtype type, const void *buf, size_t len) { @@ -150,47 +175,14 @@ server_status_window(struct window *w) void printflike2 server_write_message(struct client *c, const char *fmt, ...) { - struct screen_redraw_ctx ctx; - va_list ap; - char *msg; - size_t size; - u_int slines; - - slines = options_get_number(&c->session->options, "status-lines"); - - screen_redraw_start_client(&ctx, c); + va_list ap; + char *msg; va_start(ap, fmt); xvasprintf(&msg, fmt, ap); va_end(ap); - msg = xrealloc(msg, 1, c->sx + 1); - msg[c->sx] = '\0'; - - size = strlen(msg); - if (size < c->sx) - memset(msg + size, ' ', c->sx - size); - - screen_redraw_move_cursor(&ctx, 0, c->sy - 1); - screen_redraw_set_attributes(&ctx, ATTR_REVERSE, 0x88); - screen_redraw_write_string(&ctx, "%s", msg); - - buffer_flush(c->tty.fd, c->tty.in, c->tty.out); - usleep(750000); - - memset(msg, ' ', c->sx); - - screen_redraw_move_cursor(&ctx, 0, c->sy - 1); - screen_redraw_set_attributes(&ctx, 0, 0x88); - screen_redraw_write_string(&ctx, "%s", msg); + server_set_client_message(c, msg); xfree(msg); - - if (slines == 0) { - screen_redraw_lines(&ctx, c->sy - 1, 1); - screen_redraw_stop(&ctx); - } else { - screen_redraw_stop(&ctx); - server_status_client(c); - } } |