@ -45,6 +45,10 @@ private Q_SLOTS:
void testInhibit_data ( ) ;
void testInhibit ( ) ;
void testDontInhibitWhenNotOnCurrentDesktop ( ) ;
void testDontInhibitWhenMinimized ( ) ;
void testDontInhibitWhenUnmapped ( ) ;
void testDontInhibitWhenLeftCurrentDesktop ( ) ;
} ;
void TestIdleInhibition : : initTestCase ( )
@ -70,6 +74,9 @@ void TestIdleInhibition::init()
void TestIdleInhibition : : cleanup ( )
{
Test : : destroyWaylandConnection ( ) ;
VirtualDesktopManager : : self ( ) - > setCount ( 1 ) ;
QCOMPARE ( VirtualDesktopManager : : self ( ) - > count ( ) , 1u ) ;
}
void TestIdleInhibition : : testInhibit_data ( )
@ -125,5 +132,232 @@ void TestIdleInhibition::testInhibit()
QCOMPARE ( inhibitedSpy . count ( ) , 4 ) ;
}
void TestIdleInhibition : : testDontInhibitWhenNotOnCurrentDesktop ( )
{
// This test verifies that the idle inhibitor object is not honored when
// the associated surface is not on the current virtual desktop.
VirtualDesktopManager : : self ( ) - > setCount ( 2 ) ;
QCOMPARE ( VirtualDesktopManager : : self ( ) - > count ( ) , 2u ) ;
// Get reference to the idle interface.
auto idle = waylandServer ( ) - > display ( ) - > findChild < IdleInterface * > ( ) ;
QVERIFY ( idle ) ;
QVERIFY ( ! idle - > isInhibited ( ) ) ;
QSignalSpy inhibitedSpy ( idle , & IdleInterface : : inhibitedChanged ) ;
QVERIFY ( inhibitedSpy . isValid ( ) ) ;
// Create the test client.
QScopedPointer < Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( ! surface . isNull ( ) ) ;
QScopedPointer < XdgShellSurface > shellSurface ( Test : : createXdgShellStableSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! shellSurface . isNull ( ) ) ;
// Create the inhibitor object.
QScopedPointer < IdleInhibitor > inhibitor ( Test : : waylandIdleInhibitManager ( ) - > createInhibitor ( surface . data ( ) ) ) ;
QVERIFY ( inhibitor - > isValid ( ) ) ;
// Render the client.
auto c = Test : : renderAndWaitForShown ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
QVERIFY ( c ) ;
// The test client should be only on the first virtual desktop.
QCOMPARE ( c - > desktops ( ) . count ( ) , 1 ) ;
QCOMPARE ( c - > desktops ( ) . first ( ) , VirtualDesktopManager : : self ( ) - > desktops ( ) . first ( ) ) ;
// This should inhibit our server object.
QVERIFY ( idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 1 ) ;
// Switch to the second virtual desktop.
VirtualDesktopManager : : self ( ) - > setCurrent ( 2 ) ;
// The surface is no longer visible, so the compositor don't have to honor the
// idle inhibitor object.
QVERIFY ( ! idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 2 ) ;
// Switch back to the first virtual desktop.
VirtualDesktopManager : : self ( ) - > setCurrent ( 1 ) ;
// The test client became visible again, so the compositor has to honor the idle
// inhibitor object back again.
QVERIFY ( idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 3 ) ;
// Destroy the test client.
shellSurface . reset ( ) ;
QVERIFY ( Test : : waitForWindowDestroyed ( c ) ) ;
QTRY_VERIFY ( ! idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 4 ) ;
}
void TestIdleInhibition : : testDontInhibitWhenMinimized ( )
{
// This test verifies that the idle inhibitor object is not honored when the
// associated surface is minimized.
// Get reference to the idle interface.
auto idle = waylandServer ( ) - > display ( ) - > findChild < IdleInterface * > ( ) ;
QVERIFY ( idle ) ;
QVERIFY ( ! idle - > isInhibited ( ) ) ;
QSignalSpy inhibitedSpy ( idle , & IdleInterface : : inhibitedChanged ) ;
QVERIFY ( inhibitedSpy . isValid ( ) ) ;
// Create the test client.
QScopedPointer < Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( ! surface . isNull ( ) ) ;
QScopedPointer < XdgShellSurface > shellSurface ( Test : : createXdgShellStableSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! shellSurface . isNull ( ) ) ;
// Create the inhibitor object.
QScopedPointer < IdleInhibitor > inhibitor ( Test : : waylandIdleInhibitManager ( ) - > createInhibitor ( surface . data ( ) ) ) ;
QVERIFY ( inhibitor - > isValid ( ) ) ;
// Render the client.
auto c = Test : : renderAndWaitForShown ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
QVERIFY ( c ) ;
// This should inhibit our server object.
QVERIFY ( idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 1 ) ;
// Minimize the client, the idle inhibitor object should not be honored.
c - > minimize ( ) ;
QVERIFY ( ! idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 2 ) ;
// Unminimize the client, the idle inhibitor object should be honored back again.
c - > unminimize ( ) ;
QVERIFY ( idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 3 ) ;
// Destroy the test client.
shellSurface . reset ( ) ;
QVERIFY ( Test : : waitForWindowDestroyed ( c ) ) ;
QTRY_VERIFY ( ! idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 4 ) ;
}
void TestIdleInhibition : : testDontInhibitWhenUnmapped ( )
{
// This test verifies that the idle inhibitor object is not honored by KWin
// when the associated client is unmapped.
// Get reference to the idle interface.
auto idle = waylandServer ( ) - > display ( ) - > findChild < IdleInterface * > ( ) ;
QVERIFY ( idle ) ;
QVERIFY ( ! idle - > isInhibited ( ) ) ;
QSignalSpy inhibitedSpy ( idle , & IdleInterface : : inhibitedChanged ) ;
QVERIFY ( inhibitedSpy . isValid ( ) ) ;
// Create the test client.
QScopedPointer < Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( ! surface . isNull ( ) ) ;
QScopedPointer < XdgShellSurface > shellSurface ( Test : : createXdgShellStableSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! shellSurface . isNull ( ) ) ;
// Create the inhibitor object.
QScopedPointer < IdleInhibitor > inhibitor ( Test : : waylandIdleInhibitManager ( ) - > createInhibitor ( surface . data ( ) ) ) ;
QVERIFY ( inhibitor - > isValid ( ) ) ;
// Render the client.
auto c = Test : : renderAndWaitForShown ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
QVERIFY ( c ) ;
// This should inhibit our server object.
QVERIFY ( idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 1 ) ;
// Unmap the client.
QSignalSpy hiddenSpy ( c , & ShellClient : : windowHidden ) ;
QVERIFY ( hiddenSpy . isValid ( ) ) ;
surface - > attachBuffer ( Buffer : : Ptr ( ) ) ;
surface - > commit ( Surface : : CommitFlag : : None ) ;
QVERIFY ( hiddenSpy . wait ( ) ) ;
// The surface is no longer visible, so the compositor don't have to honor the
// idle inhibitor object.
QVERIFY ( ! idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 2 ) ;
// Map the client.
QSignalSpy windowShownSpy ( c , & ShellClient : : windowShown ) ;
QVERIFY ( windowShownSpy . isValid ( ) ) ;
Test : : render ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
QVERIFY ( windowShownSpy . wait ( ) ) ;
// The test client became visible again, so the compositor has to honor the idle
// inhibitor object back again.
QVERIFY ( idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 3 ) ;
// Destroy the test client.
shellSurface . reset ( ) ;
QVERIFY ( Test : : waitForWindowDestroyed ( c ) ) ;
QTRY_VERIFY ( ! idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 4 ) ;
}
void TestIdleInhibition : : testDontInhibitWhenLeftCurrentDesktop ( )
{
// This test verifies that the idle inhibitor object is not honored by KWin
// when the associated surface leaves the current virtual desktop.
VirtualDesktopManager : : self ( ) - > setCount ( 2 ) ;
QCOMPARE ( VirtualDesktopManager : : self ( ) - > count ( ) , 2u ) ;
// Get reference to the idle interface.
auto idle = waylandServer ( ) - > display ( ) - > findChild < IdleInterface * > ( ) ;
QVERIFY ( idle ) ;
QVERIFY ( ! idle - > isInhibited ( ) ) ;
QSignalSpy inhibitedSpy ( idle , & IdleInterface : : inhibitedChanged ) ;
QVERIFY ( inhibitedSpy . isValid ( ) ) ;
// Create the test client.
QScopedPointer < Surface > surface ( Test : : createSurface ( ) ) ;
QVERIFY ( ! surface . isNull ( ) ) ;
QScopedPointer < XdgShellSurface > shellSurface ( Test : : createXdgShellStableSurface ( surface . data ( ) ) ) ;
QVERIFY ( ! shellSurface . isNull ( ) ) ;
// Create the inhibitor object.
QScopedPointer < IdleInhibitor > inhibitor ( Test : : waylandIdleInhibitManager ( ) - > createInhibitor ( surface . data ( ) ) ) ;
QVERIFY ( inhibitor - > isValid ( ) ) ;
// Render the client.
auto c = Test : : renderAndWaitForShown ( surface . data ( ) , QSize ( 100 , 50 ) , Qt : : blue ) ;
QVERIFY ( c ) ;
// The test client should be only on the first virtual desktop.
QCOMPARE ( c - > desktops ( ) . count ( ) , 1 ) ;
QCOMPARE ( c - > desktops ( ) . first ( ) , VirtualDesktopManager : : self ( ) - > desktops ( ) . first ( ) ) ;
// This should inhibit our server object.
QVERIFY ( idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 1 ) ;
// Let the client enter the second virtual desktop.
c - > enterDesktop ( VirtualDesktopManager : : self ( ) - > desktops ( ) . at ( 1 ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 1 ) ;
// If the client leaves the first virtual desktop, then the associated idle
// inhibitor object should not be honored.
c - > leaveDesktop ( VirtualDesktopManager : : self ( ) - > desktops ( ) . at ( 0 ) ) ;
QVERIFY ( ! idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 2 ) ;
// If the client enters the first desktop, then the associated idle inhibitor
// object should be honored back again.
c - > enterDesktop ( VirtualDesktopManager : : self ( ) - > desktops ( ) . at ( 0 ) ) ;
QVERIFY ( idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 3 ) ;
// Destroy the test client.
shellSurface . reset ( ) ;
QVERIFY ( Test : : waitForWindowDestroyed ( c ) ) ;
QTRY_VERIFY ( ! idle - > isInhibited ( ) ) ;
QCOMPARE ( inhibitedSpy . count ( ) , 4 ) ;
}
WAYLANDTEST_MAIN ( TestIdleInhibition )
# include "idle_inhibition_test.moc"