dnd: don't try to access destroyed dragActor
The dragComplete handler incorrectly checks this._actorDestroyed to see if the drag actor is destroyed. The drag actor may not be the same as the main actor. The end result is an exception in drop handling, leading to a shell lockup. This commit changes the code to always set this._dragActor to undefined when it's destroyed, and check for that condition instead of this._actorDestroyed in the dragComplete handler. Closes https://gitlab.gnome.org/GNOME/gnome-shell/issues/577
This commit is contained in:
parent
c2e9e68df7
commit
82c72f377a
@ -506,6 +506,7 @@ var _Draggable = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
} else
|
} else
|
||||||
this._dragActor.destroy();
|
this._dragActor.destroy();
|
||||||
|
this._dragActor = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._dragInProgress = false;
|
this._dragInProgress = false;
|
||||||
@ -565,8 +566,10 @@ var _Draggable = new Lang.Class({
|
|||||||
if (!this._buttonDown)
|
if (!this._buttonDown)
|
||||||
this._dragComplete();
|
this._dragComplete();
|
||||||
this.emit('drag-end', eventTime, false);
|
this.emit('drag-end', eventTime, false);
|
||||||
if (!this._dragOrigParent)
|
if (!this._dragOrigParent) {
|
||||||
this._dragActor.destroy();
|
this._dragActor.destroy();
|
||||||
|
this._dragActor = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -634,6 +637,7 @@ var _Draggable = new Lang.Class({
|
|||||||
dragActor.set_position(this._dragOrigX, this._dragOrigY);
|
dragActor.set_position(this._dragOrigX, this._dragOrigY);
|
||||||
} else {
|
} else {
|
||||||
dragActor.destroy();
|
dragActor.destroy();
|
||||||
|
this._dragActor = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.emit('drag-end', eventTime, false);
|
this.emit('drag-end', eventTime, false);
|
||||||
@ -641,7 +645,7 @@ var _Draggable = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_dragComplete() {
|
_dragComplete() {
|
||||||
if (!this._actorDestroyed)
|
if (this._dragActor)
|
||||||
Shell.util_set_hidden_from_pick(this._dragActor, false);
|
Shell.util_set_hidden_from_pick(this._dragActor, false);
|
||||||
|
|
||||||
this._ungrabEvents();
|
this._ungrabEvents();
|
||||||
|
Loading…
Reference in New Issue
Block a user