/******************************************************************** KWin - the KDE window manager This file is part of the KDE project. Copyright (C) 2007 Rivo Laks This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ #include "demo_wavywindows.h" #include namespace KWin { KWIN_EFFECT( demo_wavywindows, WavyWindowsEffect ) WavyWindowsEffect::WavyWindowsEffect() { mTimeElapsed = 0.0f; } void WavyWindowsEffect::prePaintScreen( ScreenPrePaintData& data, int time ) { // Adjust elapsed time mTimeElapsed += (time / 1000.0f); // We need to mark the screen windows as transformed. Otherwise the whole // screen won't be repainted, resulting in artefacts data.mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS; effects->prePaintScreen(data, time); } void WavyWindowsEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time ) { // This window will be transformed by the effect data.setTransformed(); // Check if OpenGL compositing is used // Request the window to be divided into cells which are at most 30x30 // pixels big data.quads = data.quads.makeGrid( 30 ); effects->prePaintWindow( w, data, time ); } void WavyWindowsEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ) { // Make sure we have OpenGL compositing and the window is vidible and not a // special window // TODO if( w->isVisible() && !w->isSpecialWindow() ) if( !w->isSpecialWindow() ) { // We have OpenGL compositing and the window has been subdivided // because of our request (in pre-paint pass) // Transform all the vertices to create wavy effect for( int i = 0; i < data.quads.count(); ++i ) for( int j = 0; j < 4; ++j ) { WindowVertex& v = data.quads[ i ][ j ]; v.move( v.x() + sin(mTimeElapsed + v.originalY() / 60 + 0.5f) * 10, v.y() + sin(mTimeElapsed + v.originalX() / 80) * 10 ); } } // Call the next effect. effects->paintWindow( w, mask, region, data ); } void WavyWindowsEffect::postPaintScreen() { // Repaint the workspace so that everything would be repainted next time effects->addRepaintFull(); // Call the next effect. effects->postPaintScreen(); } } // namespace