aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-06-12 11:19:13 +0200
committerAlexander Orzechowski <alex@ozal.ski>2023-06-12 12:42:31 +0000
commit6e8fb5509f2c94d09d4efa0f9b1f40b37bf73863 (patch)
tree9092c31860858f1c78e1e103e6d50aba6baa0bfc
parent05dd08afe569083c24a1c0a416b7dc593a41c14b (diff)
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
-rw-r--r--types/wlr_cursor.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/types/wlr_cursor.c b/types/wlr_cursor.c
index f82d3c79..3d5c8b22 100644
--- a/types/wlr_cursor.c
+++ b/types/wlr_cursor.c
@@ -469,26 +469,30 @@ void wlr_cursor_set_surface(struct wlr_cursor *cur, struct wlr_surface *surface,
continue;
}
- cursor_output_cursor_reset_image(output_cursor);
+ if (surface != output_cursor->surface) {
+ // Only send wl_surface.leave if the surface changes
+ cursor_output_cursor_reset_image(output_cursor);
+
+ output_cursor->surface = surface;
+
+ wl_signal_add(&surface->events.destroy,
+ &output_cursor->surface_destroy);
+ output_cursor->surface_destroy.notify =
+ output_cursor_output_handle_surface_destroy;
+ wl_signal_add(&surface->events.commit,
+ &output_cursor->surface_commit);
+ output_cursor->surface_commit.notify =
+ output_cursor_output_handle_surface_commit;
+
+ wl_signal_add(&output_cursor->output_cursor->output->events.commit,
+ &output_cursor->output_commit);
+ output_cursor->output_commit.notify =
+ output_cursor_output_handle_output_commit;
+ }
- output_cursor->surface = surface;
output_cursor->surface_hotspot.x = hotspot_x;
output_cursor->surface_hotspot.y = hotspot_y;
- wl_signal_add(&surface->events.destroy,
- &output_cursor->surface_destroy);
- output_cursor->surface_destroy.notify =
- output_cursor_output_handle_surface_destroy;
- wl_signal_add(&surface->events.commit,
- &output_cursor->surface_commit);
- output_cursor->surface_commit.notify =
- output_cursor_output_handle_surface_commit;
-
- wl_signal_add(&output_cursor->output_cursor->output->events.commit,
- &output_cursor->output_commit);
- output_cursor->output_commit.notify =
- output_cursor_output_handle_output_commit;
-
output_cursor_output_commit_surface(output_cursor);
}
}