From 46f0defabd73d60a49825d3ca8629ac78f49de12 Mon Sep 17 00:00:00 2001 From: lkn Date: Fri, 26 Jun 2026 07:11:07 +0200 Subject: [PATCH] wayland: guard event_flush commit against inactive session The wl_event_loop_dispatch in event_flush could process a session deactivation event (VT switch) while mid-animation, triggering a wlroots assertion in wlr_backend_finish. Skip the commit and dispatch when the DRM session is inactive. --- src/backend/wayland/wl_event.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/backend/wayland/wl_event.c b/src/backend/wayland/wl_event.c index d7ef0c2..6ca97ce 100644 --- a/src/backend/wayland/wl_event.c +++ b/src/backend/wayland/wl_event.c @@ -3,6 +3,7 @@ #endif #include #include +#include #include "../../screen.h" #include "wl_types.h" @@ -11,12 +12,9 @@ void wl_event_flush(void) { wl_xdisplay_flush(); /* Commit the scene so intermediate animation frames are visible */ - if (wl_state.scene_output && wl_state.allocator) { + if (wl_state.scene_output && wl_state.allocator && + (!wl_state.session || wl_state.session->active)) { wlr_scene_output_commit(wl_state.scene_output, NULL); - /* Flush the display so the frame reaches the DRM backend, - * then dispatch to process the page-flip completion event - * before returning. Without this, animation loops that - * call event_flush repeatedly only show the final frame. */ wl_display_flush_clients(wl_state.display); struct wl_event_loop *loop = wl_display_get_event_loop(wl_state.display); wl_event_loop_dispatch(loop, 0);