From 36bc3515573cd1d607199fdc2c926b8f6c3c045d Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 22 May 2026 09:21:32 +0000 Subject: [PATCH] Use a union for the data passed around in tty_ctx instead of void *. --- screen-write.c | 36 ++++++++++++++++++------------------ tmux.h | 17 ++++++++++++++--- tty.c | 33 +++++++++++++++++---------------- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/screen-write.c b/screen-write.c index c5ae0d36..41135963 100644 --- a/screen-write.c +++ b/screen-write.c @@ -1121,7 +1121,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); screen_write_collect_flush(ctx, 0, __func__); - ttyctx.num = nx; + ttyctx.n = nx; tty_write(tty_cmd_insertcharacter, &ttyctx); } @@ -1149,7 +1149,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); screen_write_collect_flush(ctx, 0, __func__); - ttyctx.num = nx; + ttyctx.n = nx; tty_write(tty_cmd_deletecharacter, &ttyctx); } @@ -1177,7 +1177,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); screen_write_collect_flush(ctx, 0, __func__); - ttyctx.num = nx; + ttyctx.n = nx; tty_write(tty_cmd_clearcharacter, &ttyctx); } @@ -1204,7 +1204,7 @@ screen_write_insertline(struct screen_write_ctx *ctx, u_int ny, u_int bg) grid_view_insert_lines(gd, s->cy, ny, bg); screen_write_collect_flush(ctx, 0, __func__); - ttyctx.num = ny; + ttyctx.n = ny; tty_write(tty_cmd_insertline, &ttyctx); return; } @@ -1224,7 +1224,7 @@ screen_write_insertline(struct screen_write_ctx *ctx, u_int ny, u_int bg) screen_write_collect_flush(ctx, 0, __func__); - ttyctx.num = ny; + ttyctx.n = ny; tty_write(tty_cmd_insertline, &ttyctx); } @@ -1252,7 +1252,7 @@ screen_write_deleteline(struct screen_write_ctx *ctx, u_int ny, u_int bg) grid_view_delete_lines(gd, s->cy, ny, bg); screen_write_collect_flush(ctx, 0, __func__); - ttyctx.num = ny; + ttyctx.n = ny; tty_write(tty_cmd_deleteline, &ttyctx); return; } @@ -1271,7 +1271,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); screen_write_collect_flush(ctx, 0, __func__); - ttyctx.num = ny; + ttyctx.n = ny; tty_write(tty_cmd_deleteline, &ttyctx); } @@ -1492,7 +1492,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); screen_write_collect_flush(ctx, 0, __func__); - ttyctx.num = lines; + ttyctx.n = lines; tty_write(tty_cmd_scrolldown, &ttyctx); } @@ -1757,7 +1757,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only, ctx->scrolled = s->rlower - s->rupper + 1; screen_write_initctx(ctx, &ttyctx, 1); - ttyctx.num = ctx->scrolled; + ttyctx.n = ctx->scrolled; ttyctx.bg = ctx->bg; tty_write(tty_cmd_scrollup, &ttyctx); @@ -1785,15 +1785,15 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only, if (ci->type == CLEAR) { screen_write_initctx(ctx, &ttyctx, 1); ttyctx.bg = ci->bg; - ttyctx.num = ci->used; + ttyctx.n = ci->used; tty_write(tty_cmd_clearcharacter, &ttyctx); } else { screen_write_initctx(ctx, &ttyctx, 0); ttyctx.cell = &ci->gc; if (ci->wrapped) ttyctx.flags |= TTY_CTX_WRAPPED; - ttyctx.ptr = cl->data + ci->x; - ttyctx.num = ci->used; + ttyctx.data.data = cl->data + ci->x; + ttyctx.data.size = ci->used; tty_write(tty_cmd_cells, &ttyctx); } items++; @@ -2081,7 +2081,7 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc) /* Create space for character in insert mode. */ if (s->mode & MODE_INSERT) { screen_write_collect_flush(ctx, 0, __func__); - ttyctx.num = width; + ttyctx.n = width; tty_write(tty_cmd_insertcharacter, &ttyctx); } @@ -2293,9 +2293,9 @@ screen_write_setselection(struct screen_write_ctx *ctx, const char *clip, struct tty_ctx ttyctx; screen_write_initctx(ctx, &ttyctx, 0); - ttyctx.ptr = str; - ttyctx.ptr2 = (void *)clip; - ttyctx.num = len; + ttyctx.sel.clip = clip; + ttyctx.sel.data = str; + ttyctx.sel.size = len; tty_write(tty_cmd_setselection, &ttyctx); } @@ -2310,8 +2310,8 @@ screen_write_rawstring(struct screen_write_ctx *ctx, u_char *str, u_int len, screen_write_initctx(ctx, &ttyctx, 0); if (allow_invisible_panes) ttyctx.flags |= TTY_CTX_INVISIBLE_PANES; - ttyctx.ptr = str; - ttyctx.num = len; + ttyctx.data.data = str; + ttyctx.data.size = len; tty_write(tty_cmd_rawstring, &ttyctx); } diff --git a/tmux.h b/tmux.h index bba8beaa..d21a9e93 100644 --- a/tmux.h +++ b/tmux.h @@ -1704,9 +1704,20 @@ struct tty_ctx { #define TTY_CTX_CELL_DRAW_LINE 0x20 #define TTY_CTX_CELL_INVALIDATE 0x40 - u_int num; - void *ptr; - void *ptr2; + union { + u_int n; + + 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 diff --git a/tty.c b/tty.c index 883bea60..4966f432 100644 --- a/tty.c +++ b/tty.c @@ -1555,7 +1555,7 @@ tty_cmd_insertcharacter(struct tty *tty, const struct tty_ctx *ctx) 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 @@ -1578,7 +1578,7 @@ tty_cmd_deletecharacter(struct tty *tty, const struct tty_ctx *ctx) 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 @@ -1587,7 +1587,7 @@ tty_cmd_clearcharacter(struct tty *tty, const struct tty_ctx *ctx) tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg, 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 @@ -1614,7 +1614,7 @@ tty_cmd_insertline(struct tty *tty, const struct tty_ctx *ctx) tty_margin_off(tty); 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; } @@ -1642,7 +1642,7 @@ tty_cmd_deleteline(struct tty *tty, const struct tty_ctx *ctx) tty_margin_off(tty); 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; } @@ -1775,19 +1775,19 @@ tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx) tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); 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)) tty_cursor(tty, 0, tty->rlower); else 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'); } else { if (tty->cy == UINT_MAX) tty_cursor(tty, 0, 0); else tty_cursor(tty, 0, tty->cy); - tty_putcode_i(tty, TTYC_INDN, ctx->num); + tty_putcode_i(tty, TTYC_INDN, ctx->n); } } @@ -1818,9 +1818,9 @@ tty_cmd_scrolldown(struct tty *tty, const struct tty_ctx *ctx) tty_cursor_pane(tty, ctx, ctx->ocx, ctx->orupper); 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 { - for (i = 0; i < ctx->num; i++) + for (i = 0; i < ctx->n; i++) tty_putcode(tty, TTYC_RI); } } @@ -1970,14 +1970,15 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx) struct visible_ranges *r; struct visible_range *rr; 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; if ((ctx->flags & TTY_CTX_WINDOW_BIGGER) && (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) || !tty_full_width(tty, ctx) || (tty->term->flags & TERM_NOAM) || @@ -2000,7 +2001,7 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx) px = ctx->xoff + ctx->ocx - ctx->wox; 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++) { rr = &r->ranges[i]; if (rr->nx != 0) { @@ -2014,7 +2015,7 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx) void 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 @@ -2043,7 +2044,7 @@ void tty_cmd_rawstring(struct tty *tty, const struct tty_ctx *ctx) { tty->flags |= TTY_NOBLOCK; - tty_add(tty, ctx->ptr, ctx->num); + tty_add(tty, ctx->data.data, ctx->data.size); tty_invalidate(tty); }