summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Foreman <derek.foreman@collabora.com>2022-09-12 11:52:19 -0500
committerMarius Vlad <marius.vlad@collabora.com>2022-09-14 16:39:26 +0300
commitf88eed4ea8349610ff0b0de774db6a04d457f7aa (patch)
tree30b6f5e4ef227925d37d3cb9edeaac0c5aaceeb7
parent8f8ff5f2945a5cb6348d7453730beb4c4983a2b7 (diff)
downloadweston-f88eed4ea8349610ff0b0de774db6a04d457f7aa.tar.gz
clients: Fix cursors when compositor gives wl_seat before wl_compositor
We have no guarantee that we can create a surface for the pointer at the instant we receive a seat that will (probably eventually) need one. Hold off until we receive an enter event before creating this - at that point we know with certainty that wl_compositor is available, since we've used it to create the surface that was entered. Fixes #659 Signed-off-by: Derek Foreman <derek.foreman@collabora.com> (cherry picked from commit 11ba13d7178d2c2c74373458ab32cb6ab66897b1)
-rw-r--r--clients/window.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/clients/window.c b/clients/window.c
index bc9a8a83..1d98ee04 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -2778,6 +2778,15 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
input->display->serial = serial;
input->pointer_enter_serial = serial;
input->pointer_focus = window;
+
+ /* Some compositors advertise wl_seat before wl_compositor. This
+ * makes it potentially impossible to create the pointer surface
+ * when we bind the seat, so we need to create our pointer surface
+ * now instead.
+ */
+ if (!input->pointer_surface)
+ input->pointer_surface = wl_compositor_create_surface(input->display->compositor);
+
input->pointer_surface_has_role = false;
input->sx = sx;
@@ -5940,7 +5949,6 @@ display_add_input(struct display *d, uint32_t id, int display_seat_version)
input);
}
- input->pointer_surface = wl_compositor_create_surface(d->compositor);
input->pointer_surface_has_role = false;
toytimer_init(&input->cursor_timer, CLOCK_MONOTONIC, d,
@@ -6010,7 +6018,8 @@ input_destroy(struct input *input)
fini_xkb(input);
- wl_surface_destroy(input->pointer_surface);
+ if (input->pointer_surface)
+ wl_surface_destroy(input->pointer_surface);
wl_list_remove(&input->link);
wl_seat_destroy(input->seat);