diff --git a/kwin/effects/magiclamp/magiclamp.cpp b/kwin/effects/magiclamp/magiclamp.cpp index e1572cb..44406a2 100644 --- a/kwin/effects/magiclamp/magiclamp.cpp +++ b/kwin/effects/magiclamp/magiclamp.cpp @@ -301,6 +301,11 @@ void MagicLampEffect::postPaintScreen() effects->postPaintScreen(); } +void MagicLampEffect::windowDeleted( EffectWindow* w ) +{ + mTimeLineWindows.remove( w ); +} + void MagicLampEffect::windowMinimized( EffectWindow* w ) { mTimeLineWindows[w].setCurveShape(TimeLine::LinearCurve); diff --git a/kwin/effects/magiclamp/magiclamp.h b/kwin/effects/magiclamp/magiclamp.h index a7f134d..84bfa7e 100644 --- a/kwin/effects/magiclamp/magiclamp.h +++ b/kwin/effects/magiclamp/magiclamp.h @@ -38,6 +38,7 @@ class MagicLampEffect virtual void paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ); virtual void postPaintScreen(); + virtual void windowDeleted( EffectWindow* c ); virtual void windowMinimized( EffectWindow* c ); virtual void windowUnminimized( EffectWindow* c ); diff --git a/kwin/effects/minimizeanimation/minimizeanimation.cpp b/kwin/effects/minimizeanimation/minimizeanimation.cpp index 9432504..905a64b 100644 --- a/kwin/effects/minimizeanimation/minimizeanimation.cpp +++ b/kwin/effects/minimizeanimation/minimizeanimation.cpp @@ -39,34 +39,39 @@ void MinimizeAnimationEffect::prePaintScreen( ScreenPrePaintData& data, int time // whole screen won't be repainted, resulting in artefacts data.mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS; - effects->prePaintScreen(data, time); - } - -void MinimizeAnimationEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time ) - { - if( mTimeLineWindows.contains( w )) + QHash< EffectWindow*, TimeLine >::iterator entry = mTimeLineWindows.begin(); + bool erase = false; + while( entry != mTimeLineWindows.end() ) { - if( w->isMinimized() ) + TimeLine &timeline = entry.value(); + if( entry.key()->isMinimized() ) { - mTimeLineWindows[w].addTime(time); - if( mTimeLineWindows[w].progress() >= 1.0f ) - mTimeLineWindows.remove( w ); + timeline.addTime(time); + erase = (timeline.progress() >= 1.0f); } else { - mTimeLineWindows[w].removeTime(time); - if( mTimeLineWindows[w].progress() <= 0.0f ) - mTimeLineWindows.remove( w ); + timeline.removeTime(time); + erase = (timeline.progress() <= 0.0f); } + if( erase ) + entry = mTimeLineWindows.erase( entry ); + else + ++entry; + } - // Schedule window for transformation if the animation is still in - // progress - if( mTimeLineWindows.contains( w )) - { - // We'll transform this window - data.setTransformed(); - w->enablePainting( EffectWindow::PAINT_DISABLED_BY_MINIMIZE ); - } + effects->prePaintScreen(data, time); + } + +void MinimizeAnimationEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time ) + { + // Schedule window for transformation if the animation is still in + // progress + if( mTimeLineWindows.contains( w ) ) + { + // We'll transform this window + data.setTransformed(); + w->enablePainting( EffectWindow::PAINT_DISABLED_BY_MINIMIZE ); } effects->prePaintWindow( w, data, time ); @@ -74,10 +79,11 @@ void MinimizeAnimationEffect::prePaintWindow( EffectWindow* w, WindowPrePaintDat void MinimizeAnimationEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ) { - if( mTimeLineWindows.contains( w )) + QHash< EffectWindow*, TimeLine >::const_iterator entry = mTimeLineWindows.find(w); + if( entry != mTimeLineWindows.constEnd() ) { // 0 = not minimized, 1 = fully minimized - double progress = mTimeLineWindows[w].value(); + double progress = entry->value(); QRect geo = w->geometry(); QRect icon = w->iconGeometry(); @@ -107,18 +113,25 @@ void MinimizeAnimationEffect::postPaintScreen() effects->postPaintScreen(); } +void MinimizeAnimationEffect::windowDeleted( EffectWindow* w ) + { + mTimeLineWindows.remove( w ); + } + void MinimizeAnimationEffect::windowMinimized( EffectWindow* w ) { - mTimeLineWindows[w].setCurveShape(TimeLine::EaseInCurve); - mTimeLineWindows[w].setDuration( animationTime( 250 )); - mTimeLineWindows[w].setProgress(0.0f); + TimeLine &timeline = mTimeLineWindows[w]; + timeline.setCurveShape(TimeLine::EaseInCurve); + timeline.setDuration( animationTime( 250 )); + timeline.setProgress(0.0f); } void MinimizeAnimationEffect::windowUnminimized( EffectWindow* w ) { - mTimeLineWindows[w].setCurveShape(TimeLine::EaseOutCurve); - mTimeLineWindows[w].setDuration( animationTime( 250 )); - mTimeLineWindows[w].setProgress(1.0f); + TimeLine &timeline = mTimeLineWindows[w]; + timeline.setCurveShape(TimeLine::EaseOutCurve); + timeline.setDuration( animationTime( 250 )); + timeline.setProgress(1.0f); } } // namespace diff --git a/kwin/effects/minimizeanimation/minimizeanimation.h b/kwin/effects/minimizeanimation/minimizeanimation.h index d8abd8c..96e4578 100644 --- a/kwin/effects/minimizeanimation/minimizeanimation.h +++ b/kwin/effects/minimizeanimation/minimizeanimation.h @@ -42,6 +42,7 @@ class MinimizeAnimationEffect virtual void paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ); virtual void postPaintScreen(); + virtual void windowDeleted( EffectWindow* c ); virtual void windowMinimized( EffectWindow* c ); virtual void windowUnminimized( EffectWindow* c );