mirror of
https://github.com/brl/mutter.git
synced 2024-12-25 20:32:16 +00:00
data-device: Protect against destroyed dnd-focus clients
When a possible drag dest client crashes during DnD, it may happen we receive first the destroy notification for the data_device, and later the notification for the focus surface. When this happens we unset the drag_focus_data_device first, and later on meta_wayland_drag_grab_set_focus(grab, NULL) we assume it still exists when sending the leave event, leading to mutter crashing right after. So, as we don't receive any ordering guarantees about resource destruction, just prepare the meta_wayland_drag_grab_set_focus() paths for this.
This commit is contained in:
parent
8da5761ffc
commit
ea4979e182
@ -543,6 +543,9 @@ meta_wayland_drag_dest_focus_in (MetaWaylandDataDevice *data_device,
|
||||
struct wl_client *client;
|
||||
wl_fixed_t sx, sy;
|
||||
|
||||
if (!grab->drag_focus_data_device)
|
||||
return;
|
||||
|
||||
client = wl_resource_get_client (surface->resource);
|
||||
display = wl_client_get_display (client);
|
||||
|
||||
@ -563,7 +566,8 @@ meta_wayland_drag_dest_focus_out (MetaWaylandDataDevice *data_device,
|
||||
{
|
||||
MetaWaylandDragGrab *grab = data_device->current_grab;
|
||||
|
||||
wl_data_device_send_leave (grab->drag_focus_data_device);
|
||||
if (grab->drag_focus_data_device)
|
||||
wl_data_device_send_leave (grab->drag_focus_data_device);
|
||||
|
||||
wl_list_remove (&grab->drag_focus_listener.link);
|
||||
grab->drag_focus_data_device = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user