From 0deaeceb729e1571633092e04d3b4eb143362282 Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Sat, 10 Sep 2022 19:48:49 +0200 Subject: [PATCH] cursor: Prevent setting the same cursor image twice Possibly fixes #512 Reported-by: @Flrian --- src/cursor.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/cursor.c b/src/cursor.c index 10647e91..c8aa7da4 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -12,6 +12,10 @@ #include "ssd.h" #include "config/mousebind.h" #include "common/scene-helpers.h" +#include "common/zfree.h" + +/* Used to prevent setting the same cursor image twice */ +static char *last_cursor_image = NULL; static bool is_surface(enum ssd_part_type view_area) @@ -99,8 +103,13 @@ request_cursor_notify(struct wl_listener *listener, void *data) * hardware cursor on the output that it's currently on and * continue to do so as the cursor moves between outputs. */ + wlr_cursor_set_surface(seat->cursor, event->surface, - event->hotspot_x, event->hotspot_y); + event->hotspot_x, event->hotspot_y); + + if (last_cursor_image) { + zfree(last_cursor_image); + } } } @@ -197,6 +206,15 @@ process_cursor_resize(struct server *server, uint32_t time) void cursor_set(struct seat *seat, const char *cursor_name) { + if (last_cursor_image) { + if (!strcmp(last_cursor_image, cursor_name)) { + /* Prevent setting the same cursor image twice */ + return; + } + free(last_cursor_image); + } + last_cursor_image = strdup(cursor_name); + wlr_xcursor_manager_set_cursor_image( seat->xcursor_manager, cursor_name, seat->cursor); }