diff --git a/effects.cpp b/effects.cpp --- a/effects.cpp +++ b/effects.cpp @@ -338,6 +338,23 @@ emit windowHidden(c->effectWindow()); } ); + connect(c, &AbstractClient::keepAboveChanged, this, + [this, c](bool above) { + Q_UNUSED(above) + emit windowKeepAboveChanged(c->effectWindow()); + } + ); + connect(c, &AbstractClient::keepBelowChanged, this, + [this, c](bool below) { + Q_UNUSED(below) + emit windowKeepBelowChanged(c->effectWindow()); + } + ); + connect(c, &AbstractClient::fullScreenChanged, this, + [this, c]() { + emit windowFullScreenChanged(c->effectWindow()); + } + ); } void EffectsHandlerImpl::setupClientConnections(Client* c) diff --git a/effects/diminactive/diminactive.h b/effects/diminactive/diminactive.h --- a/effects/diminactive/diminactive.h +++ b/effects/diminactive/diminactive.h @@ -65,6 +65,8 @@ void windowDeleted(EffectWindow *w); void activeFullScreenEffectChanged(); + void updateActiveWindow(EffectWindow *w); + private: void dimWindow(WindowPaintData &data, qreal strength); bool canDimWindow(const EffectWindow *w) const; @@ -82,7 +84,7 @@ bool m_dimByGroup; bool m_dimFullScreen; - EffectWindow *m_activeWindow; + EffectWindow *m_activeWindow = nullptr; const EffectWindowGroup *m_activeWindowGroup; QHash m_transitions; QHash m_forceDim; diff --git a/effects/diminactive/diminactive.cpp b/effects/diminactive/diminactive.cpp --- a/effects/diminactive/diminactive.cpp +++ b/effects/diminactive/diminactive.cpp @@ -57,6 +57,10 @@ this, &DimInactiveEffect::windowDeleted); connect(effects, &EffectsHandler::activeFullScreenEffectChanged, this, &DimInactiveEffect::activeFullScreenEffectChanged); + connect(effects, &EffectsHandler::windowKeepAboveChanged, + this, &DimInactiveEffect::updateActiveWindow); + connect(effects, &EffectsHandler::windowFullScreenChanged, + this, &DimInactiveEffect::updateActiveWindow); } DimInactiveEffect::~DimInactiveEffect() @@ -77,14 +81,7 @@ m_dimByGroup = DimInactiveConfig::dimByGroup(); m_dimFullScreen = DimInactiveConfig::dimFullScreen(); - // Need to reset m_activeWindow becase canDimWindow returns false - // if m_activeWindow is equal to effects->activeWindow(). - m_activeWindow = nullptr; - - EffectWindow *activeWindow = effects->activeWindow(); - m_activeWindow = (activeWindow && canDimWindow(activeWindow)) - ? activeWindow - : nullptr; + updateActiveWindow(effects->activeWindow()); m_activeWindowGroup = (m_dimByGroup && m_activeWindow) ? m_activeWindow->group() @@ -400,4 +397,20 @@ effects->addRepaintFull(); } +void DimInactiveEffect::updateActiveWindow(EffectWindow *w) +{ + if (effects->activeWindow() == nullptr) { + return; + } + + if (effects->activeWindow() != w) { + return; + } + + // Need to reset m_activeWindow because canDimWindow depends on it. + m_activeWindow = nullptr; + + m_activeWindow = canDimWindow(w) ? w : nullptr; +} + } // namespace KWin diff --git a/libkwineffects/kwineffects.h b/libkwineffects/kwineffects.h --- a/libkwineffects/kwineffects.h +++ b/libkwineffects/kwineffects.h @@ -1729,6 +1729,30 @@ **/ void hasActiveFullScreenEffectChanged(); + /** + * This signal is emitted when the keep above state of @p w was changed. + * + * @param w The window whose the keep above state was changed. + * @since 5.15 + **/ + void windowKeepAboveChanged(EffectWindow *w); + + /** + * This signal is emitted when the keep below state of @p was changed. + * + * @param w The window whose the keep below state was changed. + * @since 5.15 + **/ + void windowKeepBelowChanged(EffectWindow *w); + + /** + * This signal is emitted when the full screen state of @p w was changed. + * + * @param w The window whose the full screen state was changed. + * @since 5.15 + **/ + void windowFullScreenChanged(EffectWindow *w); + protected: QVector< EffectPair > loaded_effects; //QHash< QString, EffectFactory* > effect_factories;