summaryrefslogtreecommitdiffstats
path: root/src/compositor/global
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-24 16:51:01 +0200
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-28 13:10:33 +0200
commitd2d70779224b067f6035f431319036054272ce65 (patch)
tree0ea297990553ff75cf82fb840d59dde903903dcd /src/compositor/global
parent88f821e189bd1d4d4550c1864f622ca7df2a7c34 (diff)
Make the default wl_shell available from QML
This finaly ties together how to use QWaylandQuickItems with different shells It was required to decouple QWaylandView from the QWaylandQuickItem since QML doesn't play to well with muliple inheritance. The QWaylandQuickItem can be retrieved from the QWaylandView which is now conveniently a QObject. Also the QWaylandQuickItem owns the QWaylandView. This architecture also leaves room for creating a QWaylandWidget :) Change-Id: Ib8a00e6f17f0f1bfc3ff244753f021c76db22cb1
Diffstat (limited to 'src/compositor/global')
-rw-r--r--src/compositor/global/qwaylandextension.cpp79
-rw-r--r--src/compositor/global/qwaylandextension.h30
-rw-r--r--src/compositor/global/qwaylandextension_p.h12
3 files changed, 104 insertions, 17 deletions
diff --git a/src/compositor/global/qwaylandextension.cpp b/src/compositor/global/qwaylandextension.cpp
index 915d6379d..d42f7e4be 100644
--- a/src/compositor/global/qwaylandextension.cpp
+++ b/src/compositor/global/qwaylandextension.cpp
@@ -38,31 +38,95 @@
#include "qwaylandextension.h"
#include "qwaylandextension_p.h"
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
+
#include <wayland-server.h>
QT_BEGIN_NAMESPACE
-QWaylandExtension::QWaylandExtension(QWaylandExtensionContainer *container, QObject *parent)
- : QObject(*new QWaylandExtensionPrivate(container), parent)
+QWaylandExtension::QWaylandExtension()
+ : QObject(*new QWaylandExtensionPrivate())
+{
+}
+
+QWaylandExtension::QWaylandExtension(QWaylandExtensionContainer *container)
+ : QObject(*new QWaylandExtensionPrivate())
{
- container->addExtension(this);
+ d_func()->extension_container = container;
+ QCoreApplication::postEvent(this, new QEvent(QEvent::Polish));
}
-QWaylandExtension::QWaylandExtension(QWaylandExtensionPrivate &dd, QObject *parent)
- : QObject(dd,parent)
+QWaylandExtension::QWaylandExtension(QWaylandExtensionPrivate &dd)
+ : QObject(dd)
{
- d_func()->extension_container->addExtension(this);
+}
+
+QWaylandExtension::QWaylandExtension(QWaylandExtensionContainer *container, QWaylandExtensionPrivate &dd)
+ : QObject(dd)
+{
+ d_func()->extension_container = container;
+ QCoreApplication::postEvent(this, new QEvent(QEvent::Polish));
}
QWaylandExtension::~QWaylandExtension()
{
Q_D(QWaylandExtension);
- d->extension_container->removeExtension(this);
+ if (d->extension_container)
+ d->extension_container->removeExtension(this);
+}
+
+QWaylandExtensionContainer *QWaylandExtension::extensionContainer() const
+{
+ Q_D(const QWaylandExtension);
+ return d->extension_container;
+}
+
+void QWaylandExtension::setExtensionContainer(QWaylandExtensionContainer *container)
+{
+ Q_D(QWaylandExtension);
+ d->extension_container = container;
+}
+
+void QWaylandExtension::initialize()
+{
+ Q_D(QWaylandExtension);
+ if (d->initialized) {
+ qWarning() << "QWaylandExtension:" << extensionInterface()->name << "is already initialized";
+ return;
+ }
+
+ if (!d->extension_container) {
+ qWarning() << "QWaylandExtension:" << extensionInterface()->name << "requests to initialize with no extension container set";
+ return;
+ }
+
+ d->extension_container->addExtension(this);
+ d->initialized = true;
+}
+
+bool QWaylandExtension::isInitialized() const
+{
+ Q_D(const QWaylandExtension);
+ return d->initialized;
+}
+
+bool QWaylandExtension::event(QEvent *event)
+{
+ switch(event->type()) {
+ case QEvent::Polish:
+ initialize();
+ break;
+ default:
+ break;
+ }
+ return QObject::event(event);
}
QWaylandExtensionContainer::~QWaylandExtensionContainer()
{
foreach (QWaylandExtension *extension, extension_vector) {
+ QWaylandExtensionPrivate::get(extension)->extension_container = Q_NULLPTR;
delete extension;
}
}
@@ -98,6 +162,7 @@ void QWaylandExtensionContainer::addExtension(QWaylandExtension *extension)
void QWaylandExtensionContainer::removeExtension(QWaylandExtension *extension)
{
+ Q_ASSERT(extension_vector.contains(extension));
extension_vector.removeOne(extension);
}
diff --git a/src/compositor/global/qwaylandextension.h b/src/compositor/global/qwaylandextension.h
index 00523ba4d..f597cd9ad 100644
--- a/src/compositor/global/qwaylandextension.h
+++ b/src/compositor/global/qwaylandextension.h
@@ -70,13 +70,23 @@ class Q_COMPOSITOR_EXPORT QWaylandExtension : public QObject
Q_OBJECT
Q_DECLARE_PRIVATE(QWaylandExtension)
public:
- QWaylandExtension(QWaylandExtensionContainer *container, QObject *parent = 0);
+ QWaylandExtension();
+ QWaylandExtension(QWaylandExtensionContainer *container);
virtual ~QWaylandExtension();
+ QWaylandExtensionContainer *extensionContainer() const;
+ void setExtensionContainer(QWaylandExtensionContainer *container);
+
+ Q_INVOKABLE virtual void initialize();
+ bool isInitialized() const;
+
virtual const struct wl_interface *extensionInterface() const = 0;
protected:
- QWaylandExtension(QWaylandExtensionPrivate &dd, QObject *parent = 0);
+ QWaylandExtension(QWaylandExtensionPrivate &dd);
+ QWaylandExtension(QWaylandExtensionContainer *container, QWaylandExtensionPrivate &dd);
+
+ bool event(QEvent *event) Q_DECL_OVERRIDE;
};
template <typename T>
@@ -84,8 +94,12 @@ class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplate : public QWaylandExtension
{
Q_DECLARE_PRIVATE(QWaylandExtensionTemplate)
public:
- QWaylandExtensionTemplate(QWaylandExtensionContainer *container, QObject *_parent = 0)
- : QWaylandExtension(container, _parent)
+ QWaylandExtensionTemplate()
+ : QWaylandExtension()
+ { }
+
+ QWaylandExtensionTemplate(QWaylandExtensionContainer *container)
+ : QWaylandExtension(container)
{ }
const struct wl_interface *extensionInterface() const Q_DECL_OVERRIDE
@@ -100,8 +114,12 @@ public:
}
protected:
- QWaylandExtensionTemplate(QWaylandExtensionTemplatePrivate &dd, QObject *_parent = 0)
- : QWaylandExtension(dd, _parent)
+ QWaylandExtensionTemplate(QWaylandExtensionTemplatePrivate &dd)
+ : QWaylandExtension(dd)
+ { }
+
+ QWaylandExtensionTemplate(QWaylandExtensionContainer *container, QWaylandExtensionTemplatePrivate &dd)
+ : QWaylandExtension(container,dd)
{ }
};
diff --git a/src/compositor/global/qwaylandextension_p.h b/src/compositor/global/qwaylandextension_p.h
index 5ca5bd3cf..d1dddb674 100644
--- a/src/compositor/global/qwaylandextension_p.h
+++ b/src/compositor/global/qwaylandextension_p.h
@@ -45,20 +45,24 @@ class Q_COMPOSITOR_EXPORT QWaylandExtensionPrivate : public QObjectPrivate
Q_DECLARE_PUBLIC(QWaylandExtension)
public:
- QWaylandExtensionPrivate(QWaylandExtensionContainer *container)
+ QWaylandExtensionPrivate()
: QObjectPrivate()
- , extension_container(container)
+ , extension_container(Q_NULLPTR)
+ , initialized(false)
{
}
+ static QWaylandExtensionPrivate *get(QWaylandExtension *extension) { return extension->d_func(); }
+
QWaylandExtensionContainer *extension_container;
+ bool initialized;
};
class Q_COMPOSITOR_EXPORT QWaylandExtensionTemplatePrivate : public QWaylandExtensionPrivate
{
public:
- QWaylandExtensionTemplatePrivate(QWaylandExtensionContainer *container)
- : QWaylandExtensionPrivate(container)
+ QWaylandExtensionTemplatePrivate()
+ : QWaylandExtensionPrivate()
{ }
};