cursor: only reset the cursor when the surface changes

If the set_cursor request is used with the same surface, don't call
cursor_output_cursor_reset_image(). That function sends
wl_surface.leave and can cause an infinite feedback loop with some
clients (submitting a LoDPI cursor when the surface leaves an HiDPI
output).

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3669
This commit is contained in:
Simon Ser 2023-06-12 11:19:13 +02:00 committed by Alexander Orzechowski
parent 05dd08afe5
commit 6e8fb5509f
1 changed files with 20 additions and 16 deletions

View File

@ -469,11 +469,11 @@ void wlr_cursor_set_surface(struct wlr_cursor *cur, struct wlr_surface *surface,
continue; continue;
} }
if (surface != output_cursor->surface) {
// Only send wl_surface.leave if the surface changes
cursor_output_cursor_reset_image(output_cursor); cursor_output_cursor_reset_image(output_cursor);
output_cursor->surface = surface; output_cursor->surface = surface;
output_cursor->surface_hotspot.x = hotspot_x;
output_cursor->surface_hotspot.y = hotspot_y;
wl_signal_add(&surface->events.destroy, wl_signal_add(&surface->events.destroy,
&output_cursor->surface_destroy); &output_cursor->surface_destroy);
@ -488,6 +488,10 @@ void wlr_cursor_set_surface(struct wlr_cursor *cur, struct wlr_surface *surface,
&output_cursor->output_commit); &output_cursor->output_commit);
output_cursor->output_commit.notify = output_cursor->output_commit.notify =
output_cursor_output_handle_output_commit; output_cursor_output_handle_output_commit;
}
output_cursor->surface_hotspot.x = hotspot_x;
output_cursor->surface_hotspot.y = hotspot_y;
output_cursor_output_commit_surface(output_cursor); output_cursor_output_commit_surface(output_cursor);
} }