From 81627842fe961e3b6a3cef29dac9c98c8f2e30c9 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Fri, 9 Oct 2015 10:27:04 +0200 Subject: New custom extension example The example implements a simple Wayland extension that doesn't do anything useful. It contains a custom compositor and a wayland platform plugin. Change-Id: I88df4b20f328a32fca33b8d013d253611539526f Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../wayland/custom-extension/client/.gitignore | 4 + .../wayland/custom-extension/client/client.json | 3 + .../wayland/custom-extension/client/client.pro | 18 ++++ .../custom-extension/client/customextension.cpp | 81 +++++++++++++++ .../custom-extension/client/customextension.h | 83 ++++++++++++++++ examples/wayland/custom-extension/client/main.cpp | 87 ++++++++++++++++ .../wayland/custom-extension/compositor/.gitignore | 8 ++ .../custom-extension/compositor/compositor.pro | 31 ++++++ .../custom-extension/compositor/compositor.qrc | 7 ++ .../compositor/customextension.cpp | 76 ++++++++++++++ .../custom-extension/compositor/customextension.h | 68 +++++++++++++ .../compositor/images/background.png | Bin 0 -> 203 bytes .../wayland/custom-extension/compositor/main.cpp | 62 ++++++++++++ .../custom-extension/compositor/qml/Screen.qml | 92 +++++++++++++++++ .../custom-extension/compositor/qml/main.qml | 104 +++++++++++++++++++ .../wayland/custom-extension/custom-extension.pro | 7 ++ .../wayland/custom-extension/protocol/custom.xml | 62 ++++++++++++ examples/wayland/custom-extension/testapp/main.cpp | 110 +++++++++++++++++++++ .../wayland/custom-extension/testapp/testapp.pro | 3 + 19 files changed, 906 insertions(+) create mode 100644 examples/wayland/custom-extension/client/.gitignore create mode 100644 examples/wayland/custom-extension/client/client.json create mode 100644 examples/wayland/custom-extension/client/client.pro create mode 100644 examples/wayland/custom-extension/client/customextension.cpp create mode 100644 examples/wayland/custom-extension/client/customextension.h create mode 100644 examples/wayland/custom-extension/client/main.cpp create mode 100644 examples/wayland/custom-extension/compositor/.gitignore create mode 100644 examples/wayland/custom-extension/compositor/compositor.pro create mode 100644 examples/wayland/custom-extension/compositor/compositor.qrc create mode 100644 examples/wayland/custom-extension/compositor/customextension.cpp create mode 100644 examples/wayland/custom-extension/compositor/customextension.h create mode 100644 examples/wayland/custom-extension/compositor/images/background.png create mode 100644 examples/wayland/custom-extension/compositor/main.cpp create mode 100644 examples/wayland/custom-extension/compositor/qml/Screen.qml create mode 100644 examples/wayland/custom-extension/compositor/qml/main.qml create mode 100644 examples/wayland/custom-extension/custom-extension.pro create mode 100644 examples/wayland/custom-extension/protocol/custom.xml create mode 100644 examples/wayland/custom-extension/testapp/main.cpp create mode 100644 examples/wayland/custom-extension/testapp/testapp.pro (limited to 'examples/wayland/custom-extension') diff --git a/examples/wayland/custom-extension/client/.gitignore b/examples/wayland/custom-extension/client/.gitignore new file mode 100644 index 00000000..b4961e18 --- /dev/null +++ b/examples/wayland/custom-extension/client/.gitignore @@ -0,0 +1,4 @@ +qwayland-custom.cpp +qwayland-custom.h +wayland-custom-client-protocol.h +wayland-custom-protocol.c diff --git a/examples/wayland/custom-extension/client/client.json b/examples/wayland/custom-extension/client/client.json new file mode 100644 index 00000000..7aab544e --- /dev/null +++ b/examples/wayland/custom-extension/client/client.json @@ -0,0 +1,3 @@ +{ + "Keys": [ "custom-wayland" ] +} diff --git a/examples/wayland/custom-extension/client/client.pro b/examples/wayland/custom-extension/client/client.pro new file mode 100644 index 00000000..03056f22 --- /dev/null +++ b/examples/wayland/custom-extension/client/client.pro @@ -0,0 +1,18 @@ +PLUGIN_TYPE = platforms +load(qt_plugin) + +CONFIG += wayland-scanner + +TARGET = custom-wayland + +QT += waylandclient-private + +WAYLANDCLIENTSOURCES += ../protocol/custom.xml + +OTHER_FILES += client.json + +SOURCES += main.cpp \ + customextension.cpp + +HEADERS += customextension.h + diff --git a/examples/wayland/custom-extension/client/customextension.cpp b/examples/wayland/custom-extension/client/customextension.cpp new file mode 100644 index 00000000..e6bab56c --- /dev/null +++ b/examples/wayland/custom-extension/client/customextension.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Wayland module +** +** $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 "customextension.h" +#include +#include + +#include + +namespace QtWaylandClient { + +CustomExtension::CustomExtension(QWaylandIntegration *wayland_integration) + : m_display(0) +{ + // TODO: add a simpler API for this + + QtWaylandClient::QWaylandDisplay *wayland_display = wayland_integration->display(); + struct ::wl_registry *registry = wl_display_get_registry(wayland_display->wl_display()); + QtWayland::wl_registry::init(registry); +} + +void CustomExtension::sendRequest(const QString &text, int value) +{ + qDebug() << "Client-side plugin sending request:" << text << value; + qtrequest(text, value); +} + +void CustomExtension::example_extension_qtevent(struct wl_surface *surface, + uint32_t time, + const QString &text, + uint32_t value) +{ + qDebug() << "Client-side plugin received an event:" << surface << time << text << value; + emit eventReceived(text, value); +} + +void CustomExtension::registry_global(uint32_t id, const QString &interface, uint32_t version) +{ + if (interface == QStringLiteral("qt_example_extension")) { + QtWayland::qt_example_extension::init(QtWayland::wl_registry::object(), id, version); + } +} + +} diff --git a/examples/wayland/custom-extension/client/customextension.h b/examples/wayland/custom-extension/client/customextension.h new file mode 100644 index 00000000..d8797a9e --- /dev/null +++ b/examples/wayland/custom-extension/client/customextension.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Wayland module +** +** $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$ +** +****************************************************************************/ + +#ifndef CUSTOMEXTENSION_H +#define CUSTOMEXTENSION_H + +#include +#include +#include "qwayland-custom.h" + +QT_BEGIN_NAMESPACE + +namespace QtWaylandClient { + +class QWaylandDisplay; +class QWaylandIntegration; + +class CustomExtension : public QObject, QtWayland::qt_example_extension, public QtWayland::wl_registry +{ + Q_OBJECT +public: + CustomExtension(QWaylandIntegration *wayland_integration); + +public slots: + void sendRequest(const QString &text, int value); + +signals: + void eventReceived(const QString &text, uint value); + +private: + QWaylandDisplay *m_display; + + void example_extension_qtevent(struct wl_surface *surface, + uint32_t time, + const QString &text, + uint32_t value) Q_DECL_OVERRIDE; + + void registry_global(uint32_t id, const QString &interface, uint32_t version) Q_DECL_OVERRIDE; + +}; + +} + +QT_END_NAMESPACE + +#endif // CUSTOMEXTENSION_H diff --git a/examples/wayland/custom-extension/client/main.cpp b/examples/wayland/custom-extension/client/main.cpp new file mode 100644 index 00000000..90705388 --- /dev/null +++ b/examples/wayland/custom-extension/client/main.cpp @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Wayland module +** +** $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 +#include +#include "customextension.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +namespace QtWaylandClient { + +static CustomExtension * extension_global; + +class CustomIntegrationPlugin : public QPlatformIntegrationPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "client.json") +public: + QPlatformIntegration *create(const QString&, const QStringList&) Q_DECL_OVERRIDE; +}; + + QPlatformIntegration *CustomIntegrationPlugin::create(const QString& system, const QStringList& paramList) +{ + Q_UNUSED(paramList); + Q_UNUSED(system); + + qDebug() << "************* The Qt Custom Extension Example Plugin is active ************"; + + QWaylandIntegration *integration = new QWaylandIntegration(); + + extension_global = new CustomExtension(integration); + + // We need a way for client apps to get hold of the extension. The proper API for this is + // QPlatformNativeInterface, but that's a low-level API using void*. There will be a nice + // client API at some point, but in the meantime, it is easier to use QObject::findChild(). + + extension_global->setParent(qApp); + extension_global->setObjectName("qt_example_custom_extension"); + + return integration; +} + +} + +QT_END_NAMESPACE + +#include "main.moc" diff --git a/examples/wayland/custom-extension/compositor/.gitignore b/examples/wayland/custom-extension/compositor/.gitignore new file mode 100644 index 00000000..2532eb22 --- /dev/null +++ b/examples/wayland/custom-extension/compositor/.gitignore @@ -0,0 +1,8 @@ +custom-compositor +qwayland-custom.cpp +qwayland-custom.h +qwayland-server-custom.cpp +qwayland-server-custom.h +wayland-custom-client-protocol.h +wayland-custom-protocol.c +wayland-custom-server-protocol.h diff --git a/examples/wayland/custom-extension/compositor/compositor.pro b/examples/wayland/custom-extension/compositor/compositor.pro new file mode 100644 index 00000000..f38b1ecb --- /dev/null +++ b/examples/wayland/custom-extension/compositor/compositor.pro @@ -0,0 +1,31 @@ +QT += core gui qml + +QT += waylandcompositor-private + +CONFIG += wayland-scanner +CONFIG += c++11 +SOURCES += \ + main.cpp \ + customextension.cpp + +OTHER_FILES = \ + qml/main.qml \ + qml/Screen.qml \ + images/background.jpg + +WAYLANDSERVERSOURCES += \ + ../protocol/custom.xml + +RESOURCES += compositor.qrc + +contains(QT_CONFIG, no-pkg-config) { + LIBS += -lwayland-server +} else { + CONFIG += link_pkgconfig + PKGCONFIG += wayland-server +} + +TARGET = custom-compositor + +HEADERS += \ + customextension.h diff --git a/examples/wayland/custom-extension/compositor/compositor.qrc b/examples/wayland/custom-extension/compositor/compositor.qrc new file mode 100644 index 00000000..db3a8075 --- /dev/null +++ b/examples/wayland/custom-extension/compositor/compositor.qrc @@ -0,0 +1,7 @@ + + + images/background.png + qml/main.qml + qml/Screen.qml + + diff --git a/examples/wayland/custom-extension/compositor/customextension.cpp b/examples/wayland/custom-extension/compositor/customextension.cpp new file mode 100644 index 00000000..55435f0d --- /dev/null +++ b/examples/wayland/custom-extension/compositor/customextension.cpp @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Wayland module +** +** $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 Digia Plc and its Subsidiary(-ies) 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 "customextension.h" + +#include + +#include + +namespace QtWayland { + +CustomExtension::CustomExtension() +{ +} + +void CustomExtension::initialize(QWaylandCompositor *compositor) +{ + init(compositor->display(), 1); +} + +void CustomExtension::sendEvent(QWaylandSurface *surface, uint time, const QString &text, uint value) +{ + if (surface) { + Resource *target = resourceMap().value(surface->waylandClient()); + if (target) { + qDebug() << "Server-side extension sending an event:" << text << value; + send_qtevent(target->handle, surface->resource(), time, text, value); + } + } +} + +void CustomExtension::example_extension_qtrequest(QtWaylandServer::qt_example_extension::Resource *resource, const QString &text, int32_t value) +{ + Q_UNUSED(resource); + qDebug() << "Server-side extension received a request:" << text << value; + emit requestReceived(text, value); +} + +} diff --git a/examples/wayland/custom-extension/compositor/customextension.h b/examples/wayland/custom-extension/compositor/customextension.h new file mode 100644 index 00000000..02a7c363 --- /dev/null +++ b/examples/wayland/custom-extension/compositor/customextension.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Wayland module +** +** $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 Digia Plc and its Subsidiary(-ies) 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$ +** +****************************************************************************/ + +#ifndef CUSTOMEXTENSION_H +#define CUSTOMEXTENSION_H + +#include "wayland-util.h" + +#include +#include +#include "qwayland-server-custom.h" + +namespace QtWayland { + +class CustomExtension : public QWaylandExtensionTemplate, public QtWaylandServer::qt_example_extension +{ + Q_OBJECT +public: + CustomExtension(); + Q_INVOKABLE void initialize(QWaylandCompositor *compositor); + Q_INVOKABLE void sendEvent(QWaylandSurface *surface, uint time, const QString &text, uint value); + +signals: + void requestReceived(const QString &text, uint value); +protected: + virtual void example_extension_qtrequest(Resource *resource, const QString &text, int32_t value) Q_DECL_OVERRIDE; +}; + +} + +#endif // CUSTOMEXTENSION_H diff --git a/examples/wayland/custom-extension/compositor/images/background.png b/examples/wayland/custom-extension/compositor/images/background.png new file mode 100644 index 00000000..2429df11 Binary files /dev/null and b/examples/wayland/custom-extension/compositor/images/background.png differ diff --git a/examples/wayland/custom-extension/compositor/main.cpp b/examples/wayland/custom-extension/compositor/main.cpp new file mode 100644 index 00000000..343f1df8 --- /dev/null +++ b/examples/wayland/custom-extension/compositor/main.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Wayland module +** +** $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 Digia Plc and its Subsidiary(-ies) 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 +#include +#include +#include + +#include +#include +#include "customextension.h" + +static void registerTypes() +{ + qmlRegisterType("com.theqtcompany.customextension", 1, 0, "CustomExtension"); +} + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + registerTypes(); + QQmlApplicationEngine appEngine(QUrl("qrc:///qml/main.qml")); + + return app.exec(); +} diff --git a/examples/wayland/custom-extension/compositor/qml/Screen.qml b/examples/wayland/custom-extension/compositor/qml/Screen.qml new file mode 100644 index 00000000..46d884b4 --- /dev/null +++ b/examples/wayland/custom-extension/compositor/qml/Screen.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Wayland module +** +** $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 Digia Plc and its Subsidiary(-ies) 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.2 +import QtWayland.Compositor 1.0 + +WaylandOutput { + id: output + property alias surfaceArea: background + window: Window { + id: screen + + property QtObject output + + width: 1024 + height: 768 + visible: true + + WaylandMouseTracker { + id: mouseTracker + anchors.fill: parent + + enableWSCursor: true + Image { + id: background + anchors.fill: parent + fillMode: Image.Tile + source: "qrc:/images/background.png" + smooth: false + } + WaylandCursorItem { + id: cursor + inputEventsEnabled: false + x: mouseTracker.mouseX - hotspotX + y: mouseTracker.mouseY - hotspotY + + inputDevice: output.compositor.defaultInputDevice + } + Rectangle { + anchors.bottom: parent.bottom + anchors.right: parent.right + width: 75 + height: 75 + color: "#BADA55" + MouseArea { + anchors.fill: parent + onClicked: { + comp.sendEvent(); + } + } + } + } + } +} diff --git a/examples/wayland/custom-extension/compositor/qml/main.qml b/examples/wayland/custom-extension/compositor/qml/main.qml new file mode 100644 index 00000000..ab534b49 --- /dev/null +++ b/examples/wayland/custom-extension/compositor/qml/main.qml @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Wayland module +** +** $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 Digia Plc and its Subsidiary(-ies) 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 QtWayland.Compositor 1.0 + +import com.theqtcompany.customextension 1.0 + +WaylandCompositor { + id: comp + + property var lastItem: null + + property int counter : 0 + + function sendEvent() { + if (lastItem != null) { + console.log("Compositor sending event: " + counter); + custom.sendEvent(lastItem.shellSurface.surface, 0, "test", counter); + counter++; + } + } + + Screen { + compositor: comp + } + + Component { + id: chromeComponent + ShellSurfaceItem { + id: chrome + onSurfaceDestroyed: { + if (chrome === lastItem) + lastItem = null; + chrome.destroy() + } + } + } + + extensions: [ + Shell { + id: defaultShell + + onCreateShellSurface: { + var item = chromeComponent.createObject(defaultOutput.surfaceArea, { "surface": surface } ); + item.shellSurface.initialize(defaultShell, surface, client, id); + lastItem = item; + } + + Component.onCompleted: { + initialize(); + } + }, + CustomExtension { + id: custom + onRequestReceived: { + console.log("Compositor received a request: \"" + text + "\", " + value) + } + + Component.onCompleted: { + initialize(comp); + } + } + + ] + +} diff --git a/examples/wayland/custom-extension/custom-extension.pro b/examples/wayland/custom-extension/custom-extension.pro new file mode 100644 index 00000000..c44464a3 --- /dev/null +++ b/examples/wayland/custom-extension/custom-extension.pro @@ -0,0 +1,7 @@ +TEMPLATE=subdirs + +SUBDIRS += client +SUBDIRS += compositor +SUBDIRS += testapp + +OTHER_FILES += protocol/custom.xml diff --git a/examples/wayland/custom-extension/protocol/custom.xml b/examples/wayland/custom-extension/protocol/custom.xml new file mode 100644 index 00000000..bda67829 --- /dev/null +++ b/examples/wayland/custom-extension/protocol/custom.xml @@ -0,0 +1,62 @@ + + + + Copyright (C) 2015 The Qt Company Ltd. + Contact: http://www.qt.io/licensing/ + + This file is part of the examples of the Qt Wayland module + + $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$ + + + + + + Example event from server to client + + + + + + + + + + + Example request from client to server + + + + + + + diff --git a/examples/wayland/custom-extension/testapp/main.cpp b/examples/wayland/custom-extension/testapp/main.cpp new file mode 100644 index 00000000..4ff44b7f --- /dev/null +++ b/examples/wayland/custom-extension/testapp/main.cpp @@ -0,0 +1,110 @@ +/**************************************************************************** + ** + ** Copyright (C) 2015 The Qt Company Ltd. + ** Contact: http://www.qt.io/licensing/ + ** + ** This file is part of the examples of the Qt Wayland module + ** + ** $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 +#include +#include +#include + +#include + +static QObject *s_custom; + +class TestWindow : public QRasterWindow +{ + Q_OBJECT + +public: + TestWindow() + { + if (s_custom) + connect(s_custom, SIGNAL(eventReceived(const QString &, uint)), + this, SLOT(handleEvent(const QString &, uint))); + } + +public slots: + void handleEvent(const QString &text, uint value) + { + qDebug() << "Client application received event" << text << value; + } + +protected: + void paintEvent(QPaintEvent *) + { + QPainter p(this); + p.fillRect(QRect(0,0,width(),height()),Qt::gray); + p.fillRect(50,50,100,100, QColor("#C0FFEE")); + } + + void mousePressEvent(QMouseEvent *ev) Q_DECL_OVERRIDE + { + Q_ASSERT(s_custom); + bool insideRect = QRect(50,50,100,100).contains(ev->pos()); + + QString text = insideRect ? "Click inside" : "Click outside"; + int value = ev->pos().x(); + + qDebug() << "Client application sending request:" << text << value; + + QMetaObject::invokeMethod(s_custom, "sendRequest", Qt::DirectConnection, + Q_ARG(QString, text), + Q_ARG(int, value)); + } + +private: + +}; + +int main (int argc, char **argv) +{ + QGuiApplication app(argc, argv); + + s_custom = app.findChild("qt_example_custom_extension"); + if (!s_custom) { + qCritical() << "This example requires the Qt Custom Extension platform plugin"; + return -1; + } + TestWindow window; + window.show(); + + return app.exec(); +} + +#include "main.moc" diff --git a/examples/wayland/custom-extension/testapp/testapp.pro b/examples/wayland/custom-extension/testapp/testapp.pro new file mode 100644 index 00000000..8424f3bf --- /dev/null +++ b/examples/wayland/custom-extension/testapp/testapp.pro @@ -0,0 +1,3 @@ +SOURCES += main.cpp + +CONFIG += c++11 -- cgit v1.2.1