Convert display-panes away from an overlay and into a mode. This is

another step on the road of getting rid of overlays altogether (they are
full of special cases; popups and menus are to go also eventually). We
lose some of the styling of borders but gain the ability to run
display-panes in another pane (perhaps not hugely useful but one never
knows). The -b flag goes away as no longer useful.
This commit is contained in:
nicm
2026-07-14 17:17:17 +00:00
committed by tmux update bot
parent 34a11db6ca
commit 1a02c9957c
22 changed files with 1333 additions and 542 deletions

View File

@@ -1,4 +1,4 @@
/* $OpenBSD: window.c,v 1.361 2026/07/13 13:01:14 nicm Exp $ */
/* $OpenBSD: window.c,v 1.362 2026/07/14 17:17:18 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1496,18 +1496,21 @@ window_pane_resize(struct window_pane *wp, u_int sx, u_int sy)
int
window_pane_set_mode(struct window_pane *wp, struct window_pane *swp,
const struct window_mode *mode, struct cmd_find_state *fs,
struct args *args)
const struct window_mode *mode, struct cmdq_item *item,
struct cmd_find_state *fs, struct args *args)
{
struct window_mode_entry *wme;
struct window *w = wp->window;
const char *name = mode->name, *p = NULL;
const char *name = mode->name, *oname = NULL;
if (!TAILQ_EMPTY(&wp->modes)) {
if (TAILQ_FIRST(&wp->modes)->mode == mode)
return (1);
p = TAILQ_FIRST(&wp->modes)->mode->name;
if (TAILQ_FIRST(&wp->modes)->mode->flags & WINDOW_MODE_NO_STACK)
window_pane_reset_mode(wp);
}
if (!TAILQ_EMPTY(&wp->modes))
oname = TAILQ_FIRST(&wp->modes)->mode->name;
TAILQ_FOREACH(wme, &wp->modes, entry) {
if (wme->mode == mode)
@@ -1523,7 +1526,12 @@ window_pane_set_mode(struct window_pane *wp, struct window_pane *swp,
wme->mode = mode;
wme->prefix = 1;
TAILQ_INSERT_HEAD(&wp->modes, wme, entry);
wme->screen = wme->mode->init(wme, fs, args);
wme->screen = wme->mode->init(wme, item, fs, args);
if (wme->screen == NULL) {
TAILQ_REMOVE(&wp->modes, wme, entry);
free(wme);
return (1);
}
}
wme->kill = args != NULL ? args_has(args, 'k') : 0;
wp->screen = wme->screen;
@@ -1534,8 +1542,8 @@ window_pane_set_mode(struct window_pane *wp, struct window_pane *swp,
server_redraw_window_borders(wp->window);
server_status_window(wp->window);
window_fire_pane_mode_changed("pane-mode-entered", wp, p, name, 1);
window_fire_pane_mode_changed("pane-mode-changed", wp, p, name, 1);
window_fire_pane_mode_changed("pane-mode-entered", wp, oname, name, 1);
window_fire_pane_mode_changed("pane-mode-changed", wp, oname, name, 1);
return (0);
}
@@ -2684,8 +2692,15 @@ window_get_pane_status(struct window *w)
int
window_pane_get_pane_status(struct window_pane *wp)
{
struct window_mode_entry *wme;
int status;
wme = TAILQ_FIRST(&wp->modes);
if (wme != NULL &&
(wme->mode->flags & WINDOW_MODE_HIDE_PANE_STATUS) &&
(wp->flags & PANE_ZOOMED))
return (PANE_STATUS_OFF);
if (!window_pane_is_floating(wp))
return (window_get_pane_status(wp->window));
if (window_pane_get_pane_lines(wp) == PANE_LINES_NONE)