[effects/dimscreen] Port to JavaScript
Summary: The ported effect looks quite similar to the C++ version except one thing: it works correctly when user activates/deactivates a full screen effect, for example the Desktop Cube effect. Other than that, there are no behavioral or visual differences. Reviewers: #kwin, davidedmundson Reviewed By: #kwin, davidedmundson Subscribers: davidedmundson, kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D16452icc-effect-5.17.5
parent
900f242a39
commit
ea1873f975
|
@ -89,7 +89,6 @@ void TestBuiltInEffectLoader::testHasEffect_data()
|
||||||
QTest::newRow("CubeSlide") << QStringLiteral("cubeslide") << true;
|
QTest::newRow("CubeSlide") << QStringLiteral("cubeslide") << true;
|
||||||
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true;
|
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true;
|
||||||
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true;
|
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true;
|
||||||
QTest::newRow("DimScreen") << QStringLiteral("dimscreen") << true;
|
|
||||||
QTest::newRow("FallApart") << QStringLiteral("fallapart") << true;
|
QTest::newRow("FallApart") << QStringLiteral("fallapart") << true;
|
||||||
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << true;
|
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << true;
|
||||||
QTest::newRow("Glide") << QStringLiteral("glide") << true;
|
QTest::newRow("Glide") << QStringLiteral("glide") << true;
|
||||||
|
@ -144,7 +143,6 @@ void TestBuiltInEffectLoader::testKnownEffects()
|
||||||
<< QStringLiteral("cubeslide")
|
<< QStringLiteral("cubeslide")
|
||||||
<< QStringLiteral("desktopgrid")
|
<< QStringLiteral("desktopgrid")
|
||||||
<< QStringLiteral("diminactive")
|
<< QStringLiteral("diminactive")
|
||||||
<< QStringLiteral("dimscreen")
|
|
||||||
<< QStringLiteral("fallapart")
|
<< QStringLiteral("fallapart")
|
||||||
<< QStringLiteral("flipswitch")
|
<< QStringLiteral("flipswitch")
|
||||||
<< QStringLiteral("glide")
|
<< QStringLiteral("glide")
|
||||||
|
@ -212,7 +210,6 @@ void TestBuiltInEffectLoader::testSupported_data()
|
||||||
QTest::newRow("CubeSlide-GL-no-anim") << QStringLiteral("cubeslide") << false << oc << false;
|
QTest::newRow("CubeSlide-GL-no-anim") << QStringLiteral("cubeslide") << false << oc << false;
|
||||||
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true << xc << true;
|
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true << xc << true;
|
||||||
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true << xc << true;
|
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true << xc << true;
|
||||||
QTest::newRow("DimScreen") << QStringLiteral("dimscreen") << true << xc << true;
|
|
||||||
QTest::newRow("FallApart") << QStringLiteral("fallapart") << false << xc << true;
|
QTest::newRow("FallApart") << QStringLiteral("fallapart") << false << xc << true;
|
||||||
QTest::newRow("FallApart-GL") << QStringLiteral("fallapart") << true << oc << true;
|
QTest::newRow("FallApart-GL") << QStringLiteral("fallapart") << true << oc << true;
|
||||||
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << false << xc << true;
|
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << false << xc << true;
|
||||||
|
@ -302,7 +299,6 @@ void TestBuiltInEffectLoader::testLoadEffect_data()
|
||||||
QTest::newRow("CubeSlide-GL") << QStringLiteral("cubeslide") << true << oc;
|
QTest::newRow("CubeSlide-GL") << QStringLiteral("cubeslide") << true << oc;
|
||||||
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true << xc;
|
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true << xc;
|
||||||
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true << xc;
|
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true << xc;
|
||||||
QTest::newRow("DimScreen") << QStringLiteral("dimScreen") << true << xc;
|
|
||||||
QTest::newRow("FallApart") << QStringLiteral("fallapart") << false << xc;
|
QTest::newRow("FallApart") << QStringLiteral("fallapart") << false << xc;
|
||||||
QTest::newRow("FallApart-GL") << QStringLiteral("fallapart") << true << oc;
|
QTest::newRow("FallApart-GL") << QStringLiteral("fallapart") << true << oc;
|
||||||
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << false << xc;
|
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << false << xc;
|
||||||
|
|
|
@ -80,7 +80,6 @@ void TestPluginEffectLoader::testHasEffect_data()
|
||||||
QTest::newRow("CubeSlide") << QStringLiteral("cubeslide") << false;
|
QTest::newRow("CubeSlide") << QStringLiteral("cubeslide") << false;
|
||||||
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << false;
|
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << false;
|
||||||
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << false;
|
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << false;
|
||||||
QTest::newRow("DimScreen") << QStringLiteral("dimscreen") << false;
|
|
||||||
QTest::newRow("FallApart") << QStringLiteral("fallapart") << false;
|
QTest::newRow("FallApart") << QStringLiteral("fallapart") << false;
|
||||||
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << false;
|
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << false;
|
||||||
QTest::newRow("Glide") << QStringLiteral("glide") << false;
|
QTest::newRow("Glide") << QStringLiteral("glide") << false;
|
||||||
|
@ -111,6 +110,7 @@ void TestPluginEffectLoader::testHasEffect_data()
|
||||||
QTest::newRow("Zoom") << QStringLiteral("zoom") << false;
|
QTest::newRow("Zoom") << QStringLiteral("zoom") << false;
|
||||||
QTest::newRow("Non Existing") << QStringLiteral("InvalidName") << false;
|
QTest::newRow("Non Existing") << QStringLiteral("InvalidName") << false;
|
||||||
// all the scripted effects should fail
|
// all the scripted effects should fail
|
||||||
|
QTest::newRow("DimScreen") << QStringLiteral("kwin4_effect_dimscreen") << false;
|
||||||
QTest::newRow("Fade") << QStringLiteral("kwin4_effect_fade") << false;
|
QTest::newRow("Fade") << QStringLiteral("kwin4_effect_fade") << false;
|
||||||
QTest::newRow("FadeDesktop") << QStringLiteral("kwin4_effect_fadedesktop") << false;
|
QTest::newRow("FadeDesktop") << QStringLiteral("kwin4_effect_fadedesktop") << false;
|
||||||
QTest::newRow("FadingPopups") << QStringLiteral("kwin4_effect_fadingpopups") << false;
|
QTest::newRow("FadingPopups") << QStringLiteral("kwin4_effect_fadingpopups") << false;
|
||||||
|
|
|
@ -110,7 +110,6 @@ void TestScriptedEffectLoader::testHasEffect_data()
|
||||||
QTest::newRow("CubeSlide") << QStringLiteral("cubeslide") << false;
|
QTest::newRow("CubeSlide") << QStringLiteral("cubeslide") << false;
|
||||||
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << false;
|
QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << false;
|
||||||
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << false;
|
QTest::newRow("DimInactive") << QStringLiteral("diminactive") << false;
|
||||||
QTest::newRow("DimScreen") << QStringLiteral("dimscreen") << false;
|
|
||||||
QTest::newRow("FallApart") << QStringLiteral("fallapart") << false;
|
QTest::newRow("FallApart") << QStringLiteral("fallapart") << false;
|
||||||
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << false;
|
QTest::newRow("FlipSwitch") << QStringLiteral("flipswitch") << false;
|
||||||
QTest::newRow("Glide") << QStringLiteral("glide") << false;
|
QTest::newRow("Glide") << QStringLiteral("glide") << false;
|
||||||
|
@ -148,6 +147,7 @@ void TestScriptedEffectLoader::testHasEffect_data()
|
||||||
QTest::newRow("FadingPopups") << QStringLiteral("kwin4_effect_fadingpopups") << true;
|
QTest::newRow("FadingPopups") << QStringLiteral("kwin4_effect_fadingpopups") << true;
|
||||||
QTest::newRow("FrozenApp") << QStringLiteral("kwin4_effect_frozenapp") << true;
|
QTest::newRow("FrozenApp") << QStringLiteral("kwin4_effect_frozenapp") << true;
|
||||||
QTest::newRow("DialogParent") << QStringLiteral("kwin4_effect_dialogparent") << true;
|
QTest::newRow("DialogParent") << QStringLiteral("kwin4_effect_dialogparent") << true;
|
||||||
|
QTest::newRow("DimScreen") << QStringLiteral("kwin4_effect_dimscreen") << true;
|
||||||
QTest::newRow("Login") << QStringLiteral("kwin4_effect_login") << true;
|
QTest::newRow("Login") << QStringLiteral("kwin4_effect_login") << true;
|
||||||
QTest::newRow("Logout") << QStringLiteral("kwin4_effect_logout") << true;
|
QTest::newRow("Logout") << QStringLiteral("kwin4_effect_logout") << true;
|
||||||
QTest::newRow("Maximize") << QStringLiteral("kwin4_effect_maximize") << true;
|
QTest::newRow("Maximize") << QStringLiteral("kwin4_effect_maximize") << true;
|
||||||
|
@ -178,6 +178,7 @@ void TestScriptedEffectLoader::testKnownEffects()
|
||||||
{
|
{
|
||||||
QStringList expectedEffects;
|
QStringList expectedEffects;
|
||||||
expectedEffects << QStringLiteral("kwin4_effect_dialogparent")
|
expectedEffects << QStringLiteral("kwin4_effect_dialogparent")
|
||||||
|
<< QStringLiteral("kwin4_effect_dimscreen")
|
||||||
<< QStringLiteral("kwin4_effect_fade")
|
<< QStringLiteral("kwin4_effect_fade")
|
||||||
<< QStringLiteral("kwin4_effect_fadedesktop")
|
<< QStringLiteral("kwin4_effect_fadedesktop")
|
||||||
<< QStringLiteral("kwin4_effect_fadingpopups")
|
<< QStringLiteral("kwin4_effect_fadingpopups")
|
||||||
|
@ -211,6 +212,7 @@ void TestScriptedEffectLoader::testLoadEffect_data()
|
||||||
QTest::newRow("FadingPopups") << QStringLiteral("kwin4_effect_fadingpopups") << true;
|
QTest::newRow("FadingPopups") << QStringLiteral("kwin4_effect_fadingpopups") << true;
|
||||||
QTest::newRow("FrozenApp") << QStringLiteral("kwin4_effect_frozenapp") << true;
|
QTest::newRow("FrozenApp") << QStringLiteral("kwin4_effect_frozenapp") << true;
|
||||||
QTest::newRow("DialogParent") << QStringLiteral("kwin4_effect_dialogparent") << true;
|
QTest::newRow("DialogParent") << QStringLiteral("kwin4_effect_dialogparent") << true;
|
||||||
|
QTest::newRow("DimScreen") << QStringLiteral("kwin4_effect_dimscreen") << true;
|
||||||
QTest::newRow("Login") << QStringLiteral("kwin4_effect_login") << true;
|
QTest::newRow("Login") << QStringLiteral("kwin4_effect_login") << true;
|
||||||
QTest::newRow("Logout") << QStringLiteral("kwin4_effect_logout") << true;
|
QTest::newRow("Logout") << QStringLiteral("kwin4_effect_logout") << true;
|
||||||
QTest::newRow("Maximize") << QStringLiteral("kwin4_effect_maximize") << true;
|
QTest::newRow("Maximize") << QStringLiteral("kwin4_effect_maximize") << true;
|
||||||
|
@ -361,6 +363,7 @@ void TestScriptedEffectLoader::testLoadAllEffects()
|
||||||
// prepare the configuration to hard enable/disable the effects we want to load
|
// prepare the configuration to hard enable/disable the effects we want to load
|
||||||
KConfigGroup plugins = config->group("Plugins");
|
KConfigGroup plugins = config->group("Plugins");
|
||||||
plugins.writeEntry(kwin4 + QStringLiteral("dialogparentEnabled"), false);
|
plugins.writeEntry(kwin4 + QStringLiteral("dialogparentEnabled"), false);
|
||||||
|
plugins.writeEntry(kwin4 + QStringLiteral("dimscreenEnabled"), false);
|
||||||
plugins.writeEntry(kwin4 + QStringLiteral("fadeEnabled"), false);
|
plugins.writeEntry(kwin4 + QStringLiteral("fadeEnabled"), false);
|
||||||
plugins.writeEntry(kwin4 + QStringLiteral("fadedesktopEnabled"), false);
|
plugins.writeEntry(kwin4 + QStringLiteral("fadedesktopEnabled"), false);
|
||||||
plugins.writeEntry(kwin4 + QStringLiteral("fadingpopupsEnabled"), false);
|
plugins.writeEntry(kwin4 + QStringLiteral("fadingpopupsEnabled"), false);
|
||||||
|
|
|
@ -132,6 +132,7 @@ kconfig_add_kcfg_files(kwin4_effect_builtins_sources
|
||||||
|
|
||||||
# scripted effects
|
# scripted effects
|
||||||
add_subdirectory( dialogparent )
|
add_subdirectory( dialogparent )
|
||||||
|
add_subdirectory( dimscreen )
|
||||||
add_subdirectory( eyeonscreen )
|
add_subdirectory( eyeonscreen )
|
||||||
add_subdirectory( fade )
|
add_subdirectory( fade )
|
||||||
add_subdirectory( fadedesktop )
|
add_subdirectory( fadedesktop )
|
||||||
|
@ -152,7 +153,6 @@ add_subdirectory( windowaperture )
|
||||||
# Common effects
|
# Common effects
|
||||||
add_subdirectory( desktopgrid )
|
add_subdirectory( desktopgrid )
|
||||||
add_subdirectory( diminactive )
|
add_subdirectory( diminactive )
|
||||||
include( dimscreen/CMakeLists.txt )
|
|
||||||
include( fallapart/CMakeLists.txt )
|
include( fallapart/CMakeLists.txt )
|
||||||
include( highlightwindow/CMakeLists.txt )
|
include( highlightwindow/CMakeLists.txt )
|
||||||
include( kscreen/CMakeLists.txt )
|
include( kscreen/CMakeLists.txt )
|
||||||
|
|
|
@ -1,7 +1 @@
|
||||||
#######################################
|
add_subdirectory(package)
|
||||||
# Effect
|
|
||||||
|
|
||||||
# Source files
|
|
||||||
set( kwin4_effect_builtins_sources ${kwin4_effect_builtins_sources}
|
|
||||||
dimscreen/dimscreen.cpp
|
|
||||||
)
|
|
||||||
|
|
|
@ -1,137 +0,0 @@
|
||||||
/********************************************************************
|
|
||||||
KWin - the KDE window manager
|
|
||||||
This file is part of the KDE project.
|
|
||||||
|
|
||||||
Copyright (C) 2008, 2009 Martin Gräßlin <mgraesslin@kde.org>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*********************************************************************/
|
|
||||||
#include "dimscreen.h"
|
|
||||||
|
|
||||||
#include <kwinglutils.h>
|
|
||||||
|
|
||||||
#include <QSet>
|
|
||||||
|
|
||||||
namespace KWin
|
|
||||||
{
|
|
||||||
|
|
||||||
static const QSet<QString> s_authWindows {
|
|
||||||
QStringLiteral("kdesu kdesu"),
|
|
||||||
QStringLiteral("kdesudo kdesudo"),
|
|
||||||
QStringLiteral("pinentry pinentry"),
|
|
||||||
QStringLiteral("polkit-kde-authentication-agent-1 polkit-kde-authentication-agent-1"),
|
|
||||||
QStringLiteral("polkit-kde-manager polkit-kde-manager"),
|
|
||||||
|
|
||||||
// On Wayland, the resource name is filename of executable. It's empty for
|
|
||||||
// authentication agents because KWayland can't get their executable paths.
|
|
||||||
QStringLiteral(" org.kde.kdesu"),
|
|
||||||
QStringLiteral(" org.kde.polkit-kde-authentication-agent-1")
|
|
||||||
};
|
|
||||||
|
|
||||||
DimScreenEffect::DimScreenEffect()
|
|
||||||
: mActivated(false)
|
|
||||||
, activateAnimation(false)
|
|
||||||
, deactivateAnimation(false)
|
|
||||||
{
|
|
||||||
reconfigure(ReconfigureAll);
|
|
||||||
connect(effects, SIGNAL(windowActivated(KWin::EffectWindow*)), this, SLOT(slotWindowActivated(KWin::EffectWindow*)));
|
|
||||||
}
|
|
||||||
|
|
||||||
DimScreenEffect::~DimScreenEffect()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void DimScreenEffect::reconfigure(ReconfigureFlags)
|
|
||||||
{
|
|
||||||
timeline.setDuration(animationTime(250));
|
|
||||||
}
|
|
||||||
|
|
||||||
void DimScreenEffect::prePaintScreen(ScreenPrePaintData& data, int time)
|
|
||||||
{
|
|
||||||
if (mActivated && activateAnimation && !effects->activeFullScreenEffect())
|
|
||||||
timeline.setCurrentTime(timeline.currentTime() + time);
|
|
||||||
if (mActivated && deactivateAnimation)
|
|
||||||
timeline.setCurrentTime(timeline.currentTime() - time);
|
|
||||||
if (mActivated && effects->activeFullScreenEffect())
|
|
||||||
timeline.setCurrentTime(timeline.currentTime() - time);
|
|
||||||
if (mActivated && !activateAnimation && !deactivateAnimation && !effects->activeFullScreenEffect() && timeline.currentValue() != 1.0)
|
|
||||||
timeline.setCurrentTime(timeline.currentTime() + time);
|
|
||||||
effects->prePaintScreen(data, time);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DimScreenEffect::postPaintScreen()
|
|
||||||
{
|
|
||||||
if (mActivated) {
|
|
||||||
if (activateAnimation && timeline.currentValue() == 1.0) {
|
|
||||||
activateAnimation = false;
|
|
||||||
effects->addRepaintFull();
|
|
||||||
}
|
|
||||||
if (deactivateAnimation && timeline.currentValue() == 0.0) {
|
|
||||||
deactivateAnimation = false;
|
|
||||||
mActivated = false;
|
|
||||||
effects->addRepaintFull();
|
|
||||||
}
|
|
||||||
// still animating
|
|
||||||
if (timeline.currentValue() > 0.0 && timeline.currentValue() < 1.0)
|
|
||||||
effects->addRepaintFull();
|
|
||||||
}
|
|
||||||
effects->postPaintScreen();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool isDimWindow(const EffectWindow *w)
|
|
||||||
{
|
|
||||||
if (w->isPopupWindow()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (w->isX11Client() && !w->isManaged()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DimScreenEffect::paintWindow(EffectWindow *w, int mask, QRegion region, WindowPaintData &data)
|
|
||||||
{
|
|
||||||
if (mActivated && (w != window) && isDimWindow(w)) {
|
|
||||||
data.multiplyBrightness((1.0 - 0.33 * timeline.currentValue()));
|
|
||||||
data.multiplySaturation((1.0 - 0.33 * timeline.currentValue()));
|
|
||||||
}
|
|
||||||
effects->paintWindow(w, mask, region, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DimScreenEffect::slotWindowActivated(EffectWindow *w)
|
|
||||||
{
|
|
||||||
if (!w) return;
|
|
||||||
if (s_authWindows.contains(w->windowClass())) {
|
|
||||||
mActivated = true;
|
|
||||||
activateAnimation = true;
|
|
||||||
deactivateAnimation = false;
|
|
||||||
window = w;
|
|
||||||
effects->addRepaintFull();
|
|
||||||
} else {
|
|
||||||
if (mActivated) {
|
|
||||||
activateAnimation = false;
|
|
||||||
deactivateAnimation = true;
|
|
||||||
effects->addRepaintFull();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DimScreenEffect::isActive() const
|
|
||||||
{
|
|
||||||
return mActivated;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
|
@ -1,57 +0,0 @@
|
||||||
/********************************************************************
|
|
||||||
KWin - the KDE window manager
|
|
||||||
This file is part of the KDE project.
|
|
||||||
|
|
||||||
Copyright (C) 2008, 2009 Martin Gräßlin <mgraesslin@kde.org>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*********************************************************************/
|
|
||||||
|
|
||||||
#ifndef KWIN_DIMSCREEN_H
|
|
||||||
#define KWIN_DIMSCREEN_H
|
|
||||||
|
|
||||||
#include <kwineffects.h>
|
|
||||||
#include <QTimeLine>
|
|
||||||
|
|
||||||
namespace KWin
|
|
||||||
{
|
|
||||||
|
|
||||||
class DimScreenEffect
|
|
||||||
: public Effect
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
DimScreenEffect();
|
|
||||||
~DimScreenEffect();
|
|
||||||
|
|
||||||
virtual void reconfigure(ReconfigureFlags);
|
|
||||||
virtual void prePaintScreen(ScreenPrePaintData& data, int time);
|
|
||||||
virtual void postPaintScreen();
|
|
||||||
virtual void paintWindow(EffectWindow *w, int mask, QRegion region, WindowPaintData &data);
|
|
||||||
virtual bool isActive() const;
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
|
||||||
void slotWindowActivated(KWin::EffectWindow *w);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool mActivated;
|
|
||||||
bool activateAnimation;
|
|
||||||
bool deactivateAnimation;
|
|
||||||
QTimeLine timeline;
|
|
||||||
EffectWindow* window;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
install(DIRECTORY contents
|
||||||
|
DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/effects/kwin4_effect_dimscreen)
|
||||||
|
|
||||||
|
install(FILES metadata.desktop
|
||||||
|
DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/effects/kwin4_effect_dimscreen)
|
||||||
|
|
||||||
|
install(FILES metadata.desktop
|
||||||
|
DESTINATION ${SERVICES_INSTALL_DIR}/${KWIN_NAME}
|
||||||
|
RENAME kwin4_effect_dimscreen.desktop)
|
||||||
|
|
||||||
|
file(COPY contents metadata.desktop
|
||||||
|
DESTINATION ${CMAKE_BINARY_DIR}/bin/kwin/effects/kwin4_effect_dimscreen)
|
|
@ -0,0 +1,238 @@
|
||||||
|
/********************************************************************
|
||||||
|
This file is part of the KDE project.
|
||||||
|
|
||||||
|
Copyright (C) 2018 Vlad Zagorodniy <vladzzag@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*********************************************************************/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var authenticationAgents = [
|
||||||
|
"kdesu kdesu",
|
||||||
|
"kdesudo kdesudo",
|
||||||
|
"pinentry pinentry",
|
||||||
|
"polkit-kde-authentication-agent-1 polkit-kde-authentication-agent-1",
|
||||||
|
"polkit-kde-manager polkit-kde-manager",
|
||||||
|
|
||||||
|
// On Wayland, the resource name is filename of executable. It's empty for
|
||||||
|
// authentication agents because KWayland can't get their executable paths.
|
||||||
|
" org.kde.kdesu",
|
||||||
|
" org.kde.polkit-kde-authentication-agent-1"
|
||||||
|
];
|
||||||
|
|
||||||
|
function activeAuthenticationAgent() {
|
||||||
|
var activeWindow = effects.activeWindow;
|
||||||
|
if (!activeWindow) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (authenticationAgents.indexOf(activeWindow.windowClass) == -1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return activeWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dimScreenEffect = {
|
||||||
|
loadConfig: function () {
|
||||||
|
dimScreenEffect.duration = animationTime(250);
|
||||||
|
dimScreenEffect.brightness = 0.67;
|
||||||
|
dimScreenEffect.saturation = 0.67;
|
||||||
|
},
|
||||||
|
startAnimation: function (window) {
|
||||||
|
if (!window.visible) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (window.popupWindow) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (window.x11Client && !window.managed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (window.dimAnimation) {
|
||||||
|
if (redirect(window.dimAnimation, Effect.Forward)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cancel(window.dimAnimation);
|
||||||
|
}
|
||||||
|
window.dimAnimation = set({
|
||||||
|
window: window,
|
||||||
|
curve: QEasingCurve.InOutSine,
|
||||||
|
duration: dimScreenEffect.duration,
|
||||||
|
keepAlive: false,
|
||||||
|
animations: [
|
||||||
|
{
|
||||||
|
type: Effect.Saturation,
|
||||||
|
to: dimScreenEffect.saturation
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: Effect.Brightness,
|
||||||
|
to: dimScreenEffect.brightness
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
},
|
||||||
|
startAnimationSmooth: function (window) {
|
||||||
|
dimScreenEffect.startAnimation(window);
|
||||||
|
},
|
||||||
|
startAnimationInstant: function (window) {
|
||||||
|
dimScreenEffect.startAnimation(window);
|
||||||
|
|
||||||
|
if (window.dimAnimation) {
|
||||||
|
complete(window.dimAnimation);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cancelAnimationSmooth: function (window) {
|
||||||
|
if (!window.dimAnimation) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (redirect(window.dimAnimation, Effect.Backward)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cancel(window.dimAnimation);
|
||||||
|
delete window.dimAnimation;
|
||||||
|
},
|
||||||
|
cancelAnimationInstant: function (window) {
|
||||||
|
if (window.dimAnimation) {
|
||||||
|
cancel(window.dimAnimation);
|
||||||
|
delete window.dimAnimation;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dimScreen: function (agent, animationFunc, cancelFunc) {
|
||||||
|
// Keep track of currently active authentication agent so we don't have
|
||||||
|
// to re-scan the stacking order in brightenScreen each time when some
|
||||||
|
// window is activated.
|
||||||
|
dimScreenEffect.authenticationAgent = agent;
|
||||||
|
|
||||||
|
var windows = effects.stackingOrder;
|
||||||
|
for (var i = 0; i < windows.length; ++i) {
|
||||||
|
var window = windows[i];
|
||||||
|
if (window == agent) {
|
||||||
|
// The agent might have been dimmed before (because there are
|
||||||
|
// several authentication agents on the screen), so we need to
|
||||||
|
// cancel previous animations for it if there are any.
|
||||||
|
cancelFunc(agent);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
animationFunc(window);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dimScreenSmooth: function (agent) {
|
||||||
|
dimScreenEffect.dimScreen(
|
||||||
|
agent,
|
||||||
|
dimScreenEffect.startAnimationSmooth,
|
||||||
|
dimScreenEffect.cancelAnimationSmooth
|
||||||
|
);
|
||||||
|
},
|
||||||
|
dimScreenInstant: function (agent) {
|
||||||
|
dimScreenEffect.dimScreen(
|
||||||
|
agent,
|
||||||
|
dimScreenEffect.startAnimationInstant,
|
||||||
|
dimScreenEffect.cancelAnimationInstant
|
||||||
|
);
|
||||||
|
},
|
||||||
|
brightenScreen: function (cancelFunc) {
|
||||||
|
if (!dimScreenEffect.authenticationAgent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dimScreenEffect.authenticationAgent = null;
|
||||||
|
|
||||||
|
var windows = effects.stackingOrder;
|
||||||
|
for (var i = 0; i < windows.length; ++i) {
|
||||||
|
cancelFunc(windows[i]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
brightenScreenSmooth: function () {
|
||||||
|
dimScreenEffect.brightenScreen(dimScreenEffect.cancelAnimationSmooth);
|
||||||
|
},
|
||||||
|
brightenScreenInstant: function () {
|
||||||
|
dimScreenEffect.brightenScreen(dimScreenEffect.cancelAnimationInstant);
|
||||||
|
},
|
||||||
|
slotWindowActivated: function (window) {
|
||||||
|
if (!window) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (authenticationAgents.indexOf(window.windowClass) != -1) {
|
||||||
|
dimScreenEffect.dimScreenSmooth(window);
|
||||||
|
} else {
|
||||||
|
dimScreenEffect.brightenScreenSmooth();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
slotWindowAdded: function (window) {
|
||||||
|
// Don't dim authentication agents that just opened.
|
||||||
|
var agent = activeAuthenticationAgent();
|
||||||
|
if (agent == window) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a window appeared while the screen is dimmed, dim the window too.
|
||||||
|
if (agent) {
|
||||||
|
dimScreenEffect.startAnimationInstant(window);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
slotActiveFullScreenEffectChanged: function () {
|
||||||
|
// If some full screen effect has been activated, for example the desktop
|
||||||
|
// cube effect, then brighten screen back. We need to do that because the
|
||||||
|
// full screen effect can dim windows on its own.
|
||||||
|
if (effects.hasActiveFullScreenEffect) {
|
||||||
|
dimScreenEffect.brightenScreenSmooth();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If user left the full screen effect, try to dim screen back.
|
||||||
|
var agent = activeAuthenticationAgent();
|
||||||
|
if (agent) {
|
||||||
|
dimScreenEffect.dimScreenSmooth(agent);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
slotDesktopChanged: function () {
|
||||||
|
// If there is an active full screen effect, then try smoothly dim/brighten
|
||||||
|
// the screen. Keep in mind that in order for this to work properly, this
|
||||||
|
// effect has to come after the full screen effect in the effect chain,
|
||||||
|
// otherwise this slot will be invoked before the full screen effect can mark
|
||||||
|
// itself as a full screen effect.
|
||||||
|
if (effects.hasActiveFullScreenEffect) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to brighten windows on the previous virtual desktop.
|
||||||
|
dimScreenEffect.brightenScreenInstant();
|
||||||
|
|
||||||
|
// Try to dim windows on the current virtual desktop.
|
||||||
|
var agent = activeAuthenticationAgent();
|
||||||
|
if (agent) {
|
||||||
|
dimScreenEffect.dimScreenInstant(agent);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
restartAnimation: function (window) {
|
||||||
|
if (activeAuthenticationAgent()) {
|
||||||
|
dimScreenEffect.startAnimationInstant(window);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
init: function () {
|
||||||
|
dimScreenEffect.loadConfig();
|
||||||
|
|
||||||
|
effect.configChanged.connect(dimScreenEffect.loadConfig);
|
||||||
|
effects.windowActivated.connect(dimScreenEffect.slotWindowActivated);
|
||||||
|
effects.windowAdded.connect(dimScreenEffect.slotWindowAdded);
|
||||||
|
effects.windowMinimized.connect(dimScreenEffect.cancelAnimationInstant);
|
||||||
|
effects.windowUnminimized.connect(dimScreenEffect.restartAnimation);
|
||||||
|
effects.activeFullScreenEffectChanged.connect(
|
||||||
|
dimScreenEffect.slotActiveFullScreenEffectChanged);
|
||||||
|
effects['desktopChanged(int,int)'].connect(dimScreenEffect.slotDesktopChanged);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
dimScreenEffect.init();
|
|
@ -0,0 +1,20 @@
|
||||||
|
[Desktop Entry]
|
||||||
|
Comment=Darkens the entire screen when requesting root privileges
|
||||||
|
Icon=preferences-system-windows-effect-dimscreen
|
||||||
|
Name=Dim Screen for Administrator Mode
|
||||||
|
|
||||||
|
Type=Service
|
||||||
|
X-KDE-ParentApp=
|
||||||
|
X-KDE-PluginInfo-Author=Martin Flöser, Vlad Zagorodniy
|
||||||
|
X-KDE-PluginInfo-Category=Focus
|
||||||
|
X-KDE-PluginInfo-Email=mgraesslin@kde.org, vladzzag@gmail.com
|
||||||
|
X-KDE-PluginInfo-License=GPL
|
||||||
|
X-KDE-PluginInfo-Name=kwin4_effect_dimscreen
|
||||||
|
X-KDE-PluginInfo-Version=1
|
||||||
|
X-KDE-PluginInfo-Website=
|
||||||
|
X-KDE-ServiceTypes=KWin/Effect
|
||||||
|
X-KDE-PluginInfo-EnabledByDefault=false
|
||||||
|
X-KDE-Ordering=60
|
||||||
|
X-Plasma-API=javascript
|
||||||
|
X-Plasma-MainScript=code/main.js
|
||||||
|
X-KWin-Video-Url=http://files.kde.org/plasma/kwin/effect-videos/dim_administration.mp4
|
|
@ -31,7 +31,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
// Common effects only relevant to desktop
|
// Common effects only relevant to desktop
|
||||||
#include "desktopgrid/desktopgrid.h"
|
#include "desktopgrid/desktopgrid.h"
|
||||||
#include "diminactive/diminactive.h"
|
#include "diminactive/diminactive.h"
|
||||||
#include "dimscreen/dimscreen.h"
|
|
||||||
#include "fallapart/fallapart.h"
|
#include "fallapart/fallapart.h"
|
||||||
#include "highlightwindow/highlightwindow.h"
|
#include "highlightwindow/highlightwindow.h"
|
||||||
#include "magiclamp/magiclamp.h"
|
#include "magiclamp/magiclamp.h"
|
||||||
|
@ -217,21 +216,6 @@ EFFECT_FALLBACK
|
||||||
nullptr,
|
nullptr,
|
||||||
nullptr
|
nullptr
|
||||||
#endif
|
#endif
|
||||||
EFFECT_FALLBACK
|
|
||||||
}, {
|
|
||||||
QStringLiteral("dimscreen"),
|
|
||||||
i18ndc("kwin_effects", "Name of a KWin Effect", "Dim Screen for Administrator Mode"),
|
|
||||||
i18ndc("kwin_effects", "Comment describing the KWin Effect", "Darkens the entire screen when requesting root privileges"),
|
|
||||||
QStringLiteral("Focus"),
|
|
||||||
QString(),
|
|
||||||
QUrl(QStringLiteral("http://files.kde.org/plasma/kwin/effect-videos/dim_administration.mp4")),
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
#ifdef EFFECT_BUILTINS
|
|
||||||
&createHelper<DimScreenEffect>,
|
|
||||||
nullptr,
|
|
||||||
nullptr
|
|
||||||
#endif
|
|
||||||
EFFECT_FALLBACK
|
EFFECT_FALLBACK
|
||||||
}, {
|
}, {
|
||||||
QStringLiteral("fallapart"),
|
QStringLiteral("fallapart"),
|
||||||
|
|
|
@ -42,7 +42,6 @@ enum class BuiltInEffect
|
||||||
CubeSlide,
|
CubeSlide,
|
||||||
DesktopGrid,
|
DesktopGrid,
|
||||||
DimInactive,
|
DimInactive,
|
||||||
DimScreen,
|
|
||||||
FallApart,
|
FallApart,
|
||||||
FlipSwitch,
|
FlipSwitch,
|
||||||
Glide,
|
Glide,
|
||||||
|
|
Loading…
Reference in New Issue