Merge branch 'floating_panes' into floating_panes_staging

This commit is contained in:
Nicholas Marriott
2026-05-27 16:54:17 +01:00
5 changed files with 101 additions and 90 deletions

View File

@@ -616,8 +616,10 @@ screen_redraw_make_pane_status(struct client *c, struct window_pane *wp,
else
width = wp->sx + sb_w - 2;
max_width = (int)w->sx - (wp->xoff + 2) - sb_w;
if (max_width < 0) max_width = 0;
if (width > (u_int)max_width) width = (u_int)max_width;
if (max_width < 0)
max_width = 0;
if (width > (u_int)max_width)
width = (u_int)max_width;
wp->status_size = width;
memcpy(&old, &wp->status_screen, sizeof old);
@@ -866,40 +868,40 @@ screen_redraw_pane(struct client *c, struct window_pane *wp,
}
/* Get border cell style. */
static const struct grid_cell *
static void
screen_redraw_draw_borders_style(struct screen_redraw_ctx *ctx, u_int x,
u_int y, struct window_pane *wp)
u_int y, struct window_pane *wp, struct grid_cell *ngc)
{
struct client *c = ctx->c;
struct session *s = c->session;
struct window *w = s->curw->window;
struct window_pane *active = server_client_get_pane(c);
struct options *wo = w->options;
const char *border_opt;
struct grid_cell *gc;
const char *border_option;
struct format_tree *ft;
int *flag;
if (wp->border_gc_set)
return (&wp->border_gc);
wp->border_gc_set = 1;
if (screen_redraw_check_is(ctx, x, y, active)) {
flag = &wp->active_border_gc_set;
gc = &wp->active_border_gc;
border_option = "pane-active-border-style";
} else {
flag = &wp->border_gc_set;
gc = &wp->border_gc;
border_option = "pane-border-style";
}
if (!*flag) {
ft = format_create_defaults(NULL, c, s, s->curw, wp);
border_opt = screen_redraw_check_is(ctx, x, y, active) ?
"pane-active-border-style" : "pane-border-style";
/* Window-level baseline. */
style_apply(&wp->border_gc, wo, border_opt, ft);
/* Floating pane window default overrides window baseline. */
if (wp->flags & PANE_FLOATING)
style_add(&wp->border_gc, wo, "floating-pane-border-style", ft);
/* Per-pane override (set via new-pane -S or set-option -p). */
if (options_get_only(wp->options, border_opt) != NULL)
style_add(&wp->border_gc, wp->options, border_opt, ft);
style_apply(gc, w->options, border_option, ft);
if (options_get_only(wp->options, border_option) != NULL)
style_add(gc, wp->options, border_option, ft);
format_free(ft);
return (&wp->border_gc);
*flag = 1;
}
memcpy(ngc, gc, sizeof *ngc);
}
/* Draw arrow indicator if enabled. */
@@ -987,7 +989,6 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j)
struct format_tree *ft;
struct window_pane *wp, *active = server_client_get_pane(c);
struct grid_cell gc;
const struct grid_cell *tmp;
u_int cell_type;
u_int x = ctx->ox + i, y = ctx->oy + j;
int isolates;
@@ -1014,11 +1015,7 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j)
}
memcpy(&gc, &ctx->no_pane_gc, sizeof gc);
} else {
tmp = screen_redraw_draw_borders_style(ctx, x, y, wp);
if (tmp == NULL)
return;
memcpy(&gc, tmp, sizeof gc);
screen_redraw_draw_borders_style(ctx, x, y, wp, &gc);
if (server_is_marked(s, s->curw, marked_pane.wp) &&
screen_redraw_check_is(ctx, x, y, marked_pane.wp))
gc.attr ^= GRID_ATTR_REVERSE;
@@ -1058,8 +1055,10 @@ screen_redraw_draw_borders(struct screen_redraw_ctx *ctx)
log_debug("%s: %s @%u", __func__, c->name, w->id);
TAILQ_FOREACH(wp, &w->panes, entry)
TAILQ_FOREACH(wp, &w->panes, entry) {
wp->border_gc_set = 0;
wp->active_border_gc_set = 0;
}
for (j = 0; j < c->tty.sy - ctx->statuslines; j++) {
for (i = 0; i < c->tty.sx; i++)
@@ -1155,6 +1154,10 @@ screen_redraw_get_visible_ranges(struct window_pane *base_wp, u_int px,
return (&sr);
}
w = base_wp->window;
if (px + width > w->sx)
width = w->sx - px;
if (r == NULL) {
/* Start with the entire width of the range. */
server_client_ensure_ranges(&base_wp->r, 1);
@@ -1164,7 +1167,6 @@ screen_redraw_get_visible_ranges(struct window_pane *base_wp, u_int px,
r->used = 1;
}
w = base_wp->window;
sb = options_get_number(w->options, "pane-scrollbars");
sb_pos = options_get_number(w->options, "pane-scrollbars-position");
@@ -1401,7 +1403,7 @@ screen_redraw_draw_pane_scrollbar(struct screen_redraw_ctx *ctx,
int sb_w = wp->scrollbar_style.width;
int sb_pad = wp->scrollbar_style.pad;
int cm_y, cm_size, xoff = wp->xoff;
int sb_x, sb_y = (int)(wp->yoff); /* sb top */
int sb_x, sb_y = (int)wp->yoff; /* sb top */
if (window_pane_mode(wp) == WINDOW_PANE_NO_MODE) {
if (sb == PANE_SCROLLBARS_MODAL)

View File

@@ -182,7 +182,6 @@ screen_write_pane_is_obscured(struct screen_write_ctx *ctx)
if (ctx->wp == NULL)
return (0);
if (ctx->flags & SCREEN_WRITE_CHECKED_IF_OBSCURED) {
if (ctx->flags & SCREEN_WRITE_OBSCURED)
return (1);
@@ -190,6 +189,14 @@ screen_write_pane_is_obscured(struct screen_write_ctx *ctx)
}
ctx->flags |= SCREEN_WRITE_CHECKED_IF_OBSCURED;
if (ctx->wp->xoff < 0 ||
ctx->wp->yoff < 0 ||
ctx->wp->xoff + ctx->wp->sx >= ctx->wp->window->sx ||
ctx->wp->yoff + ctx->wp->sy >= ctx->wp->window->sy) {
ctx->flags |= SCREEN_WRITE_OBSCURED;
return (1);
}
while ((wp = TAILQ_PREV(wp, window_panes, zentry)) != NULL) {
if ((wp->flags & PANE_FLOATING) &&
((wp->yoff >= ctx->wp->yoff &&

2
tmux.h
View File

@@ -1331,6 +1331,8 @@ struct window_pane {
int border_gc_set;
struct grid_cell border_gc;
int active_border_gc_set;
struct grid_cell active_border_gc;
int control_bg;
int control_fg;

View File

@@ -2102,7 +2102,7 @@ window_pane_tiled_geometry(struct window *w, struct window_pane *wp,
} else if (args_has(args, 'p')) {
size = args_strtonum_and_expand(args, 'p', 0, 100, item,
cause);
if (cause == NULL)
if (*cause == NULL)
size = curval * size / 100;
}
if (*cause != NULL)