Merge pull request #11025 from bfredl/doublescroll

compositor: avoid transmitting invalid lines on double scroll
This commit is contained in:
Björn Linse 2019-09-15 16:53:43 +02:00 committed by GitHub
commit 45f23ef9d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 23 additions and 10 deletions

View File

@ -526,9 +526,7 @@ static void ui_comp_raw_line(UI *ui, Integer grid, Integer row,
endcol = MIN(endcol, clearcol);
}
bool above_msg = (kv_A(layers, kv_size(layers)-1) == &msg_grid
&& row < msg_current_row-(msg_was_scrolled?1:0));
bool covered = kv_size(layers)-(above_msg?1:0) > curgrid->comp_index+1;
bool covered = curgrid_covered_above((int)row);
// TODO(bfredl): eventually should just fix compose_line to respect clearing
// and optimize it for uncovered lines.
if (flags & kLineFlagInvalid || covered || curgrid->blending) {
@ -588,6 +586,16 @@ static void ui_comp_msg_set_pos(UI *ui, Integer grid, Integer row,
msg_was_scrolled = scrolled;
}
/// check if curgrid is covered on row or above
///
/// TODO(bfredl): currently this only handles message row
static bool curgrid_covered_above(int row)
{
bool above_msg = (kv_A(layers, kv_size(layers)-1) == &msg_grid
&& row < msg_current_row-(msg_was_scrolled?1:0));
return kv_size(layers)-(above_msg?1:0) > curgrid->comp_index+1;
}
static void ui_comp_grid_scroll(UI *ui, Integer grid, Integer top,
Integer bot, Integer left, Integer right,
Integer rows, Integer cols)
@ -599,18 +607,23 @@ static void ui_comp_grid_scroll(UI *ui, Integer grid, Integer top,
bot += curgrid->comp_row;
left += curgrid->comp_col;
right += curgrid->comp_col;
bool covered = kv_size(layers) > curgrid->comp_index+1 || curgrid->blending;
bool covered = curgrid_covered_above((int)(bot - MAX(rows, 0)));
if (covered) {
if (covered || curgrid->blending) {
// TODO(bfredl):
// 1. check if rectangles actually overlap
// 2. calulate subareas that can scroll.
if (rows > 0) {
bot -= rows;
} else {
top += (-rows);
compose_debug(top, bot, left, right, dbghl_recompose, true);
for (int r = (int)(top + MAX(-rows, 0)); r < bot - MAX(rows, 0); r++) {
// TODO(bfredl): workaround for win_update() performing two scrolls in a
// row, where the latter might scroll invalid space created by the first.
// ideally win_update() should keep track of this itself and not scroll
// the invalid space.
if (curgrid->attrs[curgrid->line_offset[r-curgrid->comp_row]
+left-curgrid->comp_col] >= 0) {
compose_line(r, left, right, 0);
}
}
compose_area(top, bot, left, right);
} else {
ui_composed_call_grid_scroll(1, top, bot, left, right, rows, cols);
if (rdb_flags & RDB_COMPOSITOR) {