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>
This commit is contained in:
+10
-1
@@ -2571,6 +2571,15 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
|
|||||||
input->display->serial = serial;
|
input->display->serial = serial;
|
||||||
input->pointer_enter_serial = serial;
|
input->pointer_enter_serial = serial;
|
||||||
input->pointer_focus = window;
|
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->pointer_surface_has_role = false;
|
||||||
|
|
||||||
input->sx = sx;
|
input->sx = sx;
|
||||||
@@ -5743,7 +5752,6 @@ display_add_input(struct display *d, uint32_t id, int display_seat_version)
|
|||||||
input);
|
input);
|
||||||
}
|
}
|
||||||
|
|
||||||
input->pointer_surface = wl_compositor_create_surface(d->compositor);
|
|
||||||
input->pointer_surface_has_role = false;
|
input->pointer_surface_has_role = false;
|
||||||
|
|
||||||
toytimer_init(&input->cursor_timer, CLOCK_MONOTONIC, d,
|
toytimer_init(&input->cursor_timer, CLOCK_MONOTONIC, d,
|
||||||
@@ -5813,6 +5821,7 @@ input_destroy(struct input *input)
|
|||||||
|
|
||||||
fini_xkb(input);
|
fini_xkb(input);
|
||||||
|
|
||||||
|
if (input->pointer_surface)
|
||||||
wl_surface_destroy(input->pointer_surface);
|
wl_surface_destroy(input->pointer_surface);
|
||||||
|
|
||||||
wl_list_remove(&input->link);
|
wl_list_remove(&input->link);
|
||||||
|
|||||||
Reference in New Issue
Block a user