2
* Animation plugin for compiz/beryl
6
* Copyright : (C) 2006 Erkin Bahceci
7
* E-mail : erkinbah@gmail.com
9
* Based on Wobbly and Minimize plugins by
11
* E-mail : davidr@novell.com>
13
* Particle system added by : (C) 2006 Dennis Kasprzyk
14
* E-mail : onestone@beryl-project.org
16
* Beam-Up added by : Florencio Guimaraes
17
* E-mail : florencio@nexcorp.com.br
19
* Hexagon tessellator added by : Mike Slegeir
20
* E-mail : mikeslegeir@mail.utexas.edu>
22
* This program is free software; you can redistribute it and/or
23
* modify it under the terms of the GNU General Public License
24
* as published by the Free Software Foundation; either version 2
25
* of the License, or (at your option) any later version.
27
* This program is distributed in the hope that it will be useful,
28
* but WITHOUT ANY WARRANTY; without even the implied warranty of
29
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30
* GNU General Public License for more details.
32
* You should have received a copy of the GNU General Public License
33
* along with this program; if not, write to the Free Software
34
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
39
// ===================== Effect: Focus Fade =========================
41
FocusFadeAnim::FocusFadeAnim (CompWindow *w,
42
WindowEvent curWindowEvent,
44
const AnimEffect info,
45
const CompRect &icon) :
46
Animation::Animation (w, curWindowEvent, duration, info, icon),
47
RestackAnim::RestackAnim (w, curWindowEvent, duration, info, icon),
48
FadeAnim::FadeAnim (w, curWindowEvent, duration, info, icon)
52
/// Compute the cross-fade opacity to make the effect look good with every
53
/// window opacity value.
55
FocusFadeAnim::computeOpacity (GLushort opacityInt)
57
float progress = 1 - progressLinear ();
58
float opacity = opacityInt / (float)OPAQUE;
61
bool newCopy = overNewCopy ();
63
// flip opacity behavior for the other side of the cross-fade
65
progress = 1 - progress;
67
if (mWindow->alpha () || (newCopy && opacity >= 0.91f))
68
multiplier = progressDecelerate (progress);
69
else if (opacity > 0.94f)
70
multiplier = progressDecelerateCustom (progress, 0.55, 1.32);
71
else if (opacity >= 0.91f && opacity < 0.94f)
72
multiplier = progressDecelerateCustom (progress, 0.62, 0.92);
73
else if (opacity >= 0.89f && opacity < 0.91f)
74
multiplier = progressDecelerate (progress);
75
else if (opacity >= 0.84f && opacity < 0.89f)
76
multiplier = progressDecelerateCustom (progress, 0.64, 0.80);
77
else if (opacity >= 0.79f && opacity < 0.84f)
78
multiplier = progressDecelerateCustom (progress, 0.67, 0.77);
79
else if (opacity >= 0.54f && opacity < 0.79f)
80
multiplier = progressDecelerateCustom (progress, 0.61, 0.69);
82
multiplier = progress;
84
multiplier = 1 - multiplier;
85
float finalOpacity = opacity * multiplier;
86
finalOpacity = MIN (finalOpacity, 1);
87
finalOpacity = MAX (finalOpacity, 0);
89
return (GLushort)(finalOpacity * OPAQUE);
93
FocusFadeAnim::updateAttrib (GLWindowPaintAttrib &attrib)
95
attrib.opacity = computeOpacity (attrib.opacity);
99
FocusFadeAnim::processCandidate (CompWindow *candidateWin,
100
CompWindow *subjectWin,
101
CompRegion &candidateAndSubjectIntersection,
102
int &numSelectedCandidates)
104
AnimWindow *aCandidateWin = AnimWindow::get (candidateWin);
105
RestackPersistentData *data = static_cast<RestackPersistentData *>
106
(aCandidateWin->persistentData["restack"]);
107
data->mWinPassingThrough = subjectWin;
111
FocusFadeAnim::cleanUp (bool closing, bool destructing)
113
// Clear winPassingThrough of each window
114
// that this one was passing through
115
// during focus effect.
116
foreach (CompWindow *w, ::screen->windows ())
118
AnimWindow *aw = AnimWindow::get (w);
119
PersistentDataMap::iterator itData = aw->persistentData.find ("restack");
120
if (itData != aw->persistentData.end ()) // if found
122
RestackPersistentData *data =
123
static_cast<RestackPersistentData *> (itData->second);
124
if (data->mWinPassingThrough == mWindow)
125
data->mWinPassingThrough = 0;
129
RestackAnim::cleanUp (closing, destructing);