fix: native XDG client rendering — schedule frame on surface commit
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.
This commit is contained in:
parent
0950b228af
commit
8d963e79ac
|
|
@ -246,6 +246,7 @@ struct wl_toplevel_view {
|
||||||
struct wl_listener request_minimize_listener; /* Phase 16 */
|
struct wl_listener request_minimize_listener; /* Phase 16 */
|
||||||
struct wl_listener set_app_id_listener; /* Phase 16 */
|
struct wl_listener set_app_id_listener; /* Phase 16 */
|
||||||
struct wl_listener commit_listener; /* initial configure */
|
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. */
|
/* Phase 17: XWayland — set for X11 windows, NULL for XDG toplevels. */
|
||||||
struct wlr_xwayland_surface *xw_surface;
|
struct wlr_xwayland_surface *xw_surface;
|
||||||
/* Path 1: geometry listener — keeps scene node in sync when X11 window moves. */
|
/* 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->request_minimize_listener.link);
|
||||||
wl_list_remove(&view->set_app_id_listener.link);
|
wl_list_remove(&view->set_app_id_listener.link);
|
||||||
wl_list_remove(&view->commit_listener.link);
|
wl_list_remove(&view->commit_listener.link);
|
||||||
|
wl_list_remove(&view->surface_commit_listener.link);
|
||||||
wl_list_remove(&view->link);
|
wl_list_remove(&view->link);
|
||||||
/* Phase 18: remove scene node. */
|
/* Phase 18: remove scene node. */
|
||||||
if (view->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);
|
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+).
|
* Phase 36 / 38: new XDG toplevel listener (wlroots 0.19+).
|
||||||
* Fires when the client calls get_toplevel on an xdg_surface.
|
* 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;
|
view->commit_listener.notify = handle_xdg_toplevel_initial_commit;
|
||||||
wl_signal_add(&xdg_surface->surface->events.commit, &view->commit_listener);
|
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_list_insert(&wl_state.toplevel_list, &view->link);
|
||||||
wl_state.managed_surface_count++;
|
wl_state.managed_surface_count++;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue