diff options
-rw-r--r-- | src/client/global/qwaylandclientextension.h | 23 | ||||
-rw-r--r-- | tests/auto/client/clientextension/tst_clientextension.cpp | 13 |
2 files changed, 24 insertions, 12 deletions
diff --git a/src/client/global/qwaylandclientextension.h b/src/client/global/qwaylandclientextension.h index 8fe74e37..c57549c3 100644 --- a/src/client/global/qwaylandclientextension.h +++ b/src/client/global/qwaylandclientextension.h @@ -45,14 +45,31 @@ protected Q_SLOTS: void initialize(); }; -template <typename T> + +template<typename T, auto destruct = nullptr> 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<T *>(this)); + } + }); + } + } + + ~QWaylandClientExtensionTemplate() + { + if constexpr (destruct != nullptr) { + if (isActive()) { + std::invoke(destruct, static_cast<T *>(this)); + } + } } const struct wl_interface *extensionInterface() const override diff --git a/tests/auto/client/clientextension/tst_clientextension.cpp b/tests/auto/client/clientextension/tst_clientextension.cpp index 91b02e3b..c1cd1cb1 100644 --- a/tests/auto/client/clientextension/tst_clientextension.cpp +++ b/tests/auto/client/clientextension/tst_clientextension.cpp @@ -14,17 +14,12 @@ using namespace MockCompositor; -class TestExtension : public QWaylandClientExtensionTemplate<TestExtension>, - public QtWayland::test_interface +class TestExtension + : public QWaylandClientExtensionTemplate<TestExtension, &QtWayland::test_interface::release>, + public QtWayland::test_interface { public: - TestExtension() : QWaylandClientExtensionTemplate<TestExtension>(1) { } - ~TestExtension() - { - if (object()) { - release(); - } - } + TestExtension() : QWaylandClientExtensionTemplate(1){}; void initialize() { QWaylandClientExtension::initialize(); } }; |