From 96d66def8c004d6a052534af1681d25ccd3fd760 Mon Sep 17 00:00:00 2001 From: Sebastian Keller Date: Wed, 3 Feb 2021 01:59:00 +0100 Subject: [PATCH] dnd: Update actor position after scaling even when animations are off The code to update the actor position based on the cursor and current scale was run in a 'new-frame' handler. This is working fine when animations are enabled, but when they are turned off this does not work. This is because the 'new-frame' signal is emitted before the changes for that frame are applied. So with animations off the position was only ever updated with the starting values. As a result the shrunk actor was not being dragged by the position where it was clicked, but by where it was clicked in the original size, which is likely not even on the shrunk actor. This change now also updates the position in the onComplete handler which gets run with the final scale, even if the duration is 0. Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/1699 Part-of: --- js/ui/dnd.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/js/ui/dnd.js b/js/ui/dnd.js index f6debef58..6f5524107 100644 --- a/js/ui/dnd.js +++ b/js/ui/dnd.js @@ -455,20 +455,29 @@ var _Draggable = class _Draggable { scale_y: scale * origScale, duration: SCALE_ANIMATION_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD, + onComplete: () => { + this._updateActorPosition(origScale, + origDragOffsetX, origDragOffsetY, transX, transY); + }, }); this._dragActor.get_transition('scale-x').connect('new-frame', () => { - let currentScale = this._dragActor.scale_x / origScale; - this._dragOffsetX = currentScale * origDragOffsetX - transX; - this._dragOffsetY = currentScale * origDragOffsetY - transY; - this._dragActor.set_position( - this._dragX + this._dragOffsetX, - this._dragY + this._dragOffsetY); + this._updateActorPosition(origScale, + origDragOffsetX, origDragOffsetY, transX, transY); }); } } } + _updateActorPosition(origScale, origDragOffsetX, origDragOffsetY, transX, transY) { + const currentScale = this._dragActor.scale_x / origScale; + this._dragOffsetX = currentScale * origDragOffsetX - transX; + this._dragOffsetY = currentScale * origDragOffsetY - transY; + this._dragActor.set_position( + this._dragX + this._dragOffsetX, + this._dragY + this._dragOffsetY); + } + _maybeStartDrag(event) { let [stageX, stageY] = event.get_coords();