Prevent a race between surface destruction and focus
The Wayland protocol is asynchronous, by the time we destroy a surface, the compositor may have sent a wl_keyboard::enter or wl_pointer::enter events which now point to no surface, yet we receive it after. To prevent this race, we can just ignore any enter event targetting a NULL surface. Fixes #1150.
This commit is contained in:
parent
973bf29622
commit
eb732457ea
@ -49,6 +49,10 @@ static void pointerHandleEnter(void* data,
|
|||||||
wl_fixed_t sx,
|
wl_fixed_t sx,
|
||||||
wl_fixed_t sy)
|
wl_fixed_t sy)
|
||||||
{
|
{
|
||||||
|
// Happens in the case we just destroyed the surface.
|
||||||
|
if (!surface)
|
||||||
|
return;
|
||||||
|
|
||||||
_GLFWwindow* window = wl_surface_get_user_data(surface);
|
_GLFWwindow* window = wl_surface_get_user_data(surface);
|
||||||
|
|
||||||
_glfw.wl.pointerSerial = serial;
|
_glfw.wl.pointerSerial = serial;
|
||||||
@ -280,6 +284,10 @@ static void keyboardHandleEnter(void* data,
|
|||||||
struct wl_surface* surface,
|
struct wl_surface* surface,
|
||||||
struct wl_array* keys)
|
struct wl_array* keys)
|
||||||
{
|
{
|
||||||
|
// Happens in the case we just destroyed the surface.
|
||||||
|
if (!surface)
|
||||||
|
return;
|
||||||
|
|
||||||
_GLFWwindow* window = wl_surface_get_user_data(surface);
|
_GLFWwindow* window = wl_surface_get_user_data(surface);
|
||||||
|
|
||||||
_glfw.wl.keyboardFocus = window;
|
_glfw.wl.keyboardFocus = window;
|
||||||
|
Loading…
Reference in New Issue
Block a user