From 78247390348444c8c52abc089f3f5dc5f1bcfde7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 13 Jun 2020 22:59:46 +0530 Subject: [PATCH] Ensure selection GPU buffer is refreshed after a resize Fixes #2747 (I hope since I cannot reproduce) --- kitty/screen.h | 1 + kitty/shaders.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/kitty/screen.h b/kitty/screen.h index efa4cf788..b0331c21b 100644 --- a/kitty/screen.h +++ b/kitty/screen.h @@ -86,6 +86,7 @@ typedef struct { struct { IterationData selection, url; unsigned int cursor_x, cursor_y, scrolled_by; + index_type lines, columns; } last_rendered; bool use_latin1, is_dirty, scroll_changed, reload_all_gpu_data; Cursor *cursor; diff --git a/kitty/shaders.c b/kitty/shaders.c index d337958a7..f8c0d3bd0 100644 --- a/kitty/shaders.c +++ b/kitty/shaders.c @@ -318,8 +318,9 @@ cell_prepare_to_render(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, GLfloa bool cursor_pos_changed = screen->cursor->x != screen->last_rendered.cursor_x || screen->cursor->y != screen->last_rendered.cursor_y; bool disable_ligatures = screen->disable_ligatures == DISABLE_LIGATURES_CURSOR; + bool screen_resized = screen->last_rendered.columns != screen->columns || screen->last_rendered.lines != screen->lines; - if (screen->reload_all_gpu_data || screen->scroll_changed || screen->is_dirty || (disable_ligatures && cursor_pos_changed)) { + if (screen->reload_all_gpu_data || screen->scroll_changed || screen->is_dirty || screen_resized || (disable_ligatures && cursor_pos_changed)) { sz = sizeof(GPUCell) * screen->lines * screen->columns; address = alloc_and_map_vao_buffer(vao_idx, sz, cell_data_buffer, GL_STREAM_DRAW, GL_WRITE_ONLY); screen_update_cell_data(screen, address, fonts_data, disable_ligatures && cursor_pos_changed); @@ -332,7 +333,7 @@ cell_prepare_to_render(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, GLfloa screen->last_rendered.cursor_y = screen->cursor->y; } - if (screen->reload_all_gpu_data || screen_is_selection_dirty(screen)) { + if (screen->reload_all_gpu_data || screen_resized || screen_is_selection_dirty(screen)) { sz = screen->lines * screen->columns; address = alloc_and_map_vao_buffer(vao_idx, sz, selection_buffer, GL_STREAM_DRAW, GL_WRITE_ONLY); screen_apply_selection(screen, address, sz); @@ -345,6 +346,8 @@ cell_prepare_to_render(ssize_t vao_idx, ssize_t gvao_idx, Screen *screen, GLfloa changed = true; } screen->last_rendered.scrolled_by = screen->scrolled_by; + screen->last_rendered.columns = screen->columns; + screen->last_rendered.lines = screen->lines; return changed; }