Merge remote-tracking branch 'refs/remotes/tmux-openbsd/master'

* refs/remotes/tmux-openbsd/master:
  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:
Thomas Adam
2026-07-14 21:20:22 +01:00
22 changed files with 1331 additions and 540 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>
@@ -1507,18 +1507,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)
@@ -1534,7 +1537,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;
@@ -1545,8 +1553,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);
}
@@ -2695,8 +2703,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)