/***************************************************************** KWin - the KDE window manager This file is part of the KDE project. Copyright (C) 2007 Lubos Lunak <l.lunak@kde.org> You can Freely distribute this program under the GNU General Public License. See the file "COPYING" for the exact licensing terms. ******************************************************************/ #include "flame.h" #include <assert.h> #include <kdebug.h> namespace KWin { KWIN_EFFECT( flame, FlameEffect ) void FlameEffect::prePaintScreen( ScreenPrePaintData& data, int time ) { if( !windows.isEmpty()) data.mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS; effects->prePaintScreen(data, time); } void FlameEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time ) { if( windows.contains( w )) { if( windows[ w ] < 1 ) { windows[ w ] += time / 500.; data.setTransformed(); w->enablePainting( EffectWindow::PAINT_DISABLED_BY_DELETE ); data.quads = data.quads.splitAtY( windows[ w ] * w->height()); } else { windows.remove( w ); w->unrefWindow(); } } effects->prePaintWindow( w, data, time ); } void FlameEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ) { if( windows.contains( w )) { WindowQuadList new_quads; double ylimit = windows[ w ] * w->height(); // parts above this are already away foreach( const WindowQuad &quad, data.quads ) { if( quad.bottom() <= ylimit ) continue; new_quads.append( quad ); } if( new_quads.isEmpty()) return; // nothing to paint data.quads = new_quads; } effects->paintWindow( w, mask, region, data ); } void FlameEffect::postPaintWindow( EffectWindow* w ) { if( windows.contains( w )) effects->addRepaint( w->geometry()); // workspace, since the window under it will need painting too effects->postPaintScreen(); } void FlameEffect::windowClosed( EffectWindow* c ) { windows[ c ] = 0; c->refWindow(); } void FlameEffect::windowDeleted( EffectWindow* c ) { windows.remove( c ); } } // namespace