summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2018-09-19 11:47:35 -0400
committerRay Strode <rstrode@redhat.com>2018-09-19 12:52:39 -0400
commit82c72f377a91cfa75fed1102f92ff4685c7e74da (patch)
tree51883c2c24a4e511bb86ab2d9d4c10b878f65fc4
parentc2e9e68df72a200a13bd6b5fea88a4c4cd1a0c16 (diff)
downloadgnome-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.js8
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();