windowManager: Show window resizing clone on "size-changed"

When a window is being resized by the compositor, with Wayland the
compositor first asks the window to change its size and emits the
"size-change" signal, and then emits the "size-changed" signal after
the window acknowledges the new size. To show a fancy resize animation,
gnome-shell creates a "screenshot" of the resizing window on the
"size-change" signal, and later animates that "screenshot" to the new
window size on the "size-changed" signal.

Now if a client is not responding to our requests asking it to change
its size, we get a "size-change" signal and start showing the
window-clone, but never a "size-changed" signal, animating and hiding
the clone again. This causes a so called "ghost window" that is shown
above everything else and never disappears again.

To fix that, start showing the window clone once we get the
"size-changed" signal instead of the "size-change" signal. This makes
sure the window actually updates its size and the clone is going to be
hidden again.

Fixes https://gitlab.gnome.org/GNOME/mutter/issues/1078

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/1055
This commit is contained in:
Jonas Dreßler 2020-02-28 16:43:48 +01:00 committed by Florian Müllner
parent 648179a2db
commit da05c85f3c

View File

@ -1259,7 +1259,6 @@ var WindowManager = class {
actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
actorClone.set_position(oldFrameRect.x, oldFrameRect.y); actorClone.set_position(oldFrameRect.x, oldFrameRect.y);
actorClone.set_size(oldFrameRect.width, oldFrameRect.height); actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
Main.uiGroup.add_actor(actorClone);
if (this._clearAnimationInfo(actor)) if (this._clearAnimationInfo(actor))
this._shellwm.completed_size_change(actor); this._shellwm.completed_size_change(actor);
@ -1290,6 +1289,8 @@ var WindowManager = class {
this._resizePending.delete(actor); this._resizePending.delete(actor);
this._resizing.add(actor); this._resizing.add(actor);
Main.uiGroup.add_child(actorClone);
// Now scale and fade out the clone // Now scale and fade out the clone
actorClone.ease({ actorClone.ease({
x: targetRect.x, x: targetRect.x,