Add test case for force opacity rules on ShellClient

This is the first test for force rules. As those cannot be set through
the temporary rules message the rulesrc must be modified. To support this
RuleBook gained a setConfig method.

To my positive surprise the rules already work as intended.
This commit is contained in:
Martin Flöser 2018-02-11 18:27:34 +01:00
parent ca5747c094
commit a0aef86a74
3 changed files with 73 additions and 3 deletions

View file

@ -24,6 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "shell_client.h"
#include "virtualdesktops.h"
#include "wayland_server.h"
#include "workspace.h"
#include <KWayland/Client/surface.h>
@ -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<Test::ShellSurfaceType>("type"); \
QTest::addColumn<int>("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> surface(Test::createSurface());
QFETCH(Test::ShellSurfaceType, type);
QScopedPointer<QObject> 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<Surface> surface2(Test::createSurface());
QScopedPointer<QObject> 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"

View file

@ -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);
}

View file

@ -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<Rules*> m_rules;
QScopedPointer<KXMessages> m_temporaryRulesMessages;
KSharedConfig::Ptr m_config;
KWIN_SINGLETON(RuleBook)
};