diff --git a/autotests/wayland/lockscreen.cpp b/autotests/wayland/lockscreen.cpp index 9bcca92012..bb43eb2a62 100644 --- a/autotests/wayland/lockscreen.cpp +++ b/autotests/wayland/lockscreen.cpp @@ -26,6 +26,7 @@ along with this program. If not, see . #include "wayland_server.h" #include "workspace.h" #include "shell_client.h" +#include #include #include @@ -58,6 +59,7 @@ private Q_SLOTS: void testPointerButton(); void testPointerAxis(); void testScreenEdge(); + void testEffects(); private: void unlock(); @@ -70,6 +72,22 @@ private: QThread *m_thread = nullptr; }; +class HelperEffect : public Effect +{ + Q_OBJECT +public: + HelperEffect() {} + ~HelperEffect() {} + + void windowInputMouseEvent(QEvent*) override { + emit inputEvent(); + } + +Q_SIGNALS: + void inputEvent(); +}; + + void LockScreenTest::unlock() { using namespace ScreenLocker; @@ -437,6 +455,58 @@ void LockScreenTest::testScreenEdge() QCOMPARE(screenEdgeSpy.count(), 2); } +void LockScreenTest::testEffects() +{ + QScopedPointer effect(new HelperEffect); + QSignalSpy inputSpy(effect.data(), &HelperEffect::inputEvent); + QVERIFY(inputSpy.isValid()); + effects->startMouseInterception(effect.data(), Qt::ArrowCursor); + + quint32 timestamp = 1; + QCOMPARE(inputSpy.count(), 0); + waylandServer()->backend()->pointerMotion(QPoint(5, 5), timestamp++); + QCOMPARE(inputSpy.count(), 1); + // simlate click + waylandServer()->backend()->pointerButtonPressed(BTN_LEFT, timestamp++); + QCOMPARE(inputSpy.count(), 2); + waylandServer()->backend()->pointerButtonReleased(BTN_LEFT, timestamp++); + QCOMPARE(inputSpy.count(), 3); + + QVERIFY(!waylandServer()->isScreenLocked()); + QSignalSpy lockStateChangedSpy(ScreenLocker::KSldApp::self(), &ScreenLocker::KSldApp::lockStateChanged); + QVERIFY(lockStateChangedSpy.isValid()); + ScreenLocker::KSldApp::self()->lock(ScreenLocker::EstablishLock::Immediate); + QCOMPARE(lockStateChangedSpy.count(), 1); + QVERIFY(waylandServer()->isScreenLocked()); + + waylandServer()->backend()->pointerMotion(QPoint(6, 6), timestamp++); + QCOMPARE(inputSpy.count(), 3); + // simlate click + waylandServer()->backend()->pointerButtonPressed(BTN_LEFT, timestamp++); + QCOMPARE(inputSpy.count(), 3); + waylandServer()->backend()->pointerButtonReleased(BTN_LEFT, timestamp++); + QCOMPARE(inputSpy.count(), 3); + + // and unlock + QCOMPARE(lockStateChangedSpy.count(), 1); + unlock(); + if (lockStateChangedSpy.count() < 2) { + QVERIFY(lockStateChangedSpy.wait()); + } + QCOMPARE(lockStateChangedSpy.count(), 2); + QVERIFY(!waylandServer()->isScreenLocked()); + + waylandServer()->backend()->pointerMotion(QPoint(5, 5), timestamp++); + QCOMPARE(inputSpy.count(), 4); + // simlate click + waylandServer()->backend()->pointerButtonPressed(BTN_LEFT, timestamp++); + QCOMPARE(inputSpy.count(), 5); + waylandServer()->backend()->pointerButtonReleased(BTN_LEFT, timestamp++); + QCOMPARE(inputSpy.count(), 6); + + effects->stopMouseInterception(effect.data()); +} + } WAYLANTEST_MAIN(KWin::LockScreenTest)