diff --git a/kitty/child-monitor.c b/kitty/child-monitor.c index 995dff90c..59954a56f 100644 --- a/kitty/child-monitor.c +++ b/kitty/child-monitor.c @@ -623,6 +623,7 @@ render_os_window(OSWindow *os_window, double now, unsigned int active_window_id) br->is_dirty = false; os_window->last_active_tab = os_window->active_tab; os_window->last_num_tabs = os_window->num_tabs; os_window->last_active_window_id = active_window_id; os_window->focused_at_last_render = os_window->is_focused; + os_window->is_damaged = false; #undef WD #undef TD } @@ -638,7 +639,7 @@ render(double now) { for (size_t i = 0; i < global_state.num_os_windows; i++) { OSWindow *w = global_state.os_windows + i; if (!w->num_tabs || !should_os_window_be_rendered(w)) continue; - bool needs_render = w->is_focused; + bool needs_render = w->is_focused || w->is_damaged; make_os_window_context_current(w); if (w->viewport_size_dirty) { w->clear_count = 0; diff --git a/kitty/glfw.c b/kitty/glfw.c index 11416e00e..e6398f99d 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -85,6 +85,13 @@ framebuffer_size_callback(GLFWwindow *w, int width, int height) { global_state.callback_os_window = NULL; } +static void +refresh_callback(GLFWwindow *w) { + if (!set_callback_window(w)) return; + global_state.callback_os_window->is_damaged = true; + global_state.callback_os_window = NULL; +} + static void char_mods_callback(GLFWwindow *w, unsigned int codepoint, int mods) { if (!set_callback_window(w)) return; @@ -363,6 +370,7 @@ create_os_window(PyObject UNUSED *self, PyObject *args) { glfwSetCursor(glfw_window, standard_cursor); update_os_window_viewport(w, false); glfwSetFramebufferSizeCallback(glfw_window, framebuffer_size_callback); + glfwSetWindowRefreshCallback(glfw_window, refresh_callback); glfwSetCharModsCallback(glfw_window, char_mods_callback); glfwSetMouseButtonCallback(glfw_window, mouse_button_callback); glfwSetScrollCallback(glfw_window, scroll_callback); diff --git a/kitty/state.h b/kitty/state.h index eb5d48071..0f68c8094 100644 --- a/kitty/state.h +++ b/kitty/state.h @@ -111,6 +111,7 @@ typedef struct { bool has_pending_resizes; bool is_semi_transparent; bool shown_once; + bool is_damaged; uint32_t offscreen_texture_id; unsigned int clear_count; } OSWindow;