diff --git a/autotests/integration/CMakeLists.txt b/autotests/integration/CMakeLists.txt index ae58fa52f2..6bdf2d0640 100644 --- a/autotests/integration/CMakeLists.txt +++ b/autotests/integration/CMakeLists.txt @@ -27,6 +27,10 @@ ecm_add_qtwayland_client_protocol(KWinIntegrationTestFramework_SOURCES PROTOCOL ${WaylandProtocols_DATADIR}/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml BASENAME xdg-decoration-unstable-v1 ) +ecm_add_qtwayland_client_protocol(KWinIntegrationTestFramework_SOURCES + PROTOCOL ${WaylandProtocols_DATADIR}/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml + BASENAME idle-inhibit-unstable-v1 +) add_library(KWinIntegrationTestFramework STATIC ${KWinIntegrationTestFramework_SOURCES}) target_link_libraries(KWinIntegrationTestFramework Qt::Test diff --git a/autotests/integration/idle_inhibition_test.cpp b/autotests/integration/idle_inhibition_test.cpp index 08c28df8f2..b27225a81c 100644 --- a/autotests/integration/idle_inhibition_test.cpp +++ b/autotests/integration/idle_inhibition_test.cpp @@ -12,7 +12,6 @@ #include "wayland_server.h" #include "workspace.h" -#include #include #include @@ -56,7 +55,7 @@ void TestIdleInhibition::initTestCase() void TestIdleInhibition::init() { - QVERIFY(Test::setupWaylandConnection(Test::AdditionalWaylandInterface::IdleInhibition)); + QVERIFY(Test::setupWaylandConnection(Test::AdditionalWaylandInterface::IdleInhibitV1)); } @@ -81,8 +80,8 @@ void TestIdleInhibition::testInhibit() QScopedPointer shellSurface(Test::createXdgToplevelSurface(surface.data())); // now create inhibition on window - QScopedPointer inhibitor(Test::waylandIdleInhibitManager()->createInhibitor(surface.data())); - QVERIFY(inhibitor->isValid()); + QScopedPointer inhibitor(Test::createIdleInhibitorV1(surface.data())); + QVERIFY(inhibitor); // render the client auto c = Test::renderAndWaitForShown(surface.data(), QSize(100, 50), Qt::blue); @@ -97,7 +96,7 @@ void TestIdleInhibition::testInhibit() QVERIFY(!idle->isInhibited()); // inhibit again and destroy window - Test::waylandIdleInhibitManager()->createInhibitor(surface.data(), surface.data()); + QScopedPointer inhibitor2(Test::createIdleInhibitorV1(surface.data())); QVERIFY(inhibitedSpy.wait()); QVERIFY(idle->isInhibited()); @@ -129,8 +128,8 @@ void TestIdleInhibition::testDontInhibitWhenNotOnCurrentDesktop() QVERIFY(!shellSurface.isNull()); // Create the inhibitor object. - QScopedPointer inhibitor(Test::waylandIdleInhibitManager()->createInhibitor(surface.data())); - QVERIFY(inhibitor->isValid()); + QScopedPointer inhibitor(Test::createIdleInhibitorV1(surface.data())); + QVERIFY(inhibitor); // Render the client. auto c = Test::renderAndWaitForShown(surface.data(), QSize(100, 50), Qt::blue); @@ -186,8 +185,8 @@ void TestIdleInhibition::testDontInhibitWhenMinimized() QVERIFY(!shellSurface.isNull()); // Create the inhibitor object. - QScopedPointer inhibitor(Test::waylandIdleInhibitManager()->createInhibitor(surface.data())); - QVERIFY(inhibitor->isValid()); + QScopedPointer inhibitor(Test::createIdleInhibitorV1(surface.data())); + QVERIFY(inhibitor); // Render the client. auto c = Test::renderAndWaitForShown(surface.data(), QSize(100, 50), Qt::blue); @@ -235,8 +234,8 @@ void TestIdleInhibition::testDontInhibitWhenUnmapped() QVERIFY(surfaceConfigureRequestedSpy.isValid()); // Create the inhibitor object. - QScopedPointer inhibitor(Test::waylandIdleInhibitManager()->createInhibitor(surface.data())); - QVERIFY(inhibitor->isValid()); + QScopedPointer inhibitor(Test::createIdleInhibitorV1(surface.data())); + QVERIFY(inhibitor); // Map the client. QSignalSpy clientAddedSpy(workspace(), &Workspace::clientAdded); @@ -316,8 +315,8 @@ void TestIdleInhibition::testDontInhibitWhenLeftCurrentDesktop() QVERIFY(!shellSurface.isNull()); // Create the inhibitor object. - QScopedPointer inhibitor(Test::waylandIdleInhibitManager()->createInhibitor(surface.data())); - QVERIFY(inhibitor->isValid()); + QScopedPointer inhibitor(Test::createIdleInhibitorV1(surface.data())); + QVERIFY(inhibitor); // Render the client. auto c = Test::renderAndWaitForShown(surface.data(), QSize(100, 50), Qt::blue); diff --git a/autotests/integration/kwin_wayland_test.h b/autotests/integration/kwin_wayland_test.h index c22050b6d5..67f2885a57 100644 --- a/autotests/integration/kwin_wayland_test.h +++ b/autotests/integration/kwin_wayland_test.h @@ -14,6 +14,7 @@ // Qt #include +#include "qwayland-idle-inhibit-unstable-v1.h" #include "qwayland-wlr-layer-shell-unstable-v1.h" #include "qwayland-text-input-unstable-v3.h" #include "qwayland-xdg-decoration-unstable-v1.h" @@ -26,7 +27,6 @@ namespace Client class AppMenuManager; class ConnectionThread; class Compositor; -class IdleInhibitManager; class Output; class PlasmaShell; class PlasmaWindowManagement; @@ -247,13 +247,26 @@ protected: void zxdg_toplevel_decoration_v1_configure(uint32_t mode) override; }; +class IdleInhibitManagerV1 : public QtWayland::zwp_idle_inhibit_manager_v1 +{ +public: + ~IdleInhibitManagerV1() override; +}; + +class IdleInhibitorV1 : public QtWayland::zwp_idle_inhibitor_v1 +{ +public: + IdleInhibitorV1(IdleInhibitManagerV1 *manager, KWayland::Client::Surface *surface); + ~IdleInhibitorV1() override; +}; + enum class AdditionalWaylandInterface { Seat = 1 << 0, Decoration = 1 << 1, PlasmaShell = 1 << 2, WindowManagement = 1 << 3, PointerConstraints = 1 << 4, - IdleInhibition = 1 << 5, + IdleInhibitV1 = 1 << 5, AppMenu = 1 << 6, ShadowManager = 1 << 7, XdgDecorationV1 = 1 << 8, @@ -291,7 +304,6 @@ KWayland::Client::ServerSideDecorationManager *waylandServerSideDecoration(); KWayland::Client::PlasmaShell *waylandPlasmaShell(); KWayland::Client::PlasmaWindowManagement *waylandWindowManagement(); KWayland::Client::PointerConstraints *waylandPointerConstraints(); -KWayland::Client::IdleInhibitManager *waylandIdleInhibitManager(); KWayland::Client::AppMenuManager *waylandAppMenuManager(); KWayland::Client::OutputManagement *waylandOutputManagement(); KWayland::Client::TextInputManager *waylandTextInputManager(); @@ -333,6 +345,7 @@ XdgPopup *createXdgPopupSurface(KWayland::Client::Surface *surface, XdgSurface * CreationSetup configureMode = CreationSetup::CreateAndConfigure); XdgToplevelDecorationV1 *createXdgToplevelDecorationV1(XdgToplevel *toplevel, QObject *parent = nullptr); +IdleInhibitorV1 *createIdleInhibitorV1(KWayland::Client::Surface *surface); /** diff --git a/autotests/integration/test_helpers.cpp b/autotests/integration/test_helpers.cpp index 29d9f9b4b0..e7f6c81f32 100644 --- a/autotests/integration/test_helpers.cpp +++ b/autotests/integration/test_helpers.cpp @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -208,6 +207,21 @@ void XdgToplevelDecorationV1::zxdg_toplevel_decoration_v1_configure(uint32_t m) emit configureRequested(mode(m)); } +IdleInhibitManagerV1::~IdleInhibitManagerV1() +{ + destroy(); +} + +IdleInhibitorV1::IdleInhibitorV1(IdleInhibitManagerV1 *manager, KWayland::Client::Surface *surface) + : QtWayland::zwp_idle_inhibitor_v1(manager->create_inhibitor(*surface)) +{ +} + +IdleInhibitorV1::~IdleInhibitorV1() +{ + destroy(); +} + static struct { ConnectionThread *connection = nullptr; EventQueue *queue = nullptr; @@ -226,7 +240,7 @@ static struct { QThread *thread = nullptr; QVector outputs; QVector outputDevices; - IdleInhibitManager *idleInhibit = nullptr; + IdleInhibitManagerV1 *idleInhibitManagerV1 = nullptr; AppMenuManager *appMenu = nullptr; XdgDecorationManagerV1 *xdgDecorationManagerV1 = nullptr; TextInputManager *textInputManager = nullptr; @@ -384,6 +398,13 @@ bool setupWaylandConnection(AdditionalWaylandInterfaces flags) return; } } + if (flags & AdditionalWaylandInterface::IdleInhibitV1) { + if (interface == zwp_idle_inhibit_manager_v1_interface.name) { + s_waylandConnection.idleInhibitManagerV1 = new IdleInhibitManagerV1(); + s_waylandConnection.idleInhibitManagerV1->init(*registry, name, version); + return; + } + } }); QSignalSpy allAnnounced(registry, &Registry::interfacesAnnounced); @@ -459,13 +480,6 @@ bool setupWaylandConnection(AdditionalWaylandInterfaces flags) return false; } } - if (flags.testFlag(AdditionalWaylandInterface::IdleInhibition)) { - s_waylandConnection.idleInhibit = registry->createIdleInhibitManager(registry->interface(Registry::Interface::IdleInhibitManagerUnstableV1).name, - registry->interface(Registry::Interface::IdleInhibitManagerUnstableV1).version); - if (!s_waylandConnection.idleInhibit->isValid()) { - return false; - } - } if (flags.testFlag(AdditionalWaylandInterface::AppMenu)) { s_waylandConnection.appMenu = registry->createAppMenuManager(registry->interface(Registry::Interface::AppMenu).name, registry->interface(Registry::Interface::AppMenu).version); if (!s_waylandConnection.appMenu->isValid()) { @@ -504,8 +518,8 @@ void destroyWaylandConnection() s_waylandConnection.xdgShell = nullptr; delete s_waylandConnection.shadowManager; s_waylandConnection.shadowManager = nullptr; - delete s_waylandConnection.idleInhibit; - s_waylandConnection.idleInhibit = nullptr; + delete s_waylandConnection.idleInhibitManagerV1; + s_waylandConnection.idleInhibitManagerV1 = nullptr; delete s_waylandConnection.shm; s_waylandConnection.shm = nullptr; delete s_waylandConnection.queue; @@ -590,11 +604,6 @@ PointerConstraints *waylandPointerConstraints() return s_waylandConnection.pointerConstraints; } -IdleInhibitManager *waylandIdleInhibitManager() -{ - return s_waylandConnection.idleInhibit; -} - AppMenuManager* waylandAppMenuManager() { return s_waylandConnection.appMenu; @@ -845,6 +854,17 @@ XdgToplevelDecorationV1 *createXdgToplevelDecorationV1(XdgToplevel *toplevel, QO return new XdgToplevelDecorationV1(manager, toplevel, parent); } +IdleInhibitorV1 *createIdleInhibitorV1(KWayland::Client::Surface *surface) +{ + IdleInhibitManagerV1 *manager = s_waylandConnection.idleInhibitManagerV1; + if (!manager) { + qWarning() << "Could not create an idle_inhibitor_v1 because idle_inhibit_manager_v1 global is not bound"; + return nullptr; + } + + return new IdleInhibitorV1(manager, surface); +} + bool waitForWindowDestroyed(AbstractClient *client) { QSignalSpy destroyedSpy(client, &QObject::destroyed);