Merge branch 'floating_panes' into floating_panes_staging

This commit is contained in:
Nicholas Marriott
2026-05-22 12:39:38 +01:00
3 changed files with 48 additions and 36 deletions

View File

@@ -1170,7 +1170,7 @@ screen_write_insertcharacter(struct screen_write_ctx *ctx, u_int nx, u_int bg)
grid_view_insert_cells(s->grid, s->cx, s->cy, nx, bg); grid_view_insert_cells(s->grid, s->cx, s->cy, nx, bg);
screen_write_collect_flush(ctx, 0, __func__); screen_write_collect_flush(ctx, 0, __func__);
ttyctx.num = nx; ttyctx.n = nx;
tty_write(tty_cmd_insertcharacter, &ttyctx); tty_write(tty_cmd_insertcharacter, &ttyctx);
} }
@@ -1203,7 +1203,7 @@ screen_write_deletecharacter(struct screen_write_ctx *ctx, u_int nx, u_int bg)
grid_view_delete_cells(s->grid, s->cx, s->cy, nx, bg); grid_view_delete_cells(s->grid, s->cx, s->cy, nx, bg);
screen_write_collect_flush(ctx, 0, __func__); screen_write_collect_flush(ctx, 0, __func__);
ttyctx.num = nx; ttyctx.n = nx;
tty_write(tty_cmd_deletecharacter, &ttyctx); tty_write(tty_cmd_deletecharacter, &ttyctx);
} }
@@ -1236,7 +1236,7 @@ screen_write_clearcharacter(struct screen_write_ctx *ctx, u_int nx, u_int bg)
grid_view_clear(s->grid, s->cx, s->cy, nx, 1, bg); grid_view_clear(s->grid, s->cx, s->cy, nx, 1, bg);
screen_write_collect_flush(ctx, 0, __func__); screen_write_collect_flush(ctx, 0, __func__);
ttyctx.num = nx; ttyctx.n = nx;
tty_write(tty_cmd_clearcharacter, &ttyctx); tty_write(tty_cmd_clearcharacter, &ttyctx);
} }
@@ -1272,7 +1272,7 @@ screen_write_insertline(struct screen_write_ctx *ctx, u_int ny, u_int bg)
grid_view_insert_lines(gd, s->cy, ny, bg); grid_view_insert_lines(gd, s->cy, ny, bg);
screen_write_collect_flush(ctx, 0, __func__); screen_write_collect_flush(ctx, 0, __func__);
ttyctx.num = ny; ttyctx.n = ny;
tty_write(tty_cmd_insertline, &ttyctx); tty_write(tty_cmd_insertline, &ttyctx);
return; return;
} }
@@ -1292,7 +1292,7 @@ screen_write_insertline(struct screen_write_ctx *ctx, u_int ny, u_int bg)
screen_write_collect_flush(ctx, 0, __func__); screen_write_collect_flush(ctx, 0, __func__);
ttyctx.num = ny; ttyctx.n = ny;
tty_write(tty_cmd_insertline, &ttyctx); tty_write(tty_cmd_insertline, &ttyctx);
} }
@@ -1325,7 +1325,7 @@ screen_write_deleteline(struct screen_write_ctx *ctx, u_int ny, u_int bg)
grid_view_delete_lines(gd, s->cy, ny, bg); grid_view_delete_lines(gd, s->cy, ny, bg);
screen_write_collect_flush(ctx, 0, __func__); screen_write_collect_flush(ctx, 0, __func__);
ttyctx.num = ny; ttyctx.n = ny;
tty_write(tty_cmd_deleteline, &ttyctx); tty_write(tty_cmd_deleteline, &ttyctx);
return; return;
} }
@@ -1344,7 +1344,7 @@ screen_write_deleteline(struct screen_write_ctx *ctx, u_int ny, u_int bg)
grid_view_delete_lines_region(gd, s->rlower, s->cy, ny, bg); grid_view_delete_lines_region(gd, s->rlower, s->cy, ny, bg);
screen_write_collect_flush(ctx, 0, __func__); screen_write_collect_flush(ctx, 0, __func__);
ttyctx.num = ny; ttyctx.n = ny;
tty_write(tty_cmd_deleteline, &ttyctx); tty_write(tty_cmd_deleteline, &ttyctx);
} }
@@ -1623,7 +1623,7 @@ screen_write_scrolldown(struct screen_write_ctx *ctx, u_int lines, u_int bg)
grid_view_scroll_region_down(gd, s->rupper, s->rlower, bg); grid_view_scroll_region_down(gd, s->rupper, s->rlower, bg);
screen_write_collect_flush(ctx, 0, __func__); screen_write_collect_flush(ctx, 0, __func__);
ttyctx.num = lines; ttyctx.n = lines;
tty_write(tty_cmd_scrolldown, &ttyctx); tty_write(tty_cmd_scrolldown, &ttyctx);
} }
@@ -2043,7 +2043,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only,
screen_write_initctx(ctx, &ttyctx, 1, 1); screen_write_initctx(ctx, &ttyctx, 1, 1);
if (wp != NULL && wp->yoff + wp->sy > wp->window->sy) if (wp != NULL && wp->yoff + wp->sy > wp->window->sy)
ttyctx.orlower -= (wp->yoff + wp->sy - wp->window->sy); ttyctx.orlower -= (wp->yoff + wp->sy - wp->window->sy);
ttyctx.num = ctx->scrolled; ttyctx.n = ctx->scrolled;
ttyctx.bg = ctx->bg; ttyctx.bg = ctx->bg;
tty_write(tty_cmd_scrollup, &ttyctx); tty_write(tty_cmd_scrollup, &ttyctx);
if (wp != NULL) if (wp != NULL)
@@ -2133,7 +2133,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only,
if (ci->type == CLEAR) { if (ci->type == CLEAR) {
screen_write_initctx(ctx, &ttyctx, 1, 0); screen_write_initctx(ctx, &ttyctx, 1, 0);
ttyctx.bg = ci->bg; ttyctx.bg = ci->bg;
ttyctx.num = wr_length; ttyctx.n = wr_length;
tty_write(tty_cmd_clearcharacter, tty_write(tty_cmd_clearcharacter,
&ttyctx); &ttyctx);
} else { } else {
@@ -2142,7 +2142,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only,
if (ci->wrapped) if (ci->wrapped)
ttyctx.flags |= TTY_CTX_WRAPPED; ttyctx.flags |= TTY_CTX_WRAPPED;
ttyctx.ptr = cl->data + wr_start; ttyctx.ptr = cl->data + wr_start;
ttyctx.num = wr_length; ttyctx.n = wr_length;
tty_write(tty_cmd_cells, &ttyctx); tty_write(tty_cmd_cells, &ttyctx);
} }
items++; items++;
@@ -2447,7 +2447,7 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
/* Create space for character in insert mode. */ /* Create space for character in insert mode. */
if (s->mode & MODE_INSERT) { if (s->mode & MODE_INSERT) {
screen_write_collect_flush(ctx, 0, __func__); screen_write_collect_flush(ctx, 0, __func__);
ttyctx.num = width; ttyctx.n = width;
tty_write(tty_cmd_insertcharacter, &ttyctx); tty_write(tty_cmd_insertcharacter, &ttyctx);
} }
@@ -2697,9 +2697,9 @@ screen_write_setselection(struct screen_write_ctx *ctx, const char *clip,
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
screen_write_initctx(ctx, &ttyctx, 0, 0); screen_write_initctx(ctx, &ttyctx, 0, 0);
ttyctx.ptr = str; ttyctx.sel.clip = clip;
ttyctx.ptr2 = (void *)clip; ttyctx.sel.data = str;
ttyctx.num = len; ttyctx.sel.size = len;
tty_write(tty_cmd_setselection, &ttyctx); tty_write(tty_cmd_setselection, &ttyctx);
} }
@@ -2714,8 +2714,8 @@ screen_write_rawstring(struct screen_write_ctx *ctx, u_char *str, u_int len,
screen_write_initctx(ctx, &ttyctx, 0, 0); screen_write_initctx(ctx, &ttyctx, 0, 0);
if (allow_invisible_panes) if (allow_invisible_panes)
ttyctx.flags |= TTY_CTX_INVISIBLE_PANES; ttyctx.flags |= TTY_CTX_INVISIBLE_PANES;
ttyctx.ptr = str; ttyctx.data.data = str;
ttyctx.num = len; ttyctx.data.size = len;
tty_write(tty_cmd_rawstring, &ttyctx); tty_write(tty_cmd_rawstring, &ttyctx);
} }

