[fusion-commits] Animation plugin: Changes to 'master' (966570ebf22e7b23c357758d0edc66a892ad8b2a)

cornelius at server.beryl-project.org cornelius at server.beryl-project.org
Tue Jul 3 06:30:18 CEST 2007


New commits:
commit 966570ebf22e7b23c357758d0edc66a892ad8b2a
Merge: fded3610b10d5ec740ca08f1de08efe665568157 e9c33a72332c3f89a616a83d47a9bf2dbb776108
Author: Erkin Bahceci <erkinbah at gmail.com>
Date:   Tue Jul 3 00:29:21 2007 -0400

    Merge branch 'master' of git+ssh://cornelius@git.opencompositing.org/git/fusion/plugins/animation

commit fded3610b10d5ec740ca08f1de08efe665568157
Author: Erkin Bahceci <erkinbah at gmail.com>
Date:   Tue Jul 3 00:24:46 2007 -0400

    Make animations minimize to taskbar. Make RollUp duration consistent.
    Improve curved/horizontal fold animations' open/close behavior.

commit b0cde69bb0c0171d248c277d1acd875c42f9ea37
Author: Erkin Bahceci <erkinbah at gmail.com>
Date:   Tue Jul 3 00:18:56 2007 -0400

    Move some code between files.


 animation-internal.h |   28 +++++++++++++-
 animation.c          |  103 +++++++++++++++++++++++++-------------------------
 animation.xml.in     |    5 +-
 curvedfold.c         |   48 +++++++++++++++++++----
 dream.c              |   18 ++++++++-
 glide.c              |   34 +++++++++++++++-
 horizontalfold.c     |   13 +++++-
 rollup.c             |   12 ++++++
 zoomside.c           |   61 ++++++++++++++++++++----------
 9 files changed, 234 insertions(+), 88 deletions(-)


Modified: fusion/plugins/animation/animation-internal.h
===================================================================
--- fusion/plugins/animation/animation-internal.h
+++ fusion/plugins/animation/animation-internal.h
@@ -632,6 +632,10 @@ AnimEffectProperties *animEffectPropertiesTmp;
 	 (dir) == 2 ? (box).x - (WIN_X(dw) + WIN_W(dw)) : \
 	              ((box).x + (box).width) - WIN_X(dw))
 
+// ratio of perceived length of animation compared to real duration
+// to make it appear to have the same speed with other animation effects
+#define ZOOM_PERCEIVED_T 0.75f
+
 /*
  * Function prototypes
  *
@@ -686,6 +690,16 @@ defaultAnimInit (CompScreen * s,
 				 CompWindow * w);
 
 void
+defaultMinimizeUpdateWindowAttrib(AnimScreen * as,
+								  AnimWindow * aw,
+								  WindowPaintAttrib * wAttrib);
+
+void
+defaultMinimizeUpdateWindowTransform(CompScreen *s,
+									 CompWindow *w,
+									 CompTransform *wTransform);
+
+void
 animDrawWindowGeometry(CompWindow * w);
 
 
@@ -723,6 +737,10 @@ fxCurvedFoldModelStep (CompScreen *s,
 					   CompWindow *w,
 					   float time);
 
+void
+fxFoldUpdateWindowAttrib(AnimScreen * as,
+						 AnimWindow * aw,
+						 WindowPaintAttrib * wAttrib);
 
 /* dodge.c */
 
@@ -947,7 +965,8 @@ void fxRollUpInitGrid (AnimScreen *as,
 					   int *gridWidth,
 					   int *gridHeight);
  
- 
+void fxRollUpAnimInit(CompScreen * s, CompWindow * w);
+
 /* wave.c */
  
 Bool
@@ -969,6 +988,13 @@ fxZoomUpdateWindowTransform(CompScreen *s,
 							CompTransform *wTransform);
 
 void
+fxZoomAnimProgress(AnimScreen * as,
+				   AnimWindow * aw,
+				   float *moveProgress,
+				   float *scaleProgress,
+				   Bool neverSpringy);
+
+void
 fxSidekickInit (CompScreen *s,
 				CompWindow *w);
 

Modified: fusion/plugins/animation/animation.c
===================================================================
--- fusion/plugins/animation/animation.c
+++ fusion/plugins/animation/animation.c
@@ -163,6 +163,19 @@ void defaultAnimInit(CompScreen * s, CompWindow * w)
 					as->opt[ANIM_SCREEN_OPTION_TIME_STEP].value.i);
 }
 
