Sync from SUSE:SLFO:Main qt6-wayland revision 55487e7fce03b5909e06809706237120

This commit is contained in:
Adrian Schröter 2025-02-07 11:22:06 +01:00
parent 9f521fde93
commit 2b0d3a2544
10 changed files with 870 additions and 178 deletions

View File

@ -1,37 +0,0 @@
From 92bcb8f6b7a852c7a5d662fc34de561692a7a454 Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
Date: Thu, 20 Jun 2024 11:25:06 +0300
Subject: [PATCH] Client: Ensure that guessed popup parent has a shell surface
The last input window may not have a shell surface if it is a subsurface
or that window has been just made invisible.
Change-Id: Iad11c68659579429ddc5d9ba0038975b25da8e0d
Reviewed-by: David Edmundson <davidedmundson@kde.org>
(cherry picked from commit 52c406cec149634680489faeeaf06bb1258cd12f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 7d04c18531276c94bfdf2f9a955d6f02554b28b2)
---
src/client/qwaylandwindow.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 22aeba10..c3725ffc 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -1157,8 +1157,10 @@ QWaylandWindow *QWaylandWindow::guessTransientParent() const
return mTopPopup;
}
- if (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup)
- return display()->lastInputWindow();
+ if (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup) {
+ if (auto lastInputWindow = display()->lastInputWindow())
+ return closestShellSurfaceWindow(lastInputWindow->window());
+ }
return nullptr;
}
--
2.45.2

View File

@ -1,44 +0,0 @@
From 8811c62a0c31443ee888a67df2e960bc040f3dcc Mon Sep 17 00:00:00 2001
From: David Edmundson <davidedmundson@kde.org>
Date: Wed, 10 Jul 2024 09:00:33 +0100
Subject: [PATCH 1/2] client: Guard against windows being on a null screen
calculateScreenFromSurfaceEvents uses the screen information from our
surface enter events. If this is not set yet, or refers to outputs not
yet complete we fall back to the QWindow::screen. This was introduced in
e03613524fc9f6be5c4cd7e9bdb00bc09c7f1e0b.
It was assumed that this would always be a valid value as QtBase keeps
it updated, but there are apparently paths for it to still be null.
It will be evaluated again when the surface receives a wl_enter event or
the output that we have entered is finally initialised and we will then
be marked as on the correct screen.
Change-Id: I33b4a5112c3426a8ea523d39a0658ba7ffee5298
Reviewed-by: Aleix Pol Gonzalez <aleixpol@kde.org>
Reviewed-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
(cherry picked from commit c4f91b479303dda2e49499de249018d7c66c5f99)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit ec07c90cd647fd7a647f3f10dcae4d18699263df)
(cherry picked from commit 406995207eae8d644b6e5262aa716a48c7e471a8)
---
src/client/qwaylandwindow.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 22aeba10..c64f3326 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -1405,7 +1405,7 @@ void QWaylandWindow::handleScreensChanged()
{
QPlatformScreen *newScreen = calculateScreenFromSurfaceEvents();
- if (newScreen->screen() == window()->screen())
+ if (!newScreen || newScreen->screen() == window()->screen())
return;
QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen());
--
2.45.2

View File

