diff options
8 files changed, 236 insertions, 4 deletions
diff --git a/examples/wayland/custom-extension/custom-extension.pro b/examples/wayland/custom-extension/custom-extension.pro index c44464a3..1e56b79c 100644 --- a/examples/wayland/custom-extension/custom-extension.pro +++ b/examples/wayland/custom-extension/custom-extension.pro @@ -1,6 +1,7 @@ TEMPLATE=subdirs -SUBDIRS += client +SUBDIRS += client \ + qmltestapp SUBDIRS += compositor SUBDIRS += testapp diff --git a/examples/wayland/custom-extension/qmltestapp/main.cpp b/examples/wayland/custom-extension/qmltestapp/main.cpp new file mode 100644 index 00000000..23e280ca --- /dev/null +++ b/examples/wayland/custom-extension/qmltestapp/main.cpp @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Erik Larsson. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QGuiApplication> +#include <QtQml/QQmlApplicationEngine> + +#include <QtQml/qqml.h> +#include <QtQml/QQmlEngine> +#include "../client/customextension.h" + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + qmlRegisterType<QtWaylandClient::CustomExtension>("com.theqtcompany.customextension", 1, 0, "CustomExtension"); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + return app.exec(); +} + diff --git a/examples/wayland/custom-extension/qmltestapp/main.qml b/examples/wayland/custom-extension/qmltestapp/main.qml new file mode 100644 index 00000000..10e413ef --- /dev/null +++ b/examples/wayland/custom-extension/qmltestapp/main.qml @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Erik Larsson. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Window 2.0 +import com.theqtcompany.customextension 1.0 + +Window { + visible: true + Rectangle { + anchors.fill: parent + color: "#297A4A" + } + + MouseArea { + anchors.fill: parent + onClicked: { + console.log("Clicked outside", mouseX) + if (extensionLoader.item && extensionLoader.item.active) + extensionLoader.item.sendRequest("Clicked outside", mouseX) + } + } + + MouseArea { + anchors.centerIn: parent + width: 100; height: 100 + onClicked: { + var obj = mapToItem(parent, mouse.x, mouse.y) + console.log("Clicked inside", obj.x) + if (extensionLoader.item && extensionLoader.item.active) + extensionLoader.item.sendRequest("Clicked inside", obj.x) + } + + Rectangle { + anchors.fill: parent + color: "#34FD85" + } + } + + MouseArea { + anchors.right: parent.right + anchors.bottom: parent.bottom + width: 150; height: 25 + + Rectangle { + anchors.fill: parent + color: "#010101" + Text { + anchors.centerIn: parent + color: "white" + text: extensionLoader.item ? "Unload client extension" : "Load client extension" + } + } + onClicked: { + extensionLoader.active = !extensionLoader.active + } + } + + Component { + id: extensionComponent + CustomExtension { + id: customExtension + onActiveChanged: console.log("Custom extension is active?", active) + } + } + + Loader { + id: extensionLoader + sourceComponent: extensionComponent + } + + Connections { + target: extensionLoader.item + onEventReceived: console.log("Event received", text, value) + } +} + diff --git a/examples/wayland/custom-extension/qmltestapp/qml.qrc b/examples/wayland/custom-extension/qmltestapp/qml.qrc new file mode 100644 index 00000000..5f6483ac --- /dev/null +++ b/examples/wayland/custom-extension/qmltestapp/qml.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> diff --git a/examples/wayland/custom-extension/qmltestapp/qmltestapp.pro b/examples/wayland/custom-extension/qmltestapp/qmltestapp.pro new file mode 100644 index 00000000..786faeb0 --- /dev/null +++ b/examples/wayland/custom-extension/qmltestapp/qmltestapp.pro @@ -0,0 +1,28 @@ +TEMPLATE = app + +QT += qml quick waylandclient-private + +CONFIG += c++11 +CONFIG += wayland-scanner +CONFIG += link_pkgconfig + +WAYLANDCLIENTSOURCES += ../protocol/custom.xml + +!contains(QT_CONFIG, no-pkg-config) { + PKGCONFIG += wayland-client +} else { + LIBS += -lwayland-client +} + +SOURCES += main.cpp \ + ../client/customextension.cpp + +HEADERS += \ + ../client/customextension.h + +RESOURCES += qml.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/wayland/custom-extension/qmltestapp +INSTALLS += target + + diff --git a/src/client/global/qwaylandclientextension.cpp b/src/client/global/qwaylandclientextension.cpp index 501f266f..b71c41d1 100644 --- a/src/client/global/qwaylandclientextension.cpp +++ b/src/client/global/qwaylandclientextension.cpp @@ -38,6 +38,8 @@ #include "qwaylandclientextension_p.h" #include <QtWaylandClient/private/qwaylanddisplay_p.h> #include <QtWaylandClient/private/qwaylandintegration_p.h> +#include <QtGui/QGuiApplication> +#include <QtGui/qpa/qplatformnativeinterface.h> QT_BEGIN_NAMESPACE @@ -45,11 +47,22 @@ namespace QtWaylandClient { QWaylandClientExtensionPrivate::QWaylandClientExtensionPrivate() : QObjectPrivate() - , waylandIntegration(new QWaylandIntegration()) + , waylandIntegration(NULL) , version(-1) + , active(false) { - QtWaylandClient::QWaylandDisplay *waylandDisplay = waylandIntegration->display(); - struct ::wl_registry *registry = wl_display_get_registry(waylandDisplay->wl_display()); + // Keep the possibility to use a custom waylandIntegration as a plugin, + // but also add the possibility to run it as a QML component. + struct ::wl_display *waylandDisplay = NULL; + if (QGuiApplication::platformNativeInterface()) { + waylandDisplay = static_cast<struct ::wl_display*>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("wl_display")); + } else { + waylandIntegration = new QWaylandIntegration(); + waylandDisplay = waylandIntegration->display()->wl_display(); + } + + Q_ASSERT(waylandDisplay); + struct ::wl_registry *registry = wl_display_get_registry(waylandDisplay); QtWayland::wl_registry::init(registry); } @@ -59,6 +72,8 @@ void QWaylandClientExtensionPrivate::registry_global(uint32_t id, const QString if (interfaceName == QLatin1String(q->extensionInterface()->name)) { struct ::wl_registry *registry = static_cast<struct ::wl_registry *>(QtWayland::wl_registry::object()); q->bind(registry, id, ver); + active = true; + emit q->activeChanged(); } } @@ -90,6 +105,12 @@ void QWaylandClientExtension::setVersion(const int ver) } } +bool QWaylandClientExtension::active() const +{ + Q_D(const QWaylandClientExtension); + return d->active; +} + } QT_END_NAMESPACE diff --git a/src/client/global/qwaylandclientextension.h b/src/client/global/qwaylandclientextension.h index efdfa46f..aee03eb2 100644 --- a/src/client/global/qwaylandclientextension.h +++ b/src/client/global/qwaylandclientextension.h @@ -54,11 +54,13 @@ class Q_WAYLAND_CLIENT_EXPORT QWaylandClientExtension : public QObject Q_OBJECT Q_DECLARE_PRIVATE(QWaylandClientExtension) Q_PROPERTY(int protocolVersion READ version NOTIFY versionChanged) + Q_PROPERTY(bool active READ active NOTIFY activeChanged) public: QWaylandClientExtension(const int version); QWaylandIntegration *integration() const; int version() const; + bool active() const; virtual const struct wl_interface *extensionInterface() const = 0; virtual void bind(struct ::wl_registry *registry, int id, int version) = 0; @@ -66,6 +68,7 @@ protected: void setVersion(const int version); Q_SIGNALS: void versionChanged(); + void activeChanged(); }; template <typename T> diff --git a/src/client/global/qwaylandclientextension_p.h b/src/client/global/qwaylandclientextension_p.h index 2676f0ee..9287ee95 100644 --- a/src/client/global/qwaylandclientextension_p.h +++ b/src/client/global/qwaylandclientextension_p.h @@ -65,6 +65,7 @@ public: QWaylandIntegration *waylandIntegration; int version; + bool active; protected: void registry_global(uint32_t id, const QString &interfaceName, uint32_t version) Q_DECL_OVERRIDE; |