+void defaultMinimizeAnimInit(CompScreen * s, CompWindow * w)
+{
+	ANIM_WINDOW(w);
+
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		aw->animTotalTime /= ZOOM_PERCEIVED_T;
+		aw->animRemainingTime = aw->animTotalTime;
+	}
+	defaultAnimInit(s, w);
+}
+
 static Bool
 defaultLetOthersDrawGeoms (CompScreen *s, CompWindow *w)
 {
@@ -387,6 +400,33 @@ Bool defaultAnimStep(CompScreen * s, CompWindow * w, float time)
 	return TRUE;
 }
 
+void
+defaultMinimizeUpdateWindowAttrib(AnimScreen * as,
+								  AnimWindow * aw,
+								  WindowPaintAttrib * wAttrib)
+{
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		fxZoomUpdateWindowAttrib(as, aw, wAttrib);
+	}
+}
+
+void
+defaultMinimizeUpdateWindowTransform(CompScreen *s,
+									 CompWindow *w,
+									 CompTransform *wTransform)
+{
+	ANIM_WINDOW(w);
+
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		// Zoom to icon
+		fxZoomUpdateWindowTransform(s, w, wTransform);
+	}
+}
+
 
 AnimEffectProperties animEffectProperties[AnimEffectNum] = {
 	// AnimEffectNone
@@ -400,8 +440,9 @@ AnimEffectProperties animEffectProperties[AnimEffectNum] = {
 	{0, 0, drawParticleSystems, fxBurnModelStep, fxBurnInit, 0, 0, 0, 1, 0,
 	 0, 0, 0},
 	// AnimEffectCurvedFold
-	{0, 0, 0, fxCurvedFoldModelStep, 0, fxMagicLampInitGrid, 0, 0, 0, 0, 0,
-	 0, 0},
+	{fxFoldUpdateWindowAttrib, 0, 0, fxCurvedFoldModelStep,
+	 defaultMinimizeAnimInit, fxMagicLampInitGrid, 0, 0, 0, 0, 0,
+	 defaultMinimizeUpdateWindowTransform, 0},
 	// AnimEffectDodge
 	{0, 0, 0, fxDodgeAnimStep, defaultAnimInit, 0, 0, 0, 0, 0,
 	 defaultLetOthersDrawGeoms,
@@ -411,8 +452,9 @@ AnimEffectProperties animEffectProperties[AnimEffectNum] = {
 	 fxDomino3DInit, 0, polygonsStoreClips, polygonsDrawCustomGeometry, 0,
 	 polygonsLinearAnimStepPolygon, 0, 0, 0},
 	// AnimEffectDream
-	{fxDreamUpdateWindowAttrib, 0, 0, fxDreamModelStep, defaultAnimInit,
-	 fxMagicLampInitGrid, 0, 0, 0, 0, 0, 0, 0},
+	{fxDreamUpdateWindowAttrib, 0, 0, fxDreamModelStep, defaultMinimizeAnimInit,
+	 fxMagicLampInitGrid, 0, 0, 0, 0, 0, defaultMinimizeUpdateWindowTransform,
+	 0},
 	// AnimEffectExplode3D
 	{0, polygonsPrePaintWindow, polygonsPostPaintWindow, polygonsAnimStep,
 	 fxExplode3DInit, 0, polygonsStoreClips, polygonsDrawCustomGeometry, 0,
@@ -436,8 +478,9 @@ AnimEffectProperties animEffectProperties[AnimEffectNum] = {
 	 polygonsDeceleratingAnimStepPolygon,
 	 fxGlideLetOthersDrawGeoms, fxGlideUpdateWindowTransform, 0},
 	// AnimEffectHorizontalFolds
-	{0, 0, 0, fxHorizontalFoldsModelStep, 0, fxHorizontalFoldsInitGrid,
-	 0, 0, 0, 0, 0, 0, 0},
+	{fxFoldUpdateWindowAttrib, 0, 0, fxHorizontalFoldsModelStep,
+	 defaultMinimizeAnimInit, fxHorizontalFoldsInitGrid, 0, 0, 0, 0, 0,
+	 defaultMinimizeUpdateWindowTransform, 0},
 	// AnimEffectLeafSpread3D
 	{0, polygonsPrePaintWindow, polygonsPostPaintWindow, polygonsAnimStep,
 	 fxLeafSpread3DInit, 0, polygonsStoreClips, polygonsDrawCustomGeometry, 0,
@@ -453,7 +496,8 @@ AnimEffectProperties animEffectProperties[AnimEffectNum] = {
 	 fxDomino3DInit, 0, polygonsStoreClips, polygonsDrawCustomGeometry, 0,
 	 polygonsLinearAnimStepPolygon, 0, 0, 0},
 	// AnimEffectRollUp
-	{0, 0, 0, fxRollUpModelStep, 0, fxRollUpInitGrid, 0, 0, 1, 0, 0, 0, 0},
+	{0, 0, 0, fxRollUpModelStep, fxRollUpAnimInit, fxRollUpInitGrid, 0, 0, 1,
+	 0, 0, 0, 0},
 	// AnimEffectSidekick
 	{fxZoomUpdateWindowAttrib, 0, 0, defaultAnimStep, fxSidekickInit,
 	 0, 0, 0, 1, 0, defaultLetOthersDrawGeoms, fxZoomUpdateWindowTransform,
@@ -2737,18 +2781,6 @@ static void animHandleEvent(CompDisplay * d, XEvent * event)
 							aw->icon.height = 20;
 						}
 						*/
-						if ((aw->curAnimEffect == AnimEffectZoom || 
-							 aw->curAnimEffect == AnimEffectSidekick) &&
-							(as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterOn ||
-							 as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterMin))
-						{
-							aw->icon.x =
-									WIN_X(w) +
-									WIN_W(w) / 2 - aw->icon.width / 2;
-							aw->icon.y =
-									WIN_Y(w) +
-									WIN_H(w) / 2 - aw->icon.height / 2;
-						}
 
 						aw->unmapCnt++;
 						w->unmapRefCnt++;
@@ -2876,19 +2908,6 @@ static void animHandleEvent(CompDisplay * d, XEvent * event)
 								MAX(aw->icon.width,
 									as->opt[ANIM_SCREEN_OPTION_MAGIC_LAMP_VACUUM_CREATE_START_WIDTH].value.i);
 
-						if ((aw->curAnimEffect == AnimEffectZoom || 
-							 aw->curAnimEffect == AnimEffectSidekick) &&
-							(as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterOn ||
-							 as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterCreate))
-						{
-							aw->icon.x =
-									WIN_X(w) +
-									WIN_W(w) / 2 - aw->icon.width / 2;
-							aw->icon.y =
-									WIN_Y(w) +
-									WIN_H(w) / 2 - aw->icon.height / 2;
-						}
-
 						aw->unmapCnt++;
 						w->unmapRefCnt++;
 
@@ -3221,16 +3240,6 @@ static Bool animDamageWindowRect(CompWindow * w, Bool initial, BoxPtr rect)
 							aw->icon.width = 100;
 							aw->icon.height = 20;
 						}
-						if ((aw->curAnimEffect == AnimEffectZoom || 
-							 aw->curAnimEffect == AnimEffectSidekick) &&
-							(as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterOn ||
-							 as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterMin))
-						{
-							aw->icon.x =
-									WIN_X(w) + WIN_W(w) / 2 - aw->icon.width / 2;
-							aw->icon.y =
-									WIN_Y(w) + WIN_H(w) / 2 - aw->icon.height / 2;
-						}
 						addWindowDamage(w);
 					}
 					else
@@ -3417,14 +3426,6 @@ static Bool animDamageWindowRect(CompWindow * w, Bool initial, BoxPtr rect)
 					aw->icon.x -= aw->icon.width / 2;
 					aw->icon.y -= aw->icon.height / 2;
 
-					if ((aw->curAnimEffect == AnimEffectZoom ||
-						 aw->curAnimEffect == AnimEffectSidekick) &&
-						(as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterOn ||
-						 as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterCreate))
-					{
-						aw->icon.x = WIN_X(w) + WIN_W(w) / 2 - aw->icon.width / 2;
-						aw->icon.y = WIN_Y(w) + WIN_H(w) / 2 - aw->icon.height / 2;
-					}
 					aw->state = IconicState;	// we're doing this as a hack, it may not be necessary
 
 					// Store coords in this viewport to omit 3d effect
@@ -3813,8 +3814,6 @@ static Bool animInitWindow(CompPlugin * p, CompWindow * w)
 	if (!aw)
 		return FALSE;
 
-	//aw->animatedAtom = IPCS_GetAtom(IPCS_OBJECT(w), IPCS_BOOL,
-	//								"IS_ANIMATED", TRUE);
 	aw->model = 0;
 	aw->state = w->state;
 	aw->animRemainingTime = 0;

Modified: fusion/plugins/animation/animation.xml.in
===================================================================
--- fusion/plugins/animation/animation.xml.in
+++ fusion/plugins/animation/animation.xml.in
@@ -3,6 +3,7 @@
 	<plugin name="animation">
 		<_short>Animations</_short>
 		<_long>Use various animations as window effects</_long>
+		<feature>windowanimations</feature>
 		<category>Effects</category>
 		<deps>
 			<relation type="after">
@@ -1005,7 +1006,7 @@
 				<option name="shade_duration" type="float">
 					<_short>Animation Duration</_short>
 					<_long>Shade animation duration in seconds.</_long>
-					<default>0.5</default>
+					<default>0.3</default>
 					<min>0.1</min>
 					<max>10</max>
 					<precision>0.02</precision>
@@ -1471,7 +1472,7 @@
 					<option name="horizontal_folds_num_folds" type="int">
 						<_short>Number of Horizontal Folds</_short>
 						<_long>The number of horizontal folds that occur in the Horizontal Fold animation.</_long>
-						<default>5</default>
+						<default>3</default>
 						<min>1</min>
 						<max>50</max>
 					</option>

Modified: fusion/plugins/animation/curvedfold.c
===================================================================
--- fusion/plugins/animation/curvedfold.c
+++ fusion/plugins/animation/curvedfold.c
@@ -89,7 +89,8 @@ fxCurvedFoldModelStepObject(CompWindow * w,
 		}
 	}
 	else
-	{							// Execute normal mode
+	{
+		// Execute normal mode
 
 		// find position within window borders
 		// (border contents correspond to 0.0-1.0 range)
@@ -108,7 +109,8 @@ fxCurvedFoldModelStepObject(CompWindow * w,
 				(curveMaxAmp -
 				 curveMaxAmp * 4 * relDistToCenter * relDistToCenter);
 		object->position.y =
-				(1 - forwardProgress) * origy + forwardProgress * BORDER_Y(w);
+				(1 - forwardProgress) * origy +
+				forwardProgress * (BORDER_Y(w) + BORDER_H(w) / 2.0);
 	}
 }
 
@@ -122,15 +124,45 @@ Bool fxCurvedFoldModelStep(CompScreen * s, CompWindow * w, float time)
 
 	Model *model = aw->model;
 
-	float forwardProgress = defaultAnimProgress(aw);
+	float forwardProgress;
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		float dummy;
+		fxZoomAnimProgress(as, aw, &forwardProgress, &dummy, TRUE);
+	}
+	else
+		forwardProgress = defaultAnimProgress(aw);
 
 	int i;
 	for (i = 0; i < model->numObjects; i++)
-		fxCurvedFoldModelStepObject(w, 
-									model,
-									&model->objects[i],
-									forwardProgress,
-									as->opt[ANIM_SCREEN_OPTION_CURVED_FOLD_AMP].value.f * WIN_W(w));
+		fxCurvedFoldModelStepObject
+			(w, 
+			 model,
+			 &model->objects[i],
+			 forwardProgress,
+			 as->opt[ANIM_SCREEN_OPTION_CURVED_FOLD_AMP].value.f * WIN_W(w));
 	modelCalcBounds(model);
 	return TRUE;
 }
+
+void
+fxFoldUpdateWindowAttrib(AnimScreen * as,
+						 AnimWindow * aw,
+						 WindowPaintAttrib * wAttrib)
+{
+	if (aw->curWindowEvent == WindowEventCreate ||
+		aw->curWindowEvent == WindowEventClose)
+	{
+		float forwardProgress = defaultAnimProgress(aw);
+
+		wAttrib->opacity =
+			(GLushort) (aw->storedOpacity * (1 - forwardProgress));
+	}
+	else if (aw->curWindowEvent == WindowEventMinimize ||
+			 aw->curWindowEvent == WindowEventUnminimize)
+	{
+		fxZoomUpdateWindowAttrib(as, aw, wAttrib);
+	}
+	// if shade/unshade don't do anything
+}

Modified: fusion/plugins/animation/dream.c
===================================================================
--- fusion/plugins/animation/dream.c
+++ fusion/plugins/animation/dream.c
@@ -63,11 +63,20 @@ Bool fxDreamModelStep(CompScreen * s, CompWindow * w, float time)
 	if (!defaultAnimStep(s, w, time))
 		return FALSE;
 
+	ANIM_SCREEN(s);
 	ANIM_WINDOW(w);
 
 	Model *model = aw->model;
 
-	float forwardProgress = defaultAnimProgress(aw);
+	float forwardProgress;
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		float dummy;
+		fxZoomAnimProgress(as, aw, &forwardProgress, &dummy, TRUE);
+	}
+	else
+		forwardProgress = defaultAnimProgress(aw);
 
 	int i;
 	for (i = 0; i < model->numObjects; i++)
