Clear flags across all sessions, from Thomas Adam.

This commit is contained in:
Nicholas Marriott 2012-07-08 07:27:32 +00:00
parent 67b926cf3c
commit 63f5c38023
4 changed files with 41 additions and 7 deletions

View File

@ -56,9 +56,6 @@ server_window_loop(void)
server_status_session(s); server_status_session(s);
TAILQ_FOREACH(wp, &w->panes, entry) TAILQ_FOREACH(wp, &w->panes, entry)
server_window_check_content(s, wl, wp); server_window_check_content(s, wl, wp);
if (!(s->flags & SESSION_UNATTACHED))
w->flags &= ~(WINDOW_BELL|WINDOW_ACTIVITY);
} }
} }
} }
@ -78,6 +75,8 @@ server_window_check_bell(struct session *s, struct winlink *wl)
wl->flags |= WINLINK_BELL; wl->flags |= WINLINK_BELL;
if (s->flags & SESSION_UNATTACHED) if (s->flags & SESSION_UNATTACHED)
return (1); return (1);
if (s->curw->window == wl->window)
w->flags &= ~WINDOW_BELL;
visual = options_get_number(&s->options, "visual-bell"); visual = options_get_number(&s->options, "visual-bell");
action = options_get_number(&s->options, "bell-action"); action = options_get_number(&s->options, "bell-action");
@ -108,6 +107,9 @@ server_window_check_activity(struct session *s, struct winlink *wl)
struct window *w = wl->window; struct window *w = wl->window;
u_int i; u_int i;
if (s->curw->window == wl->window)
w->flags &= ~WINDOW_ACTIVITY;
if (!(w->flags & WINDOW_ACTIVITY) || wl->flags & WINLINK_ACTIVITY) if (!(w->flags & WINDOW_ACTIVITY) || wl->flags & WINLINK_ACTIVITY)
return (0); return (0);
if (s->curw == wl && !(s->flags & SESSION_UNATTACHED)) if (s->curw == wl && !(s->flags & SESSION_UNATTACHED))
@ -196,6 +198,9 @@ server_window_check_content(
char *found, *ptr; char *found, *ptr;
/* Activity flag must be set for new content. */ /* Activity flag must be set for new content. */
if (s->curw->window == w)
w->flags &= ~WINDOW_ACTIVITY;
if (!(w->flags & WINDOW_ACTIVITY) || wl->flags & WINLINK_CONTENT) if (!(w->flags & WINDOW_ACTIVITY) || wl->flags & WINLINK_CONTENT)
return (0); return (0);
if (s->curw == wl && !(s->flags & SESSION_UNATTACHED)) if (s->curw == wl && !(s->flags & SESSION_UNATTACHED))

View File

@ -353,7 +353,7 @@ session_next(struct session *s, int alert)
winlink_stack_remove(&s->lastw, wl); winlink_stack_remove(&s->lastw, wl);
winlink_stack_push(&s->lastw, s->curw); winlink_stack_push(&s->lastw, s->curw);
s->curw = wl; s->curw = wl;
wl->flags &= ~WINLINK_ALERTFLAGS; winlink_clear_flags(wl);
return (0); return (0);
} }
@ -390,7 +390,7 @@ session_previous(struct session *s, int alert)
winlink_stack_remove(&s->lastw, wl); winlink_stack_remove(&s->lastw, wl);
winlink_stack_push(&s->lastw, s->curw); winlink_stack_push(&s->lastw, s->curw);
s->curw = wl; s->curw = wl;
wl->flags &= ~WINLINK_ALERTFLAGS; winlink_clear_flags(wl);
return (0); return (0);
} }
@ -408,7 +408,7 @@ session_select(struct session *s, int idx)
winlink_stack_remove(&s->lastw, wl); winlink_stack_remove(&s->lastw, wl);
winlink_stack_push(&s->lastw, s->curw); winlink_stack_push(&s->lastw, s->curw);
s->curw = wl; s->curw = wl;
wl->flags &= ~WINLINK_ALERTFLAGS; winlink_clear_flags(wl);
return (0); return (0);
} }
@ -427,7 +427,7 @@ session_last(struct session *s)
winlink_stack_remove(&s->lastw, wl); winlink_stack_remove(&s->lastw, wl);
winlink_stack_push(&s->lastw, s->curw); winlink_stack_push(&s->lastw, s->curw);
s->curw = wl; s->curw = wl;
wl->flags &= ~WINLINK_ALERTFLAGS; winlink_clear_flags(wl);
return (0); return (0);
} }

1
tmux.h
View File

@ -2076,6 +2076,7 @@ struct window_pane *window_pane_find_down(struct window_pane *);
struct window_pane *window_pane_find_left(struct window_pane *); struct window_pane *window_pane_find_left(struct window_pane *);
struct window_pane *window_pane_find_right(struct window_pane *); struct window_pane *window_pane_find_right(struct window_pane *);
void window_set_name(struct window *, const char *); void window_set_name(struct window *, const char *);
void winlink_clear_flags(struct winlink *);
/* layout.c */ /* layout.c */
u_int layout_count_cells(struct layout_cell *); u_int layout_count_cells(struct layout_cell *);

View File

@ -1164,3 +1164,31 @@ window_pane_find_right(struct window_pane *wp)
} }
return (NULL); return (NULL);
} }
/* Clear alert flags for a winlink */
void
winlink_clear_flags(struct winlink *wl)
{
struct winlink *wm;
struct session *s;
struct window *w;
u_int i;
for (i = 0; i < ARRAY_LENGTH(&windows); i++) {
if ((w = ARRAY_ITEM(&windows, i)) == NULL)
continue;
RB_FOREACH(s, sessions, &sessions) {
if ((wm = session_has(s, w)) == NULL)
continue;
if (wm->window != wl->window)
continue;
if ((wm->flags & WINLINK_ALERTFLAGS) == 0)
continue;
wm->flags &= ~WINLINK_ALERTFLAGS;
server_status_session(s);
}
}
}