From 8d963e79ac8c23550bd0bd88600239fddf1fd377 Mon Sep 17 00:00:00 2001 From: Window Maker Date: Sun, 17 May 2026 20:59:31 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20native=20XDG=20client=20rendering=20?= =?UTF-8?q?=E2=80=94=20schedule=20frame=20on=20surface=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added permanent surface_commit_listener to wl_toplevel_view that calls wlr_output_schedule_frame on every client buffer commit. Previously only the initial-commit listener existed, which removed itself after sending the first configure — subsequent buffer updates (typing in foot/xterm) were not triggering re-renders. --- src/backend/wayland/wl_backend.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 68c3c49..6c04d94 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -246,6 +246,7 @@ struct wl_toplevel_view { struct wl_listener request_minimize_listener; /* Phase 16 */ struct wl_listener set_app_id_listener; /* Phase 16 */ struct wl_listener commit_listener; /* initial configure */ + struct wl_listener surface_commit_listener; /* permanent commit listener */ /* Phase 17: XWayland — set for X11 windows, NULL for XDG toplevels. */ struct wlr_xwayland_surface *xw_surface; /* Path 1: geometry listener — keeps scene node in sync when X11 window moves. */ @@ -1173,6 +1174,7 @@ handle_toplevel_destroy(struct wl_listener *listener, void *data) wl_list_remove(&view->request_minimize_listener.link); wl_list_remove(&view->set_app_id_listener.link); wl_list_remove(&view->commit_listener.link); + wl_list_remove(&view->surface_commit_listener.link); wl_list_remove(&view->link); /* Phase 18: remove scene node. */ if (view->scene_node) { @@ -1664,6 +1666,16 @@ handle_xdg_toplevel_initial_commit(struct wl_listener *listener, void *data) wlr_xdg_surface_schedule_configure(view->xdg_surface); } +static void +handle_toplevel_commit(struct wl_listener *listener, void *data) +{ + struct wl_toplevel_view *view = + wl_container_of(listener, view, surface_commit_listener); + (void)view; (void)data; + if (wl_state.output) + wlr_output_schedule_frame(wl_state.output); +} + /* * Phase 36 / 38: new XDG toplevel listener (wlroots 0.19+). * Fires when the client calls get_toplevel on an xdg_surface. @@ -1710,6 +1722,9 @@ handle_xdg_new_toplevel(struct wl_listener *listener, void *data) view->commit_listener.notify = handle_xdg_toplevel_initial_commit; wl_signal_add(&xdg_surface->surface->events.commit, &view->commit_listener); + view->surface_commit_listener.notify = handle_toplevel_commit; + wl_signal_add(&xdg_surface->surface->events.commit, &view->surface_commit_listener); + wl_list_insert(&wl_state.toplevel_list, &view->link); wl_state.managed_surface_count++;