From b61c800ceeeef55301af668904e21a07feb26b4b Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Fri, 5 Feb 2021 15:05:13 +0200 Subject: [PATCH] libkwineffects: Introduce windowExpandedGeometryChanged() This signal can be useful if you want to know when the visible geometry has changed to update cached repaint region during an animation. --- src/effects.cpp | 6 ++++++ src/libkwineffects/kwinanimationeffect.cpp | 19 +++++-------------- src/libkwineffects/kwinanimationeffect.h | 2 +- src/libkwineffects/kwineffects.h | 5 +++++ src/toplevel.cpp | 4 ++++ src/toplevel.h | 5 +++++ 6 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/effects.cpp b/src/effects.cpp index db6344aa37..5ff8882566 100644 --- a/src/effects.cpp +++ b/src/effects.cpp @@ -354,6 +354,9 @@ void EffectsHandlerImpl::setupClientConnections(AbstractClient* c) emit windowFullScreenChanged(c->effectWindow()); } ); + connect(c, &AbstractClient::visibleGeometryChanged, this, [this, c]() { + emit windowExpandedGeometryChanged(c->effectWindow()); + }); } void EffectsHandlerImpl::setupUnmanagedConnections(Unmanaged* u) @@ -364,6 +367,9 @@ void EffectsHandlerImpl::setupUnmanagedConnections(Unmanaged* u) connect(u, &Unmanaged::frameGeometryChanged, this, &EffectsHandlerImpl::slotFrameGeometryChanged); connect(u, &Unmanaged::paddingChanged, this, &EffectsHandlerImpl::slotPaddingChanged); connect(u, &Unmanaged::damaged, this, &EffectsHandlerImpl::slotWindowDamaged); + connect(u, &Unmanaged::visibleGeometryChanged, this, [this, u]() { + emit windowExpandedGeometryChanged(u->effectWindow()); + }); } void EffectsHandlerImpl::reconfigure() diff --git a/src/libkwineffects/kwinanimationeffect.cpp b/src/libkwineffects/kwinanimationeffect.cpp index f0a741272f..9cf23aa331 100644 --- a/src/libkwineffects/kwinanimationeffect.cpp +++ b/src/libkwineffects/kwinanimationeffect.cpp @@ -213,12 +213,8 @@ quint64 AnimationEffect::p_animate( EffectWindow *w, Attribute a, uint meta, int if (!d->m_isInitialized) init(); // needs to ensure the window gets removed if deleted in the same event cycle if (d->m_animations.isEmpty()) { - connect(effects, &EffectsHandler::windowGeometryShapeChanged, - this, &AnimationEffect::_expandedGeometryChanged); - connect(effects, &EffectsHandler::windowStepUserMovedResized, - this, &AnimationEffect::_expandedGeometryChanged); - connect(effects, &EffectsHandler::windowPaddingChanged, - this, &AnimationEffect::_expandedGeometryChanged); + connect(effects, &EffectsHandler::windowExpandedGeometryChanged, + this, &AnimationEffect::_windowExpandedGeometryChanged); } AniMap::iterator it = d->m_animations.find(w); if (it == d->m_animations.end()) @@ -555,12 +551,8 @@ void AnimationEffect::clipWindow(const EffectWindow *w, const AniData &anim, Win void AnimationEffect::disconnectGeometryChanges() { - disconnect(effects, &EffectsHandler::windowGeometryShapeChanged, - this, &AnimationEffect::_expandedGeometryChanged); - disconnect(effects, &EffectsHandler::windowStepUserMovedResized, - this, &AnimationEffect::_expandedGeometryChanged); - disconnect(effects, &EffectsHandler::windowPaddingChanged, - this, &AnimationEffect::_expandedGeometryChanged); + disconnect(effects, &EffectsHandler::windowExpandedGeometryChanged, + this, &AnimationEffect::_windowExpandedGeometryChanged); } @@ -970,9 +962,8 @@ region_creation: d->m_damageDirty = false; } -void AnimationEffect::_expandedGeometryChanged(KWin::EffectWindow *w, const QRect &old) +void AnimationEffect::_windowExpandedGeometryChanged(KWin::EffectWindow *w) { - Q_UNUSED(old) Q_D(AnimationEffect); AniMap::const_iterator entry = d->m_animations.constFind(w); if (entry != d->m_animations.constEnd()) { diff --git a/src/libkwineffects/kwinanimationeffect.h b/src/libkwineffects/kwinanimationeffect.h index f096b7edc8..7e9df62b87 100644 --- a/src/libkwineffects/kwinanimationeffect.h +++ b/src/libkwineffects/kwinanimationeffect.h @@ -389,7 +389,7 @@ private Q_SLOTS: void triggerRepaint(); void _windowClosed( KWin::EffectWindow* w ); void _windowDeleted( KWin::EffectWindow* w ); - void _expandedGeometryChanged(KWin::EffectWindow *w, const QRect &old); + void _windowExpandedGeometryChanged(KWin::EffectWindow *w); private: static QElapsedTimer s_clock; diff --git a/src/libkwineffects/kwineffects.h b/src/libkwineffects/kwineffects.h index 5f104bda54..d3ed399956 100644 --- a/src/libkwineffects/kwineffects.h +++ b/src/libkwineffects/kwineffects.h @@ -1845,6 +1845,11 @@ Q_SIGNALS: */ void sessionStateChanged(); + /** + * This signal is emitted when the visible geometry of a window changed. + */ + void windowExpandedGeometryChanged(KWin::EffectWindow *window); + protected: QVector< EffectPair > loaded_effects; //QHash< QString, EffectFactory* > effect_factories; diff --git a/src/toplevel.cpp b/src/toplevel.cpp index 26b486eec5..0f512451c5 100644 --- a/src/toplevel.cpp +++ b/src/toplevel.cpp @@ -50,6 +50,10 @@ Toplevel::Toplevel() setupCheckScreenConnection(); connect(this, &Toplevel::bufferGeometryChanged, this, &Toplevel::inputTransformationChanged); + connect(this, &Toplevel::paddingChanged, this, &Toplevel::visibleGeometryChanged); + connect(this, &Toplevel::bufferGeometryChanged, this, &Toplevel::visibleGeometryChanged); + connect(this, &Toplevel::frameGeometryChanged, this, &Toplevel::visibleGeometryChanged); + // Only for compatibility reasons, drop in the next major release. connect(this, &Toplevel::frameGeometryChanged, this, &Toplevel::geometryChanged); } diff --git a/src/toplevel.h b/src/toplevel.h index 5d02d4b72e..26fe5c91d8 100644 --- a/src/toplevel.h +++ b/src/toplevel.h @@ -665,6 +665,11 @@ Q_SIGNALS: */ void clientGeometryChanged(KWin::Toplevel *toplevel, const QRect &oldGeometry); + /** + * This signal is emitted when the visible geometry has changed. + */ + void visibleGeometryChanged(); + protected Q_SLOTS: /** * Checks whether the screen number for this Toplevel changed and updates if needed.