summaryrefslogtreecommitdiffstats
path: root/src/compositor/global
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-05-08 14:55:14 +0200
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-28 13:09:42 +0200
commitd1359f8b0c2b8fcffc2112d2e29d530ac1ab7c9a (patch)
tree0f7fdee380c657914065230d522f91a89563088e /src/compositor/global
parent85b1d4e6524504321fa769457eea5fb3b7e62e7e (diff)
Improve QWaylandExtension
By using curiously recurring template pattern we can generate a getter which is very convenient, and all QWaylandExtensions should have this casting operation Change-Id: Idb5a786655f2e106cf5388b11ed71e8b6ddddec0
Diffstat (limited to 'src/compositor/global')
-rw-r--r--src/compositor/global/qwaylandextension.cpp18
-rw-r--r--src/compositor/global/qwaylandextension.h54
-rw-r--r--src/compositor/global/qwaylandextension_p.h15
3 files changed, 34 insertions, 53 deletions
diff --git a/src/compositor/global/qwaylandextension.cpp b/src/compositor/global/qwaylandextension.cpp
index 55fd994ee..e255aecc3 100644
--- a/src/compositor/global/qwaylandextension.cpp
+++ b/src/compositor/global/qwaylandextension.cpp
@@ -70,7 +70,7 @@ QWaylandExtensionContainer::~QWaylandExtensionContainer()
QWaylandExtension *QWaylandExtensionContainer::extension(const QByteArray &name)
{
for (int i = 0; i < extension_vector.size(); i++) {
- if (extension_vector.at(i)->name() == name)
+ if (extension_vector.at(i)->extensionInterface()->name == name)
return extension_vector.at(i);
}
return Q_NULLPTR;
@@ -79,7 +79,7 @@ QWaylandExtension *QWaylandExtensionContainer::extension(const QByteArray &name)
QWaylandExtension *QWaylandExtensionContainer::extension(const wl_interface *interface)
{
for (int i = 0; i < extension_vector.size(); i++) {
- if (extension_vector.at(i)->interface() == interface)
+ if (extension_vector.at(i)->extensionInterface() == interface)
return extension_vector.at(i);
}
return Q_NULLPTR;
@@ -101,18 +101,4 @@ void QWaylandExtensionContainer::removeExtension(QWaylandExtension *extension)
extension_vector.removeOne(extension);
}
-QWaylandExtensionTemplate::QWaylandExtensionTemplate(QWaylandExtensionContainer *container, QObject *parent)
- : QWaylandExtension(container, parent)
-{ }
-
-QWaylandExtensionTemplate::QWaylandExtensionTemplate(QWaylandExtensionTemplatePrivate &dd, QObject *parent)
- : QWaylandExtension(dd, parent)
-{ }
-
-const struct wl_interface *QWaylandExtensionTemplate::interface() const
-{
- Q_D(const QWaylandExtensionTemplate);
- return d->interface();
-}
-
QT_END_NAMESPACE
diff --git a/src/compositor/global/qwaylandextension.h b/src/compositor/global/qwaylandextension.h
index e31c6398d..dbb87a99b 100644
--- a/src/compositor/global/qwaylandextension.h
+++ b/src/compositor/global/qwaylandextension.h
@@ -46,27 +46,10 @@
QT_BEGIN_NAMESPACE
class QWaylandCompositor;
-class QWaylandExtensionContainer;
+class QWaylandExtension;
class QWaylandExtensionPrivate;
class QWaylandExtensionTemplatePrivate;
-class Q_COMPOSITOR_EXPORT QWaylandExtension : public QObject
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QWaylandExtension)
-public:
- QWaylandExtension(QWaylandExtensionContainer *container, QObject *parent = 0);
- virtual ~QWaylandExtension();
-
- virtual const struct wl_interface *interface() const = 0;
-
- const QByteArray name() const { return interface()->name; }
- quint32 version() const { return interface()->version; }
-
-protected:
- QWaylandExtension(QWaylandExtensionPrivate &dd, QObject *parent = 0);
-};
-
class Q_COMPOSITOR_EXPORT QWaylandExtensionContainer
{
public:
@@ -82,17 +65,44 @@ protected:
QVector<QWaylandExtension *> extension_vector;
};
-class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplate : public QWaylandExtension
+class Q_COMPOSITOR_EXPORT QWaylandExtension : public QObject
{
Q_OBJECT
+ Q_DECLARE_PRIVATE(QWaylandExtension)
+public:
+ QWaylandExtension(QWaylandExtensionContainer *container, QObject *parent = 0);
+ virtual ~QWaylandExtension();
+
+ virtual const struct wl_interface *extensionInterface() const = 0;
+
+protected:
+ QWaylandExtension(QWaylandExtensionPrivate &dd, QObject *parent = 0);
+};
+
+template <typename T>
+class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplate : public QWaylandExtension
+{
Q_DECLARE_PRIVATE(QWaylandExtensionTemplate)
public:
- QWaylandExtensionTemplate(QWaylandExtensionContainer *container, QObject *parent = 0);
+ QWaylandExtensionTemplate(QWaylandExtensionContainer *container, QObject *parent = 0)
+ : QWaylandExtension(container, parent)
+ { }
+
+ const struct wl_interface *extensionInterface() const Q_DECL_OVERRIDE
+ {
+ return T::interface();
+ }
- const struct wl_interface *interface() const Q_DECL_OVERRIDE;
+ static T *get(QWaylandExtensionContainer *container)
+ {
+ if (!container) return Q_NULLPTR;
+ return qobject_cast<T *>(container->extension(T::interfaceName()));
+ }
protected:
- QWaylandExtensionTemplate(QWaylandExtensionTemplatePrivate &dd, QObject *parent = 0);
+ QWaylandExtensionTemplate(QWaylandExtensionTemplatePrivate &dd, QObject *parent = 0)
+ : QWaylandExtension(dd, parent)
+ { }
};
QT_END_NAMESPACE
diff --git a/src/compositor/global/qwaylandextension_p.h b/src/compositor/global/qwaylandextension_p.h
index b86943650..5ca5bd3cf 100644
--- a/src/compositor/global/qwaylandextension_p.h
+++ b/src/compositor/global/qwaylandextension_p.h
@@ -56,25 +56,10 @@ public:
class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplatePrivate : public QWaylandExtensionPrivate
{
- Q_DECLARE_PUBLIC(QWaylandExtension)
-
public:
QWaylandExtensionTemplatePrivate(QWaylandExtensionContainer *container)
: QWaylandExtensionPrivate(container)
- {}
-
- virtual const struct wl_interface *interface() const = 0;
-};
-
-template <typename T>
-class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplatePrivateImpl : public QWaylandExtensionTemplatePrivate, public T
-{
-public:
- QWaylandExtensionTemplatePrivateImpl(QWaylandExtensionContainer *container)
- : QWaylandExtensionTemplatePrivate(container)
{ }
-
- const struct wl_interface *interface() const Q_DECL_OVERRIDE { return T::interface(); }
};
#endif /*QWAYLANDEXTENSION_P_H*/