diff options
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/tmux/server-window.c | 29 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.h | 5 |
2 files changed, 31 insertions, 3 deletions
diff --git a/usr.bin/tmux/server-window.c b/usr.bin/tmux/server-window.c index 8184b0fb3ad..29d6641c9fc 100644 --- a/usr.bin/tmux/server-window.c +++ b/usr.bin/tmux/server-window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-window.c,v 1.2 2009/10/27 13:03:33 nicm Exp $ */ +/* $OpenBSD: server-window.c,v 1.3 2009/10/28 22:53:14 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> @@ -22,6 +22,7 @@ #include "tmux.h" +int server_window_backoff(struct window_pane *); int server_window_check_bell(struct session *, struct window *); int server_window_check_activity(struct session *, struct window *); int server_window_check_content( @@ -44,7 +45,9 @@ server_window_prepare(void) TAILQ_FOREACH(wp, &w->panes, entry) { if (wp->fd == -1) continue; - events = POLLIN; + events = 0; + if (!server_window_backoff(wp)) + events |= POLLIN; if (BUFFER_USED(wp->out) > 0) events |= POLLOUT; server_poll_add( @@ -61,6 +64,28 @@ server_window_prepare(void) } } +/* Check if this window should suspend reading. */ +int +server_window_backoff(struct window_pane *wp) +{ + struct client *c; + u_int i; + + if (!window_pane_visible(wp)) + return (0); + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session == NULL) + continue; + if (c->session->curw->window != wp->window) + continue; + if (BUFFER_USED(c->tty.out) > BACKOFF_THRESHOLD) + return (1); + } + return (0); +} + /* Process a single window pane event. */ void server_window_callback(int fd, int events, void *data) diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index f8b7778a6f9..a7ea4455666 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.151 2009/10/27 13:03:33 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.152 2009/10/28 22:53:14 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -65,6 +65,9 @@ extern char **environ; /* Maximum poll timeout (when attached). */ #define POLL_TIMEOUT 50 +/* Maximum data to buffer for output before suspending reading from panes. */ +#define BACKOFF_THRESHOLD 1024 + /* * Maximum sizes of strings in message data. Don't forget to bump * PROTOCOL_VERSION if any of these change! |