From 1e1e90d0bb9e8e8521fef986fc46317d1e907284 Mon Sep 17 00:00:00 2001 From: Simon Long Date: Tue, 12 Mar 2024 19:53:41 +0000 Subject: [PATCH] Reload cursor theme and size on reconfigure Fixes: #1587 --- include/input/cursor.h | 1 + src/input/cursor.c | 11 ++++++++++- src/seat.c | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/input/cursor.h b/include/input/cursor.h index 752d78a8..70905c0f 100644 --- a/include/input/cursor.h +++ b/include/input/cursor.h @@ -119,6 +119,7 @@ void cursor_update_focus(struct server *server); void cursor_update_image(struct seat *seat); void cursor_init(struct seat *seat); +void cursor_load(struct seat *seat); void cursor_emulate_move_absolute(struct seat *seat, struct wlr_input_device *device, double x, double y, uint32_t time_msec); diff --git a/src/input/cursor.c b/src/input/cursor.c index fd7d0e61..b1a661c1 100644 --- a/src/input/cursor.c +++ b/src/input/cursor.c @@ -1253,12 +1253,15 @@ cursor_frame(struct wl_listener *listener, void *data) } void -cursor_init(struct seat *seat) +cursor_load(struct seat *seat) { const char *xcursor_theme = getenv("XCURSOR_THEME"); const char *xcursor_size = getenv("XCURSOR_SIZE"); uint32_t size = xcursor_size ? atoi(xcursor_size) : 24; + if (seat->xcursor_manager) { + wlr_xcursor_manager_destroy(seat->xcursor_manager); + } seat->xcursor_manager = wlr_xcursor_manager_create(xcursor_theme, size); wlr_xcursor_manager_load(seat->xcursor_manager, 1); @@ -1293,6 +1296,12 @@ cursor_init(struct seat *seat) "Cursor theme is missing cursor names, using fallback"); cursor_names = cursors_x11; } +} + +void +cursor_init(struct seat *seat) +{ + cursor_load(seat); /* Set the initial cursor image so the cursor is visible right away */ cursor_set(seat, LAB_CURSOR_DEFAULT); diff --git a/src/seat.c b/src/seat.c index 1d4a20e7..4ef175d9 100644 --- a/src/seat.c +++ b/src/seat.c @@ -529,6 +529,7 @@ seat_init(struct server *server) seat->input_method_relay = input_method_relay_create(seat); + seat->xcursor_manager = NULL; seat->cursor = wlr_cursor_create(); if (!seat->cursor) { wlr_log(WLR_ERROR, "unable to create cursor"); @@ -571,6 +572,7 @@ seat_reconfigure(struct server *server) { struct seat *seat = &server->seat; struct input *input; + cursor_load(seat); wl_list_for_each(input, &seat->inputs, link) { switch (input->wlr_input_device->type) { case WLR_INPUT_DEVICE_KEYBOARD: