diff --git a/autotests/test_screens.cpp b/autotests/test_screens.cpp
index cfdf428df6..68920d7bfc 100644
--- a/autotests/test_screens.cpp
+++ b/autotests/test_screens.cpp
@@ -21,6 +21,8 @@ along with this program. If not, see .
#include "../cursor.h"
#include "mock_screens.h"
#include "mock_client.h"
+// frameworks
+#include
// Qt
#include
@@ -28,9 +30,10 @@ along with this program. If not, see .
namespace KWin
{
+static QPoint s_cursorPos = QPoint();
QPoint Cursor::pos()
{
- return QPoint();
+ return s_cursorPos;
}
}
@@ -39,7 +42,10 @@ class TestScreens : public QObject
{
Q_OBJECT
private Q_SLOTS:
+ void init();
void testCurrentFollowsMouse();
+ void testReconfigure_data();
+ void testReconfigure();
void testSize_data();
void testSize();
void testCount();
@@ -48,8 +54,17 @@ private Q_SLOTS:
void testCurrent_data();
void testCurrent();
void testCurrentClient();
+ void testCurrentWithFollowsMouse_data();
+ void testCurrentWithFollowsMouse();
+ void testCurrentPoint_data();
+ void testCurrentPoint();
};
+void TestScreens::init()
+{
+ KWin::s_cursorPos = QPoint();
+}
+
void TestScreens::testCurrentFollowsMouse()
{
KWin::MockWorkspace ws;
@@ -57,8 +72,54 @@ void TestScreens::testCurrentFollowsMouse()
QVERIFY(!screens->isCurrentFollowsMouse());
screens->setCurrentFollowsMouse(true);
QVERIFY(screens->isCurrentFollowsMouse());
+ // setting to same should not do anything
+ screens->setCurrentFollowsMouse(true);
+ QVERIFY(screens->isCurrentFollowsMouse());
+
+ // setting back to other value
screens->setCurrentFollowsMouse(false);
QVERIFY(!screens->isCurrentFollowsMouse());
+ // setting to same should not do anything
+ screens->setCurrentFollowsMouse(false);
+ QVERIFY(!screens->isCurrentFollowsMouse());
+}
+
+void TestScreens::testReconfigure_data()
+{
+ QTest::addColumn("focusPolicy");
+ QTest::addColumn("expectedDefault");
+ QTest::addColumn("setting");
+
+ QTest::newRow("ClickToFocus") << QStringLiteral("ClickToFocus") << false << true;
+ QTest::newRow("FocusFollowsMouse") << QStringLiteral("FocusFollowsMouse") << true << false;
+ QTest::newRow("FocusUnderMouse") << QStringLiteral("FocusUnderMouse") << true << false;
+ QTest::newRow("FocusStrictlyUnderMouse") << QStringLiteral("FocusStrictlyUnderMouse") << true << false;
+}
+
+void TestScreens::testReconfigure()
+{
+ using namespace KWin;
+ MockWorkspace ws;
+ Screens::create(&ws);
+ screens()->reconfigure();
+ QVERIFY(!screens()->isCurrentFollowsMouse());
+
+ QFETCH(QString, focusPolicy);
+
+ KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig);
+ config->group("Windows").writeEntry("FocusPolicy", focusPolicy);
+ config->group("Windows").sync();
+ config->sync();
+
+ screens()->setConfig(config);
+ screens()->reconfigure();
+ QTEST(screens()->isCurrentFollowsMouse(), "expectedDefault");
+
+ QFETCH(bool, setting);
+ config->group("Windows").writeEntry("ActiveMouseScreen", setting);
+ config->sync();
+ screens()->reconfigure();
+ QCOMPARE(screens()->isCurrentFollowsMouse(), setting);
}
void TestScreens::testSize_data()
@@ -221,11 +282,83 @@ void TestScreens::testCurrentClient()
QCOMPARE(currentChangedSpy.count(), 1);
QCOMPARE(screens()->current(), 1);
+ // setting current with the same client again should not change, though
+ screens()->setCurrent(client);
+ QCOMPARE(currentChangedSpy.count(), 1);
+
// and it should even still be on screen 1 if we make the client non-current again
ws.setActiveClient(nullptr);
client->setActive(false);
QCOMPARE(screens()->current(), 1);
}
+void TestScreens::testCurrentWithFollowsMouse_data()
+{
+ QTest::addColumn< QList >("geometries");
+ QTest::addColumn("cursorPos");
+ QTest::addColumn("expected");
+
+ QTest::newRow("empty") << QList{{QRect()}} << QPoint(100, 100) << 0;
+ QTest::newRow("cloned") << QList{{QRect{0, 0, 200, 100}, QRect{0, 0, 200, 100}}} << QPoint(50, 50) << 0;
+ QTest::newRow("adjacent-0") << QList{{QRect{0, 0, 200, 100}, QRect{200, 100, 400, 300}}} << QPoint(199, 99) << 0;
+ QTest::newRow("adjacent-1") << QList{{QRect{0, 0, 200, 100}, QRect{200, 100, 400, 300}}} << QPoint(200, 100) << 1;
+ QTest::newRow("gap") << QList{{QRect{0, 0, 10, 20}, QRect{20, 40, 10, 20}}} << QPoint(15, 30) << 1;
+}
+
+void TestScreens::testCurrentWithFollowsMouse()
+{
+ using namespace KWin;
+ MockWorkspace ws;
+ MockScreens *mockScreens = static_cast(Screens::create(&ws));
+ QSignalSpy changedSpy(screens(), SIGNAL(changed()));
+ QVERIFY(changedSpy.isValid());
+ screens()->setCurrentFollowsMouse(true);
+ QCOMPARE(screens()->current(), 0);
+
+ QFETCH(QList, geometries);
+ mockScreens->setGeometries(geometries);
+ // first is before it's updated
+ QVERIFY(changedSpy.wait());
+ // second is after it's updated
+ QVERIFY(changedSpy.wait());
+
+ QFETCH(QPoint, cursorPos);
+ KWin::s_cursorPos = cursorPos;
+ QTEST(screens()->current(), "expected");
+}
+
+void TestScreens::testCurrentPoint_data()
+{
+ QTest::addColumn< QList >("geometries");
+ QTest::addColumn("cursorPos");
+ QTest::addColumn("expected");
+
+ QTest::newRow("empty") << QList{{QRect()}} << QPoint(100, 100) << 0;
+ QTest::newRow("cloned") << QList{{QRect{0, 0, 200, 100}, QRect{0, 0, 200, 100}}} << QPoint(50, 50) << 0;
+ QTest::newRow("adjacent-0") << QList{{QRect{0, 0, 200, 100}, QRect{200, 100, 400, 300}}} << QPoint(199, 99) << 0;
+ QTest::newRow("adjacent-1") << QList{{QRect{0, 0, 200, 100}, QRect{200, 100, 400, 300}}} << QPoint(200, 100) << 1;
+ QTest::newRow("gap") << QList{{QRect{0, 0, 10, 20}, QRect{20, 40, 10, 20}}} << QPoint(15, 30) << 1;
+}
+
+void TestScreens::testCurrentPoint()
+{
+ using namespace KWin;
+ MockWorkspace ws;
+ MockScreens *mockScreens = static_cast(Screens::create(&ws));
+ QSignalSpy changedSpy(screens(), SIGNAL(changed()));
+ QVERIFY(changedSpy.isValid());
+
+ QFETCH(QList, geometries);
+ mockScreens->setGeometries(geometries);
+ // first is before it's updated
+ QVERIFY(changedSpy.wait());
+ // second is after it's updated
+ QVERIFY(changedSpy.wait());
+
+ QFETCH(QPoint, cursorPos);
+ screens()->setCurrent(cursorPos);
+ QTEST(screens()->current(), "expected");
+}
+
QTEST_MAIN(TestScreens)
#include "test_screens.moc"