@ -0,0 +1,263 @@
From 24002ac6cbd01dbde4944b63c1f7c87ed2bd72b5 Mon Sep 17 00:00:00 2001
From: David Redondo <qt@david-redondo.de>
Date: Fri, 22 Nov 2024 10:56:41 +0100
Subject: [PATCH] client: Redo management of tablet object proxies
Since 5af836aea3bb91a9f388e565415dc33b2fde4577 tools and pads can sometimes
be parented to tablets. When a tablet is unplugged sometimes the remove
event for the tablet can be sent before the remove events for the pad.
Deleting the tablet will also delete the pad but not the pad proxy,
resulting in a crash when the pad remove event is received.
This moves destruction of the wayland proxies which makes everything much
simpler as not every location that deletes those objects needs to call
destroy and fixes the described problem.
Change-Id: I0aaeda3d3996251e411229b5e97aa1ce0bce43ac
Reviewed-by: David Edmundson <davidedmundson@kde.org>
(cherry picked from commit 1f76835d1805d9b1c25c136a19c1101f19cc2259)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
src/client/qwaylandtabletv2.cpp | 24 +++++----
src/client/qwaylandtabletv2_p.h | 4 +-
tests/auto/client/tabletv2/tst_tabletv2.cpp | 60 +++++++++++++++++----
3 files changed, 67 insertions(+), 21 deletions(-)
diff --git a/src/client/qwaylandtabletv2.cpp b/src/client/qwaylandtabletv2.cpp
index 305aae50..c3f665df 100644
--- a/src/client/qwaylandtabletv2.cpp
+++ b/src/client/qwaylandtabletv2.cpp
@@ -185,12 +185,6 @@ QWaylandTabletSeatV2::QWaylandTabletSeatV2(QWaylandTabletManagerV2 *manager, QWa
QWaylandTabletSeatV2::~QWaylandTabletSeatV2()
{
- for (auto *tablet : m_tablets)
- tablet->destroy();
- for (auto *tool : m_tools)
- tool->destroy();
- for (auto *pad : m_pads)
- pad->destroy();
qDeleteAll(m_tablets);
qDeleteAll(m_tools);
qDeleteAll(m_deadTools);
@@ -252,6 +246,11 @@ QWaylandTabletV2::QWaylandTabletV2(::zwp_tablet_v2 *tablet, const QString &seatN
d->seatName = seatName;
}
+QWaylandTabletV2::~QWaylandTabletV2()
+{
+ destroy();
+}
+
void QWaylandTabletV2::zwp_tablet_v2_name(const QString &name)
{
QPointingDevicePrivate *d = QPointingDevicePrivate::get(this);
@@ -290,7 +289,6 @@ void QWaylandTabletSeatV2::toolRemoved(QWaylandTabletToolV2 *tool)
void QWaylandTabletV2::zwp_tablet_v2_removed()
{
- destroy();
deleteLater();
}
@@ -314,7 +312,10 @@ QWaylandTabletToolV2::QWaylandTabletToolV2(QWaylandTabletSeatV2 *tabletSeat, ::z
#endif
}
-QWaylandTabletToolV2::~QWaylandTabletToolV2() = default;
+QWaylandTabletToolV2::~QWaylandTabletToolV2()
+{
+ destroy();
+}
void QWaylandTabletToolV2::zwp_tablet_tool_v2_type(uint32_t tool_type)
{
@@ -408,7 +409,6 @@ void QWaylandTabletToolV2::zwp_tablet_tool_v2_done()
void QWaylandTabletToolV2::zwp_tablet_tool_v2_removed()
{
- destroy();
m_tabletSeat->toolRemoved(this);
}
@@ -600,6 +600,11 @@ QWaylandTabletPadV2::QWaylandTabletPadV2(::zwp_tablet_pad_v2 *pad)
{
}
+QWaylandTabletPadV2::~QWaylandTabletPadV2()
+{
+ destroy();
+}
+
void QWaylandTabletPadV2::zwp_tablet_pad_v2_path(const QString &path)
{
QPointingDevicePrivate *d = QPointingDevicePrivate::get(this);
@@ -619,7 +624,6 @@ void QWaylandTabletPadV2::zwp_tablet_pad_v2_done()
void QWaylandTabletPadV2::zwp_tablet_pad_v2_removed()
{
- destroy();
delete this;
}
diff --git a/src/client/qwaylandtabletv2_p.h b/src/client/qwaylandtabletv2_p.h
index 94b687ee..f0d7cd18 100644
--- a/src/client/qwaylandtabletv2_p.h
+++ b/src/client/qwaylandtabletv2_p.h
@@ -83,6 +83,7 @@ class Q_WAYLANDCLIENT_EXPORT QWaylandTabletV2 : public QPointingDevice, public Q
Q_OBJECT
public:
explicit QWaylandTabletV2(::zwp_tablet_v2 *tablet, const QString &seatName);
+ ~QWaylandTabletV2();
protected:
// callbacks which act as setters
@@ -98,7 +99,7 @@ class Q_WAYLANDCLIENT_EXPORT QWaylandTabletToolV2 : public QPointingDevice, publ
Q_OBJECT
public:
QWaylandTabletToolV2(QWaylandTabletSeatV2 *tabletSeat, ::zwp_tablet_tool_v2 *tool);
- ~QWaylandTabletToolV2() override;
+ ~QWaylandTabletToolV2();
void updateCursor();
@@ -181,6 +182,7 @@ class Q_WAYLANDCLIENT_EXPORT QWaylandTabletPadV2 : public QPointingDevice, publi
Q_OBJECT
public:
explicit QWaylandTabletPadV2(::zwp_tablet_pad_v2 *pad);
+ ~QWaylandTabletPadV2();
protected:
// void zwp_tablet_pad_v2_group(struct ::zwp_tablet_pad_group_v2 *pad_group) override;
diff --git a/tests/auto/client/tabletv2/tst_tabletv2.cpp b/tests/auto/client/tabletv2/tst_tabletv2.cpp
index 85df099f..d5c2ccb3 100644
--- a/tests/auto/client/tabletv2/tst_tabletv2.cpp
+++ b/tests/auto/client/tabletv2/tst_tabletv2.cpp
@@ -186,9 +186,9 @@ public:
QList<TabletV2 *> m_tablets;
QList<TabletV2 *> m_tabletsWaitingForDestroy;
QList<TabletToolV2 *> m_tools;
- QList<TabletToolV2 *> m_toolsWaitingForDestroy;
+ QList<TabletToolV2::Resource *> m_toolsWaitingForDestroy;
QList<TabletPadV2 *> m_pads;
- QList<TabletPadV2 *> m_padsWaitingForDestroy;
+ QList<TabletPadV2::Resource *> m_padsWaitingForDestroy;
protected:
void zwp_tablet_seat_v2_bind_resource(Resource *resource) override
@@ -274,11 +274,12 @@ void TabletV2::zwp_tablet_v2_destroy(QtWaylandServer::zwp_tablet_v2::Resource *r
void TabletToolV2::sendRemoved()
{
- for (auto *resource : resourceMap())
+ for (auto *resource : resourceMap()) {
zwp_tablet_tool_v2_send_removed(resource->handle);
+ m_tabletSeat->m_toolsWaitingForDestroy.append(resource);
+ }
bool removed = m_tabletSeat->m_tools.removeOne(this);
QVERIFY(removed);
- m_tabletSeat->m_toolsWaitingForDestroy.append(this);
}
uint TabletToolV2::sendProximityIn(TabletV2 *tablet, Surface *surface)
@@ -333,26 +334,25 @@ uint TabletToolV2::sendFrame()
void TabletToolV2::zwp_tablet_tool_v2_destroy(QtWaylandServer::zwp_tablet_tool_v2::Resource *resource)
{
if (m_tabletSeat) {
- bool removed = m_tabletSeat->m_toolsWaitingForDestroy.removeOne(this);
- QVERIFY(removed);
+ m_tabletSeat->m_toolsWaitingForDestroy.removeOne(resource);
}
wl_resource_destroy(resource->handle);
}
void TabletPadV2::sendRemoved()
{
- for (auto *resource : resourceMap())
+ for (auto *resource : resourceMap()) {
zwp_tablet_pad_v2_send_removed(resource->handle);
+ m_tabletSeat->m_padsWaitingForDestroy.append(resource);
+ }
bool removed = m_tabletSeat->m_pads.removeOne(this);
QVERIFY(removed);
- m_tabletSeat->m_padsWaitingForDestroy.append(this);
}
void TabletPadV2::zwp_tablet_pad_v2_destroy(QtWaylandServer::zwp_tablet_pad_v2::Resource *resource)
{
if (m_tabletSeat) {
- bool removed = m_tabletSeat->m_padsWaitingForDestroy.removeOne(this);
- QVERIFY(removed);
+ m_tabletSeat->m_padsWaitingForDestroy.removeOne(resource);
}
wl_resource_destroy(resource->handle);
}
@@ -405,6 +405,8 @@ private slots:
void destroysTablet();
void destroysTool();
void destroysPad();
+ void removeTabletBeforeTool();
+ void removeTabletBeforePad();
void proximityEvents();
void moveEvent();
void pointerType_data();
@@ -502,12 +504,14 @@ void tst_tabletv2::destroysTool()
{
QCOMPOSITOR_TRY_VERIFY(tabletSeat());
exec([&] {
+ tabletSeat()->addTablet();
tabletSeat()->addTool();
});
QCOMPOSITOR_TRY_VERIFY(tabletTool());
exec([&] {
tabletTool()->sendRemoved();
+ tablet()->sendRemoved();
});
QCOMPOSITOR_TRY_VERIFY(!tabletTool());
@@ -530,6 +534,42 @@ void tst_tabletv2::destroysPad()
QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_padsWaitingForDestroy.empty());
}
+void tst_tabletv2::removeTabletBeforeTool()
+{
+ QCOMPOSITOR_TRY_VERIFY(tabletSeat());
+ exec([&] {
+ tabletSeat()->addTablet();
+ tabletSeat()->addTool();
+ });
+ QCOMPOSITOR_TRY_VERIFY(tablet());
+ QCOMPOSITOR_TRY_VERIFY(tabletTool());
+
+ exec([&] { tablet()->sendRemoved(); });
+ QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_tabletsWaitingForDestroy.empty());
+
+ exec([&] { tabletTool()->sendRemoved(); });
+ QCOMPOSITOR_TRY_VERIFY(!tabletTool());
+ QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_toolsWaitingForDestroy.empty());
+}
+
+void tst_tabletv2::removeTabletBeforePad()
+{
+ QCOMPOSITOR_TRY_VERIFY(tabletSeat());
+ exec([&] {
+ tabletSeat()->addTablet();
+ tabletSeat()->addPad();
+ });
+ QCOMPOSITOR_TRY_VERIFY(tablet());
+ QCOMPOSITOR_TRY_VERIFY(tabletPad());
+
+ exec([&] { tablet()->sendRemoved(); });
+ QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_tabletsWaitingForDestroy.empty());
+
+ exec([&] { tabletPad()->sendRemoved(); });
+ QCOMPOSITOR_TRY_VERIFY(!tabletPad());
+ QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_padsWaitingForDestroy.empty());
+}
+
void tst_tabletv2::proximityEvents()
{
ProximityFilter filter;
--
2.47.1

View File

@ -0,0 +1,25 @@
From 6f87a84b8e72c3676ee9cf7190b8ae1f82387353 Mon Sep 17 00:00:00 2001
From: Heng Liu <liuhenga@uniontech.com>
Date: Fri, 25 Oct 2024 10:17:45 +0800
Subject: [PATCH] fix crash when attach differ shellsurface to the same shellsurfaceitem
Change shellSurface from a raw pointer to a QPointer to prevent
crash caused by accessing the wild pointer when shellSurface is destroyed
Pick-to: 6.8
Change-Id: Iabf25ce9e3fab416b5b927bf768e94398516a710
---
diff --git a/src/compositor/extensions/qwaylandquickshellsurfaceitem_p.h b/src/compositor/extensions/qwaylandquickshellsurfaceitem_p.h
index 46e5f65..10b10a0 100644
--- a/src/compositor/extensions/qwaylandquickshellsurfaceitem_p.h
+++ b/src/compositor/extensions/qwaylandquickshellsurfaceitem_p.h
@@ -41,7 +41,7 @@
void lower() override;
QWaylandQuickShellIntegration *m_shellIntegration = nullptr;
- QWaylandShellSurface *m_shellSurface = nullptr;
+ QPointer<QWaylandShellSurface> m_shellSurface = nullptr;
QQuickItem *m_moveItem = nullptr;
bool m_autoCreatePopupItems = true;
bool staysOnTop = false;

View File

@ -0,0 +1,488 @@
From c2f61bc47baacf2e6a44c6c3c4e4cbf0abfa4095 Mon Sep 17 00:00:00 2001
From: Liang Qi <liang.qi@qt.io>
Date: Wed, 3 Jul 2024 15:06:09 +0200
Subject: [PATCH] Update wayland.xml to version 1.23.0
This updates only the protocol definition, implementations
will need additional commits to opt into using them.
Change-Id: I5999e6dd75dfff7d904981fb1545d58c8b38ceb0
Reviewed-by: David Edmundson <davidedmundson@kde.org>
---
src/3rdparty/protocol/wayland/wayland.xml | 215 ++++++++++++++++++++++--------
1 file changed, 156 insertions(+), 59 deletions(-)
diff --git a/src/3rdparty/protocol/wayland/wayland.xml b/src/3rdparty/protocol/wayland/wayland.xml
index 10e039d6e..9418c62f3 100644
--- a/src/3rdparty/protocol/wayland/wayland.xml
+++ b/src/3rdparty/protocol/wayland/wayland.xml
@@ -46,7 +46,7 @@
compositor after the callback is fired and as such the client must not
attempt to use it after that point.
- The callback_data passed in the callback is the event serial.
+ The callback_data passed in the callback is undefined and should be ignored.
</description>
<arg name="callback" type="new_id" interface="wl_callback"
summary="callback object for the sync request"/>
@@ -212,7 +212,7 @@
</request>
</interface>
- <interface name="wl_shm_pool" version="1">
+ <interface name="wl_shm_pool" version="2">
<description summary="a shared memory pool">
The wl_shm_pool object encapsulates a piece of memory shared
between the compositor and client. Through the wl_shm_pool
@@ -262,17 +262,17 @@
created, but using the new size. This request can only be
used to make the pool bigger.
- This request only changes the amount of bytes that are mmapped
- by the server and does not touch the file corresponding to the
- file descriptor passed at creation time. It is the client's
- responsibility to ensure that the file is at least as big as
- the new pool size.
+ This request only changes the amount of bytes that are mmapped
+ by the server and does not touch the file corresponding to the
+ file descriptor passed at creation time. It is the client's
+ responsibility to ensure that the file is at least as big as
+ the new pool size.
</description>
<arg name="size" type="int" summary="new size of the pool, in bytes"/>
</request>
</interface>
- <interface name="wl_shm" version="1">
+ <interface name="wl_shm" version="2">
<description summary="shared memory support">
A singleton global object that provides support for shared
memory.
@@ -419,6 +419,21 @@
<entry name="xbgr16161616" value="0x38344258" summary="[63:0] x:B:G:R 16:16:16:16 little endian"/>
<entry name="argb16161616" value="0x38345241" summary="[63:0] A:R:G:B 16:16:16:16 little endian"/>
<entry name="abgr16161616" value="0x38344241" summary="[63:0] A:B:G:R 16:16:16:16 little endian"/>
+ <entry name="c1" value="0x20203143" summary="[7:0] C0:C1:C2:C3:C4:C5:C6:C7 1:1:1:1:1:1:1:1 eight pixels/byte"/>
+ <entry name="c2" value="0x20203243" summary="[7:0] C0:C1:C2:C3 2:2:2:2 four pixels/byte"/>
+ <entry name="c4" value="0x20203443" summary="[7:0] C0:C1 4:4 two pixels/byte"/>
+ <entry name="d1" value="0x20203144" summary="[7:0] D0:D1:D2:D3:D4:D5:D6:D7 1:1:1:1:1:1:1:1 eight pixels/byte"/>
+ <entry name="d2" value="0x20203244" summary="[7:0] D0:D1:D2:D3 2:2:2:2 four pixels/byte"/>
+ <entry name="d4" value="0x20203444" summary="[7:0] D0:D1 4:4 two pixels/byte"/>
+ <entry name="d8" value="0x20203844" summary="[7:0] D"/>
+ <entry name="r1" value="0x20203152" summary="[7:0] R0:R1:R2:R3:R4:R5:R6:R7 1:1:1:1:1:1:1:1 eight pixels/byte"/>
+ <entry name="r2" value="0x20203252" summary="[7:0] R0:R1:R2:R3 2:2:2:2 four pixels/byte"/>
+ <entry name="r4" value="0x20203452" summary="[7:0] R0:R1 4:4 two pixels/byte"/>
+ <entry name="r10" value="0x20303152" summary="[15:0] x:R 6:10 little endian"/>
+ <entry name="r12" value="0x20323152" summary="[15:0] x:R 4:12 little endian"/>
+ <entry name="avuy8888" value="0x59555641" summary="[31:0] A:Cr:Cb:Y 8:8:8:8 little endian"/>
+ <entry name="xvuy8888" value="0x59555658" summary="[31:0] X:Cr:Cb:Y 8:8:8:8 little endian"/>
+ <entry name="p030" value="0x30333050" summary="2x2 subsampled Cr:Cb plane 10 bits per channel packed"/>
</enum>
<request name="create_pool">
@@ -442,6 +457,17 @@
</description>
<arg name="format" type="uint" enum="format" summary="buffer pixel format"/>
</event>
+
+ <!-- Version 2 additions -->
+
+ <request name="release" type="destructor" since="2">
+ <description summary="release the shm object">
+ Using this request a client can tell the server that it is not going to
+ use the shm object anymore.
+
+ Objects created via this interface remain unaffected.
+ </description>
+ </request>
</interface>
<interface name="wl_buffer" version="1">
@@ -453,9 +479,11 @@
client provides and updates the contents is defined by the buffer factory
interface.
- If the buffer uses a format that has an alpha channel, the alpha channel
- is assumed to be premultiplied in the color channels unless otherwise
- specified.
+ Color channels are assumed to be electrical rather than optical (in other
+ words, encoded with a transfer function) unless otherwise specified. If
+ the buffer uses a format that has an alpha channel, the alpha channel is
+ assumed to be premultiplied into the electrical color channel values
+ (after transfer function encoding) unless otherwise specified.
Note, because wl_buffer objects are created from multiple independent
factory interfaces, the wl_buffer interface is frozen at version 1.
@@ -847,6 +875,7 @@
<enum name="error">
<entry name="role" value="0" summary="given wl_surface has another role"/>
+ <entry name="used_source" value="1" summary="source has already been used"/>
</enum>
<request name="start_drag">
@@ -868,7 +897,7 @@
The icon surface is an optional (can be NULL) surface that
provides an icon to be moved around with the cursor. Initially,
the top-left corner of the icon surface is placed at the cursor
- hotspot, but subsequent wl_surface.attach request can move the
+ hotspot, but subsequent wl_surface.offset requests can move the
relative position. Attach requests must be confirmed with
wl_surface.commit as usual. The icon surface is given the role of
a drag-and-drop icon. If the icon surface already has another role,
@@ -876,6 +905,10 @@
The input region is ignored for wl_surfaces with the role of a
drag-and-drop icon.
+
+ The given source may not be used in any further set_selection or
+ start_drag requests. Attempting to reuse a previously-used source
+ may send a used_source error.
</description>
<arg name="source" type="object" interface="wl_data_source" allow-null="true" summary="data source for the eventual transfer"/>
<arg name="origin" type="object" interface="wl_surface" summary="surface where the drag originates"/>
@@ -889,6 +922,10 @@
to the data from the source on behalf of the client.
To unset the selection, set the source to NULL.
+
+ The given source may not be used in any further set_selection or
+ start_drag requests. Attempting to reuse a previously-used source
+ may send a used_source error.
</description>
<arg name="source" type="object" interface="wl_data_source" allow-null="true" summary="data source for the selection"/>
<arg name="serial" type="uint" summary="serial number of the event that triggered this request"/>
@@ -1411,7 +1448,7 @@
<entry name="invalid_size" value="2" summary="buffer size is invalid"/>
<entry name="invalid_offset" value="3" summary="buffer offset is invalid"/>
<entry name="defunct_role_object" value="4"
- summary="surface was destroyed before its role object"/>
+ summary="surface was destroyed before its role object"/>
</enum>
<request name="destroy" type="destructor">
@@ -1440,9 +1477,9 @@
When the bound wl_surface version is 5 or higher, passing any
non-zero x or y is a protocol violation, and will result in an
- 'invalid_offset' error being raised. The x and y arguments are ignored
- and do not change the pending state. To achieve equivalent semantics,
- use wl_surface.offset.
+ 'invalid_offset' error being raised. The x and y arguments are ignored
+ and do not change the pending state. To achieve equivalent semantics,
+ use wl_surface.offset.
Surface contents are double-buffered state, see wl_surface.commit.
@@ -1479,6 +1516,13 @@
If wl_surface.attach is sent with a NULL wl_buffer, the
following wl_surface.commit will remove the surface content.
+
+ If a pending wl_buffer has been destroyed, the result is not specified.
+ Many compositors are known to remove the surface content on the following
+ wl_surface.commit, but this behaviour is not universal. Clients seeking to
+ maximise compatibility should not destroy pending buffers and should
+ ensure that they explicitly remove content from surfaces, even after
+ destroying buffers.
</description>
<arg name="buffer" type="object" interface="wl_buffer" allow-null="true"
summary="buffer of surface contents"/>
@@ -1618,16 +1662,18 @@
<description summary="commit pending surface state">
Surface state (input, opaque, and damage regions, attached buffers,
etc.) is double-buffered. Protocol requests modify the pending state,
- as opposed to the current state in use by the compositor. A commit
- request atomically applies all pending state, replacing the current
- state. After commit, the new pending state is as documented for each
- related request.
+ as opposed to the active state in use by the compositor.
- On commit, a pending wl_buffer is applied first, and all other state
- second. This means that all coordinates in double-buffered state are
- relative to the new wl_buffer coming into use, except for
- wl_surface.attach itself. If there is no pending wl_buffer, the
- coordinates are relative to the current surface contents.
+ A commit request atomically creates a content update from the pending
+ state, even if the pending state has not been touched. The content
+ update is placed in a queue until it becomes active. After commit, the
+ new pending state is as documented for each related request.
+
+ When the content update is applied, the wl_buffer is applied before all
+ other state. This means that all coordinates in double-buffered state
+ are relative to the newly attached wl_buffers, except for
+ wl_surface.attach itself. If there is no newly attached wl_buffer, the
+ coordinates are relative to the previous content update.
All requests that need a commit to become effective are documented
to affect double-buffered state.
@@ -1666,10 +1712,12 @@
<request name="set_buffer_transform" since="2">
<description summary="sets the buffer transformation">
- This request sets an optional transformation on how the compositor
- interprets the contents of the buffer attached to the surface. The
- accepted values for the transform parameter are the values for
- wl_output.transform.
+ This request sets the transformation that the client has already applied
+ to the content of the buffer. The accepted values for the transform
+ parameter are the values for wl_output.transform.
+
+ The compositor applies the inverse of this transformation whenever it
+ uses the buffer contents.
Buffer transform is double-buffered state, see wl_surface.commit.
@@ -1725,11 +1773,11 @@
a buffer that is larger (by a factor of scale in each dimension)
than the desired surface size.
- If scale is not positive the invalid_scale protocol error is
+ If scale is not greater than 0 the invalid_scale protocol error is
raised.
</description>
<arg name="scale" type="int"
- summary="positive scale for interpreting buffer contents"/>
+ summary="scale for interpreting buffer contents"/>
</request>
<!-- Version 4 additions -->
@@ -1802,10 +1850,15 @@
This event indicates the preferred buffer scale for this surface. It is
sent whenever the compositor's preference changes.
+ Before receiving this event the preferred buffer scale for this surface
+ is 1.
+
It is intended that scaling aware clients use this event to scale their
content and use wl_surface.set_buffer_scale to indicate the scale they
have rendered with. This allows clients to supply a higher detail
buffer.
+
+ The compositor shall emit a scale value greater than 0.
</description>
<arg name="factor" type="int" summary="preferred scaling factor"/>
</event>
@@ -1815,9 +1868,12 @@
This event indicates the preferred buffer transform for this surface.
It is sent whenever the compositor's preference changes.
- It is intended that transform aware clients use this event to apply the
- transform to their content and use wl_surface.set_buffer_transform to
- indicate the transform they have rendered with.
+ Before receiving this event the preferred buffer transform for this
+ surface is normal.
+
+ Applying this transformation to the surface buffer contents and using
+ wl_surface.set_buffer_transform might allow the compositor to use the
+ surface buffer more efficiently.
</description>
<arg name="transform" type="uint" enum="wl_output.transform"
summary="preferred transform"/>
@@ -1992,9 +2048,9 @@
where (x, y) are the coordinates of the pointer location, in
surface-local coordinates.
- On surface.attach requests to the pointer surface, hotspot_x
+ On wl_surface.offset requests to the pointer surface, hotspot_x
and hotspot_y are decremented by the x and y parameters
- passed to the request. Attach must be confirmed by
+ passed to the request. The offset must be applied by
wl_surface.commit as usual.
The hotspot can also be updated by passing the currently set
@@ -2248,7 +2304,7 @@
<arg name="axis" type="uint" enum="axis" summary="the axis stopped with this event"/>
</event>
- <event name="axis_discrete" since="5">
+ <event name="axis_discrete" since="5" deprecated-since="8">
<description summary="axis click event">
Discrete step information for scroll and other axes.
@@ -2374,6 +2430,16 @@
<description summary="keyboard input device">
The wl_keyboard interface represents one or more keyboards
associated with a seat.
+
+ Each wl_keyboard has the following logical state:
+
+ - an active surface (possibly null),
+ - the keys currently logically down,
+ - the active modifiers,
+ - the active group.
+
+ By default, the active surface is null, the keys currently logically down
+ are empty, the active modifiers and the active group are 0.
</description>
<enum name="keymap_format">
@@ -2408,10 +2474,15 @@
The compositor must send the wl_keyboard.modifiers event after this
event.
+
+ In the wl_keyboard logical state, this event sets the active surface to
+ the surface argument and the keys currently logically down to the keys
+ in the keys argument. The compositor must not send this event if the
+ wl_keyboard already had an active surface immediately before this event.
</description>
<arg name="serial" type="uint" summary="serial number of the enter event"/>
<arg name="surface" type="object" interface="wl_surface" summary="surface gaining keyboard focus"/>
- <arg name="keys" type="array" summary="the currently pressed keys"/>
+ <arg name="keys" type="array" summary="the keys currently logically down"/>
</event>
<event name="leave">
@@ -2422,8 +2493,10 @@
The leave notification is sent before the enter notification
for the new focus.
- After this event client must assume that all keys, including modifiers,
- are lifted and also it must stop key repeating if there's some going on.
+ In the wl_keyboard logical state, this event resets all values to their
+ defaults. The compositor must not send this event if the active surface
+ of the wl_keyboard was not equal to the surface argument immediately
+ before this event.
</description>
<arg name="serial" type="uint" summary="serial number of the leave event"/>
<arg name="surface" type="object" interface="wl_surface" summary="surface that lost keyboard focus"/>
@@ -2448,6 +2521,15 @@
If this event produces a change in modifiers, then the resulting
wl_keyboard.modifiers event must be sent after this event.
+
+ In the wl_keyboard logical state, this event adds the key to the keys
+ currently logically down (if the state argument is pressed) or removes
+ the key from the keys currently logically down (if the state argument is
+ released). The compositor must not send this event if the wl_keyboard
+ did not have an active surface immediately before this event. The
+ compositor must not send this event if state is pressed (resp. released)
+ and the key was already logically down (resp. was not logically down)
+ immediately before this event.
</description>
<arg name="serial" type="uint" summary="serial number of the key event"/>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
@@ -2459,6 +2541,17 @@
<description summary="modifier and group state">
Notifies clients that the modifier and/or group state has
changed, and it should update its local state.
+
+ The compositor may send this event without a surface of the client
+ having keyboard focus, for example to tie modifier information to
+ pointer focus instead. If a modifier event with pressed modifiers is sent
+ without a prior enter event, the client can assume the modifier state is
+ valid until it receives the next wl_keyboard.modifiers event. In order to
+ reset the modifier state again, the compositor can send a
+ wl_keyboard.modifiers event with no pressed modifiers.
+
+ In the wl_keyboard logical state, this event updates the modifiers and
+ group.
</description>
<arg name="serial" type="uint" summary="serial number of the modifiers event"/>
<arg name="mods_depressed" type="uint" summary="depressed modifiers"/>
@@ -2566,6 +2659,8 @@
currently active on this client's surface. The client is
responsible for finalizing the touch points, future touch points on
this surface may reuse the touch point ID.
+
+ No frame event is required after the cancel event.
</description>
</event>
@@ -2665,10 +2760,9 @@
</enum>
<enum name="transform">
- <description summary="transform from framebuffer to output">
- This describes the transform that a compositor will apply to a
- surface to compensate for the rotation or mirroring of an
- output device.
+ <description summary="transformation applied to buffer contents">
+ This describes transformations that clients and compositors apply to
+ buffer contents.
The flipped values correspond to an initial flip around a
vertical axis followed by rotation.
@@ -2700,6 +2794,10 @@
The geometry event will be followed by a done event (starting from
version 2).
+ Clients should use wl_surface.preferred_buffer_transform instead of the
+ transform advertised by this event to find the preferred buffer
+ transform to use for a surface.
+
Note: wl_output only advertises partial information about the output
position and identification. Some compositors, for instance those not
implementing a desktop-style output layout or those exposing virtual
@@ -2722,7 +2820,7 @@
<arg name="model" type="string"
summary="textual description of the model"/>
<arg name="transform" type="int" enum="transform"
- summary="transform that maps framebuffer to output"/>
+ summary="additional transformation applied to buffer contents during presentation"/>
</event>
<enum name="mode" bitfield="true">
@@ -2795,8 +2893,9 @@
This event contains scaling geometry information
that is not in the geometry event. It may be sent after
binding the output object or if the output scale changes
- later. If it is not sent, the client should assume a
- scale of 1.
+ later. The compositor will emit a non-zero, positive
+ value for scale. If it is not sent, the client should
+ assume a scale of 1.
A scale larger than 1 means that the compositor will
automatically scale surface buffers by this amount
@@ -2804,12 +2903,9 @@
displays where applications rendering at the native
resolution would be too small to be legible.
- It is intended that scaling aware clients track the
- current output of a surface, and if it is on a scaled
- output it should use wl_surface.set_buffer_scale with
- the scale of the output. That way the compositor can
- avoid scaling the surface, and the client can supply
- a higher detail image.
+ Clients should use wl_surface.preferred_buffer_scale
+ instead of this event to find the preferred buffer
+ scale to use for a surface.
The scale event will be followed by a done event.
</description>
@@ -3035,6 +3131,11 @@
If the parent wl_surface object is destroyed, the sub-surface is
unmapped.
+
+ A sub-surface never has the keyboard focus of any seat.
+
+ The wl_surface.offset request is ignored: clients must use set_position
+ instead to move the sub-surface.
</description>
<request name="destroy" type="destructor">
@@ -3060,9 +3161,7 @@
surface area. Negative values are allowed.
The scheduled coordinates will take effect whenever the state of the
- parent surface is applied. When this happens depends on whether the
- parent surface is in synchronized mode or not. See
- wl_subsurface.set_sync and wl_subsurface.set_desync for details.
+ parent surface is applied.
If more than one set_position request is invoked by the client before
the commit of the parent surface, the position of a new request always
@@ -3085,9 +3184,7 @@
The z-order is double-buffered. Requests are handled in order and
applied immediately to a pending state. The final pending state is
copied to the active state the next time the state of the parent
- surface is applied. When this happens depends on whether the parent
- surface is in synchronized mode or not. See wl_subsurface.set_sync and
- wl_subsurface.set_desync for details.
+ surface is applied.
A new sub-surface is initially added as the top-most in the stack
of its siblings and parent.

View File

@ -1,86 +0,0 @@
From be646fd42892d6e59a573a0a188c5ae193d2be83 Mon Sep 17 00:00:00 2001
From: David Edmundson <davidedmundson@kde.org>
Date: Fri, 5 Jul 2024 16:13:40 +0100
Subject: [PATCH 2/2] Client: Improve thread safety determining window size on
the render thread
updateSurface is called from both the render and GUI thread. We
therefore need every property referenced to be thread safe.
Rather than guarding each property we cache the buffer size whenever the
window geometry or scale changes and put a mutex round this one
variable.
Change-Id: I4168ced27556e0e4558bbdbd1daa275d7523c33d
Reviewed-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
(cherry picked from commit 83da29c62f8fb918df8d91826d16b5d5ceb2c704)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit f817608c7152487f489d0f3a227c1d0ceb7b0c2c)
---
.../client/wayland-egl/qwaylandeglwindow.cpp | 20 +++++++++++++++----
.../client/wayland-egl/qwaylandeglwindow_p.h | 6 ++++++
2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
index e6258893..d020f4db 100644
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
@@ -50,6 +50,15 @@ QWaylandWindow::WindowType QWaylandEglWindow::windowType() const
void QWaylandEglWindow::ensureSize()
{
+ // this is always called on the main thread
+ QMargins margins = mWindowDecoration ? frameMargins() : QMargins{};
+ QRect rect = geometry();
+ QSize sizeWithMargins = (rect.size() + QSize(margins.left() + margins.right(), margins.top() + margins.bottom())) * scale();
+ {
+ QWriteLocker lock(&m_bufferSizeLock);
+ m_bufferSize = sizeWithMargins;
+ }
+
updateSurface(false);
}
@@ -60,14 +69,17 @@ void QWaylandEglWindow::setGeometry(const QRect &rect)
// we're now getting a resize we don't want to create it again.
// Just resize the wl_egl_window, the EGLSurface will be created
// the next time makeCurrent is called.
- updateSurface(false);
+ ensureSize();
}
void QWaylandEglWindow::updateSurface(bool create)
{
- QMargins margins = mWindowDecoration ? frameMargins() : QMargins{};
- QRect rect = geometry();
- QSize sizeWithMargins = (rect.size() + QSize(margins.left() + margins.right(), margins.top() + margins.bottom())) * scale();
+
+ QSize sizeWithMargins;
+ {
+ QReadLocker lock(&m_bufferSizeLock);
+ sizeWithMargins = m_bufferSize;
+ }
// wl_egl_windows must have both width and height > 0
// mesa's egl returns NULL if we try to create a, invalid wl_egl_window, however not all EGL
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h
index 5b9aa987..048f0b61 100644
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h
@@ -60,7 +60,13 @@ private:
mutable QOpenGLFramebufferObject *m_contentFBO = nullptr;
QSurfaceFormat m_format;
+ // Size used in the last call to wl_egl_window_resize
QSize m_requestedSize;
+
+ // Size of the buffer used by QWaylandWindow
+ // This is always written to from the main thread, potentially read from the rendering thread
+ QReadWriteLock m_bufferSizeLock;
+ QSize m_bufferSize;
};
}
--
2.45.2

