Skip to content

Commit

Permalink
Update to Qt 6.3 state
Browse files Browse the repository at this point in the history
  • Loading branch information
ilya-fedin authored and john-preston committed Apr 12, 2022
1 parent f0207f8 commit 7db371e
Show file tree
Hide file tree
Showing 7 changed files with 266 additions and 12 deletions.
9 changes: 9 additions & 0 deletions waylandshells/xdg-shell/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ if (DESKTOP_APP_QT6)
FILES
${third_party_loc}/wayland-protocols/stable/xdg-shell/xdg-shell.xml
${third_party_loc}/wayland-protocols/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml
${third_party_loc}/wayland-protocols/staging/xdg-activation/xdg-activation-v1.xml
)
else()
ecm_add_qtwayland_client_protocol(xdg_shell_protocol_srcs
Expand All @@ -33,11 +34,18 @@ else()
PROTOCOL ${third_party_loc}/wayland-protocols/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml
BASENAME xdg-decoration-unstable-v1
)

ecm_add_qtwayland_client_protocol(xdg_activation_protocol_srcs
PROTOCOL ${third_party_loc}/wayland-protocols/staging/xdg-activation/xdg-activation-v1.xml
BASENAME xdg-activation-v1
)
endif()

nice_target_sources(lib_waylandshells_xdg_shell ${src_loc}
PRIVATE
main.cpp
qwaylandxdgactivationv1.cpp
qwaylandxdgactivationv1_p.h
qwaylandxdgdecorationv1.cpp
qwaylandxdgdecorationv1_p.h
qwaylandxdgshell.cpp
Expand All @@ -51,6 +59,7 @@ if (NOT DESKTOP_APP_QT6)
PRIVATE
${xdg_shell_protocol_srcs}
${xdg_decoration_protocol_srcs}
${xdg_activation_protocol_srcs}
)
endif()

Expand Down
85 changes: 85 additions & 0 deletions waylandshells/xdg-shell/qwaylandxdgactivationv1.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/****************************************************************************
**
** 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 WaylandShells {

using 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
99 changes: 99 additions & 0 deletions waylandshells/xdg-shell/qwaylandxdgactivationv1_p.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/****************************************************************************
**
** 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;

}

namespace WaylandShells {

using namespace QtWaylandClient;

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
67 changes: 55 additions & 12 deletions waylandshells/xdg-shell/qwaylandxdgshell.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,6 @@ QWaylandXdgSurface::Toplevel::Toplevel(QWaylandXdgSurface *xdgSurface)

QWaylandXdgSurface::Toplevel::~Toplevel()
{
if (m_applied.states & Qt::WindowActive) {
QWaylandWindow *window = m_xdgSurface->window();
window->display()->handleWindowDeactivated(window);
}

// The protocol spec requires that the decoration object is deleted before xdg_toplevel.
delete m_decoration;
m_decoration = nullptr;
Expand All @@ -89,19 +84,26 @@ void QWaylandXdgSurface::Toplevel::applyConfigure()
if (!(m_applied.states & (Qt::WindowMaximized|Qt::WindowFullScreen)))
m_normalSize = m_xdgSurface->m_window->windowFrameGeometry().size();

if ((m_pending.states & Qt::WindowActive) && !(m_applied.states & Qt::WindowActive))
if ((m_pending.states & Qt::WindowActive) && !(m_applied.states & Qt::WindowActive)
#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
&& !m_xdgSurface->m_window->display()->isKeyboardAvailable())
#else
)
#endif
m_xdgSurface->m_window->display()->handleWindowActivated(m_xdgSurface->m_window);

if (!(m_pending.states & Qt::WindowActive) && (m_applied.states & Qt::WindowActive))
if (!(m_pending.states & Qt::WindowActive) && (m_applied.states & Qt::WindowActive)
#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
&& !m_xdgSurface->m_window->display()->isKeyboardAvailable())
#else
)
#endif
m_xdgSurface->m_window->display()->handleWindowDeactivated(m_xdgSurface->m_window);

// TODO: none of the other plugins send WindowActive either, but is it on purpose?
Qt::WindowStates statesWithoutActive = m_pending.states & ~Qt::WindowActive;

#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
m_xdgSurface->m_window->handleToplevelWindowTilingStatesChanged(m_toplevelStates);
#endif
m_xdgSurface->m_window->handleWindowStatesChanged(statesWithoutActive);
m_xdgSurface->m_window->handleWindowStatesChanged(m_pending.states);

if (m_pending.size.isEmpty()) {
// An empty size in the configure means it's up to the client to choose the size
Expand Down Expand Up @@ -275,7 +277,7 @@ QWaylandXdgSurface::QWaylandXdgSurface(QWaylandXdgShell *shell, ::xdg_surface *s
} else {
setToplevel();
if (transientParent) {
auto parentXdgSurface = static_cast<QWaylandXdgSurface *>(transientParent->shellSurface());
auto parentXdgSurface = qobject_cast<QWaylandXdgSurface *>(transientParent->shellSurface());
if (parentXdgSurface)
m_toplevel->set_parent(parentXdgSurface->m_toplevel->object());
}
Expand Down Expand Up @@ -335,6 +337,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)
Expand Down Expand Up @@ -512,6 +516,41 @@ void QWaylandXdgSurface::xdg_surface_configure(uint32_t serial)
}
}

#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
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 (m_shell->activation()) {
m_activationToken = token;
} else {
qCWarning(lcQpaWayland) << "zxdg_activation_v1 not available";
}
}
#endif

QWaylandXdgShell::QWaylandXdgShell(QWaylandDisplay *display, uint32_t id, uint32_t availableVersion)
#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)
: QtWayland::xdg_wm_base(display->wl_registry(), id, qMin(availableVersion, 2u))
Expand Down Expand Up @@ -545,6 +584,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));
}
}

}
Expand Down
10 changes: 10 additions & 0 deletions waylandshells/xdg-shell/qwaylandxdgshell_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -101,6 +102,11 @@ class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgSurface : public QWaylandShellSurface,
bool wantsDecorations() const override;
void propagateSizeHints() override;
void setWindowGeometry(const QRect &rect) override;
#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
bool requestActivate() override;
void setXdgActivationToken(const QString &token) override;
void requestXdgActivationToken(quint32 serial) override;
#endif

void setSizeHints();

Expand Down Expand Up @@ -168,6 +174,8 @@ class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgSurface : public QWaylandShellSurface,
QRegion m_exposeRegion;
uint m_pendingConfigureSerial = 0;
uint m_appliedConfigureSerial = 0;
QString m_activationToken;
QString m_appId;
QMargins m_customMargins;

friend class QWaylandXdgShell;
Expand All @@ -180,6 +188,7 @@ class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShell : public QtWayland::xdg_wm_base
~QWaylandXdgShell() override;

QWaylandXdgDecorationManagerV1 *decorationManager() { return m_xdgDecorationManager.data(); }
QWaylandXdgActivationV1 *activation() const { return m_xdgActivation.data(); }
QWaylandXdgSurface *getXdgSurface(QWaylandWindow *window);

protected:
Expand All @@ -191,6 +200,7 @@ class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShell : public QtWayland::xdg_wm_base

QWaylandDisplay *m_display = nullptr;
QScopedPointer<QWaylandXdgDecorationManagerV1> m_xdgDecorationManager;
QScopedPointer<QWaylandXdgActivationV1> m_xdgActivation;
QWaylandXdgSurface::Popup *m_topmostGrabbingPopup = nullptr;

friend class QWaylandXdgSurface;
Expand Down

0 comments on commit 7db371e

Please sign in to comment.