@@ -82,6 +91,13 @@ void
 fxDreamUpdateWindowAttrib(AnimScreen * as,
 						  AnimWindow * aw, WindowPaintAttrib * wAttrib)
 {
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		fxZoomUpdateWindowAttrib(as, aw, wAttrib);
+		return;
+	}
+
 	float forwardProgress = 0;
 	if (aw->animTotalTime - aw->timestep != 0)
 		forwardProgress =

Modified: fusion/plugins/animation/glide.c
===================================================================
--- fusion/plugins/animation/glide.c
+++ fusion/plugins/animation/glide.c
@@ -111,6 +111,13 @@ fxGlideUpdateWindowAttrib(AnimScreen * as,
 
 	// the effect is CompTransform-based
 
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		fxZoomUpdateWindowAttrib(as, aw, wAttrib);
+		return;
+	}
+
 	float forwardProgress = fxGlideAnimProgress(aw);
 
 	wAttrib->opacity = aw->storedOpacity * (1 - forwardProgress);
@@ -153,7 +160,15 @@ fxGlideUpdateWindowTransform(CompScreen *s,
 
 	fxGlideGetParams(as, aw, &finalDistFac, &finalRotAng, &thickness);
 
-	float forwardProgress = fxGlideAnimProgress(aw);
+	float forwardProgress;
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		float dummy;
+		fxZoomAnimProgress(as, aw, &forwardProgress, &dummy, TRUE);
+	}
+	else
+		forwardProgress = fxGlideAnimProgress(aw);
 
 	float finalz = finalDistFac * 0.8 * DEFAULT_Z_CAMERA * s->width;
 
