[workspaces] Don't use a clone for the window drag actor

Using a clone for the drag actor causes the animation into
the final position not to work as expected; instead use
the newly added DND parameters to change the original
drag actors size and opacity. (This reverts the change in
011db9f).

Since we are using the original actor, we have to be careful
not to change it during the drag, so don't actually position
dragged window actors in Workspace.positionWindows().

https://bugzilla.gnome.org/show_bug.cgi?id=613367
This commit is contained in:
Owen W. Taylor 2010-03-19 16:46:08 -04:00
parent 94472ba9fa
commit 2a740448e1

View File

@ -128,53 +128,20 @@ WindowClone.prototype = {
Lang.bind(this, this._onLeave)); Lang.bind(this, this._onLeave));
this._havePointer = false; this._havePointer = false;
this._draggable = DND.makeDraggable(this.actor); this._draggable = DND.makeDraggable(this.actor,
{ dragActorMaxSize: WINDOW_DND_SIZE,
dragActorOpacity: DRAGGING_WINDOW_OPACITY });
this._draggable.connect('drag-begin', Lang.bind(this, this._onDragBegin)); this._draggable.connect('drag-begin', Lang.bind(this, this._onDragBegin));
this._draggable.connect('drag-end', Lang.bind(this, this._onDragEnd)); this._draggable.connect('drag-end', Lang.bind(this, this._onDragEnd));
this._inDrag = false; this.inDrag = false;
this._zooming = false; this._zooming = false;
this._selected = false; this._selected = false;
}, },
getDragActorSource: function() {
return this.actor;
},
getDragActor: function(x, y) {
// We want to shrink the window down to at most THUMBNAIL_SIZE in one direction,
// but animate that transition. The way we do this is to compute our final
// width/height, and set that on the Clone. The clone itself will then scale
// the source. But to animate, we need to compute a scale which will get us
// back to the original size, and then animate down to a scale of 1.
let scale = Math.min(WINDOW_DND_SIZE / this.realWindow.width, WINDOW_DND_SIZE / this.realWindow.height);
let [transformedX, transformedY] = this.actor.get_transformed_position();
let [transformedWidth, transformedHeight] = this.actor.get_transformed_size();
let xOffset = (x - transformedX) * scale;
let yOffset = (y - transformedY) * scale;
let targetWidth = this.realWindow.width * scale;
let targetHeight = this.realWindow.height * scale;
let inverseScale;
if (targetWidth < transformedWidth)
inverseScale = transformedWidth / targetWidth;
else
inverseScale = 1;
let actor = new Clutter.Clone({ source: this.realWindow,
width: targetWidth,
height: targetHeight,
opacity: DRAGGING_WINDOW_OPACITY });
actor.set_scale_full(inverseScale, inverseScale, xOffset, yOffset);
Tweener.addTween(actor, { time: Overview.ANIMATION_TIME,
transition: "easeOutQuad",
scale_x: 1,
scale_y: 1 });
actor._delegate = this;
return actor;
},
setStackAbove: function (actor) { setStackAbove: function (actor) {
this._stackAbove = actor; this._stackAbove = actor;
if (this._inDrag || this._zooming) if (this.inDrag || this._zooming)
// We'll fix up the stack after the drag/zooming // We'll fix up the stack after the drag/zooming
return; return;
this.actor.raise(this._stackAbove); this.actor.raise(this._stackAbove);
@ -204,9 +171,9 @@ WindowClone.prototype = {
if (this._zoomLightbox) if (this._zoomLightbox)
this._zoomLightbox.destroy(); this._zoomLightbox.destroy();
if (this._inDrag) { if (this.inDrag) {
this.emit('drag-end'); this.emit('drag-end');
this._inDrag = false; this.inDrag = false;
} }
this.disconnectAll(); this.disconnectAll();
@ -215,7 +182,7 @@ WindowClone.prototype = {
_onEnter: function (actor, event) { _onEnter: function (actor, event) {
// If the user drags faster than we can follow, he'll end up // If the user drags faster than we can follow, he'll end up
// leaving the window temporarily and then re-entering it // leaving the window temporarily and then re-entering it
if (this._inDrag) if (this.inDrag)
return; return;
this._havePointer = true; this._havePointer = true;
@ -224,7 +191,7 @@ WindowClone.prototype = {
_onLeave: function (actor, event) { _onLeave: function (actor, event) {
// If the user drags faster than we can follow, he'll end up // If the user drags faster than we can follow, he'll end up
// leaving the window temporarily and then re-entering it // leaving the window temporarily and then re-entering it
if (this._inDrag) if (this.inDrag)
return; return;
this._havePointer = false; this._havePointer = false;
@ -324,14 +291,12 @@ WindowClone.prototype = {
}, },
_onDragBegin : function (draggable, time) { _onDragBegin : function (draggable, time) {
this.actor.hide(); this.inDrag = true;
this._inDrag = true;
this.emit('drag-begin'); this.emit('drag-begin');
}, },
_onDragEnd : function (draggable, time, snapback) { _onDragEnd : function (draggable, time, snapback) {
this._inDrag = false; this.inDrag = false;
this.actor.show();
// Most likely, the clone is going to move away from the // Most likely, the clone is going to move away from the
// pointer now. But that won't cause a leave-event, so // pointer now. But that won't cause a leave-event, so
@ -1135,6 +1100,11 @@ Workspace.prototype = {
let mainIndex = this._lookupIndex(metaWindow); let mainIndex = this._lookupIndex(metaWindow);
let overlay = this._windowOverlays[mainIndex]; let overlay = this._windowOverlays[mainIndex];
// Positioning a window currently being dragged must be avoided;
// we'll just leave a blank spot in the layout for it.
if (clone.inDrag)
continue;
let [x, y, scale] = this._computeWindowRelativeLayout(metaWindow, slot); let [x, y, scale] = this._computeWindowRelativeLayout(metaWindow, slot);
if (overlay) if (overlay)