diff --git a/effects.cpp b/effects.cpp index 5dd773e293..7ed4a559d4 100644 --- a/effects.cpp +++ b/effects.cpp @@ -95,6 +95,8 @@ EffectsHandlerImpl::EffectsHandlerImpl(CompositingType type) , mouse_poll_ref_count(0) , current_paint_effectframe(0) { + Workspace *ws = Workspace::self(); + connect(ws, SIGNAL(currentDesktopChanged(int)), this, SLOT(slotDesktopChanged(int))); reconfigure(); } @@ -334,10 +336,12 @@ void EffectsHandlerImpl::clientGroupItemRemoved(EffectWindow* c, EffectWindow* g ep.second->clientGroupItemRemoved(c, group); } -void EffectsHandlerImpl::desktopChanged(int old) +void EffectsHandlerImpl::slotDesktopChanged(int old) { - foreach (const EffectPair & ep, loaded_effects) - ep.second->desktopChanged(old); + const int newDesktop = Workspace::self()->currentDesktop(); + if (old != 0 && newDesktop != old) { + emit desktopChanged(old, newDesktop); + } } void EffectsHandlerImpl::windowDamaged(EffectWindow* w, const QRect& r) diff --git a/effects.h b/effects.h index 17c92dc3d6..ef09ff0328 100644 --- a/effects.h +++ b/effects.h @@ -38,6 +38,7 @@ namespace KWin class EffectsHandlerImpl : public EffectsHandler { + Q_OBJECT public: EffectsHandlerImpl(CompositingType type); virtual ~EffectsHandlerImpl(); @@ -165,7 +166,6 @@ public: void clientGroupItemSwitched(EffectWindow* from, EffectWindow* to); void clientGroupItemAdded(EffectWindow* from, EffectWindow* to); void clientGroupItemRemoved(EffectWindow* c, EffectWindow* group); - void desktopChanged(int old); void windowDamaged(EffectWindow* w, const QRect& r); void windowGeometryShapeChanged(EffectWindow* w, const QRect& old); void tabBoxAdded(int mode); @@ -191,6 +191,9 @@ public: QList elevatedWindows() const; +protected Q_SLOTS: + void slotDesktopChanged(int old); + protected: KLibrary* findEffectLibrary(KService* service); void effectsChanged(); diff --git a/effects/cube/cubeslide.cpp b/effects/cube/cubeslide.cpp index b23c7a5b0f..2f44fbe6e2 100644 --- a/effects/cube/cubeslide.cpp +++ b/effects/cube/cubeslide.cpp @@ -38,6 +38,7 @@ CubeSlideEffect::CubeSlideEffect() , desktopChangedWhileMoving(false) , progressRestriction(0.0f) { + connect(effects, SIGNAL(desktopChanged(int, int)), this, SLOT(slotDesktopChanged(int, int))); reconfigure(ReconfigureAll); } @@ -417,7 +418,7 @@ void CubeSlideEffect::postPaintScreen() } } -void CubeSlideEffect::desktopChanged(int old) +void CubeSlideEffect::slotDesktopChanged(int old, int current) { if (effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this) return; @@ -499,10 +500,10 @@ void CubeSlideEffect::desktopChanged(int old) } } else { // ignore pager layout - int left = old - effects->currentDesktop(); + int left = old - current; if (left < 0) left = effects->numberOfDesktops() + left; - int right = effects->currentDesktop() - old; + int right = current - old; if (right < 0) right = effects->numberOfDesktops() + right; if (left < right) { diff --git a/effects/cube/cubeslide.h b/effects/cube/cubeslide.h index b1ff4a29ed..6485d3e607 100644 --- a/effects/cube/cubeslide.h +++ b/effects/cube/cubeslide.h @@ -41,10 +41,13 @@ public: virtual void postPaintScreen(); virtual void prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time); virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data); - virtual void desktopChanged(int old); virtual void windowUserMovedResized(EffectWindow* c, bool first, bool last); static bool supported(); + +private Q_SLOTS: + void slotDesktopChanged(int old, int current); + private: enum RotationDirection { Left, diff --git a/effects/fadedesktop/fadedesktop.cpp b/effects/fadedesktop/fadedesktop.cpp index 1858fa7b61..f3f89f36e2 100644 --- a/effects/fadedesktop/fadedesktop.cpp +++ b/effects/fadedesktop/fadedesktop.cpp @@ -30,6 +30,7 @@ KWIN_EFFECT(fadedesktop, FadeDesktopEffect) FadeDesktopEffect::FadeDesktopEffect() : m_fading(false) { + connect(effects, SIGNAL(desktopChanged(int,int)), this, SLOT(slotDesktopChanged(int))); m_timeline.setCurveShape(TimeLine::LinearCurve); reconfigure(ReconfigureAll); } @@ -88,7 +89,7 @@ void FadeDesktopEffect::paintWindow(EffectWindow *w, int mask, QRegion region, W effects->paintWindow(w, mask, region, data); } -void FadeDesktopEffect::desktopChanged(int old) +void FadeDesktopEffect::slotDesktopChanged(int old) { if (effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this) return; diff --git a/effects/fadedesktop/fadedesktop.h b/effects/fadedesktop/fadedesktop.h index 6f39220a1c..ad241bc2d6 100644 --- a/effects/fadedesktop/fadedesktop.h +++ b/effects/fadedesktop/fadedesktop.h @@ -38,7 +38,9 @@ public: virtual void postPaintScreen(); virtual void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, int time); virtual void paintWindow(EffectWindow *w, int mask, QRegion region, WindowPaintData &data); - virtual void desktopChanged(int old); + +private Q_SLOTS: + void slotDesktopChanged(int old); private: bool m_fading; diff --git a/effects/slide/slide.cpp b/effects/slide/slide.cpp index 8e5efaa637..9a27b22e41 100644 --- a/effects/slide/slide.cpp +++ b/effects/slide/slide.cpp @@ -31,6 +31,7 @@ KWIN_EFFECT(slide, SlideEffect) SlideEffect::SlideEffect() : slide(false) { + connect(effects, SIGNAL(desktopChanged(int,int)), this, SLOT(slotDesktopChanged(int,int))); mTimeLine.setCurveShape(TimeLine::EaseInOutCurve); reconfigure(ReconfigureAll); } @@ -168,7 +169,7 @@ QRect SlideEffect::desktopRect(int desktop) const return rect; } -void SlideEffect::desktopChanged(int old) +void SlideEffect::slotDesktopChanged(int old, int current) { if (effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this) return; @@ -198,7 +199,7 @@ void SlideEffect::desktopChanged(int old) currentRegion |= (currentRegion & QRect(w, 0, w, h)).translated(-w, 0); currentRegion |= (currentRegion & QRect(0, h, w, h)).translated(0, -h); } - QRect rect = desktopRect(effects->currentDesktop()); + QRect rect = desktopRect(current); if (currentRegion.contains(rect)) { // current position is in new current desktop (e.g. quickly changing back), // don't do full progress diff --git a/effects/slide/slide.h b/effects/slide/slide.h index d2d55c087f..445b585254 100644 --- a/effects/slide/slide.h +++ b/effects/slide/slide.h @@ -40,7 +40,10 @@ public: virtual void postPaintScreen(); virtual void prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time); virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data); - virtual void desktopChanged(int old); + +private Q_SLOTS: + void slotDesktopChanged(int old, int current); + private: QRect desktopRect(int desktop) const; TimeLine mTimeLine; diff --git a/libkwineffects/kwineffects.cpp b/libkwineffects/kwineffects.cpp index 9c84e17ff9..731b8e9977 100644 --- a/libkwineffects/kwineffects.cpp +++ b/libkwineffects/kwineffects.cpp @@ -179,10 +179,6 @@ void Effect::propertyNotify(EffectWindow* , long) { } -void Effect::desktopChanged(int) -{ -} - void Effect::windowDamaged(EffectWindow*, const QRect&) { } diff --git a/libkwineffects/kwineffects.h b/libkwineffects/kwineffects.h index a894074665..de4be0ab66 100644 --- a/libkwineffects/kwineffects.h +++ b/libkwineffects/kwineffects.h @@ -455,7 +455,6 @@ public: virtual void clientGroupItemAdded(EffectWindow* from, EffectWindow* to); // from merged with to virtual void clientGroupItemRemoved(EffectWindow* c, EffectWindow* group); // c removed from group virtual void windowInputMouseEvent(Window w, QEvent* e); - virtual void desktopChanged(int old); virtual void windowDamaged(EffectWindow* w, const QRect& r); virtual void windowGeometryShapeChanged(EffectWindow* w, const QRect& old); virtual void mouseChanged(const QPoint& pos, const QPoint& oldpos, @@ -832,6 +831,14 @@ public: **/ static KConfigGroup effectConfig(const QString& effectname); +Q_SIGNALS: + /** + * Signal emitted when the current desktop changed. + * @param oldDesktop The previously current desktop + * @param newDesktop The new current desktop + * @since 4.7 + **/ + void desktopChanged(int oldDesktop, int newDesktop); protected: QVector< EffectPair > loaded_effects; diff --git a/workspace.cpp b/workspace.cpp index 922de171fb..8e2d7a2794 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -1463,8 +1463,6 @@ bool Workspace::setCurrentDesktop(int new_desktop) if (old_desktop != 0 && old_desktop != new_desktop && numberOfDesktops() > 1) desktop_change_osd->desktopChanged(old_desktop); - if (effects != NULL && old_desktop != 0 && old_desktop != new_desktop) - static_cast(effects)->desktopChanged(old_desktop); if (compositing()) addRepaintFull();