@@ -167,6 +182,13 @@ fxGlideUpdateWindowTransform(CompScreen *s,
 	float rotAngle = finalRotAng * forwardProgress;
 	aw->glideModRotAngle = fmodf(rotAngle + 720, 360.0f);
 
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		// Zoom to icon
+		fxZoomUpdateWindowTransform(s, w, wTransform);
+	}
+
 	// put back to window position
 	matrixTranslate (wTransform, rotAxisOffset.x, rotAxisOffset.y, 0);
 
@@ -191,6 +213,13 @@ void fxGlideInit(CompScreen * s, CompWindow * w)
 	ANIM_SCREEN(s);
 	ANIM_WINDOW(w);
 
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		aw->animTotalTime /= ZOOM_PERCEIVED_T;
+		aw->animRemainingTime = aw->animTotalTime;
+	}
+
 	if (!fxGlideIsPolygonBased(as, aw))
 	{
 		// store window opacity
@@ -238,7 +267,8 @@ void fxGlideInit(CompScreen * s, CompWindow * w)
 	pset->correctPerspective = TRUE;
 }
 
-void fxGlidePrePaintWindow(CompScreen * s, CompWindow * w)
+void fxGlidePrePaintWindow(CompScreen *s,
+						   CompWindow *w)
 {
 	ANIM_SCREEN(s);
 	ANIM_WINDOW(w);

Modified: fusion/plugins/animation/horizontalfold.c
===================================================================
--- fusion/plugins/animation/horizontalfold.c
+++ fusion/plugins/animation/horizontalfold.c
@@ -115,7 +115,8 @@ fxHorizontalFoldsModelStepObject(CompWindow * w,
 				(curveMaxAmp - curveMaxAmp * 4 *
 				 relDistToFoldCenter * relDistToFoldCenter);
 		object->position.y =
-				(1 - forwardProgress) * origy + forwardProgress * BORDER_Y(w);
+				(1 - forwardProgress) * origy +
+				forwardProgress * (BORDER_Y(w) + BORDER_H(w) / 2.0);
 	}
 }
 
