summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/global/qwaylandclientextension.h23
-rw-r--r--tests/auto/client/clientextension/tst_clientextension.cpp13
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(); }
};