=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window.c,v retrieving revision 1.285 retrieving revision 1.286 diff -c -r1.285 -r1.286 *** src/usr.bin/tmux/window.c 2023/03/27 08:47:57 1.285 --- src/usr.bin/tmux/window.c 2023/07/10 09:24:53 1.286 *************** *** 1,4 **** ! /* $OpenBSD: window.c,v 1.285 2023/03/27 08:47:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window.c,v 1.286 2023/07/10 09:24:53 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 248,268 **** winlink_stack_remove(stack, wl); TAILQ_INSERT_HEAD(stack, wl, sentry); } void winlink_stack_remove(struct winlink_stack *stack, struct winlink *wl) { ! struct winlink *wl2; ! ! if (wl == NULL) ! return; ! ! TAILQ_FOREACH(wl2, stack, sentry) { ! if (wl2 == wl) { ! TAILQ_REMOVE(stack, wl, sentry); ! return; ! } } } --- 248,262 ---- winlink_stack_remove(stack, wl); TAILQ_INSERT_HEAD(stack, wl, sentry); + wl->flags |= WINLINK_VISITED; } void winlink_stack_remove(struct winlink_stack *stack, struct winlink *wl) { ! if (wl != NULL && (wl->flags & WINLINK_VISITED)) { ! TAILQ_REMOVE(stack, wl, sentry); ! wl->flags &= ~WINLINK_VISITED; } } *************** *** 312,317 **** --- 306,312 ---- w->flags = 0; TAILQ_INIT(&w->panes); + TAILQ_INIT(&w->last_panes); w->active = NULL; w->lastlayout = -1; *************** *** 512,529 **** int window_set_active_pane(struct window *w, struct window_pane *wp, int notify) { log_debug("%s: pane %%%u", __func__, wp->id); if (wp == w->active) return (0); ! w->last = w->active; w->active = wp; w->active->active_point = next_active_point++; w->active->flags |= PANE_CHANGED; if (options_get_number(global_options, "focus-events")) { ! window_pane_update_focus(w->last); window_pane_update_focus(w->active); } --- 507,529 ---- int window_set_active_pane(struct window *w, struct window_pane *wp, int notify) { + struct window_pane *lastwp; + log_debug("%s: pane %%%u", __func__, wp->id); if (wp == w->active) return (0); ! lastwp = w->active; + window_pane_stack_remove(&w->last_panes, wp); + window_pane_stack_push(&w->last_panes, lastwp); + w->active = wp; w->active->active_point = next_active_point++; w->active->flags |= PANE_CHANGED; if (options_get_number(global_options, "focus-events")) { ! window_pane_update_focus(lastwp); window_pane_update_focus(w->active); } *************** *** 746,766 **** if (wp == marked_pane.wp) server_clear_marked(); if (wp == w->active) { ! w->active = w->last; ! w->last = NULL; if (w->active == NULL) { w->active = TAILQ_PREV(wp, window_panes, entry); if (w->active == NULL) w->active = TAILQ_NEXT(wp, entry); } if (w->active != NULL) { w->active->flags |= PANE_CHANGED; notify_window("window-pane-changed", w); window_update_focus(w); } ! } else if (wp == w->last) ! w->last = NULL; } void --- 746,766 ---- if (wp == marked_pane.wp) server_clear_marked(); + window_pane_stack_remove(&w->last_panes, wp); if (wp == w->active) { ! w->active = TAILQ_FIRST(&w->last_panes); if (w->active == NULL) { w->active = TAILQ_PREV(wp, window_panes, entry); if (w->active == NULL) w->active = TAILQ_NEXT(wp, entry); } if (w->active != NULL) { + window_pane_stack_remove(&w->last_panes, w->active); w->active->flags |= PANE_CHANGED; notify_window("window-pane-changed", w); window_update_focus(w); } ! } } void *************** *** 844,849 **** --- 844,854 ---- { struct window_pane *wp; + while (!TAILQ_EMPTY(&w->last_panes)) { + wp = TAILQ_FIRST(&w->last_panes); + window_pane_stack_remove(&w->last_panes, wp); + } + while (!TAILQ_EMPTY(&w->panes)) { wp = TAILQ_FIRST(&w->panes); TAILQ_REMOVE(&w->panes, wp, entry); *************** *** 1476,1481 **** --- 1481,1505 ---- best = window_pane_choose_best(list, size); free(list); return (best); + } + + void + window_pane_stack_push(struct window_panes *stack, struct window_pane *wp) + { + if (wp != NULL) { + window_pane_stack_remove(stack, wp); + TAILQ_INSERT_HEAD(stack, wp, sentry); + wp->flags |= PANE_VISITED; + } + } + + void + window_pane_stack_remove(struct window_panes *stack, struct window_pane *wp) + { + if (wp != NULL && (wp->flags & PANE_VISITED)) { + TAILQ_REMOVE(stack, wp, sentry); + wp->flags &= ~PANE_VISITED; + } } /* Clear alert flags for a winlink */