Track window scrolling for damage.

This commit is contained in:
nicm
2026-10-14 12:48:50 +00:00
committed by tmux update bot
parent abbe04fb74
commit 3e6c6576ab
3 changed files with 53 additions and 3 deletions

View File

@@ -1,4 +1,4 @@
/* $OpenBSD: screen-redraw.c,v 1.165 2026/10/14 12:38:18 nicm Exp $ */ /* $OpenBSD: screen-redraw.c,v 1.166 2026/10/14 12:48:50 nicm Exp $ */
/* /*
* Copyright (c) 2026 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2026 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1111,6 +1111,7 @@ redraw_free_damage(struct window *w)
free(rd); free(rd);
} }
w->damage_count = 0; w->damage_count = 0;
w->scroll_pending = 0;
} }
/* Collapse all pending damage for a window into one rectangle. */ /* Collapse all pending damage for a window into one rectangle. */
@@ -1209,6 +1210,39 @@ redraw_damage_window(struct window *w, u_int x, u_int y, u_int sx, u_int sy)
redraw_apply_window_damage(w, x, y, sx, sy, 0); redraw_apply_window_damage(w, x, y, sx, sy, 0);
} }
/* Record damage caused by terminal scrolling. */
void
redraw_damage_scroll(struct window *w, u_int x, u_int y, u_int sx, u_int sy)
{
if (!w->scroll_pending) {
w->scroll_generation++;
w->scroll_pending = 1;
}
redraw_apply_window_damage(w, x, y, sx, sy, REDRAW_DAMAGE_SCROLL);
}
/* Remember whether this client used terminal scrolling for the damage. */
void
redraw_scroll_result(struct tty *tty, const struct tty_ctx *ctx, int failed)
{
struct window_pane *wp = ctx->arg;
struct window *w;
if (wp == NULL)
return;
w = wp->window;
if (!w->scroll_pending)
return;
if (tty->scroll_window != w ||
tty->scroll_generation != w->scroll_generation) {
tty->scroll_window = w;
tty->scroll_generation = w->scroll_generation;
tty->scroll_failed = 0;
}
if (failed)
tty->scroll_failed = 1;
}
/* Mark all cached redraw scenes as out of date. */ /* Mark all cached redraw scenes as out of date. */
void void
redraw_invalidate_all_scenes(void) redraw_invalidate_all_scenes(void)

10
tmux.h
View File

@@ -1,4 +1,4 @@
/* $OpenBSD: tmux.h,v 1.1462 2026/10/14 12:33:46 nicm Exp $ */ /* $OpenBSD: tmux.h,v 1.1463 2026/10/14 12:48:50 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1464,6 +1464,8 @@ struct window {
struct redraw_damages damage; struct redraw_damages damage;
u_int damage_count; u_int damage_count;
uint64_t scroll_generation;
int scroll_pending;
struct menu_data *menu; struct menu_data *menu;
u_int menu_last_px; u_int menu_last_px;
@@ -1835,6 +1837,10 @@ struct tty {
struct event key_timer; struct event key_timer;
struct tty_key *key_tree; struct tty_key *key_tree;
struct window *scroll_window;
uint64_t scroll_generation;
int scroll_failed;
}; };
/* Terminal command context. */ /* Terminal command context. */
@@ -3620,6 +3626,8 @@ int redraw_client_has_window(struct client *, struct window *);
void redraw_invalidate_scene(struct window *); void redraw_invalidate_scene(struct window *);
void redraw_invalidate_all_scenes(void); void redraw_invalidate_all_scenes(void);
void redraw_damage_window(struct window *, u_int, u_int, u_int, u_int); void redraw_damage_window(struct window *, u_int, u_int, u_int, u_int);
void redraw_damage_scroll(struct window *, u_int, u_int, u_int, u_int);
void redraw_scroll_result(struct tty *, const struct tty_ctx *, int);
void redraw_free_damage(struct window *); void redraw_free_damage(struct window *);
void redraw_client_damage(struct client *); void redraw_client_damage(struct client *);
int redraw_get_status_border_cell_type(struct redraw_span **, u_int); int redraw_get_status_border_cell_type(struct redraw_span **, u_int);

10
tty.c
View File

@@ -1,4 +1,4 @@
/* $OpenBSD: tty.c,v 1.488 2026/10/14 11:54:55 nicm Exp $ */ /* $OpenBSD: tty.c,v 1.489 2026/10/14 12:48:50 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1669,10 +1669,12 @@ tty_cmd_reverseindex(struct tty *tty, const struct tty_ctx *ctx)
!tty_term_has(tty->term, TTYC_RIN)) || !tty_term_has(tty->term, TTYC_RIN)) ||
ctx->sx == 1 || ctx->sx == 1 ||
ctx->sy == 1) { ctx->sy == 1) {
redraw_scroll_result(tty, ctx, 1);
tty_redraw_region(tty, ctx); tty_redraw_region(tty, ctx);
return; return;
} }
redraw_scroll_result(tty, ctx, 0);
tty_default_attributes(tty, ctx->bg, &ctx->style_ctx); tty_default_attributes(tty, ctx->bg, &ctx->style_ctx);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
@@ -1697,10 +1699,12 @@ tty_cmd_linefeed(struct tty *tty, const struct tty_ctx *ctx)
!tty_term_has(tty->term, TTYC_CSR) || !tty_term_has(tty->term, TTYC_CSR) ||
ctx->sx == 1 || ctx->sx == 1 ||
ctx->sy == 1) { ctx->sy == 1) {
redraw_scroll_result(tty, ctx, 1);
tty_redraw_region(tty, ctx); tty_redraw_region(tty, ctx);
return; return;
} }
redraw_scroll_result(tty, ctx, 0);
tty_default_attributes(tty, ctx->bg, &ctx->style_ctx); tty_default_attributes(tty, ctx->bg, &ctx->style_ctx);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
@@ -1735,10 +1739,12 @@ tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx)
!tty_term_has(tty->term, TTYC_CSR) || !tty_term_has(tty->term, TTYC_CSR) ||
ctx->sx == 1 || ctx->sx == 1 ||
ctx->sy == 1) { ctx->sy == 1) {
redraw_scroll_result(tty, ctx, 1);
tty_redraw_region(tty, ctx); tty_redraw_region(tty, ctx);
return; return;
} }
redraw_scroll_result(tty, ctx, 0);
tty_default_attributes(tty, ctx->bg, &ctx->style_ctx); tty_default_attributes(tty, ctx->bg, &ctx->style_ctx);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
@@ -1773,10 +1779,12 @@ tty_cmd_scrolldown(struct tty *tty, const struct tty_ctx *ctx)
!tty_term_has(tty->term, TTYC_RIN)) || !tty_term_has(tty->term, TTYC_RIN)) ||
ctx->sx == 1 || ctx->sx == 1 ||
ctx->sy == 1) { ctx->sy == 1) {
redraw_scroll_result(tty, ctx, 1);
tty_redraw_region(tty, ctx); tty_redraw_region(tty, ctx);
return; return;
} }
redraw_scroll_result(tty, ctx, 0);
tty_default_attributes(tty, ctx->bg, &ctx->style_ctx); tty_default_attributes(tty, ctx->bg, &ctx->style_ctx);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);