diff options
author | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-05-08 14:55:14 +0200 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-28 13:09:42 +0200 |
commit | d1359f8b0c2b8fcffc2112d2e29d530ac1ab7c9a (patch) | |
tree | 0f7fdee380c657914065230d522f91a89563088e /src/compositor/global | |
parent | 85b1d4e6524504321fa769457eea5fb3b7e62e7e (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.cpp | 18 | ||||
-rw-r--r-- | src/compositor/global/qwaylandextension.h | 54 | ||||
-rw-r--r-- | src/compositor/global/qwaylandextension_p.h | 15 |
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*/ |