From 845839b971f6af017be77dbe1ee1541453d12c23 Mon Sep 17 00:00:00 2001 From: Johan Klokkhammer Helsing Date: Mon, 13 Aug 2018 16:18:47 +0200 Subject: Compositor API: Add xdg-decoration unstable v1 support And add an example with server-side window decorations. Task-number: QTBUG-69934 Change-Id: Ic3984b50cf7574cae5135dea51eb4b1c80bb45a7 Reviewed-by: Paul Olav Tvete --- .../doc/src/server-side-decoration.qdoc | 36 +++++ examples/wayland/server-side-decoration/main.cpp | 68 ++++++++ examples/wayland/server-side-decoration/main.qml | 103 ++++++++++++ .../server-side-decoration.pro | 14 ++ .../server-side-decoration.qrc | 5 + examples/wayland/wayland.pro | 1 + src/3rdparty/protocol/qt_attribution.json | 2 +- src/compositor/extensions/extensions.pri | 4 + .../extensions/qwaylandxdgdecorationv1.cpp | 180 +++++++++++++++++++++ .../extensions/qwaylandxdgdecorationv1.h | 69 ++++++++ .../extensions/qwaylandxdgdecorationv1_p.h | 107 ++++++++++++ src/compositor/extensions/qwaylandxdgshell.cpp | 6 + src/compositor/extensions/qwaylandxdgshell.h | 11 ++ src/compositor/extensions/qwaylandxdgshell_p.h | 3 + .../compositor/qwaylandquickcompositorplugin.cpp | 4 + sync.profile | 2 + 16 files changed, 614 insertions(+), 1 deletion(-) create mode 100644 examples/wayland/server-side-decoration/doc/src/server-side-decoration.qdoc create mode 100644 examples/wayland/server-side-decoration/main.cpp create mode 100644 examples/wayland/server-side-decoration/main.qml create mode 100644 examples/wayland/server-side-decoration/server-side-decoration.pro create mode 100644 examples/wayland/server-side-decoration/server-side-decoration.qrc create mode 100644 src/compositor/extensions/qwaylandxdgdecorationv1.cpp create mode 100644 src/compositor/extensions/qwaylandxdgdecorationv1.h create mode 100644 src/compositor/extensions/qwaylandxdgdecorationv1_p.h diff --git a/examples/wayland/server-side-decoration/doc/src/server-side-decoration.qdoc b/examples/wayland/server-side-decoration/doc/src/server-side-decoration.qdoc new file mode 100644 index 000000000..7032152d1 --- /dev/null +++ b/examples/wayland/server-side-decoration/doc/src/server-side-decoration.qdoc @@ -0,0 +1,36 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + * \title Qt Wayland Compositor Examples - Sever Side Decoration Compositor + * \example server-side-decoration + * \brief Server Side Decoration Compositor is a simple example that demonstrates server side window decorations on xdg-shell. + * \ingroup qtwaylandcompositor-examples + * + * Server Side Decoration Compositor is a desktop-style Wayland compositor example implementing + * server-side window decorations. + */ diff --git a/examples/wayland/server-side-decoration/main.cpp b/examples/wayland/server-side-decoration/main.cpp new file mode 100644 index 000000000..e765fafb6 --- /dev/null +++ b/examples/wayland/server-side-decoration/main.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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 + +int main(int argc, char *argv[]) +{ + // ShareOpenGLContexts is needed for using the threaded renderer + // on Nvidia EGLStreams + QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); + QGuiApplication app(argc, argv); + + QQmlApplicationEngine appEngine(QUrl("qrc:///main.qml")); + + return app.exec(); +} diff --git a/examples/wayland/server-side-decoration/main.qml b/examples/wayland/server-side-decoration/main.qml new file mode 100644 index 000000000..8ec50dd57 --- /dev/null +++ b/examples/wayland/server-side-decoration/main.qml @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, 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.6 +import QtQuick.Window 2.2 +import QtQuick.Layouts 1.3 +import QtWayland.Compositor 1.3 + +WaylandCompositor { + // The output defines the screen. + WaylandOutput { + sizeFollowsWindow: true + window: Window { + width: 1024 + height: 768 + visible: true + Repeater { + model: shellSurfaces + Column { + Rectangle { + visible: modelData.toplevel.decorationMode === XdgToplevel.ServerSideDecoration + width: parent.width + height: 30 + gradient: "HeavyRain"; + RowLayout { + anchors.fill: parent + Text { + text: modelData.toplevel.title + Layout.fillWidth: true + } + MouseArea { + width: 30 + height: 30 + Text { text: "X"; anchors.centerIn: parent } + onClicked: modelData.toplevel.sendClose() + } + } + } + ShellSurfaceItem { + moveItem: parent + autoCreatePopupItems: true + shellSurface: modelData + onSurfaceDestroyed: shellSurfaces.remove(index) + } + } + } + } + } + XdgShell { + onToplevelCreated: shellSurfaces.append({shellSurface: xdgSurface}); + } + XdgDecorationManagerV1 { + preferredMode: XdgToplevel.ServerSideDecoration + } + ListModel { id: shellSurfaces } +} diff --git a/examples/wayland/server-side-decoration/server-side-decoration.pro b/examples/wayland/server-side-decoration/server-side-decoration.pro new file mode 100644 index 000000000..e6a5cd20a --- /dev/null +++ b/examples/wayland/server-side-decoration/server-side-decoration.pro @@ -0,0 +1,14 @@ +QT += gui qml + +SOURCES += \ + main.cpp + +OTHER_FILES = \ + main.qml + +RESOURCES += server-side-decoration.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/wayland/server-side-decoration +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS server-side-decoration.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/wayland/server-side-decoration +INSTALLS += target sources diff --git a/examples/wayland/server-side-decoration/server-side-decoration.qrc b/examples/wayland/server-side-decoration/server-side-decoration.qrc new file mode 100644 index 000000000..5f6483ac3 --- /dev/null +++ b/examples/wayland/server-side-decoration/server-side-decoration.qrc @@ -0,0 +1,5 @@ + + + main.qml + + diff --git a/examples/wayland/wayland.pro b/examples/wayland/wayland.pro index 0cb050cca..b9e4263e7 100644 --- a/examples/wayland/wayland.pro +++ b/examples/wayland/wayland.pro @@ -14,6 +14,7 @@ qtHaveModule(quick) { SUBDIRS += multi-screen SUBDIRS += overview-compositor SUBDIRS += ivi-compositor + SUBDIRS += server-side-decoration qtHaveModule(waylandclient) { SUBDIRS += \ custom-extension \ diff --git a/src/3rdparty/protocol/qt_attribution.json b/src/3rdparty/protocol/qt_attribution.json index bf5851f84..84dafe938 100644 --- a/src/3rdparty/protocol/qt_attribution.json +++ b/src/3rdparty/protocol/qt_attribution.json @@ -40,7 +40,7 @@ Copyright (c) 2013 BMW Car IT GmbH" "Id": "wayland-xdg-decoration-protocol", "Name": "Wayland xdg-decoration Protocol", "QDocModule": "qtwaylandcompositor", - "QtUsage": "Used in the Qt Wayland platform plugin.", + "QtUsage": "Used in the Qt Wayland Compositor API, and the Qt Wayland platform plugin.", "Files": "xdg-decoration-unstable-v1.xml", "Description": "The xdg-decoration protocol allows a compositor to announce support for server-side decorations.", diff --git a/src/compositor/extensions/extensions.pri b/src/compositor/extensions/extensions.pri index b2c55635a..5c708f891 100644 --- a/src/compositor/extensions/extensions.pri +++ b/src/compositor/extensions/extensions.pri @@ -11,6 +11,7 @@ WAYLANDSERVERSOURCES += \ ../3rdparty/protocol/text-input-unstable-v2.xml \ ../3rdparty/protocol/xdg-shell-unstable-v6.xml \ ../3rdparty/protocol/xdg-shell.xml \ + ../3rdparty/protocol/xdg-decoration-unstable-v1.xml \ ../3rdparty/protocol/ivi-application.xml \ HEADERS += \ @@ -32,6 +33,8 @@ HEADERS += \ extensions/qwaylandxdgshellv6_p.h \ extensions/qwaylandxdgshell.h \ extensions/qwaylandxdgshell_p.h \ + extensions/qwaylandxdgdecorationv1.h \ + extensions/qwaylandxdgdecorationv1_p.h \ extensions/qwaylandshellsurface.h \ extensions/qwaylandiviapplication.h \ extensions/qwaylandiviapplication_p.h \ @@ -49,6 +52,7 @@ SOURCES += \ extensions/qwaylandxdgshellv5.cpp \ extensions/qwaylandxdgshellv6.cpp \ extensions/qwaylandxdgshell.cpp \ + extensions/qwaylandxdgdecorationv1.cpp \ extensions/qwaylandshellsurface.cpp \ extensions/qwaylandiviapplication.cpp \ extensions/qwaylandivisurface.cpp \ diff --git a/src/compositor/extensions/qwaylandxdgdecorationv1.cpp b/src/compositor/extensions/qwaylandxdgdecorationv1.cpp new file mode 100644 index 000000000..a44d5c19d --- /dev/null +++ b/src/compositor/extensions/qwaylandxdgdecorationv1.cpp @@ -0,0 +1,180 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtWaylandCompositor module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwaylandxdgdecorationv1_p.h" + +#include +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +QWaylandXdgDecorationManagerV1::QWaylandXdgDecorationManagerV1() + : QWaylandCompositorExtensionTemplate(*new QWaylandXdgDecorationManagerV1Private) +{ +} + +void QWaylandXdgDecorationManagerV1::initialize() +{ + Q_D(QWaylandXdgDecorationManagerV1); + + QWaylandCompositorExtensionTemplate::initialize(); + QWaylandCompositor *compositor = static_cast(extensionContainer()); + if (!compositor) { + qWarning() << "Failed to find QWaylandCompositor when initializing QWaylandXdgDecorationV1"; + return; + } + d->init(compositor->display(), 1); +} + +QWaylandXdgToplevel::DecorationMode QWaylandXdgDecorationManagerV1::preferredMode() const +{ + Q_D(const QWaylandXdgDecorationManagerV1); + return d->m_defaultMode; +} + +void QWaylandXdgDecorationManagerV1::setPreferredMode(QWaylandXdgToplevel::DecorationMode defaultMode) +{ + Q_D(QWaylandXdgDecorationManagerV1); + if (d->m_defaultMode == defaultMode) + return; + + d->m_defaultMode = defaultMode; + emit defaultModeChanged(); +} + +const wl_interface *QWaylandXdgDecorationManagerV1::interface() +{ + return QWaylandXdgDecorationManagerV1Private::interface(); +} + +void QWaylandXdgDecorationManagerV1Private::zxdg_decoration_manager_v1_get_toplevel_decoration( + Resource *resource, uint id, wl_resource *toplevelResource) +{ + Q_Q(QWaylandXdgDecorationManagerV1); + + auto *toplevel = QWaylandXdgToplevel::fromResource(toplevelResource); + if (!toplevel) { + qWarning() << "Couldn't find toplevel for decoration"; + return; + } + + //TODO: verify that the xdg surface is unconfigured, and post protocol error/warning + + auto *toplevelPrivate = QWaylandXdgToplevelPrivate::get(toplevel); + + if (toplevelPrivate->m_decoration) { + qWarning() << "zxdg_decoration_manager_v1.get_toplevel_decoration:" + << toplevel << "already has a decoration object, ignoring"; + //TODO: protocol error as well? + return; + } + + new QWaylandXdgToplevelDecorationV1(toplevel, q, resource->client(), id); +} + +QWaylandXdgToplevelDecorationV1::QWaylandXdgToplevelDecorationV1(QWaylandXdgToplevel *toplevel, + QWaylandXdgDecorationManagerV1 *manager, + wl_client *client, int id) + : QtWaylandServer::zxdg_toplevel_decoration_v1(client, id, /*version*/ 1) + , m_toplevel(toplevel) + , m_manager(manager) +{ + Q_ASSERT(toplevel); + auto *toplevelPrivate = QWaylandXdgToplevelPrivate::get(toplevel); + Q_ASSERT(!toplevelPrivate->m_decoration); + toplevelPrivate->m_decoration.reset(this); + sendConfigure(manager->preferredMode()); +} + +void QWaylandXdgToplevelDecorationV1::sendConfigure(QWaylandXdgToplevelDecorationV1::DecorationMode mode) +{ + if (configuredMode() == mode) + return; + + switch (mode) { + case DecorationMode::ClientSideDecoration: + send_configure(mode_client_side); + break; + case DecorationMode::ServerSideDecoration: + send_configure(mode_server_side); + break; + default: + qWarning() << "Illegal mode in QWaylandXdgToplevelDecorationV1::sendConfigure" << mode; + break; + } + + m_configuredMode = mode; + emit m_toplevel->decorationModeChanged(); +} + +void QWaylandXdgToplevelDecorationV1::zxdg_toplevel_decoration_v1_destroy_resource(Resource *resource) +{ + Q_UNUSED(resource); + auto *toplevelPrivate = QWaylandXdgToplevelPrivate::get(m_toplevel); + toplevelPrivate->m_decoration.reset(); +} + +void QWaylandXdgToplevelDecorationV1::zxdg_toplevel_decoration_v1_destroy(Resource *resource) +{ + wl_resource_destroy(resource->handle); +} + +void QWaylandXdgToplevelDecorationV1::zxdg_toplevel_decoration_v1_set_mode(Resource *resource, uint32_t mode) +{ + m_clientPreferredMode = DecorationMode(mode); + handleClientPreferredModeChanged(); +} + +void QWaylandXdgToplevelDecorationV1::zxdg_toplevel_decoration_v1_unset_mode(Resource *resource) +{ + m_clientPreferredMode = DecorationMode::DefaultDecorationMode; + handleClientPreferredModeChanged(); +} + +void QWaylandXdgToplevelDecorationV1::handleClientPreferredModeChanged() +{ + if (m_clientPreferredMode != m_configuredMode) { + if (m_clientPreferredMode == DecorationMode::DefaultDecorationMode) + sendConfigure(m_manager->preferredMode()); + else + sendConfigure(m_clientPreferredMode); + } +} + +QT_END_NAMESPACE diff --git a/src/compositor/extensions/qwaylandxdgdecorationv1.h b/src/compositor/extensions/qwaylandxdgdecorationv1.h new file mode 100644 index 000000000..649f3d162 --- /dev/null +++ b/src/compositor/extensions/qwaylandxdgdecorationv1.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtWaylandCompositor module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDXDGDECORATIONV1_H +#define QWAYLANDXDGDECORATIONV1_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QWaylandXdgDecorationManagerV1Private; + +class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandXdgDecorationManagerV1 : public QWaylandCompositorExtensionTemplate +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QWaylandXdgDecorationManagerV1) + Q_PROPERTY(QWaylandXdgToplevel::DecorationMode preferredMode READ preferredMode WRITE setPreferredMode NOTIFY defaultModeChanged) + +public: + explicit QWaylandXdgDecorationManagerV1(); + + void initialize() override; + + QWaylandXdgToplevel::DecorationMode preferredMode() const; + void setPreferredMode(QWaylandXdgToplevel::DecorationMode preferredMode); + + static const struct wl_interface *interface(); + +Q_SIGNALS: + void defaultModeChanged(); +}; + +QT_END_NAMESPACE + +#endif // QWAYLANDXDGDECORATIONV1_H diff --git a/src/compositor/extensions/qwaylandxdgdecorationv1_p.h b/src/compositor/extensions/qwaylandxdgdecorationv1_p.h new file mode 100644 index 000000000..c09cbc12e --- /dev/null +++ b/src/compositor/extensions/qwaylandxdgdecorationv1_p.h @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtWaylandCompositor module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDXDGDECORATIONV1_P_H +#define QWAYLANDXDGDECORATIONV1_P_H + +#include "qwaylandxdgdecorationv1.h" + +#include +#include + +#include + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +QT_BEGIN_NAMESPACE + +class QWaylandXdgToplevel; + +class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandXdgDecorationManagerV1Private + : public QWaylandCompositorExtensionPrivate + , public QtWaylandServer::zxdg_decoration_manager_v1 +{ + Q_DECLARE_PUBLIC(QWaylandXdgDecorationManagerV1) +public: + using DecorationMode = QWaylandXdgToplevel::DecorationMode; + explicit QWaylandXdgDecorationManagerV1Private() {} + +protected: + void zxdg_decoration_manager_v1_get_toplevel_decoration(Resource *resource, uint id, ::wl_resource *toplevelResource) override; + +private: + DecorationMode m_defaultMode = DecorationMode::ClientSideDecoration; +}; + +class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandXdgToplevelDecorationV1 + : public QtWaylandServer::zxdg_toplevel_decoration_v1 +{ +public: + using DecorationMode = QWaylandXdgToplevel::DecorationMode; + explicit QWaylandXdgToplevelDecorationV1(QWaylandXdgToplevel *toplevel, + QWaylandXdgDecorationManagerV1 *manager, + wl_client *client, int id); + + DecorationMode configuredMode() const { return m_configuredMode; } + void sendConfigure(DecorationMode mode); + +protected: + void zxdg_toplevel_decoration_v1_destroy_resource(Resource *resource) override; + void zxdg_toplevel_decoration_v1_destroy(Resource *resource) override; + void zxdg_toplevel_decoration_v1_set_mode(Resource *resource, uint32_t mode) override; + void zxdg_toplevel_decoration_v1_unset_mode(Resource *resource) override; + +private: + void handleClientPreferredModeChanged(); + + QWaylandXdgToplevel *m_toplevel = nullptr; + QWaylandXdgDecorationManagerV1 *m_manager = nullptr; + DecorationMode m_configuredMode = DecorationMode::DefaultDecorationMode; + DecorationMode m_clientPreferredMode = DecorationMode::DefaultDecorationMode; +}; + +QT_END_NAMESPACE + +#endif // QWAYLANDXDGDECORATIONV1_P_H diff --git a/src/compositor/extensions/qwaylandxdgshell.cpp b/src/compositor/extensions/qwaylandxdgshell.cpp index 01543135a..205269a88 100644 --- a/src/compositor/extensions/qwaylandxdgshell.cpp +++ b/src/compositor/extensions/qwaylandxdgshell.cpp @@ -904,6 +904,12 @@ bool QWaylandXdgToplevel::activated() const return d->m_lastAckedConfigure.states.contains(QWaylandXdgToplevel::State::ActivatedState); } +QWaylandXdgToplevel::DecorationMode QWaylandXdgToplevel::decorationMode() const +{ + Q_D(const QWaylandXdgToplevel); + return d->m_decoration ? d->m_decoration->configuredMode() : DecorationMode::ClientSideDecoration; +} + /*! * \qmlmethod size QtWaylandCompositor::XdgToplevel::sizeForResize(size size, point delta, uint edges) * diff --git a/src/compositor/extensions/qwaylandxdgshell.h b/src/compositor/extensions/qwaylandxdgshell.h index 5467290f6..bcc316e85 100644 --- a/src/compositor/extensions/qwaylandxdgshell.h +++ b/src/compositor/extensions/qwaylandxdgshell.h @@ -150,6 +150,7 @@ class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandXdgToplevel : public QObject Q_PROPERTY(bool fullscreen READ fullscreen NOTIFY fullscreenChanged) Q_PROPERTY(bool resizing READ resizing NOTIFY resizingChanged) Q_PROPERTY(bool activated READ activated NOTIFY activatedChanged) + Q_PROPERTY(enum DecorationMode decorationMode READ decorationMode NOTIFY decorationModeChanged) public: enum State : uint { MaximizedState = 1, @@ -159,6 +160,13 @@ public: }; Q_ENUM(State) + enum DecorationMode { + DefaultDecorationMode, + ClientSideDecoration, + ServerSideDecoration, + }; + Q_ENUM(DecorationMode) + QWaylandXdgToplevel(QWaylandXdgSurface *xdgSurface, QWaylandResource &resource); QWaylandXdgToplevel *parentToplevel() const; @@ -172,6 +180,7 @@ public: bool fullscreen() const; bool resizing() const; bool activated() const; + DecorationMode decorationMode() const; Q_INVOKABLE QSize sizeForResize(const QSizeF &size, const QPointF &delta, Qt::Edges edges) const; uint sendConfigure(const QSize &size, const QVector &states); @@ -206,6 +215,8 @@ Q_SIGNALS: void unsetFullscreen(); void setMinimized(); + void decorationModeChanged(); + private: QList statesAsInts() const; }; diff --git a/src/compositor/extensions/qwaylandxdgshell_p.h b/src/compositor/extensions/qwaylandxdgshell_p.h index 04d360ee7..70def5f7a 100644 --- a/src/compositor/extensions/qwaylandxdgshell_p.h +++ b/src/compositor/extensions/qwaylandxdgshell_p.h @@ -42,6 +42,8 @@ #include +#include + #include // @@ -176,6 +178,7 @@ public: QString m_appId; QSize m_maxSize; QSize m_minSize; + QScopedPointer m_decoration; static QWaylandSurfaceRole s_role; }; diff --git a/src/imports/compositor/qwaylandquickcompositorplugin.cpp b/src/imports/compositor/qwaylandquickcompositorplugin.cpp index ef2b5203e..f4e727893 100644 --- a/src/imports/compositor/qwaylandquickcompositorplugin.cpp +++ b/src/imports/compositor/qwaylandquickcompositorplugin.cpp @@ -64,6 +64,7 @@ #include #include #include +#include #include #include @@ -88,6 +89,7 @@ Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(QWaylandXdgShellV6) Q_COMPOSITOR_DECLARE_QUICK_PARENT_CLASS(QWaylandXdgSurfaceV6) Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(QWaylandXdgShell) Q_COMPOSITOR_DECLARE_QUICK_PARENT_CLASS(QWaylandXdgSurface) +Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(QWaylandXdgDecorationManagerV1) Q_COMPOSITOR_DECLARE_QUICK_EXTENSION_CLASS(QWaylandTextInputManager) class QmlUrlResolver @@ -178,6 +180,8 @@ public: qmlRegisterType(uri, 1, 3, "XdgSurface"); qmlRegisterUncreatableType(uri, 1, 3, "XdgToplevel", QObject::tr("Cannot create instance of XdgShellToplevel")); qmlRegisterUncreatableType(uri, 1, 3, "XdgPopup", QObject::tr("Cannot create instance of XdgShellPopup")); + + qmlRegisterType(uri, 1, 3, "XdgDecorationManagerV1"); } }; //![class decl] diff --git a/sync.profile b/sync.profile index 40a38745f..756674cda 100644 --- a/sync.profile +++ b/sync.profile @@ -61,6 +61,7 @@ "^qwayland-server-server-buffer-extension.h", "^qwayland-server-text-input-unstable-v2.h", "^qwayland-server-touch-extension.h", + "^qwayland-server-xdg-decoration-unstable-v1.h", "^qwayland-server-xdg-shell-unstable-v5.h", "^qwayland-server-xdg-shell-unstable-v6.h", "^qwayland-server-xdg-shell.h", @@ -72,6 +73,7 @@ "^wayland-text-input-unstable-v2-server-protocol.h", "^wayland-touch-extension-server-protocol.h", "^wayland-wayland-server-protocol.h", + "^wayland-xdg-decoration-unstable-v1-server-protocol.h", "^wayland-xdg-shell-server-protocol.h", "^wayland-xdg-shell-unstable-v5-server-protocol.h", "^wayland-xdg-shell-unstable-v6-server-protocol.h", -- cgit v1.2.3