@@ -130,7 +131,15 @@ fxHorizontalFoldsModelStep(CompScreen * s, CompWindow * w, float time)
 
 	Model *model = aw->model;
 
-	float forwardProgress = defaultAnimProgress(aw);
+	float forwardProgress;
+	if (aw->curWindowEvent == WindowEventMinimize ||
+		aw->curWindowEvent == WindowEventUnminimize)
+	{
+		float dummy;
+		fxZoomAnimProgress(as, aw, &forwardProgress, &dummy, TRUE);
+	}
+	else
+		forwardProgress = defaultAnimProgress(aw);
 
 	int i;
 	for (i = 0; i < model->numObjects; i++)

Modified: fusion/plugins/animation/rollup.c
===================================================================
--- fusion/plugins/animation/rollup.c
+++ fusion/plugins/animation/rollup.c
@@ -38,6 +38,10 @@
 
 // =====================  Effect: Roll Up  =========================
 
+// ratio of perceived length of animation compared to real duration
+// to make it appear to have the same speed with other animation effects
+#define ROLLUP_PERCEIVED_T 0.6f
+
 void
 fxRollUpInitGrid(AnimScreen * as,
 				 WindowEvent forWindowEvent, int *gridWidth, int *gridHeight)
@@ -138,3 +142,11 @@ Bool fxRollUpModelStep(CompScreen * s, CompWindow * w, float time)
 	modelCalcBounds(model);
 	return TRUE;
 }