17
tmux.h
View File

@@ -1745,9 +1745,20 @@ struct tty_ctx {
#define TTY_CTX_CELL_INVALIDATE 0x40 #define TTY_CTX_CELL_INVALIDATE 0x40
#define TTY_CTX_PANE_OBSCURED 0x80 #define TTY_CTX_PANE_OBSCURED 0x80
u_int num; union {
void *ptr; u_int n;
void *ptr2;
struct {
const char *data;
size_t size;
} data;
struct {
const char *clip;
const char *data;
size_t size;
} sel;
};
/* /*
* Cursor and region position before the screen was updated - this is * Cursor and region position before the screen was updated - this is

33
tty.c
View File

@@ -1708,7 +1708,7 @@ tty_cmd_insertcharacter(struct tty *tty, const struct tty_ctx *ctx)
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
tty_emulate_repeat(tty, TTYC_ICH, TTYC_ICH1, ctx->num); tty_emulate_repeat(tty, TTYC_ICH, TTYC_ICH1, ctx->n);
} }
void void
@@ -1731,7 +1731,7 @@ tty_cmd_deletecharacter(struct tty *tty, const struct tty_ctx *ctx)
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
tty_emulate_repeat(tty, TTYC_DCH, TTYC_DCH1, ctx->num); tty_emulate_repeat(tty, TTYC_DCH, TTYC_DCH1, ctx->n);
} }
void void
@@ -1740,7 +1740,7 @@ tty_cmd_clearcharacter(struct tty *tty, const struct tty_ctx *ctx)
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg, tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg,
ctx->s->hyperlinks); ctx->s->hyperlinks);
tty_clear_pane_line(tty, ctx, ctx->ocy, ctx->ocx, ctx->num, ctx->bg); tty_clear_pane_line(tty, ctx, ctx->ocy, ctx->ocx, ctx->n, ctx->bg);
} }
void void
@@ -1767,7 +1767,7 @@ tty_cmd_insertline(struct tty *tty, const struct tty_ctx *ctx)
tty_margin_off(tty); tty_margin_off(tty);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
tty_emulate_repeat(tty, TTYC_IL, TTYC_IL1, ctx->num); tty_emulate_repeat(tty, TTYC_IL, TTYC_IL1, ctx->n);
tty->cx = tty->cy = UINT_MAX; tty->cx = tty->cy = UINT_MAX;
} }
@@ -1795,7 +1795,7 @@ tty_cmd_deleteline(struct tty *tty, const struct tty_ctx *ctx)
tty_margin_off(tty); tty_margin_off(tty);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
tty_emulate_repeat(tty, TTYC_DL, TTYC_DL1, ctx->num); tty_emulate_repeat(tty, TTYC_DL, TTYC_DL1, ctx->n);
tty->cx = tty->cy = UINT_MAX; tty->cx = tty->cy = UINT_MAX;
} }
@@ -1928,19 +1928,19 @@ tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx)
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
tty_margin_pane(tty, ctx); tty_margin_pane(tty, ctx);
if (ctx->num == 1 || !tty_term_has(tty->term, TTYC_INDN)) { if (ctx->n == 1 || !tty_term_has(tty->term, TTYC_INDN)) {
if (!tty_use_margin(tty)) if (!tty_use_margin(tty))
tty_cursor(tty, 0, tty->rlower); tty_cursor(tty, 0, tty->rlower);
else else
tty_cursor(tty, tty->rright, tty->rlower); tty_cursor(tty, tty->rright, tty->rlower);
for (i = 0; i < ctx->num; i++) for (i = 0; i < ctx->n; i++)
tty_putc(tty, '\n'); tty_putc(tty, '\n');
} else { } else {
if (tty->cy == UINT_MAX) if (tty->cy == UINT_MAX)
tty_cursor(tty, 0, 0); tty_cursor(tty, 0, 0);
else else
tty_cursor(tty, 0, tty->cy); tty_cursor(tty, 0, tty->cy);
tty_putcode_i(tty, TTYC_INDN, ctx->num); tty_putcode_i(tty, TTYC_INDN, ctx->n);
} }
} }
@@ -1971,9 +1971,9 @@ tty_cmd_scrolldown(struct tty *tty, const struct tty_ctx *ctx)
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->orupper); tty_cursor_pane(tty, ctx, ctx->ocx, ctx->orupper);
if (tty_term_has(tty->term, TTYC_RIN)) if (tty_term_has(tty->term, TTYC_RIN))
tty_putcode_i(tty, TTYC_RIN, ctx->num); tty_putcode_i(tty, TTYC_RIN, ctx->n);
else { else {
for (i = 0; i < ctx->num; i++) for (i = 0; i < ctx->n; i++)
tty_putcode(tty, TTYC_RI); tty_putcode(tty, TTYC_RI);
} }
} }
@@ -2124,14 +2124,15 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx)
struct visible_ranges *r; struct visible_ranges *r;
struct visible_range *ri; struct visible_range *ri;
u_int i, px, py, cx; u_int i, px, py, cx;
char *cp = ctx->ptr; const char *cp = ctx->data.data;
size_t n = ctx->data.size;
if (!tty_is_visible(tty, ctx, ctx->ocx, ctx->ocy, ctx->num, 1)) if (!tty_is_visible(tty, ctx, ctx->ocx, ctx->ocy, n, 1))
return; return;
if ((ctx->flags & TTY_CTX_WINDOW_BIGGER) && if ((ctx->flags & TTY_CTX_WINDOW_BIGGER) &&
(ctx->xoff + ctx->ocx < ctx->wox || (ctx->xoff + ctx->ocx < ctx->wox ||
ctx->xoff + ctx->ocx + ctx->num > ctx->wox + ctx->wsx)) { ctx->xoff + ctx->ocx + n > ctx->wox + ctx->wsx)) {
if ((~ctx->flags & TTY_CTX_WRAPPED) || if ((~ctx->flags & TTY_CTX_WRAPPED) ||
!tty_full_width(tty, ctx) || !tty_full_width(tty, ctx) ||
(tty->term->flags & TERM_NOAM) || (tty->term->flags & TERM_NOAM) ||
@@ -2154,7 +2155,7 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx)
px = ctx->xoff + ctx->ocx - ctx->wox; px = ctx->xoff + ctx->ocx - ctx->wox;
py = ctx->yoff + ctx->ocy - ctx->woy; py = ctx->yoff + ctx->ocy - ctx->woy;
r = tty_check_overlay_range(tty, px, py, ctx->num); r = tty_check_overlay_range(tty, px, py, n);
for (i = 0; i < r->used; i++) { for (i = 0; i < r->used; i++) {
ri = &r->ranges[i]; ri = &r->ranges[i];
if (ri->nx != 0) { if (ri->nx != 0) {
@@ -2168,7 +2169,7 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx)
void void
tty_cmd_setselection(struct tty *tty, const struct tty_ctx *ctx) tty_cmd_setselection(struct tty *tty, const struct tty_ctx *ctx)
{ {
tty_set_selection(tty, ctx->ptr2, ctx->ptr, ctx->num); tty_set_selection(tty, ctx->sel.clip, ctx->sel.data, ctx->sel.size);
} }
void void
@@ -2197,7 +2198,7 @@ void
tty_cmd_rawstring(struct tty *tty, const struct tty_ctx *ctx) tty_cmd_rawstring(struct tty *tty, const struct tty_ctx *ctx)
{ {
tty->flags |= TTY_NOBLOCK; tty->flags |= TTY_NOBLOCK;
tty_add(tty, ctx->ptr, ctx->num); tty_add(tty, ctx->data.data, ctx->data.size);
tty_invalidate(tty); tty_invalidate(tty);
} }