catch geometry updates of moving clients
and bind geometry change signals dynamically REVIEW: 109570 (cherry picked from commit eb2db41304f1ec1e597e9bd282a9c4f0b7dd1e54) Conflicts: kwin/libkwineffects/kwinanimationeffect.cpp
This commit is contained in:
parent
4babec9991
commit
4e1944ef53
2 changed files with 26 additions and 15 deletions
|
@ -58,10 +58,6 @@ void AnimationEffect::init()
|
||||||
* and has pot. started an animation so we have the window in our hash :) */
|
* and has pot. started an animation so we have the window in our hash :) */
|
||||||
connect ( effects, SIGNAL(windowClosed(KWin::EffectWindow*)), SLOT(_windowClosed(KWin::EffectWindow*)) );
|
connect ( effects, SIGNAL(windowClosed(KWin::EffectWindow*)), SLOT(_windowClosed(KWin::EffectWindow*)) );
|
||||||
connect ( effects, SIGNAL(windowDeleted(KWin::EffectWindow*)), SLOT(_windowDeleted(KWin::EffectWindow*)) );
|
connect ( effects, SIGNAL(windowDeleted(KWin::EffectWindow*)), SLOT(_windowDeleted(KWin::EffectWindow*)) );
|
||||||
connect ( effects, SIGNAL(windowGeometryShapeChanged(KWin::EffectWindow*, const QRect&)),
|
|
||||||
SLOT(_expandedGeometryChanged(KWin::EffectWindow*, const QRect&)) );
|
|
||||||
connect ( effects, SIGNAL(windowPaddingChanged(KWin::EffectWindow*, const QRect&)),
|
|
||||||
SLOT(_expandedGeometryChanged(KWin::EffectWindow*, const QRect&)) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AnimationEffect::isActive() const
|
bool AnimationEffect::isActive() const
|
||||||
|
@ -176,6 +172,14 @@ void AnimationEffect::animate( EffectWindow *w, Attribute a, uint meta, int ms,
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_D(AnimationEffect);
|
Q_D(AnimationEffect);
|
||||||
|
if (d->m_animations.isEmpty()) {
|
||||||
|
connect (effects, SIGNAL(windowGeometryShapeChanged( KWin::EffectWindow*, const QRect&)),
|
||||||
|
SLOT(_expandedGeometryChanged( KWin::EffectWindow*, const QRect&)));
|
||||||
|
connect (effects, SIGNAL(windowStepUserMovedResized( KWin::EffectWindow*, const QRect&)),
|
||||||
|
SLOT(_expandedGeometryChanged( KWin::EffectWindow*, const QRect&)));
|
||||||
|
connect (effects, SIGNAL(windowPaddingChanged( KWin::EffectWindow*, const QRect&)),
|
||||||
|
SLOT(_expandedGeometryChanged( KWin::EffectWindow*, const QRect&)));
|
||||||
|
}
|
||||||
AniMap::iterator it = d->m_animations.find(w);
|
AniMap::iterator it = d->m_animations.find(w);
|
||||||
if (it == d->m_animations.end())
|
if (it == d->m_animations.end())
|
||||||
it = d->m_animations.insert(w, QPair<QList<AniData>, QRect>(QList<AniData>(), QRect()));
|
it = d->m_animations.insert(w, QPair<QList<AniData>, QRect>(QList<AniData>(), QRect()));
|
||||||
|
@ -267,17 +271,14 @@ void AnimationEffect::prePaintScreen( ScreenPrePaintData& data, int time )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTICE PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_WITHOUT_FULL_REPAINTS and thus now no flag should be required
|
|
||||||
// ... unless we start to get glitches ;-)
|
|
||||||
// if ( transformed )
|
|
||||||
// data.mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_WITHOUT_FULL_REPAINTS; //PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS;
|
|
||||||
|
|
||||||
// janitorial...
|
// janitorial...
|
||||||
if ( !(d->m_animations.count() || d->m_zombies.isEmpty()) )
|
if (d->m_animations.isEmpty()) {
|
||||||
{
|
disconnectGeometryChanges();
|
||||||
foreach ( EffectWindow *w, d->m_zombies )
|
if (!d->m_zombies.isEmpty()) { // this is actually not supposed to happen
|
||||||
w->unrefWindow();
|
foreach (EffectWindow *w, d->m_zombies)
|
||||||
d->m_zombies.clear();
|
w->unrefWindow();
|
||||||
|
d->m_zombies.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
effects->prePaintScreen(data, time);
|
effects->prePaintScreen(data, time);
|
||||||
|
@ -365,6 +366,16 @@ void AnimationEffect::clipWindow(const EffectWindow *w, const AniData &anim, Win
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AnimationEffect::disconnectGeometryChanges()
|
||||||
|
{
|
||||||
|
disconnect (effects,SIGNAL(windowGeometryShapeChanged( KWin::EffectWindow*, const QRect&)),
|
||||||
|
this, SLOT(_expandedGeometryChanged( KWin::EffectWindow*, const QRect&)));
|
||||||
|
disconnect (effects,SIGNAL(windowStepUserMovedResized( KWin::EffectWindow*, const QRect&)),
|
||||||
|
this, SLOT(_expandedGeometryChanged( KWin::EffectWindow*, const QRect&)));
|
||||||
|
disconnect (effects,SIGNAL(windowPaddingChanged( KWin::EffectWindow*, const QRect&)),
|
||||||
|
this, SLOT(_expandedGeometryChanged( KWin::EffectWindow*, const QRect&)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void AnimationEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time )
|
void AnimationEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time )
|
||||||
{
|
{
|
||||||
|
@ -755,7 +766,6 @@ region_creation:
|
||||||
|
|
||||||
void AnimationEffect::_expandedGeometryChanged(KWin::EffectWindow *w, const QRect &old)
|
void AnimationEffect::_expandedGeometryChanged(KWin::EffectWindow *w, const QRect &old)
|
||||||
{
|
{
|
||||||
Q_UNUSED(old)
|
|
||||||
Q_D(AnimationEffect);
|
Q_D(AnimationEffect);
|
||||||
AniMap::const_iterator entry = d->m_animations.constFind(w);
|
AniMap::const_iterator entry = d->m_animations.constFind(w);
|
||||||
if (entry != d->m_animations.constEnd()) {
|
if (entry != d->m_animations.constEnd()) {
|
||||||
|
|
|
@ -174,6 +174,7 @@ private:
|
||||||
void clipWindow(const EffectWindow *, const AniData &, WindowQuadList &) const;
|
void clipWindow(const EffectWindow *, const AniData &, WindowQuadList &) const;
|
||||||
float interpolated( const AniData&, int i = 0 ) const;
|
float interpolated( const AniData&, int i = 0 ) const;
|
||||||
float progress( const AniData& ) const;
|
float progress( const AniData& ) const;
|
||||||
|
void disconnectGeometryChanges();
|
||||||
void updateLayerRepaints();
|
void updateLayerRepaints();
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void init();
|
void init();
|
||||||
|
|
Loading…
Reference in a new issue