diff options
author | Aleix Pol <aleixpol@kde.org> | 2020-11-10 19:06:48 +0100 |
---|---|---|
committer | David Redondo <qt@david-redondo.de> | 2021-12-09 10:33:08 +0100 |
commit | bd6dbf01f13007c20f93080d59b26d3635a81a9d (patch) | |
tree | b44c2917c626ec3192e028c843413c354df7d11f /src/plugins | |
parent | 283a2d61d03315495a52d82f356e7cb5292f4bb4 (diff) | |
download | qtwayland-bd6dbf01f13007c20f93080d59b26d3635a81a9d.tar.gz |
Implement xdg_activation_v1 protocol
Change-Id: Ib5c8d0c6a209308c2c1a7f5e45d8866ba0127d81
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src/plugins')
5 files changed, 225 insertions, 0 deletions
diff --git a/src/plugins/shellintegration/xdg-shell/CMakeLists.txt b/src/plugins/shellintegration/xdg-shell/CMakeLists.txt index 62e3952b..f840e293 100644 --- a/src/plugins/shellintegration/xdg-shell/CMakeLists.txt +++ b/src/plugins/shellintegration/xdg-shell/CMakeLists.txt @@ -10,6 +10,7 @@ qt_internal_add_plugin(QWaylandXdgShellIntegrationPlugin SOURCES main.cpp qwaylandxdgdecorationv1.cpp qwaylandxdgdecorationv1_p.h + qwaylandxdgactivationv1.cpp qwaylandxdgactivationv1_p.h qwaylandxdgshell.cpp qwaylandxdgshell_p.h qwaylandxdgshellintegration.cpp qwaylandxdgshellintegration_p.h LIBRARIES @@ -24,6 +25,7 @@ qt6_generate_wayland_protocol_client_sources(QWaylandXdgShellIntegrationPlugin FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/protocol/xdg-decoration-unstable-v1.xml ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/protocol/xdg-shell.xml + ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/protocol/xdg-activation-v1.xml ) #### Keys ignored in scope 1:.:.:xdg-shell.pro:<TRUE>: diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1.cpp new file mode 100644 index 00000000..9b5a1cb3 --- /dev/null +++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1.cpp @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 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.LGPL3 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-3.0.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 (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwaylandxdgactivationv1_p.h" +#include <QtWaylandClient/private/qwaylanddisplay_p.h> +#include <QtWaylandClient/private/qwaylandinputdevice_p.h> + +QT_BEGIN_NAMESPACE + +namespace QtWaylandClient { + +QWaylandXdgActivationV1::QWaylandXdgActivationV1(wl_registry *registry, uint32_t id, + uint32_t availableVersion) + : QtWayland::xdg_activation_v1(registry, id, qMin(availableVersion, 1u)) +{ +} + +QWaylandXdgActivationV1::~QWaylandXdgActivationV1() +{ + Q_ASSERT(isInitialized()); + destroy(); +} + +QWaylandXdgActivationTokenV1 * +QWaylandXdgActivationV1::requestXdgActivationToken(QWaylandDisplay *display, + struct ::wl_surface *surface, uint32_t serial, + const QString &app_id) +{ + auto wl = get_activation_token(); + auto provider = new QWaylandXdgActivationTokenV1; + provider->init(wl); + + if (surface) + provider->set_surface(surface); + + if (!app_id.isEmpty()) + provider->set_app_id(app_id); + + if (display->lastInputDevice()) + provider->set_serial(serial, display->lastInputDevice()->wl_seat()); + provider->commit(); + return provider; +} + +} + +QT_END_NAMESPACE diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1_p.h b/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1_p.h new file mode 100644 index 00000000..11ffe7d1 --- /dev/null +++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1_p.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2020 Aleix Pol Gonzalez <aleixpol@kde.org> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the config.tests of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 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.LGPL3 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-3.0.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 (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDXDGACTIVATIONV1_P_H +#define QWAYLANDXDGACTIVATIONV1_P_H + +// +// 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. +// + +#include <QObject> +#include "qwayland-xdg-activation-v1.h" + +#include <QtWaylandClient/qtwaylandclientglobal.h> + +QT_BEGIN_NAMESPACE + +namespace QtWaylandClient { + +class QWaylandDisplay; +class QWaylandSurface; + +class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgActivationTokenV1 + : public QObject, + public QtWayland::xdg_activation_token_v1 +{ + Q_OBJECT +public: + void xdg_activation_token_v1_done(const QString &token) override { Q_EMIT done(token); } + +Q_SIGNALS: + void done(const QString &token); +}; + +class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgActivationV1 : public QtWayland::xdg_activation_v1 +{ +public: + QWaylandXdgActivationV1(struct ::wl_registry *registry, uint32_t id, uint32_t availableVersion); + ~QWaylandXdgActivationV1() override; + + QWaylandXdgActivationTokenV1 *requestXdgActivationToken(QWaylandDisplay *display, + struct ::wl_surface *surface, + uint32_t serial, const QString &app_id); +}; + +QT_END_NAMESPACE + +} + +#endif // QWAYLANDXDGACTIVATIONV1_P_H diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp index 8378cf9f..ad533606 100644 --- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp +++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp @@ -318,6 +318,8 @@ void QWaylandXdgSurface::setAppId(const QString &appId) { if (m_toplevel) m_toplevel->set_app_id(appId); + + m_appId = appId; } void QWaylandXdgSurface::setWindowFlags(Qt::WindowFlags flags) @@ -477,6 +479,39 @@ void QWaylandXdgSurface::xdg_surface_configure(uint32_t serial) } } +bool QWaylandXdgSurface::requestActivate() +{ + if (auto *activation = m_shell->activation()) { + activation->activate(m_activationToken, window()->wlSurface()); + return true; + } + return false; +} + +void QWaylandXdgSurface::requestXdgActivationToken(quint32 serial) +{ + if (auto *activation = m_shell->activation()) { + auto tokenProvider = activation->requestXdgActivationToken( + m_shell->m_display, m_window->wlSurface(), serial, m_appId); + connect(tokenProvider, &QWaylandXdgActivationTokenV1::done, this, + [this, tokenProvider](const QString &token) { + Q_EMIT m_window->xdgActivationTokenCreated(token); + tokenProvider->deleteLater(); + }); + } else { + QWaylandShellSurface::requestXdgActivationToken(serial); + } +} + +void QWaylandXdgSurface::setXdgActivationToken(const QString &token) +{ + if (auto *activation = m_shell->activation()) { + m_activationToken = token; + } else { + qCWarning(lcQpaWayland) << "zxdg_activation_v1 not available"; + } +} + QWaylandXdgShell::QWaylandXdgShell(QWaylandDisplay *display, uint32_t id, uint32_t availableVersion) : QtWayland::xdg_wm_base(display->wl_registry(), id, qMin(availableVersion, 2u)) , m_display(display) @@ -506,6 +541,10 @@ void QWaylandXdgShell::handleRegistryGlobal(void *data, wl_registry *registry, u QWaylandXdgShell *xdgShell = static_cast<QWaylandXdgShell *>(data); if (interface == QLatin1String(QWaylandXdgDecorationManagerV1::interface()->name)) xdgShell->m_xdgDecorationManager.reset(new QWaylandXdgDecorationManagerV1(registry, id, version)); + + if (interface == QLatin1String(QWaylandXdgActivationV1::interface()->name)) { + xdgShell->m_xdgActivation.reset(new QWaylandXdgActivationV1(registry, id, version)); + } } } diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h index b504a24d..8630fcab 100644 --- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h +++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h @@ -55,6 +55,7 @@ #include "qwayland-xdg-shell.h" #include "qwaylandxdgdecorationv1_p.h" +#include "qwaylandxdgactivationv1_p.h" #include <QtWaylandClient/qtwaylandclientglobal.h> #include <QtWaylandClient/private/qwaylandshellsurface_p.h> @@ -94,6 +95,9 @@ public: bool wantsDecorations() const override; void propagateSizeHints() override; void setWindowGeometry(const QRect &rect) override; + bool requestActivate() override; + void setXdgActivationToken(const QString &token) override; + void requestXdgActivationToken(quint32 serial) override; void setSizeHints(); @@ -157,6 +161,8 @@ private: QRegion m_exposeRegion; uint m_pendingConfigureSerial = 0; uint m_appliedConfigureSerial = 0; + QString m_activationToken; + QString m_appId; friend class QWaylandXdgShell; }; @@ -168,6 +174,7 @@ public: ~QWaylandXdgShell() override; QWaylandXdgDecorationManagerV1 *decorationManager() { return m_xdgDecorationManager.data(); } + QWaylandXdgActivationV1 *activation() const { return m_xdgActivation.data(); } QWaylandXdgSurface *getXdgSurface(QWaylandWindow *window); protected: @@ -179,6 +186,7 @@ private: QWaylandDisplay *m_display = nullptr; QScopedPointer<QWaylandXdgDecorationManagerV1> m_xdgDecorationManager; + QScopedPointer<QWaylandXdgActivationV1> m_xdgActivation; QWaylandXdgSurface::Popup *m_topmostGrabbingPopup = nullptr; friend class QWaylandXdgSurface; |