Alerts are too slow, so rather than walking all sessions and windows,

add a link of winlinks to each window and a pointer to the session to
each winlink. Also rewrite the alerts processing to return to the old
behaviour (alert in any window sets the flag on any winlink).
This commit is contained in:
nicm
2016-10-19 09:22:07 +00:00
parent bc27451e15
commit 899e629bf0
5 changed files with 179 additions and 133 deletions

8
tmux.h
View File

@@ -889,12 +889,16 @@ struct window {
#define WINDOW_STYLECHANGED 0x8000
#define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE)
int alerts_queued;
TAILQ_ENTRY(window) alerts_entry;
struct options *options;
struct grid_cell style;
struct grid_cell active_style;
u_int references;
TAILQ_HEAD(, winlink) winlinks;
RB_ENTRY(window) entry;
};
@@ -903,6 +907,7 @@ RB_HEAD(windows, window);
/* Entry on local window list. */
struct winlink {
int idx;
struct session *session;
struct window *window;
size_t status_width;
@@ -916,6 +921,7 @@ struct winlink {
#define WINLINK_ALERTFLAGS (WINLINK_BELL|WINLINK_ACTIVITY|WINLINK_SILENCE)
RB_ENTRY(winlink) entry;
TAILQ_ENTRY(winlink) wentry;
TAILQ_ENTRY(winlink) sentry;
};
RB_HEAD(winlinks, winlink);
@@ -990,6 +996,7 @@ struct session {
#define SESSION_UNATTACHED 0x1 /* not attached to any clients */
#define SESSION_PASTING 0x2
#define SESSION_ALERTED 0x4
int flags;
u_int attached;
@@ -2069,7 +2076,6 @@ struct window *window_create(u_int, u_int);
struct window *window_create_spawn(const char *, int, char **, const char *,
const char *, const char *, struct environ *,
struct termios *, u_int, u_int, u_int, char **);
void window_destroy(struct window *);
struct window_pane *window_get_active_at(struct window *, u_int, u_int);
struct window_pane *window_find_string(struct window *, const char *);
int window_has_pane(struct window *, struct window_pane *);