diff --git a/src/plugins/platforms/wayland/global/qwaylandclientextension.h b/src/plugins/platforms/wayland/global/qwaylandclientextension.h index 8fe74e37902..c57549c34a8 100644 --- a/src/plugins/platforms/wayland/global/qwaylandclientextension.h +++ b/src/plugins/platforms/wayland/global/qwaylandclientextension.h @@ -45,14 +45,31 @@ protected Q_SLOTS: void initialize(); }; -template + +template class Q_WAYLANDCLIENT_EXPORT QWaylandClientExtensionTemplate : public QWaylandClientExtension { Q_DECLARE_PRIVATE(QWaylandClientExtensionTemplate) + public: - QWaylandClientExtensionTemplate(const int ver) : - QWaylandClientExtension(ver) + QWaylandClientExtensionTemplate(const int ver) : QWaylandClientExtension(ver) { + if constexpr (destruct != nullptr) { + connect(this, &QWaylandClientExtensionTemplate::activeChanged, this, [this] { + if (!isActive()) { + std::invoke(destruct, static_cast(this)); + } + }); + } + } + + ~QWaylandClientExtensionTemplate() + { + if constexpr (destruct != nullptr) { + if (isActive()) { + std::invoke(destruct, static_cast(this)); + } + } } const struct wl_interface *extensionInterface() const override diff --git a/tests/auto/wayland/clientextension/tst_clientextension.cpp b/tests/auto/wayland/clientextension/tst_clientextension.cpp index 91b02e3b249..c1cd1cb1fa3 100644 --- a/tests/auto/wayland/clientextension/tst_clientextension.cpp +++ b/tests/auto/wayland/clientextension/tst_clientextension.cpp @@ -14,17 +14,12 @@ using namespace MockCompositor; -class TestExtension : public QWaylandClientExtensionTemplate, - public QtWayland::test_interface +class TestExtension + : public QWaylandClientExtensionTemplate, + public QtWayland::test_interface { public: - TestExtension() : QWaylandClientExtensionTemplate(1) { } - ~TestExtension() - { - if (object()) { - release(); - } - } + TestExtension() : QWaylandClientExtensionTemplate(1){}; void initialize() { QWaylandClientExtension::initialize(); } };