+
+void fxRollUpAnimInit(CompScreen * s, CompWindow * w)
+{
+	ANIM_WINDOW(w);
+
+	aw->animTotalTime /= ROLLUP_PERCEIVED_T;
+	aw->animRemainingTime = aw->animTotalTime;
+}

Modified: fusion/plugins/animation/zoomside.c
===================================================================
--- fusion/plugins/animation/zoomside.c
+++ fusion/plugins/animation/zoomside.c
@@ -38,9 +38,9 @@
 
 // =====================  Effect: Zoom and Sidekick  =========================
 
-// spring crossing x (second time it spring movement reaches target)
-#define SPRING_PERCEIVED_T 0.55f
-#define NONSPRING_PERCEIVED_T 0.75f
+// ratio of perceived length of animation compared to real duration
+// to make it appear to have the same speed with other animation effects
+#define SPRINGY_ZOOM_PERCEIVED_T 0.55f
 
 void fxSidekickInit(CompScreen * s, CompWindow * w)
 {
@@ -69,26 +69,41 @@ void fxZoomInit(CompScreen * s, CompWindow * w)
 	ANIM_SCREEN(s);
 	ANIM_WINDOW(w);
 
+	if (as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterOn ||
+		((aw->curWindowEvent == WindowEventMinimize ||
+		  aw->curWindowEvent == WindowEventUnminimize) &&
+		 as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterMin) ||
+		((aw->curWindowEvent == WindowEventCreate ||
+		  aw->curWindowEvent == WindowEventClose) &&
+		 as->opt[ANIM_SCREEN_OPTION_ZOOM_FROM_CENTER].value.i == ZoomFromCenterCreate))
+	{
+		aw->icon.x =
+			WIN_X(w) + WIN_W(w) / 2 - aw->icon.width / 2;
+		aw->icon.y =
+			WIN_Y(w) + WIN_H(w) / 2 - aw->icon.height / 2;
+	}
+
 	// allow extra time for spring damping / deceleration
 	if ((aw->curWindowEvent == WindowEventUnminimize ||
 		 aw->curWindowEvent == WindowEventCreate) &&
 		fxZoomGetSpringiness(as, aw) > 1e-4)
 	{
-		aw->animTotalTime /= SPRING_PERCEIVED_T;
+		aw->animTotalTime /= SPRINGY_ZOOM_PERCEIVED_T;
 	}
 	else
 	{
-		aw->animTotalTime /= NONSPRING_PERCEIVED_T;
+		aw->animTotalTime /= ZOOM_PERCEIVED_T;
 	}
 	aw->animRemainingTime = aw->animTotalTime;
 
 	defaultAnimInit(s, w);
 }
 
