diff options
author | Ray Strode <rstrode@redhat.com> | 2018-09-19 11:47:35 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2018-09-19 12:52:39 -0400 |
commit | 82c72f377a91cfa75fed1102f92ff4685c7e74da (patch) | |
tree | 51883c2c24a4e511bb86ab2d9d4c10b878f65fc4 | |
parent | c2e9e68df72a200a13bd6b5fea88a4c4cd1a0c16 (diff) | |
download | gnome-shell-wip/fix-drag-lock-up.tar.gz |
dnd: don't try to access destroyed dragActorwip/fix-drag-lock-up
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
-rw-r--r-- | js/ui/dnd.js | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/js/ui/dnd.js b/js/ui/dnd.js index 634a7d6d7..6c563a3ba 100644 --- a/js/ui/dnd.js +++ b/js/ui/dnd.js @@ -506,6 +506,7 @@ var _Draggable = new Lang.Class({ return true; } else this._dragActor.destroy(); + this._dragActor = undefined; } this._dragInProgress = false; @@ -565,8 +566,10 @@ var _Draggable = new Lang.Class({ if (!this._buttonDown) this._dragComplete(); this.emit('drag-end', eventTime, false); - if (!this._dragOrigParent) + if (!this._dragOrigParent) { this._dragActor.destroy(); + this._dragActor = undefined; + } return; } @@ -634,6 +637,7 @@ var _Draggable = new Lang.Class({ dragActor.set_position(this._dragOrigX, this._dragOrigY); } else { dragActor.destroy(); + this._dragActor = undefined; } this.emit('drag-end', eventTime, false); @@ -641,7 +645,7 @@ var _Draggable = new Lang.Class({ }, _dragComplete() { - if (!this._actorDestroyed) + if (this._dragActor) Shell.util_set_hidden_from_pick(this._dragActor, false); this._ungrabEvents(); |