From 2b0d3a2544a0b5bd6299d5ba5c39973f955802652730233de70a0cd1a9f9d5df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Fri, 7 Feb 2025 11:22:06 +0100 Subject: [PATCH] Sync from SUSE:SLFO:Main qt6-wayland revision 55487e7fce03b5909e06809706237120 --- ...at-guessed-popup-parent-has-a-shell-.patch | 37 -- ...ainst-windows-being-on-a-null-screen.patch | 44 -- ...-management-of-tablet-object-proxies.patch | 263 ++++++++++ 0001-fix-crash-issue.patch | 25 + ...update-wayland_xml-to-version-1_23_0.patch | 488 ++++++++++++++++++ ...hread-safety-determining-window-size.patch | 86 --- qt6-wayland.changes | 42 ++ qt6-wayland.spec | 57 +- qtwayland-everywhere-src-6.7.2.tar.xz | 3 - qtwayland-everywhere-src-6.8.1.tar.xz | 3 + 10 files changed, 870 insertions(+), 178 deletions(-) delete mode 100644 0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch delete mode 100644 0001-client-Guard-against-windows-being-on-a-null-screen.patch create mode 100644 0001-client-Redo-management-of-tablet-object-proxies.patch create mode 100644 0001-fix-crash-issue.patch create mode 100644 0001-update-wayland_xml-to-version-1_23_0.patch delete mode 100644 0002-Client-Improve-thread-safety-determining-window-size.patch delete mode 100644 qtwayland-everywhere-src-6.7.2.tar.xz create mode 100644 qtwayland-everywhere-src-6.8.1.tar.xz diff --git a/0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch b/0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch deleted file mode 100644 index 59bf71e..0000000 --- a/0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 92bcb8f6b7a852c7a5d662fc34de561692a7a454 Mon Sep 17 00:00:00 2001 -From: Vlad Zahorodnii -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 -(cherry picked from commit 52c406cec149634680489faeeaf06bb1258cd12f) -Reviewed-by: Qt Cherry-pick Bot -(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 - diff --git a/0001-client-Guard-against-windows-being-on-a-null-screen.patch b/0001-client-Guard-against-windows-being-on-a-null-screen.patch deleted file mode 100644 index 537eab9..0000000 --- a/0001-client-Guard-against-windows-being-on-a-null-screen.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 8811c62a0c31443ee888a67df2e960bc040f3dcc Mon Sep 17 00:00:00 2001 -From: David Edmundson -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 -Reviewed-by: Vlad Zahorodnii -(cherry picked from commit c4f91b479303dda2e49499de249018d7c66c5f99) -Reviewed-by: Qt Cherry-pick Bot -(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 - diff --git a/0001-client-Redo-management-of-tablet-object-proxies.patch b/0001-client-Redo-management-of-tablet-object-proxies.patch new file mode 100644 index 0000000..a711a43 --- /dev/null +++ b/0001-client-Redo-management-of-tablet-object-proxies.patch @@ -0,0 +1,263 @@ +From 24002ac6cbd01dbde4944b63c1f7c87ed2bd72b5 Mon Sep 17 00:00:00 2001 +From: David Redondo +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 +(cherry picked from commit 1f76835d1805d9b1c25c136a19c1101f19cc2259) +Reviewed-by: Qt Cherry-pick Bot +--- + 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 m_tablets; + QList m_tabletsWaitingForDestroy; + QList m_tools; +- QList m_toolsWaitingForDestroy; ++ QList m_toolsWaitingForDestroy; + QList m_pads; +- QList m_padsWaitingForDestroy; ++ QList 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 + diff --git a/0001-fix-crash-issue.patch b/0001-fix-crash-issue.patch new file mode 100644 index 0000000..1e3dee1 --- /dev/null +++ b/0001-fix-crash-issue.patch @@ -0,0 +1,25 @@ +From 6f87a84b8e72c3676ee9cf7190b8ae1f82387353 Mon Sep 17 00:00:00 2001 +From: Heng Liu +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 m_shellSurface = nullptr; + QQuickItem *m_moveItem = nullptr; + bool m_autoCreatePopupItems = true; + bool staysOnTop = false; diff --git a/0001-update-wayland_xml-to-version-1_23_0.patch b/0001-update-wayland_xml-to-version-1_23_0.patch new file mode 100644 index 0000000..8f55ee2 --- /dev/null +++ b/0001-update-wayland_xml-to-version-1_23_0.patch @@ -0,0 +1,488 @@ +From c2f61bc47baacf2e6a44c6c3c4e4cbf0abfa4095 Mon Sep 17 00:00:00 2001 +From: Liang Qi +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 +--- + 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. + + +@@ -212,7 +212,7 @@ + + + +- ++ + + 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. + + + + + +- ++ + + A singleton global object that provides support for shared + memory. +@@ -419,6 +419,21 @@ + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +@@ -442,6 +457,17 @@ + + + ++ ++ ++ ++ ++ ++ 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. ++ ++ + + + +@@ -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 @@ + + + ++ + + + +@@ -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. + + + +@@ -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. + + + +@@ -1411,7 +1448,7 @@ + + + ++ summary="surface was destroyed before its role object"/> + + + +@@ -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. + + +@@ -1618,16 +1662,18 @@ + + 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 @@ + + + +- 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. + + ++ summary="scale for interpreting buffer contents"/> + + + +@@ -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. + + + +@@ -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. + + +@@ -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 @@ + + + +- ++ + + Discrete step information for scroll and other axes. + +@@ -2374,6 +2430,16 @@ + + 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. + + + +@@ -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. + + + +- ++ + + + +@@ -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. + + + +@@ -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. + + + +@@ -2459,6 +2541,17 @@ + + 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. + + + +@@ -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. + + + +@@ -2665,10 +2760,9 @@ + + + +- +- This describes the transform that a compositor will apply to a +- surface to compensate for the rotation or mirroring of an +- output device. ++ ++ 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 @@ + + ++ summary="additional transformation applied to buffer contents during presentation"/> + + + +@@ -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. + +@@ -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. + + + +@@ -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. diff --git a/0002-Client-Improve-thread-safety-determining-window-size.patch b/0002-Client-Improve-thread-safety-determining-window-size.patch deleted file mode 100644 index f20d0ed..0000000 --- a/0002-Client-Improve-thread-safety-determining-window-size.patch +++ /dev/null @@ -1,86 +0,0 @@ -From be646fd42892d6e59a573a0a188c5ae193d2be83 Mon Sep 17 00:00:00 2001 -From: David Edmundson -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 -(cherry picked from commit 83da29c62f8fb918df8d91826d16b5d5ceb2c704) -Reviewed-by: Qt Cherry-pick Bot -(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 - diff --git a/qt6-wayland.changes b/qt6-wayland.changes index d5f1403..5836266 100644 --- a/qt6-wayland.changes +++ b/qt6-wayland.changes @@ -1,3 +1,45 @@ +------------------------------------------------------------------- +Mon Dec 2 13:02:16 UTC 2024 - Christophe Marin + +- 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 + +- 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 + +- 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 + +- 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 + +- 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 + +- 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 diff --git a/qt6-wayland.spec b/qt6-wayland.spec index 45d088d..05b3e29 100644 --- a/qt6-wayland.spec +++ b/qt6-wayland.spec @@ -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 diff --git a/qtwayland-everywhere-src-6.7.2.tar.xz b/qtwayland-everywhere-src-6.7.2.tar.xz deleted file mode 100644 index f884242..0000000 --- a/qtwayland-everywhere-src-6.7.2.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2a057e1dd644bd44abb9990fecc194b2e25c2e0f39e81aa9fee4c1e5e2a8a5b -size 1123220 diff --git a/qtwayland-everywhere-src-6.8.1.tar.xz b/qtwayland-everywhere-src-6.8.1.tar.xz new file mode 100644 index 0000000..cb0c6e3 --- /dev/null +++ b/qtwayland-everywhere-src-6.8.1.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2226fbde4e2ddd12f8bf4b239c8f38fd706a54e789e63467dfddc77129eca203 +size 1134428