diff --git a/effects.h b/effects.h --- a/effects.h +++ b/effects.h @@ -476,6 +476,7 @@ QByteArray readProperty(long atom, long type, int format) const override; void deleteProperty(long atom) const override; + EffectWindow* transientFor() override; EffectWindow* findModal() override; EffectWindowList mainWindows() const override; diff --git a/effects.cpp b/effects.cpp --- a/effects.cpp +++ b/effects.cpp @@ -2002,6 +2002,21 @@ return nullptr; } +EffectWindow* EffectWindowImpl::transientFor() +{ + auto client = qobject_cast(toplevel); + if (!client) { + return nullptr; + } + + AbstractClient *transientFor = client->transientFor(); + if (transientFor) { + return transientFor->effectWindow(); + } + + return nullptr; +} + QWindow *EffectWindowImpl::internalWindow() const { auto client = qobject_cast(toplevel); diff --git a/effects/blur/blur.cpp b/effects/blur/blur.cpp --- a/effects/blur/blur.cpp +++ b/effects/blur/blur.cpp @@ -606,11 +606,14 @@ shape = shape & region; } + EffectWindow* modal = w->transientFor(); + const bool transientForIsDock = (modal ? modal->isDock() : false); + if (!shape.isEmpty()) { - doBlur(shape, screen, data.opacity(), data.screenProjectionMatrix(), w->isDock(), w->geometry()); + doBlur(shape, screen, data.opacity(), data.screenProjectionMatrix(),w->isDock() || transientForIsDock, w->geometry()); } } - + // Draw the window over the blurred area effects->drawWindow(w, mask, region, data); } diff --git a/libkwineffects/kwineffects.h b/libkwineffects/kwineffects.h --- a/libkwineffects/kwineffects.h +++ b/libkwineffects/kwineffects.h @@ -2374,6 +2374,7 @@ virtual bool keepBelow() const = 0; virtual bool isModal() const = 0; + Q_SCRIPTABLE virtual KWin::EffectWindow* transientFor() = 0; Q_SCRIPTABLE virtual KWin::EffectWindow* findModal() = 0; Q_SCRIPTABLE virtual QList mainWindows() const = 0;