various improvements:
- speedup in slide mode: don't paint desktops which are not visible - key events are not dropped during start phase - parts of windows from different desktops are faded in/out during start/stop animation - manual (mouse) rotation is reverted in stop animation - Cube Cap Texture is positioned oriented towards desktop 1 - fix artifacts from different desktops after stop animation svn path=/trunk/KDE/kdebase/workspace/; revision=835534
This commit is contained in:
parent
bba38cb5e9
commit
09a02ee13f
2 changed files with 121 additions and 14 deletions
134
effects/cube.cpp
134
effects/cube.cpp
|
@ -68,6 +68,7 @@ CubeEffect::CubeEffect()
|
||||||
, stop( false )
|
, stop( false )
|
||||||
, reflectionPainting( false )
|
, reflectionPainting( false )
|
||||||
, slide( false )
|
, slide( false )
|
||||||
|
, oldDesktop( 0 )
|
||||||
{
|
{
|
||||||
KConfigGroup conf = effects->effectConfig( "Cube" );
|
KConfigGroup conf = effects->effectConfig( "Cube" );
|
||||||
borderActivate = (ElectricBorder)conf.readEntry( "BorderActivate", (int)ElectricNone );
|
borderActivate = (ElectricBorder)conf.readEntry( "BorderActivate", (int)ElectricNone );
|
||||||
|
@ -416,6 +417,8 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
|
||||||
angle = 90.0 - 90*verticalTimeLine.value();
|
angle = 90.0 - 90*verticalTimeLine.value();
|
||||||
angle += manualVerticalAngle * (1.0-verticalTimeLine.value());
|
angle += manualVerticalAngle * (1.0-verticalTimeLine.value());
|
||||||
}
|
}
|
||||||
|
if( stop )
|
||||||
|
angle *= (1.0 - timeLine.value());
|
||||||
glTranslatef( 0.0, 0.0, -point);
|
glTranslatef( 0.0, 0.0, -point);
|
||||||
glRotatef( angle, 1.0, 0.0, 0.0 );
|
glRotatef( angle, 1.0, 0.0, 0.0 );
|
||||||
glTranslatef( 0.0, 0.0, point);
|
glTranslatef( 0.0, 0.0, point);
|
||||||
|
@ -485,7 +488,7 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
|
||||||
topCapBefore = true;
|
topCapBefore = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( rotating || ( (manualAngle != 0.0) && !stop ) )
|
if( rotating || (manualAngle != 0.0) )
|
||||||
{
|
{
|
||||||
if( manualAngle > internalCubeAngle * 0.5f )
|
if( manualAngle > internalCubeAngle * 0.5f )
|
||||||
{
|
{
|
||||||
|
@ -526,7 +529,10 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
|
||||||
{
|
{
|
||||||
rotationAngle *= -1;
|
rotationAngle *= -1;
|
||||||
}
|
}
|
||||||
rotationAngle += manualAngle * (1.0 - timeLine.value());
|
if( stop )
|
||||||
|
rotationAngle = manualAngle * (1.0 - timeLine.value());
|
||||||
|
else
|
||||||
|
rotationAngle += manualAngle * (1.0 - timeLine.value());
|
||||||
glTranslatef( 0.0, 0.0, -point);
|
glTranslatef( 0.0, 0.0, -point);
|
||||||
glRotatef( rotationAngle, 0.0, 1.0, 0.0 );
|
glRotatef( rotationAngle, 0.0, 1.0, 0.0 );
|
||||||
glTranslatef( 0.0, 0.0, point);
|
glTranslatef( 0.0, 0.0, point);
|
||||||
|
@ -575,11 +581,6 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
|
||||||
desktopIndex = leftSteps + leftSideCounter;
|
desktopIndex = leftSteps + leftSideCounter;
|
||||||
leftSideCounter++;
|
leftSideCounter++;
|
||||||
}
|
}
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef( 0.0, 0.0, -point );
|
|
||||||
glRotatef( internalCubeAngle * desktopIndex, 0.0, 1.0, 0.0 );
|
|
||||||
glTranslatef( xTranslate, yTranslate, point );
|
|
||||||
glScalef( xRight/rect.width(), -yTop/rect.height(), 1.0 );
|
|
||||||
|
|
||||||
// start painting the cube
|
// start painting the cube
|
||||||
painting_desktop = (desktopIndex + frontDesktop )%effects->numberOfDesktops();
|
painting_desktop = (desktopIndex + frontDesktop )%effects->numberOfDesktops();
|
||||||
|
@ -587,6 +588,40 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
|
||||||
{
|
{
|
||||||
painting_desktop = effects->numberOfDesktops();
|
painting_desktop = effects->numberOfDesktops();
|
||||||
}
|
}
|
||||||
|
if( slide )
|
||||||
|
{
|
||||||
|
// only paint required desktops during slide phase
|
||||||
|
if( painting_desktop != frontDesktop )
|
||||||
|
{
|
||||||
|
int leftDesktop = frontDesktop - 1;
|
||||||
|
int rightDesktop = frontDesktop + 1;
|
||||||
|
if( leftDesktop == 0 )
|
||||||
|
leftDesktop = effects->numberOfDesktops();
|
||||||
|
if( rightDesktop > effects->numberOfDesktops() )
|
||||||
|
rightDesktop = 1;
|
||||||
|
if( !desktopChangedWhileRotating && rotationDirection == Left && painting_desktop != rightDesktop )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( desktopChangedWhileRotating && rotationDirection == Left && painting_desktop != leftDesktop )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( !desktopChangedWhileRotating && rotationDirection == Right && painting_desktop != leftDesktop )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( desktopChangedWhileRotating && rotationDirection == Right && painting_desktop != rightDesktop )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef( 0.0, 0.0, -point );
|
||||||
|
glRotatef( internalCubeAngle * desktopIndex, 0.0, 1.0, 0.0 );
|
||||||
|
glTranslatef( xTranslate, yTranslate, point );
|
||||||
|
glScalef( xRight/rect.width(), -yTop/rect.height(), 1.0 );
|
||||||
effects->paintScreen( mask, region, data );
|
effects->paintScreen( mask, region, data );
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
@ -641,7 +676,7 @@ void CubeEffect::paintCap( float left, float right, float z, float zTexture )
|
||||||
if( texturedCaps && effects->numberOfDesktops() > 3 && capTexture )
|
if( texturedCaps && effects->numberOfDesktops() > 3 && capTexture )
|
||||||
{
|
{
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glRotatef( (effects->currentDesktop()-frontDesktop)*angle, 0.0, 1.0, 0.0 );
|
glRotatef( (1-frontDesktop)*angle, 0.0, 1.0, 0.0 );
|
||||||
capTexture->bind();
|
capTexture->bind();
|
||||||
glBegin( GL_QUADS );
|
glBegin( GL_QUADS );
|
||||||
glTexCoord2f( 0.0, 0.0 );
|
glTexCoord2f( 0.0, 0.0 );
|
||||||
|
@ -671,14 +706,44 @@ void CubeEffect::postPaintScreen()
|
||||||
{
|
{
|
||||||
start = false;
|
start = false;
|
||||||
timeLine.setProgress(0.0);
|
timeLine.setProgress(0.0);
|
||||||
|
// more rotations?
|
||||||
|
if( !rotations.empty() )
|
||||||
|
{
|
||||||
|
rotationDirection = rotations.dequeue();
|
||||||
|
rotating = true;
|
||||||
|
// change the curve shape if current shape is not easeInOut
|
||||||
|
if( currentShape != TimeLine::EaseInOutCurve )
|
||||||
|
{
|
||||||
|
// more rotations follow -> linear curve
|
||||||
|
if( !rotations.empty() )
|
||||||
|
{
|
||||||
|
currentShape = TimeLine::LinearCurve;
|
||||||
|
}
|
||||||
|
// last rotation step -> easeOut curve
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentShape = TimeLine::EaseOutCurve;
|
||||||
|
}
|
||||||
|
timeLine.setCurveShape( currentShape );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if there is at least one more rotation, we can change to easeIn
|
||||||
|
if( !rotations.empty() )
|
||||||
|
{
|
||||||
|
currentShape = TimeLine::EaseInCurve;
|
||||||
|
timeLine.setCurveShape( currentShape );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
effects->addRepaintFull();
|
effects->addRepaintFull();
|
||||||
|
return; // schedule_close could have been called, start has to finish first
|
||||||
}
|
}
|
||||||
if( stop )
|
if( stop )
|
||||||
{
|
{
|
||||||
if( timeLine.value() == 1.0 )
|
if( timeLine.value() == 1.0 )
|
||||||
{
|
{
|
||||||
effects->setCurrentDesktop( frontDesktop );
|
|
||||||
stop = false;
|
stop = false;
|
||||||
timeLine.setProgress(0.0);
|
timeLine.setProgress(0.0);
|
||||||
activated = false;
|
activated = false;
|
||||||
|
@ -774,6 +839,7 @@ void CubeEffect::postPaintScreen()
|
||||||
schedule_close = false;
|
schedule_close = false;
|
||||||
if( !slide )
|
if( !slide )
|
||||||
{
|
{
|
||||||
|
effects->setCurrentDesktop( frontDesktop );
|
||||||
stop = true;
|
stop = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -883,15 +949,32 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP
|
||||||
opacity = 1.0 - (1.0 - opacity)*timeLine.value();
|
opacity = 1.0 - (1.0 - opacity)*timeLine.value();
|
||||||
if( reflectionPainting )
|
if( reflectionPainting )
|
||||||
opacity = 0.5 + ( cubeOpacity - 0.5 )*timeLine.value();
|
opacity = 0.5 + ( cubeOpacity - 0.5 )*timeLine.value();
|
||||||
|
// fade in windows belonging to different desktops
|
||||||
|
if( painting_desktop == effects->currentDesktop() && (!w->isOnDesktop( painting_desktop )) )
|
||||||
|
opacity = timeLine.value() * cubeOpacity;
|
||||||
}
|
}
|
||||||
if( stop )
|
if( stop )
|
||||||
{
|
{
|
||||||
opacity = 1.0 - (1.0 - opacity)*( 1.0 - timeLine.value() );
|
opacity = 1.0 - (1.0 - opacity)*( 1.0 - timeLine.value() );
|
||||||
if( reflectionPainting )
|
if( reflectionPainting )
|
||||||
opacity = 0.5 + ( cubeOpacity - 0.5 )*( 1.0 - timeLine.value() );
|
opacity = 0.5 + ( cubeOpacity - 0.5 )*( 1.0 - timeLine.value() );
|
||||||
|
// fade out windows belonging to different desktops
|
||||||
|
if( painting_desktop == effects->currentDesktop() && (!w->isOnDesktop( painting_desktop )) )
|
||||||
|
opacity = cubeOpacity * (1.0 - timeLine.value());
|
||||||
|
}
|
||||||
|
bool slideOpacity = false;
|
||||||
|
// fade in windows from different desktops in first slide step
|
||||||
|
if( slide && painting_desktop == oldDesktop && (!w->isOnDesktop( painting_desktop )) )
|
||||||
|
{
|
||||||
|
opacity = timeLine.value();
|
||||||
|
slideOpacity = true;
|
||||||
|
}
|
||||||
|
// fade out windows from different desktops in last slide step
|
||||||
|
if( slide && rotations.empty() && painting_desktop == effects->currentDesktop() && (!w->isOnDesktop( painting_desktop )) )
|
||||||
|
{
|
||||||
|
opacity = 1.0 - timeLine.value();
|
||||||
|
slideOpacity = true;
|
||||||
}
|
}
|
||||||
if( !slide || (slide && !w->isDesktop()) )
|
|
||||||
data.opacity *= opacity;
|
|
||||||
// check for windows belonging to the previous desktop
|
// check for windows belonging to the previous desktop
|
||||||
int prev_desktop = painting_desktop -1;
|
int prev_desktop = painting_desktop -1;
|
||||||
if( prev_desktop == 0 )
|
if( prev_desktop == 0 )
|
||||||
|
@ -928,6 +1011,28 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP
|
||||||
data.quads = new_quads;
|
data.quads = new_quads;
|
||||||
}
|
}
|
||||||
QRect rect = effects->clientArea( FullArea, effects->activeScreen(), painting_desktop );
|
QRect rect = effects->clientArea( FullArea, effects->activeScreen(), painting_desktop );
|
||||||
|
|
||||||
|
if( start || stop )
|
||||||
|
{
|
||||||
|
// we have to change opacity values for fade in/out of windows which are shown on front-desktop
|
||||||
|
if( prev_desktop == effects->currentDesktop() && w->x() < rect.x() )
|
||||||
|
{
|
||||||
|
if( start )
|
||||||
|
opacity = timeLine.value() * cubeOpacity;
|
||||||
|
if( stop )
|
||||||
|
opacity = cubeOpacity * (1.0 - timeLine.value());
|
||||||
|
}
|
||||||
|
if( next_desktop == effects->currentDesktop() && w->x() + w->width() > rect.x() + rect.width() )
|
||||||
|
{
|
||||||
|
if( start )
|
||||||
|
opacity = timeLine.value() * cubeOpacity;
|
||||||
|
if( stop )
|
||||||
|
opacity = cubeOpacity * (1.0 - timeLine.value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( !slide || (slide && !w->isDesktop()) || slideOpacity )
|
||||||
|
data.opacity *= opacity;
|
||||||
|
|
||||||
if( w->isOnDesktop(painting_desktop) && w->x() < rect.x() )
|
if( w->isOnDesktop(painting_desktop) && w->x() < rect.x() )
|
||||||
{
|
{
|
||||||
WindowQuadList new_quads;
|
WindowQuadList new_quads;
|
||||||
|
@ -1020,7 +1125,7 @@ void CubeEffect::toggle()
|
||||||
|
|
||||||
void CubeEffect::grabbedKeyboardEvent( QKeyEvent* e )
|
void CubeEffect::grabbedKeyboardEvent( QKeyEvent* e )
|
||||||
{
|
{
|
||||||
if( start || stop )
|
if( stop )
|
||||||
return;
|
return;
|
||||||
// taken from desktopgrid.cpp
|
// taken from desktopgrid.cpp
|
||||||
if( e->type() == QEvent::KeyPress )
|
if( e->type() == QEvent::KeyPress )
|
||||||
|
@ -1047,7 +1152,7 @@ void CubeEffect::grabbedKeyboardEvent( QKeyEvent* e )
|
||||||
case Qt::Key_Left:
|
case Qt::Key_Left:
|
||||||
// rotate to previous desktop
|
// rotate to previous desktop
|
||||||
kDebug() << "left";
|
kDebug() << "left";
|
||||||
if( !rotating )
|
if( !rotating && !start )
|
||||||
{
|
{
|
||||||
rotating = true;
|
rotating = true;
|
||||||
rotationDirection = Left;
|
rotationDirection = Left;
|
||||||
|
@ -1060,7 +1165,7 @@ void CubeEffect::grabbedKeyboardEvent( QKeyEvent* e )
|
||||||
case Qt::Key_Right:
|
case Qt::Key_Right:
|
||||||
// rotate to next desktop
|
// rotate to next desktop
|
||||||
kDebug() << "right";
|
kDebug() << "right";
|
||||||
if( !rotating )
|
if( !rotating && !start )
|
||||||
{
|
{
|
||||||
rotating = true;
|
rotating = true;
|
||||||
rotationDirection = Right;
|
rotationDirection = Right;
|
||||||
|
@ -1283,6 +1388,7 @@ void CubeEffect::desktopChanged( int old )
|
||||||
if( activated )
|
if( activated )
|
||||||
return;
|
return;
|
||||||
slide = true;
|
slide = true;
|
||||||
|
oldDesktop = old;
|
||||||
setActive( true );
|
setActive( true );
|
||||||
frontDesktop = old;
|
frontDesktop = old;
|
||||||
rotateToDesktop( effects->currentDesktop() );
|
rotateToDesktop( effects->currentDesktop() );
|
||||||
|
|
|
@ -101,6 +101,7 @@ class CubeEffect
|
||||||
bool stop;
|
bool stop;
|
||||||
bool reflectionPainting;
|
bool reflectionPainting;
|
||||||
bool slide;
|
bool slide;
|
||||||
|
int oldDesktop;
|
||||||
|
|
||||||
// variables for defining the projection matrix
|
// variables for defining the projection matrix
|
||||||
float fovy;
|
float fovy;
|
||||||
|
|
Loading…
Reference in a new issue