-static void fxZoomAnimProgressDir(AnimScreen * as,
-								  AnimWindow * aw,
-								  float *moveProgress,
-								  float *scaleProgress)
+void fxZoomAnimProgress(AnimScreen * as,
+						AnimWindow * aw,
+						float *moveProgress,
+						float *scaleProgress,
+						Bool neverSpringy)
 {
 	float forwardProgress =
 			1 - aw->animRemainingTime /
@@ -130,8 +145,9 @@ static void fxZoomAnimProgressDir(AnimScreen * as,
 		float springiness = 0;
 
 		// springy only when appearing
-		if (aw->curWindowEvent == WindowEventUnminimize ||
-			aw->curWindowEvent == WindowEventCreate)
+		if ((aw->curWindowEvent == WindowEventUnminimize ||
+			 aw->curWindowEvent == WindowEventCreate) &&
+			!neverSpringy)
 		{
 			springiness = fxZoomGetSpringiness(as, aw);
 		}
@@ -139,7 +155,7 @@ static void fxZoomAnimProgressDir(AnimScreen * as,
 		float springyMoveProgress =
 			cos(2*M_PI*pow(x,1)*1.25) * damping * damping2;
 
-		if (springiness > 1e-4)
+		if (springiness > 1e-4f)
 		{
 			if (x > 0.2)
 			{
@@ -185,10 +201,11 @@ fxZoomUpdateWindowAttrib(AnimScreen * as,
 {
 	float forwardProgress;
 	float dummy;
-	fxZoomAnimProgressDir(as, aw, &dummy, &forwardProgress);
-	
+
+	fxZoomAnimProgress(as, aw, &dummy, &forwardProgress, FALSE);
+
 	wAttrib->opacity =
-		(GLushort) (aw->storedOpacity * pow(1 - forwardProgress, 1));
+		(GLushort) (aw->storedOpacity * (1 - forwardProgress));
 }
 
 void
@@ -204,8 +221,7 @@ fxZoomUpdateWindowTransform(CompScreen *s, CompWindow *w, CompTransform *wTransf
 		{aw->icon.x + aw->icon.width / 2.0,
 		 aw->icon.y + aw->icon.height / 2.0};
 	Point winSize =
-		{WIN_W(w) * 1.0,
-		 WIN_H(w) * 1.0};
+		{WIN_W(w), WIN_H(w)};
 	winSize.x = (winSize.x == 0 ? 1 : winSize.x);
 	winSize.y = (winSize.y == 0 ? 1 : winSize.y);
 
@@ -215,12 +231,17 @@ fxZoomUpdateWindowTransform(CompScreen *s, CompWindow *w, CompTransform *wTransf
 
 	if (aw->curAnimEffect == AnimEffectSidekick)
 	{
-		fxZoomAnimProgressDir(as, aw, &moveProgress, &scaleProgress);
+		fxZoomAnimProgress(as, aw, &moveProgress, &scaleProgress, FALSE);
 		rotateProgress = moveProgress;
 	}
+	else if (aw->curAnimEffect == AnimEffectSidekick)
+	{
+		fxZoomAnimProgress(as, aw, &moveProgress, &scaleProgress, FALSE);
+	}
 	else
 	{
-		fxZoomAnimProgressDir(as, aw, &moveProgress, &scaleProgress);
+		// other effects use this for minimization
+		fxZoomAnimProgress(as, aw, &moveProgress, &scaleProgress, TRUE);
 	}
 
 	Point curCenter =
@@ -234,7 +255,7 @@ fxZoomUpdateWindowTransform(CompScreen *s, CompWindow *w, CompTransform *wTransf
 
 	matrixTranslate (wTransform, winCenter.x, winCenter.y, 0);
 	float tx, ty;
-	if (aw->curAnimEffect == AnimEffectSidekick)
+	if (aw->curAnimEffect != AnimEffectZoom)
 	{
 		// avoid parallelogram look
 		float maxScale = MAX(curScale.x, curScale.y);


More information about the commits mailing list