diff --git a/format.c b/format.c index d9da0fd7..221550a1 100644 --- a/format.c +++ b/format.c @@ -2494,9 +2494,20 @@ format_cb_window_last_flag(struct format_tree *ft) static void * format_cb_window_linked(struct format_tree *ft) { + struct winlink *wl; + struct session *s; + int found = 0; + if (ft->wl != NULL) { - if (session_is_linked(ft->wl->session, ft->wl->window)) - return (xstrdup("1")); + RB_FOREACH(s, sessions, &sessions) { + RB_FOREACH(wl, winlinks, &s->windows) { + if (wl->window == ft->wl->window) { + if (found) + return (xstrdup("1")); + found = 1; + } + } + } return (xstrdup("0")); } return (NULL); @@ -2506,9 +2517,27 @@ format_cb_window_linked(struct format_tree *ft) static void * format_cb_window_linked_sessions(struct format_tree *ft) { - if (ft->wl != NULL) - return (format_printf("%u", ft->wl->window->references)); - return (NULL); + struct window *w; + struct session_group *sg; + struct session *s; + u_int n = 0; + + if (ft->wl == NULL) + return (NULL); + w = ft->wl->window; + + RB_FOREACH(sg, session_groups, &session_groups) { + s = TAILQ_FIRST(&sg->sessions); + if (winlink_find_by_window(&s->windows, w) != NULL) + n++; + } + RB_FOREACH(s, sessions, &sessions) { + if (session_group_contains(s) != NULL) + continue; + if (winlink_find_by_window(&s->windows, w) != NULL) + n++; + } + return (format_printf("%u", n)); } /* Callback for window_marked_flag. */ diff --git a/popup.c b/popup.c index 97f532c0..fe34f2c0 100644 --- a/popup.c +++ b/popup.c @@ -691,6 +691,7 @@ popup_display(int flags, enum box_lines lines, struct cmdq_item *item, u_int px, pd->border_cell.attr = 0; screen_init(&pd->s, jx, jy, 0); + screen_set_default_cursor(&pd->s, global_w_options); colour_palette_init(&pd->palette); colour_palette_from_option(&pd->palette, global_w_options); diff --git a/session.c b/session.c index 0d79c82b..e4aca34d 100644 --- a/session.c +++ b/session.c @@ -31,12 +31,9 @@ u_int next_session_id; struct session_groups session_groups = RB_INITIALIZER(&session_groups); static void session_free(int, short, void *); - static void session_lock_timer(int, short, void *); - static struct winlink *session_next_alert(struct winlink *); static struct winlink *session_previous_alert(struct winlink *); - static void session_group_remove(struct session *); static void session_group_synchronize1(struct session *, struct session *); @@ -47,12 +44,12 @@ session_cmp(struct session *s1, struct session *s2) } RB_GENERATE(sessions, session, entry, session_cmp); -static int +int session_group_cmp(struct session_group *s1, struct session_group *s2) { return (strcmp(s1->name, s2->name)); } -RB_GENERATE_STATIC(session_groups, session_group, entry, session_group_cmp); +RB_GENERATE(session_groups, session_group, entry, session_group_cmp); /* * Find if session is still alive. This is true if it is still on the global diff --git a/tmux.h b/tmux.h index 02e11308..2b837a3c 100644 --- a/tmux.h +++ b/tmux.h @@ -3397,9 +3397,12 @@ void control_notify_paste_buffer_deleted(const char *); /* session.c */ extern struct sessions sessions; +extern struct session_groups session_groups; extern u_int next_session_id; int session_cmp(struct session *, struct session *); RB_PROTOTYPE(sessions, session, entry, session_cmp); +int session_group_cmp(struct session_group *, struct session_group *s2); +RB_PROTOTYPE(session_groups, session_group, entry, session_group_cmp); int session_alive(struct session *); struct session *session_find(const char *); struct session *session_find_by_id_str(const char *);