From beb57311cb8b2023d517c1440bd30974ad0d9cb8 Mon Sep 17 00:00:00 2001 From: Arca Artem Date: Wed, 5 Aug 2026 19:36:31 +0100 Subject: [PATCH] qp_lvgl: always signal flush ready even with no display (#26275) qp_lvgl_flush() called lv_disp_flush_ready() only inside the `if (selected_display)` block. When LVGL invokes the flush callback while selected_display is NULL, the callback returns without ever signalling completion, so LVGL keeps the flush marked "in progress" and stalls all further rendering. Move lv_disp_flush_ready() out of the conditional so it is always called, per LVGL's contract that every flush_cb must signal ready exactly once. --- quantum/painter/lvgl/qp_lvgl.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/quantum/painter/lvgl/qp_lvgl.c b/quantum/painter/lvgl/qp_lvgl.c index dc639b5a366..2d8d96686c4 100644 --- a/quantum/painter/lvgl/qp_lvgl.c +++ b/quantum/painter/lvgl/qp_lvgl.c @@ -28,8 +28,11 @@ void qp_lvgl_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color qp_viewport(selected_display, area->x1, area->y1, area->x2, area->y2); qp_pixdata(selected_display, (void *)color_p, number_pixels); qp_flush(selected_display); - lv_disp_flush_ready(disp); } + // Must always be signalled, even when there is no selected display: + // skipping it leaves LVGL's flush permanently "in progress" and stalls + // all further rendering. + lv_disp_flush_ready(disp); } static uint32_t tick_task_callback(uint32_t trigger_time, void *cb_arg) {