diff --git a/autotests/integration/shell_client_rules_test.cpp b/autotests/integration/shell_client_rules_test.cpp index 89659d611e..73d23a485a 100644 --- a/autotests/integration/shell_client_rules_test.cpp +++ b/autotests/integration/shell_client_rules_test.cpp @@ -24,6 +24,7 @@ along with this program. If not, see . #include "shell_client.h" #include "virtualdesktops.h" #include "wayland_server.h" +#include "workspace.h" #include @@ -57,6 +58,8 @@ private Q_SLOTS: void testApplyInitialKeepBelow(); void testApplyInitialShortcut_data(); void testApplyInitialShortcut(); + void testOpacityActive_data(); + void testOpacityActive(); }; void TestShellClientRules::initTestCase() @@ -110,6 +113,20 @@ void TestShellClientRules::name##_data() \ QTest::newRow("xdgShellV6|ForceTemporarily") << Test::ShellSurfaceType::XdgShellV6 << 6; \ } +#define TEST_FORCE_DATA( name ) \ +void TestShellClientRules::name##_data() \ +{ \ + QTest::addColumn("type"); \ + QTest::addColumn("ruleNumber"); \ + QTest::newRow("wlShell|Force") << Test::ShellSurfaceType::WlShell << 2; \ + QTest::newRow("xdgShellV5|Force") << Test::ShellSurfaceType::XdgShellV5 << 2; \ + QTest::newRow("xdgShellV6|Force") << Test::ShellSurfaceType::XdgShellV6 << 2; \ + QTest::newRow("wlShell|ForceTemporarily") << Test::ShellSurfaceType::WlShell << 6; \ + QTest::newRow("xdgShellV5|ForceTemporarily") << Test::ShellSurfaceType::XdgShellV5 << 6; \ + QTest::newRow("xdgShellV6|ForceTemporarily") << Test::ShellSurfaceType::XdgShellV6 << 6; \ +} + + TEST_DATA(testApplyInitialDesktop) void TestShellClientRules::testApplyInitialDesktop() @@ -325,5 +342,50 @@ void TestShellClientRules::testApplyInitialShortcut() QCOMPARE(c->shortcut(), sequence); } +TEST_FORCE_DATA(testOpacityActive) + +void TestShellClientRules::testOpacityActive() +{ + KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig); + config->group("General").writeEntry("count", 1); + + auto group = config->group("1"); + group.writeEntry("opacityactive", 90); + group.writeEntry("opacityinactive", 80); + QFETCH(int, ruleNumber); + group.writeEntry("opacityactiverule", ruleNumber); + group.writeEntry("opacityinactiverule", ruleNumber); + group.sync(); + + RuleBook::self()->setConfig(config); + workspace()->slotReconfigure(); + + QScopedPointer surface(Test::createSurface()); + QFETCH(Test::ShellSurfaceType, type); + QScopedPointer shellSurface(Test::createShellSurface(type, surface.data())); + + auto c = Test::renderAndWaitForShown(surface.data(), QSize(100, 50), Qt::blue); + QVERIFY(c); + QVERIFY(c->isActive()); + QCOMPARE(c->opacity(), 0.9); + + // open a second window + QScopedPointer surface2(Test::createSurface()); + QScopedPointer shellSurface2(Test::createShellSurface(type, surface2.data())); + + auto c2 = Test::renderAndWaitForShown(surface2.data(), QSize(100, 50), Qt::blue); + QVERIFY(c2); + QVERIFY(c2->isActive()); + QVERIFY(!c->isActive()); + QCOMPARE(c2->opacity(), 0.9); + QCOMPARE(c->opacity(), 0.8); + + workspace()->activateClient(c); + QVERIFY(!c2->isActive()); + QVERIFY(c->isActive()); + QCOMPARE(c->opacity(), 0.9); + QCOMPARE(c2->opacity(), 0.8); +} + WAYLANDTEST_MAIN(TestShellClientRules) #include "shell_client_rules_test.moc" diff --git a/rules.cpp b/rules.cpp index 031dde3543..8804dc57c3 100644 --- a/rules.cpp +++ b/rules.cpp @@ -1043,12 +1043,14 @@ void RuleBook::edit(AbstractClient* c, bool whole_app) void RuleBook::load() { deleteAll(); - KConfig cfg(QStringLiteral(KWIN_NAME "rulesrc"), KConfig::NoGlobals); - int count = cfg.group("General").readEntry("count", 0); + if (!m_config) { + m_config = KSharedConfig::openConfig(QStringLiteral(KWIN_NAME "rulesrc"), KConfig::NoGlobals); + } + int count = m_config->group("General").readEntry("count", 0); for (int i = 1; i <= count; ++i) { - KConfigGroup cg(&cfg, QString::number(i)); + KConfigGroup cg(m_config, QString::number(i)); Rules* rule = new Rules(cg); m_rules.append(rule); } diff --git a/rules.h b/rules.h index 007ce5b71b..f5367bf394 100644 --- a/rules.h +++ b/rules.h @@ -299,6 +299,11 @@ public: void load(); void edit(AbstractClient* c, bool whole_app); void requestDiskStorage(); + + void setConfig(const KSharedConfig::Ptr &config) { + m_config = config; + } + private Q_SLOTS: void temporaryRulesMessage(const QString&); void cleanupTemporaryRules(); @@ -311,6 +316,7 @@ private: bool m_updatesDisabled; QList m_rules; QScopedPointer m_temporaryRulesMessages; + KSharedConfig::Ptr m_config; KWIN_SINGLETON(RuleBook) };