diff --git a/effects/slidingpopups/slidingpopups.cpp b/effects/slidingpopups/slidingpopups.cpp
index 1b9a566d05..365a0e9e2c 100644
--- a/effects/slidingpopups/slidingpopups.cpp
+++ b/effects/slidingpopups/slidingpopups.cpp
@@ -21,7 +21,6 @@ along with this program. If not, see .
#include "slidingpopups.h"
#include "slidingpopupsconfig.h"
-#include
#include
#include
@@ -70,16 +69,18 @@ void SlidingPopupsEffect::reconfigure(ReconfigureFlags flags)
{
Q_UNUSED(flags)
SlidingPopupsConfig::self()->read();
- mFadeInTime = animationTime(SlidingPopupsConfig::slideInTime() != 0 ? SlidingPopupsConfig::slideInTime() : 150);
- mFadeOutTime = animationTime(SlidingPopupsConfig::slideOutTime() != 0 ? SlidingPopupsConfig::slideOutTime() : 250);
- QHash< const EffectWindow*, QTimeLine* >::iterator it = mAppearingWindows.begin();
+ mFadeInTime = std::chrono::milliseconds(
+ static_cast(animationTime(SlidingPopupsConfig::slideInTime() != 0 ? SlidingPopupsConfig::slideInTime() : 150)));
+ mFadeOutTime = std::chrono::milliseconds(
+ static_cast(animationTime(SlidingPopupsConfig::slideOutTime() != 0 ? SlidingPopupsConfig::slideOutTime() : 250)));
+ QHash< const EffectWindow*, TimeLine >::iterator it = mAppearingWindows.begin();
while (it != mAppearingWindows.end()) {
- it.value()->setDuration(animationTime(mFadeInTime));
+ (*it).setDuration(mFadeInTime);
++it;
}
it = mDisappearingWindows.begin();
while (it != mDisappearingWindows.end()) {
- it.value()->setDuration(animationTime(mFadeOutTime));
+ (*it).setDuration(mFadeOutTime);
++it;
}
QHash< const EffectWindow*, Data >::iterator wIt = mWindowsData.begin();
@@ -97,16 +98,18 @@ void SlidingPopupsEffect::prePaintScreen(ScreenPrePaintData& data, int time)
void SlidingPopupsEffect::prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time)
{
+ const std::chrono::milliseconds delta(time);
+
qreal progress = 1.0;
bool appearing = false;
if (mAppearingWindows.contains(w)) {
- mAppearingWindows[ w ]->setCurrentTime(mAppearingWindows[ w ]->currentTime() + time);
- if (mAppearingWindows[ w ]->currentValue() < 1) {
+ mAppearingWindows[ w ].update(delta);
+ if (!mAppearingWindows[ w ].done()) {
data.setTransformed();
- progress = mAppearingWindows[ w ]->currentValue();
+ progress = mAppearingWindows[ w ].value();
appearing = true;
} else {
- delete mAppearingWindows.take(w);
+ mAppearingWindows.remove(w);
w->setData(WindowForceBlurRole, false);
if (m_backgroundContrastForced.contains(w) && w->hasAlpha() &&
w->data(WindowForceBackgroundContrastRole).toBool()) {
@@ -116,14 +119,14 @@ void SlidingPopupsEffect::prePaintWindow(EffectWindow* w, WindowPrePaintData& da
}
} else if (mDisappearingWindows.contains(w)) {
- mDisappearingWindows[ w ]->setCurrentTime(mDisappearingWindows[ w ]->currentTime() + time);
- progress = mDisappearingWindows[ w ]->currentValue();
+ mDisappearingWindows[ w ].update(delta);
+ progress = mDisappearingWindows[ w ].value();
- if (progress != 1.0) {
+ if (!mDisappearingWindows[ w ].done()) {
data.setTransformed();
w->enablePainting(EffectWindow::PAINT_DISABLED | EffectWindow::PAINT_DISABLED_BY_DELETE);
} else {
- delete mDisappearingWindows.take(w);
+ mDisappearingWindows.remove(w);
w->addRepaintFull();
if (w->isDeleted()) {
w->unrefWindow();
@@ -215,10 +218,10 @@ void SlidingPopupsEffect::paintWindow(EffectWindow* w, int mask, QRegion region,
if (animating) {
qreal progress;
if (appearing)
- progress = 1.0 - mAppearingWindows[ w ]->currentValue();
+ progress = 1.0 - mAppearingWindows[ w ].value();
else {
if (mDisappearingWindows.contains(w))
- progress = mDisappearingWindows[ w ]->currentValue();
+ progress = mDisappearingWindows[ w ].value();
else
progress = 1.0;
}
@@ -306,18 +309,14 @@ void SlidingPopupsEffect::startForShow(EffectWindow *w)
w->setData(WindowForceBackgroundContrastRole, QVariant(true));
m_backgroundContrastForced.append(w);
}
- auto it = mDisappearingWindows.find(w);
- if (it != mDisappearingWindows.end()) {
- delete it.value();
- mDisappearingWindows.erase(it);
- }
- it = mAppearingWindows.find(w);
- if (it != mAppearingWindows.end()) {
- delete it.value();
- mAppearingWindows.erase(it);
- }
- mAppearingWindows.insert(w, new QTimeLine(mWindowsData[ w ].fadeInDuration, this));
- mAppearingWindows[ w ]->setCurveShape(QTimeLine::EaseInOutCurve);
+
+ mDisappearingWindows.remove(w);
+
+ TimeLine &timeLine = mAppearingWindows[ w ];
+ timeLine.reset();
+ timeLine.setDirection(TimeLine::Forward);
+ timeLine.setDuration(mWindowsData[ w ].fadeInDuration);
+ timeLine.setEasingCurve(QEasingCurve::InOutSine);
w->setData(WindowAddedGrabRole, QVariant::fromValue(static_cast(this)));
w->setData(WindowClosedGrabRole, QVariant::fromValue(static_cast(this)));
@@ -333,17 +332,16 @@ void SlidingPopupsEffect::slotWindowClosed(EffectWindow* w)
if (w->isDeleted()) {
w->refWindow();
}
- auto it = mAppearingWindows.find(w);
- if (it != mAppearingWindows.end()) {
- delete it.value();
- mAppearingWindows.erase(it);
- }
- // could be already running, better check
- if (mDisappearingWindows.contains(w)) {
+
+ mAppearingWindows.remove(w);
+
+ TimeLine &timeLine = mDisappearingWindows[ w ];
+ if (timeLine.running()) {
return;
}
- mDisappearingWindows.insert(w, new QTimeLine(mWindowsData[ w ].fadeOutDuration, this));
- mDisappearingWindows[ w ]->setCurveShape(QTimeLine::EaseInOutCurve);
+ timeLine.setDirection(TimeLine::Forward);
+ timeLine.setDuration(mWindowsData[ w ].fadeOutDuration);
+ timeLine.setEasingCurve(QEasingCurve::InOutSine);
// Tell other windowClosed() effects to ignore this window
w->setData(WindowClosedGrabRole, QVariant::fromValue(static_cast(this)));
@@ -359,8 +357,8 @@ void SlidingPopupsEffect::slotWindowClosed(EffectWindow* w)
void SlidingPopupsEffect::slotWindowDeleted(EffectWindow* w)
{
- delete mAppearingWindows.take(w);
- delete mDisappearingWindows.take(w);
+ mAppearingWindows.remove(w);
+ mDisappearingWindows.remove(w);
mWindowsData.remove(w);
effects->addRepaint(w->expandedGeometry());
}
@@ -377,8 +375,8 @@ void SlidingPopupsEffect::slotPropertyNotify(EffectWindow* w, long a)
if (w->data(WindowClosedGrabRole).value() == this) {
w->setData(WindowClosedGrabRole, QVariant());
}
- delete mAppearingWindows.take(w);
- delete mDisappearingWindows.take(w);
+ mAppearingWindows.remove(w);
+ mDisappearingWindows.remove(w);
mWindowsData.remove(w);
return;
}
@@ -390,20 +388,20 @@ void SlidingPopupsEffect::slotPropertyNotify(EffectWindow* w, long a)
//custom duration
animData.slideLength = 0;
if (data.length() >= (int)(sizeof(uint32_t) * 3)) {
- animData.fadeInDuration = d[2];
+ animData.fadeInDuration = std::chrono::milliseconds(d[2]);
if (data.length() >= (int)(sizeof(uint32_t) * 4))
//custom fadein
- animData.fadeOutDuration = d[3];
+ animData.fadeOutDuration = std::chrono::milliseconds(d[3]);
else
//custom fadeout
- animData.fadeOutDuration = d[2];
+ animData.fadeOutDuration = std::chrono::milliseconds(d[2]);
//do we want an actual slide?
if (data.length() >= (int)(sizeof(uint32_t) * 5))
animData.slideLength = d[5];
} else {
- animData.fadeInDuration = animationTime(mFadeInTime);
- animData.fadeOutDuration = animationTime(mFadeOutTime);
+ animData.fadeInDuration = mFadeInTime;
+ animData.fadeOutDuration = mFadeOutTime;
}
mWindowsData[ w ] = animData;
setupAnimData(w);
@@ -482,8 +480,8 @@ void SlidingPopupsEffect::slotWaylandSlideOnShowChanged(EffectWindow* w)
break;
}
animData.slideLength = 0;
- animData.fadeInDuration = animationTime(mFadeInTime);
- animData.fadeOutDuration = animationTime(mFadeOutTime);
+ animData.fadeInDuration = mFadeInTime;
+ animData.fadeOutDuration = mFadeOutTime;
mWindowsData[ w ] = animData;
setupAnimData(w);
diff --git a/effects/slidingpopups/slidingpopups.h b/effects/slidingpopups/slidingpopups.h
index 3f6bf7f83e..c5dc005a08 100644
--- a/effects/slidingpopups/slidingpopups.h
+++ b/effects/slidingpopups/slidingpopups.h
@@ -24,8 +24,6 @@ along with this program. If not, see .
// Include with base class for effects.
#include
-class QTimeLine;
-
namespace KWin
{
@@ -55,10 +53,10 @@ public:
// for properties
int fadeInTime() const {
- return mFadeInTime;
+ return mFadeInTime.count();
}
int fadeOutTime() const {
- return mFadeOutTime;
+ return mFadeOutTime.count();
}
public Q_SLOTS:
void slotWindowAdded(KWin::EffectWindow *c);
@@ -80,8 +78,8 @@ private:
int start; //point in screen coordinates where the window starts
//to animate, from decides if this point is an x or an y
Position from;
- int fadeInDuration;
- int fadeOutDuration;
+ std::chrono::milliseconds fadeInDuration;
+ std::chrono::milliseconds fadeOutDuration;
int slideLength;
};
long mAtom;
@@ -90,12 +88,12 @@ private:
// WindowBackgroundContrastForcedRole flag, so we can remove it later.
// It doesn't matter for disappearing windows, they'll be deleted anyway.
QList< const EffectWindow* > m_backgroundContrastForced;
- QHash< const EffectWindow*, QTimeLine* > mAppearingWindows;
- QHash< const EffectWindow*, QTimeLine* > mDisappearingWindows;
+ QHash< const EffectWindow*, TimeLine > mAppearingWindows;
+ QHash< const EffectWindow*, TimeLine > mDisappearingWindows;
QHash< const EffectWindow*, Data > mWindowsData;
int mSlideLength;
- int mFadeInTime;
- int mFadeOutTime;
+ std::chrono::milliseconds mFadeInTime;
+ std::chrono::milliseconds mFadeOutTime;
};
} // namespace