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:
parent
0e917c3dbf
commit
79acae4176
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user