dnd: Don't try to restore to parent location if parent got destroyed

The original parent of a dragged actor might have been destroyed after
the drag has been started. When the drag is canceled and _dragOrigParent
is set, the code is trying to get the current position and size of it
when restoring. With a destroyed parent this however would result in a
crash.

This could happen for example when starting a drag on a window preview
while the overview is hiding and then releasing it once the transition
is done.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4024

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1817>
This commit is contained in:
Sebastian Keller 2021-04-17 19:53:43 +02:00 committed by Marge Bot
parent 0e917c3dbf
commit 79acae4176

View File

@ -407,6 +407,10 @@ var _Draggable = class _Draggable {
Main.uiGroup.add_child(this._dragActor); Main.uiGroup.add_child(this._dragActor);
Main.uiGroup.set_child_above_sibling(this._dragActor, null); Main.uiGroup.set_child_above_sibling(this._dragActor, null);
Shell.util_set_hidden_from_pick(this._dragActor, true); Shell.util_set_hidden_from_pick(this._dragActor, true);
this._dragOrigParentDestroyId = this._dragOrigParent.connect('destroy', () => {
this._dragOrigParent = null;
});
} }
this._dragActorDestroyId = this._dragActor.connect('destroy', () => { this._dragActorDestroyId = this._dragActor.connect('destroy', () => {
@ -776,6 +780,11 @@ var _Draggable = class _Draggable {
this._dragActor = null; this._dragActor = null;
} }
if (this._dragOrigParent) {
this._dragOrigParent.disconnect(this._dragOrigParentDestroyId);
this._dragOrigParent = null;
}
this._dragState = DragState.INIT; this._dragState = DragState.INIT;
currentDraggable = null; currentDraggable = null;
} }