[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