View File

@ -1,3 +1,45 @@
-------------------------------------------------------------------
Mon Dec 2 13:02:16 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.8.1:
* https://www.qt.io/blog/qt-6.8.1-released
-------------------------------------------------------------------
Thu Nov 28 16:18:57 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Add patch to fix crash when unplugging a graphics tablet:
* 0001-client-Redo-management-of-tablet-object-proxies.patch
-------------------------------------------------------------------
Fri Nov 8 14:10:37 UTC 2024 - Hillwood Yang <hillwood@opensuse.org>
- Add 0001-fix-crash-issue.patch
fix crash when attach differ shellsurface to the same shellsurfaceitem (boo#1233141)
-------------------------------------------------------------------
Tue Oct 8 09:29:56 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.8.0:
* https://www.qt.io/blog/qt-6.8-released
- Rebase 0001-update-wayland_xml-to-version-1_23_0.patch
-------------------------------------------------------------------
Sat Sep 28 08:23:11 UTC 2024 - Christophe Marin <christophe@krop.fr>
- Update to 6.7.3
* https://www.qt.io/blog/qt-6.7.3-released
- Drop patches, merged upstream:
* 0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch
* 0001-client-Guard-against-windows-being-on-a-null-screen.patch
* 0002-Client-Improve-thread-safety-determining-window-size.patch
-------------------------------------------------------------------
Wed Aug 28 08:36:28 UTC 2024 - Hillwood Yang <hillwood@opensuse.org>
- Add patch to fix 'wl_shm' higher than interface version (2 > 1)
(boo#1229893, QTBUG-126379):
* 0001-update-wayland_xml-to-version-1_23_0.patch
-------------------------------------------------------------------
Tue Jul 16 09:02:13 UTC 2024 - Fabian Vogt <fvogt@suse.com>

View File

@ -16,8 +16,8 @@
#
%define real_version 6.7.2
%define short_version 6.7
%define real_version 6.8.1
%define short_version 6.8
%define tar_name qtwayland-everywhere-src
%define tar_suffix %{nil}
#
@ -30,7 +30,7 @@
%global with_opengl 1
%endif
Name: qt6-wayland%{?pkg_suffix}
Version: 6.7.2
Version: 6.8.1
Release: 0
Summary: Qt 6 Wayland libraries and tools
# The wayland compositor files are GPL-3.0-or-later
@ -39,10 +39,13 @@ URL: https://www.qt.io
Source0: https://download.qt.io/official_releases/qt/%{short_version}/%{real_version}%{tar_suffix}/submodules/%{tar_name}-%{real_version}%{tar_suffix}.tar.xz
Source99: qt6-wayland-rpmlintrc
# PATCH-FIX-UPSTREAM
Patch1: 0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch
Patch2: 0001-client-Guard-against-windows-being-on-a-null-screen.patch
# https://codereview.qt-project.org/c/qt/qtwayland/+/574983
Patch3: 0002-Client-Improve-thread-safety-determining-window-size.patch
Patch0: 0001-update-wayland_xml-to-version-1_23_0.patch
# PATCH-FIX-UPSTREAM
# fix crash when attach differ shellsurface to the same shellsurfaceitem
# https://codereview.qt-project.org/c/qt/qtwayland/+/599732
Patch1: 0001-fix-crash-issue.patch
# PATCH-FIX-UPSTREAM -- Fix crash when unplugging a graphics tablet
Patch2: 0001-client-Redo-management-of-tablet-object-proxies.patch
BuildRequires: pkgconfig
BuildRequires: qt6-core-private-devel
BuildRequires: qt6-gui-private-devel
@ -55,6 +58,7 @@ BuildRequires: cmake(Qt6Gui) = %{real_version}
BuildRequires: cmake(Qt6OpenGL) = %{real_version}
BuildRequires: cmake(Qt6Qml) = %{real_version}
BuildRequires: cmake(Qt6Quick) = %{real_version}
BuildRequires: cmake(Qt6Svg) = %{real_version}
BuildRequires: pkgconfig(egl)
BuildRequires: pkgconfig(wayland-client)
BuildRequires: pkgconfig(wayland-cursor)
@ -235,7 +239,8 @@ This is a meta package, it does not contain any file
EOF
%build
%cmake_qt6
%cmake_qt6 \
-DQT_GENERATE_SBOM:BOOL=FALSE
%{qt6_build}
@ -298,16 +303,52 @@ rm %{buildroot}%{_qt6_cmakedir}/*/*Plugin{Config,Targets}*.cmake
%files -n libQt6WaylandCompositor6
%{_qt6_libdir}/libQt6WaylandCompositor.so.*
%{_qt6_libdir}/libQt6WaylandCompositorIviapplication.so.*
%{_qt6_libdir}/libQt6WaylandCompositorPresentationTime.so.*
%{_qt6_libdir}/libQt6WaylandCompositorWLShell.so.*
%{_qt6_libdir}/libQt6WaylandCompositorXdgShell.so.*
%files -n qt6-waylandcompositor-devel
%{_qt6_cmakedir}/Qt6WaylandCompositor/
%{_qt6_cmakedir}/Qt6WaylandCompositorIviapplication/
%{_qt6_cmakedir}/Qt6WaylandCompositorPresentationTime/
%{_qt6_cmakedir}/Qt6WaylandCompositorWLShell/
%{_qt6_cmakedir}/Qt6WaylandCompositorXdgShell/
%{_qt6_descriptionsdir}/WaylandCompositor.json
%{_qt6_descriptionsdir}/WaylandCompositorIviapplication.json
%{_qt6_descriptionsdir}/WaylandCompositorPresentationTime.json
%{_qt6_descriptionsdir}/WaylandCompositorWLShell.json
%{_qt6_descriptionsdir}/WaylandCompositorXdgShell.json
%{_qt6_includedir}/QtWaylandCompositor/
%{_qt6_includedir}/QtWaylandCompositorIviapplication/
%{_qt6_includedir}/QtWaylandCompositorPresentationTime/
%{_qt6_includedir}/QtWaylandCompositorWLShell/
%{_qt6_includedir}/QtWaylandCompositorXdgShell/
%{_qt6_libdir}/libQt6WaylandCompositor.prl
%{_qt6_libdir}/libQt6WaylandCompositor.so
%{_qt6_libdir}/libQt6WaylandCompositorIviapplication.prl
%{_qt6_libdir}/libQt6WaylandCompositorIviapplication.so
%{_qt6_libdir}/libQt6WaylandCompositorPresentationTime.prl
%{_qt6_libdir}/libQt6WaylandCompositorPresentationTime.so
%{_qt6_libdir}/libQt6WaylandCompositorWLShell.prl
%{_qt6_libdir}/libQt6WaylandCompositorWLShell.so
%{_qt6_libdir}/libQt6WaylandCompositorXdgShell.prl
%{_qt6_libdir}/libQt6WaylandCompositorXdgShell.so
%{_qt6_metatypesdir}/qt6waylandcompositor_*_metatypes.json
%{_qt6_metatypesdir}/qt6waylandcompositoriviapplication_*_metatypes.json
%{_qt6_metatypesdir}/qt6waylandcompositorpresentationtime_*_metatypes.json
%{_qt6_metatypesdir}/qt6waylandcompositorwlshell_*_metatypes.json
%{_qt6_metatypesdir}/qt6waylandcompositorxdgshell_*_metatypes.json
%{_qt6_mkspecsdir}/modules/qt_lib_waylandcompositor.pri
%{_qt6_mkspecsdir}/modules/qt_lib_waylandcompositoriviapplication*.pri
%{_qt6_mkspecsdir}/modules/qt_lib_waylandcompositorpresentationtime*.pri
%{_qt6_mkspecsdir}/modules/qt_lib_waylandcompositorwlshell*.pri
%{_qt6_mkspecsdir}/modules/qt_lib_waylandcompositorxdgshell*.pri
%{_qt6_pkgconfigdir}/Qt6WaylandCompositor.pc
%{_qt6_pkgconfigdir}/Qt6WaylandCompositorIviapplication.pc
%{_qt6_pkgconfigdir}/Qt6WaylandCompositorPresentationTime.pc
%{_qt6_pkgconfigdir}/Qt6WaylandCompositorWLShell.pc
%{_qt6_pkgconfigdir}/Qt6WaylandCompositorXdgShell.pc
%exclude %{_qt6_includedir}/QtWaylandCompositor/%{real_version}
%files -n qt6-waylandcompositor-private-devel

BIN
qtwayland-everywhere-src-6.7.2.tar.xz (Stored with Git LFS)

Binary file not shown.

BIN
qtwayland-everywhere-src-6.8.1.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.