[gnome-shell] Shrink windows to small previews when dragging
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Shrink windows to small previews when dragging
- Date: Tue, 16 Mar 2010 15:34:45 +0000 (UTC)
commit 011db9f34d448aca63181e52b96d803a14639914
Author: Colin Walters <walters verbum org>
Date: Tue Mar 9 17:31:06 2010 -0500
Shrink windows to small previews when dragging
Hide the original actor during a grab, and create a new
clone. This is easier than trying to ensure we maintain
the state of the original window clone.
https://bugzilla.gnome.org/show_bug.cgi?id=607821
js/ui/workspace.js | 41 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 41 insertions(+), 0 deletions(-)
---
diff --git a/js/ui/workspace.js b/js/ui/workspace.js
index f1e7369..672994f 100644
--- a/js/ui/workspace.js
+++ b/js/ui/workspace.js
@@ -22,6 +22,8 @@ const Tweener = imports.ui.tweener;
const FOCUS_ANIMATION_TIME = 0.15;
+const WINDOW_DND_SIZE = 256;
+
const FRAME_COLOR = new Clutter.Color();
FRAME_COLOR.from_pixel(0xffffffff);
@@ -29,6 +31,8 @@ const SCROLL_SCALE_AMOUNT = 100 / 5;
const ZOOM_OVERLAY_FADE_TIME = 0.15;
+const DRAGGING_WINDOW_OPACITY = 100;
+
// Define a layout scheme for small window counts. For larger
// counts we fall back to an algorithm. We need more schemes here
// unless we have a really good algorithm.
@@ -133,6 +137,41 @@ WindowClone.prototype = {
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) {
this._stackAbove = actor;
if (this._inDrag || this._zooming)
@@ -276,12 +315,14 @@ WindowClone.prototype = {
},
_onDragBegin : function (draggable, time) {
+ this.actor.hide();
this._inDrag = true;
this.emit('drag-begin');
},
_onDragEnd : function (draggable, time, snapback) {
this._inDrag = false;
+ this.actor.show();
// Most likely, the clone is going to move away from the
// pointer now. But that won't cause a leave-event, so
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]