windowManager: Complete interrupted size change effects

Resizing effects are more finicky as other effects, as the actual
animation is delayed until we receive the ::size-changed signal.

However that signal may never be emitted if the window is destroyed
just after starting the size-change effect, in which case the effect
is never completed, blocking mutter from destroying the corresponding
window actor.

Address this by tracking when a resize effect is pending, and complete
the effect when appropriate.

https://gitlab.gnome.org/GNOME/mutter/issues/655
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/815
This commit is contained in:
Florian Müllner 2019-11-08 18:22:40 +01:00
parent cb7374b1ec
commit fc71f8b33a

View File

@ -703,6 +703,7 @@ var WindowManager = class {
this._unminimizing = new Set(); this._unminimizing = new Set();
this._mapping = new Set(); this._mapping = new Set();
this._resizing = new Set(); this._resizing = new Set();
this._resizePending = new Set();
this._destroying = new Set(); this._destroying = new Set();
this._movingWindow = null; this._movingWindow = null;
@ -1464,6 +1465,7 @@ var WindowManager = class {
this._clearAnimationInfo(actor); this._clearAnimationInfo(actor);
}); });
this._resizePending.add(actor);
actor.__animationInfo = { clone: actorClone, actor.__animationInfo = { clone: actorClone,
oldRect: oldFrameRect, oldRect: oldFrameRect,
destroyId: destroyId }; destroyId: destroyId };
@ -1482,6 +1484,7 @@ var WindowManager = class {
let scaleX = targetRect.width / sourceRect.width; let scaleX = targetRect.width / sourceRect.width;
let scaleY = targetRect.height / sourceRect.height; let scaleY = targetRect.height / sourceRect.height;
this._resizePending.delete(actor);
this._resizing.add(actor); this._resizing.add(actor);
// Now scale and fade out the clone // Now scale and fade out the clone
@ -1538,6 +1541,9 @@ var WindowManager = class {
actor.translation_y = 0; actor.translation_y = 0;
this._clearAnimationInfo(actor); this._clearAnimationInfo(actor);
} }
if (this._resizePending.delete(actor))
this._shellwm.completed_size_change(actor);
} }
_hasAttachedDialogs(window, ignoreWindow) { _hasAttachedDialogs(window, ignoreWindow) {