diff --git a/.gitignore b/.gitignore index e6aba2c..c020eb2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/qtdeclarative-everywhere-opensource-src-5.15.9.tar.xz +SOURCES/qtdeclarative-everywhere-opensource-src-5.15.15.tar.xz diff --git a/.qt5-qtdeclarative.metadata b/.qt5-qtdeclarative.metadata index 30c804f..4c37a95 100644 --- a/.qt5-qtdeclarative.metadata +++ b/.qt5-qtdeclarative.metadata @@ -1 +1 @@ -c1230f5c709f80d5bf7e61456a7d605983201cde SOURCES/qtdeclarative-everywhere-opensource-src-5.15.9.tar.xz +04598aaa01a546648769e85e2e225047d153e7a8 SOURCES/qtdeclarative-everywhere-opensource-src-5.15.15.tar.xz diff --git a/SOURCES/0001-Remove-unused-QPointer-QQuickPointerMask.patch b/SOURCES/0001-Remove-unused-QPointer-QQuickPointerMask.patch index 301b448..ad6261a 100644 --- a/SOURCES/0001-Remove-unused-QPointer-QQuickPointerMask.patch +++ b/SOURCES/0001-Remove-unused-QPointer-QQuickPointerMask.patch @@ -1,7 +1,7 @@ -From adc1d82fbac1f85791977ff42299e1f84f0f8db4 Mon Sep 17 00:00:00 2001 +From 79f88de24c9215bebc7a6bf9ffc49512cd4c6780 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 17 Jun 2021 16:32:28 +0200 -Subject: [PATCH 01/19] Remove unused QPointer +Subject: [PATCH 01/25] Remove unused QPointer Change-Id: I009fa6bbd8599dc3bb2e810176fe20e70ed50851 Reviewed-by: Shawn Rutledge @@ -31,5 +31,5 @@ index fba383e268..0d63618622 100644 QPointF targetStartPos; QPointF lastPos; -- -2.40.0 +2.46.0 diff --git a/SOURCES/0002-QQmlDelegateModel-Refresh-the-view-when-a-column-is-.patch b/SOURCES/0002-QQmlDelegateModel-Refresh-the-view-when-a-column-is-.patch index 8ab7e15..f494113 100644 --- a/SOURCES/0002-QQmlDelegateModel-Refresh-the-view-when-a-column-is-.patch +++ b/SOURCES/0002-QQmlDelegateModel-Refresh-the-view-when-a-column-is-.patch @@ -1,7 +1,7 @@ -From 3784ed7ea1ffe1f4be126b3425841aba44b369d8 Mon Sep 17 00:00:00 2001 +From 74a95ae00839edf533ac435f2e4b0410fd5f5b20 Mon Sep 17 00:00:00 2001 From: Aleix Pol Date: Thu, 23 Sep 2021 03:43:04 +0200 -Subject: [PATCH 02/19] QQmlDelegateModel: Refresh the view when a column is +Subject: [PATCH 02/25] QQmlDelegateModel: Refresh the view when a column is added at 0 It can happen that a model reports n>0 rows but columns=0 (See @@ -22,7 +22,7 @@ Signed-off-by: Aleix Pol create mode 100644 tests/auto/qml/qqmldelegatemodel/data/redrawUponColumnChange.qml diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp -index 523c0df779..bc6b2447af 100644 +index 3b57edfc5d..5b7e767ae2 100644 --- a/src/qmlmodels/qqmldelegatemodel.cpp +++ b/src/qmlmodels/qqmldelegatemodel.cpp @@ -389,6 +389,12 @@ void QQmlDelegateModelPrivate::connectToAbstractItemModel() @@ -51,7 +51,7 @@ index 523c0df779..bc6b2447af 100644 QObject::disconnect(aim, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector)), q, SLOT(_q_dataChanged(QModelIndex,QModelIndex,QVector))); QObject::disconnect(aim, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), -@@ -1974,6 +1986,38 @@ void QQmlDelegateModel::_q_rowsMoved( +@@ -1979,6 +1991,38 @@ void QQmlDelegateModel::_q_rowsMoved( } } @@ -122,7 +122,7 @@ index 0000000000..206133bb39 + } +} diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp -index 35f1e2c94d..1722447830 100644 +index f0afdb16ca..e128d77c52 100644 --- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp +++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp @@ -27,6 +27,8 @@ @@ -134,16 +134,16 @@ index 35f1e2c94d..1722447830 100644 #include #include #include -@@ -47,6 +49,7 @@ private slots: - void filterOnGroup_removeWhenCompleted(); +@@ -48,6 +50,7 @@ private slots: void qtbug_86017(); void contextAccessedByHandler(); + void deleteRace(); + void redrawUponColumnChange(); }; class AbstractItemModel : public QAbstractItemModel -@@ -186,6 +189,30 @@ void tst_QQmlDelegateModel::contextAccessedByHandler() - QVERIFY(root->property("works").toBool()); +@@ -187,6 +190,30 @@ void tst_QQmlDelegateModel::deleteRace() + QTRY_COMPARE(o->property("count").toInt(), 0); } +void tst_QQmlDelegateModel::redrawUponColumnChange() @@ -174,5 +174,5 @@ index 35f1e2c94d..1722447830 100644 #include "tst_qqmldelegatemodel.moc" -- -2.40.0 +2.46.0 diff --git a/SOURCES/0003-Fix-TapHandler-so-that-it-actually-registers-a-tap.patch b/SOURCES/0003-Fix-TapHandler-so-that-it-actually-registers-a-tap.patch index 95e767d..b98c39e 100644 --- a/SOURCES/0003-Fix-TapHandler-so-that-it-actually-registers-a-tap.patch +++ b/SOURCES/0003-Fix-TapHandler-so-that-it-actually-registers-a-tap.patch @@ -1,7 +1,7 @@ -From 18b10527cc14a42a19b5d088845bfd2e96326bbb Mon Sep 17 00:00:00 2001 +From 8ee61d9b89416b96c6593b04a00cad9dc7586c58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Arve=20S=C3=A6ther?= Date: Thu, 3 Sep 2020 10:51:01 +0200 -Subject: [PATCH 03/19] Fix TapHandler so that it actually registers a tap +Subject: [PATCH 03/25] Fix TapHandler so that it actually registers a tap This bug caused all quick examples that used the shared\LauncherList.qml to be broken. @@ -25,7 +25,7 @@ Reviewed-by: Shawn Rutledge 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/quick/handlers/qquickhandlerpoint.cpp b/src/quick/handlers/qquickhandlerpoint.cpp -index 72efdfd0f4..6aef3545dd 100644 +index 7103206470..02141b9a9e 100644 --- a/src/quick/handlers/qquickhandlerpoint.cpp +++ b/src/quick/handlers/qquickhandlerpoint.cpp @@ -82,7 +82,7 @@ void QQuickHandlerPoint::localize(QQuickItem *item) @@ -47,7 +47,7 @@ index 72efdfd0f4..6aef3545dd 100644 // all points are required to be from the same event, so pressed buttons and modifiers should be the same m_pressedButtons = points.first().pressedButtons(); diff --git a/src/quick/handlers/qquicksinglepointhandler.cpp b/src/quick/handlers/qquicksinglepointhandler.cpp -index b51f53b74f..89081b4e84 100644 +index d785d8c0ca..a508de455d 100644 --- a/src/quick/handlers/qquicksinglepointhandler.cpp +++ b/src/quick/handlers/qquicksinglepointhandler.cpp @@ -75,7 +75,7 @@ bool QQuickSinglePointHandler::wantsPointerEvent(QQuickPointerEvent *event) @@ -69,5 +69,5 @@ index b51f53b74f..89081b4e84 100644 void QQuickSinglePointHandler::handlePointerEventImpl(QQuickPointerEvent *event) -- -2.40.0 +2.46.0 diff --git a/SOURCES/0004-Revert-Fix-TapHandler-so-that-it-actually-registers-.patch b/SOURCES/0004-Revert-Fix-TapHandler-so-that-it-actually-registers-.patch index 376c97b..a051f6e 100644 --- a/SOURCES/0004-Revert-Fix-TapHandler-so-that-it-actually-registers-.patch +++ b/SOURCES/0004-Revert-Fix-TapHandler-so-that-it-actually-registers-.patch @@ -1,7 +1,7 @@ -From 2842ffc4e6bc4f6a7578866fbbe58c8ceb1efb16 Mon Sep 17 00:00:00 2001 +From fc67cb11baa5bb8de3612f9e86056b752ae3fb41 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 16 Nov 2021 22:43:37 +0100 -Subject: [PATCH 04/19] Revert "Fix TapHandler so that it actually registers a +Subject: [PATCH 04/25] Revert "Fix TapHandler so that it actually registers a tap" This reverts commit 36e8ccd434f948e4f11a8f9d59139ec072e41ff5. @@ -13,7 +13,7 @@ It's causing regresions 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/quick/handlers/qquickhandlerpoint.cpp b/src/quick/handlers/qquickhandlerpoint.cpp -index 6aef3545dd..72efdfd0f4 100644 +index 02141b9a9e..7103206470 100644 --- a/src/quick/handlers/qquickhandlerpoint.cpp +++ b/src/quick/handlers/qquickhandlerpoint.cpp @@ -82,7 +82,7 @@ void QQuickHandlerPoint::localize(QQuickItem *item) @@ -35,7 +35,7 @@ index 6aef3545dd..72efdfd0f4 100644 // all points are required to be from the same event, so pressed buttons and modifiers should be the same m_pressedButtons = points.first().pressedButtons(); diff --git a/src/quick/handlers/qquicksinglepointhandler.cpp b/src/quick/handlers/qquicksinglepointhandler.cpp -index 89081b4e84..b51f53b74f 100644 +index a508de455d..d785d8c0ca 100644 --- a/src/quick/handlers/qquicksinglepointhandler.cpp +++ b/src/quick/handlers/qquicksinglepointhandler.cpp @@ -75,7 +75,7 @@ bool QQuickSinglePointHandler::wantsPointerEvent(QQuickPointerEvent *event) @@ -57,5 +57,5 @@ index 89081b4e84..b51f53b74f 100644 void QQuickSinglePointHandler::handlePointerEventImpl(QQuickPointerEvent *event) -- -2.40.0 +2.46.0 diff --git a/SOURCES/0005-Make-sure-QQuickWidget-and-its-offscreen-window-s-sc.patch b/SOURCES/0005-Make-sure-QQuickWidget-and-its-offscreen-window-s-sc.patch index e2f6dee..2504924 100644 --- a/SOURCES/0005-Make-sure-QQuickWidget-and-its-offscreen-window-s-sc.patch +++ b/SOURCES/0005-Make-sure-QQuickWidget-and-its-offscreen-window-s-sc.patch @@ -1,7 +1,7 @@ -From 2d50aedb262fd387775575f684eb9e2485d84134 Mon Sep 17 00:00:00 2001 +From 11d66c236837aa6f570ba2bb5c1cb9100a54b34e Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Sat, 29 Jan 2022 21:59:33 +0200 -Subject: [PATCH 05/19] Make sure QQuickWidget and its offscreen window's +Subject: [PATCH 05/25] Make sure QQuickWidget and its offscreen window's screens are always in sync By default, the offscreen window is placed on the primary screen. @@ -20,7 +20,7 @@ Reviewed-by: Laszlo Agocs 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp -index 39780f8de3..223d91f579 100644 +index cf021d9a7c..c791f209cf 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -106,6 +106,7 @@ void QQuickWidgetPrivate::init(QQmlEngine* e) @@ -42,7 +42,7 @@ index 39780f8de3..223d91f579 100644 QOpenGLContext *shareContext = qt_gl_global_share_context(); if (!shareContext) shareContext = QWidgetPrivate::get(q->window())->shareContext(); -@@ -1520,19 +1519,16 @@ bool QQuickWidget::event(QEvent *e) +@@ -1527,19 +1526,16 @@ bool QQuickWidget::event(QEvent *e) d->handleWindowChange(); break; @@ -70,7 +70,7 @@ index 39780f8de3..223d91f579 100644 if (d->useSoftwareRenderer #if QT_CONFIG(opengl) -@@ -1545,7 +1541,7 @@ bool QQuickWidget::event(QEvent *e) +@@ -1552,7 +1548,7 @@ bool QQuickWidget::event(QEvent *e) d->render(true); } break; @@ -80,5 +80,5 @@ index 39780f8de3..223d91f579 100644 case QEvent::Move: d->updatePosition(); -- -2.40.0 +2.46.0 diff --git a/SOURCES/0007-Don-t-convert-QByteArray-in-startDrag.patch b/SOURCES/0006-Don-t-convert-QByteArray-in-startDrag.patch similarity index 94% rename from SOURCES/0007-Don-t-convert-QByteArray-in-startDrag.patch rename to SOURCES/0006-Don-t-convert-QByteArray-in-startDrag.patch index 007bd7a..80c18ed 100644 --- a/SOURCES/0007-Don-t-convert-QByteArray-in-startDrag.patch +++ b/SOURCES/0006-Don-t-convert-QByteArray-in-startDrag.patch @@ -1,7 +1,7 @@ -From c257eb6a0eeb159c670c9cf6b37d3009ec8879e5 Mon Sep 17 00:00:00 2001 +From c725e5e0b3b171b6b8f6f941332647c3674bd125 Mon Sep 17 00:00:00 2001 From: Fushan Wen Date: Tue, 1 Nov 2022 22:35:24 +0800 -Subject: [PATCH 07/19] Don't convert QByteArray in `startDrag` +Subject: [PATCH 06/25] Don't convert QByteArray in `startDrag` QMimeData::setData expects the provided data to contain the correctly encoded QByteArray, so if the variant contains a QByteArray, then take @@ -56,5 +56,5 @@ index 8321fcfeed..3b50370355 100644 drag->setMimeData(mimeData); if (pixmapLoader.isReady()) { -- -2.40.0 +2.46.0 diff --git a/SOURCES/0006-QQuickItem-Guard-against-cycles-in-nextPrevItemInTab.patch b/SOURCES/0006-QQuickItem-Guard-against-cycles-in-nextPrevItemInTab.patch deleted file mode 100644 index 49e4432..0000000 --- a/SOURCES/0006-QQuickItem-Guard-against-cycles-in-nextPrevItemInTab.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 9a3d7bc6cf8eea575e597ff1af03d87f7fbdc9aa Mon Sep 17 00:00:00 2001 -From: Fabian Kosmale -Date: Wed, 4 May 2022 09:10:54 +0200 -Subject: [PATCH 06/19] QQuickItem: Guard against cycles in - nextPrevItemInTabFocusChain -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -nextPrevItemInTabFocusChain already had a check to prevent running into -cycles, it would however only detect if we reached the original item. If -our cycle instead would loop between reachable items without ever -returning to the initial one, as in the diagram below, then we would -never terminate the loop. - - /-->other item<---next item -initial-item \ ^ - \ | - --->different item - -To prevent this from happening, we keep track of all items we've seen so -far. One last complications arises due to the fact that we do visit the -parent twice under some cicrcumstances, but we already have the skip -variable to indicate that case – we simply skip the duplicate check if -it is set to true. - -Pick-to: 6.2 6.3 -Fixes: QTBUG-87190 -Change-Id: I1449a7ebf8f325f00c296e8a8db4360faf1049e4 -Reviewed-by: Volker Hilsheimer -(cherry picked from commit e74bcf751495d9fe27efd195bc04e2a6ae6732a4) ---- - src/quick/items/qquickitem.cpp | 7 ++++++- - .../data/activeFocusOnTab_infiniteLoop3.qml | 13 +++++++++++++ - tests/auto/quick/qquickitem2/tst_qquickitem.cpp | 12 ++++++++++++ - 3 files changed, 31 insertions(+), 1 deletion(-) - create mode 100644 tests/auto/quick/qquickitem2/data/activeFocusOnTab_infiniteLoop3.qml - -diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp -index 33da9762d3..ec55fb2998 100644 ---- a/src/quick/items/qquickitem.cpp -+++ b/src/quick/items/qquickitem.cpp -@@ -59,6 +59,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -2526,6 +2527,7 @@ QQuickItem* QQuickItemPrivate::nextPrevItemInTabFocusChain(QQuickItem *item, boo - QQuickItem *current = item; - qCDebug(DBG_FOCUS) << "QQuickItemPrivate::nextPrevItemInTabFocusChain: startItem:" << startItem; - qCDebug(DBG_FOCUS) << "QQuickItemPrivate::nextPrevItemInTabFocusChain: firstFromItem:" << firstFromItem; -+ QDuplicateTracker cycleDetector; - do { - qCDebug(DBG_FOCUS) << "QQuickItemPrivate::nextPrevItemInTabFocusChain: current:" << current; - qCDebug(DBG_FOCUS) << "QQuickItemPrivate::nextPrevItemInTabFocusChain: from:" << from; -@@ -2592,7 +2594,10 @@ QQuickItem* QQuickItemPrivate::nextPrevItemInTabFocusChain(QQuickItem *item, boo - // traversed all of the chain (by compare the [current] item with [startItem]) - // Since the [startItem] might be promoted to its parent if it is invisible, - // we still have to check [current] item with original start item -- if ((current == startItem || current == originalStartItem) && from == firstFromItem) { -+ // We might also run into a cycle before we reach firstFromItem again -+ // but note that we have to ignore current if we are meant to skip it -+ if (((current == startItem || current == originalStartItem) && from == firstFromItem) || -+ (!skip && cycleDetector.hasSeen(current))) { - // wrapped around, avoid endless loops - if (item == contentItem) { - qCDebug(DBG_FOCUS) << "QQuickItemPrivate::nextPrevItemInTabFocusChain: looped, return contentItem"; -diff --git a/tests/auto/quick/qquickitem2/data/activeFocusOnTab_infiniteLoop3.qml b/tests/auto/quick/qquickitem2/data/activeFocusOnTab_infiniteLoop3.qml -new file mode 100644 -index 0000000000..889e480f3b ---- /dev/null -+++ b/tests/auto/quick/qquickitem2/data/activeFocusOnTab_infiniteLoop3.qml -@@ -0,0 +1,13 @@ -+import QtQuick 2.6 -+ -+Item { -+ visible: true -+ Item { -+ visible: false -+ Item { -+ objectName: "hiddenChild" -+ activeFocusOnTab: true -+ focus: true -+ } -+ } -+} -diff --git a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp -index c8f251dbe1..c8ef36ee68 100644 ---- a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp -+++ b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp -@@ -67,6 +67,7 @@ private slots: - void activeFocusOnTab10(); - void activeFocusOnTab_infiniteLoop_data(); - void activeFocusOnTab_infiniteLoop(); -+ void activeFocusOnTab_infiniteLoopControls(); - - void nextItemInFocusChain(); - void nextItemInFocusChain2(); -@@ -1057,6 +1058,17 @@ void tst_QQuickItem::activeFocusOnTab_infiniteLoop() - QCOMPARE(item, window->rootObject()); - } - -+ -+void tst_QQuickItem::activeFocusOnTab_infiniteLoopControls() -+{ -+ auto source = testFileUrl("activeFocusOnTab_infiniteLoop3.qml"); -+ QScopedPointerwindow(new QQuickView()); -+ window->setSource(source); -+ window->show(); -+ QVERIFY(window->errors().isEmpty()); -+ QTest::keyClick(window.get(), Qt::Key_Tab); // should not hang -+} -+ - void tst_QQuickItem::nextItemInFocusChain() - { - if (!qt_tab_all_widgets()) --- -2.40.0 - diff --git a/SOURCES/0008-Fix-build-after-95290f66b806a307b8da1f72f8fc2c698019.patch b/SOURCES/0007-Fix-build-after-95290f66b806a307b8da1f72f8fc2c698019.patch similarity index 89% rename from SOURCES/0008-Fix-build-after-95290f66b806a307b8da1f72f8fc2c698019.patch rename to SOURCES/0007-Fix-build-after-95290f66b806a307b8da1f72f8fc2c698019.patch index 947b3c4..823cf71 100644 --- a/SOURCES/0008-Fix-build-after-95290f66b806a307b8da1f72f8fc2c698019.patch +++ b/SOURCES/0007-Fix-build-after-95290f66b806a307b8da1f72f8fc2c698019.patch @@ -1,7 +1,7 @@ -From cbb5f2d37a07b75f9d340fd1e1f34a6d1e078eba Mon Sep 17 00:00:00 2001 +From 134350b5498f0c612f274cd58cf23784d4c5653f Mon Sep 17 00:00:00 2001 From: Hannah von Reth Date: Sat, 5 Nov 2022 18:48:41 +0100 -Subject: [PATCH 08/19] Fix build after +Subject: [PATCH 07/25] Fix build after 95290f66b806a307b8da1f72f8fc2c69801933d0 --- @@ -22,5 +22,5 @@ index 3b50370355..383078b3b9 100644 else mimeData->setData(it.key(), it.value().toString().toUtf8()); -- -2.40.0 +2.46.0 diff --git a/SOURCES/0009-Implement-accessibility-for-QQuickWidget.patch b/SOURCES/0008-Implement-accessibility-for-QQuickWidget.patch similarity index 99% rename from SOURCES/0009-Implement-accessibility-for-QQuickWidget.patch rename to SOURCES/0008-Implement-accessibility-for-QQuickWidget.patch index fc52c8d..2868b1d 100644 --- a/SOURCES/0009-Implement-accessibility-for-QQuickWidget.patch +++ b/SOURCES/0008-Implement-accessibility-for-QQuickWidget.patch @@ -1,7 +1,7 @@ -From 3f7ac5540c8796ec2bb2b595ca6648035a0f8b18 Mon Sep 17 00:00:00 2001 +From a6eb215f97119ff031f1c1b29a046114c867a016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Fri, 7 May 2021 10:07:50 +0200 -Subject: [PATCH 09/19] Implement accessibility for QQuickWidget +Subject: [PATCH 08/25] Implement accessibility for QQuickWidget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -469,7 +469,7 @@ index 0000000000..8c63b09f81 + +#endif diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp -index 223d91f579..9c97b43518 100644 +index c791f209cf..b0117683f7 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -39,6 +39,7 @@ @@ -561,5 +561,5 @@ index 2438e577ae..f46deb54ac 100644 load(qt_module) -- -2.40.0 +2.46.0 diff --git a/SOURCES/0010-Send-ObjectShow-event-for-visible-components-after-i.patch b/SOURCES/0009-Send-ObjectShow-event-for-visible-components-after-i.patch similarity index 85% rename from SOURCES/0010-Send-ObjectShow-event-for-visible-components-after-i.patch rename to SOURCES/0009-Send-ObjectShow-event-for-visible-components-after-i.patch index 1537cb3..1a8e399 100644 --- a/SOURCES/0010-Send-ObjectShow-event-for-visible-components-after-i.patch +++ b/SOURCES/0009-Send-ObjectShow-event-for-visible-components-after-i.patch @@ -1,7 +1,7 @@ -From bdb3af04019b9134d6e815f4fe54317db63d0152 Mon Sep 17 00:00:00 2001 +From 65b82ce6331083b963ec4f1e3f4aa660ec427600 Mon Sep 17 00:00:00 2001 From: Fushan Wen Date: Sat, 5 Nov 2022 01:44:30 +0800 -Subject: [PATCH 10/19] Send ObjectShow event for visible components after +Subject: [PATCH 09/25] Send ObjectShow event for visible components after initialized MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -24,10 +24,10 @@ Reviewed-by: Jan Arve Sæther 1 file changed, 7 insertions(+) diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp -index ec55fb2998..499fb61d1b 100644 +index 540d12c84a..552c3330a2 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp -@@ -5125,6 +5125,13 @@ void QQuickItem::componentComplete() +@@ -5126,6 +5126,13 @@ void QQuickItem::componentComplete() d->addToDirtyList(); QQuickWindowPrivate::get(d->window)->dirtyItem(this); } @@ -42,5 +42,5 @@ index ec55fb2998..499fb61d1b 100644 QQuickStateGroup *QQuickItemPrivate::_states() -- -2.40.0 +2.46.0 diff --git a/SOURCES/0011-QQuickItem-avoid-emitting-signals-during-destruction.patch b/SOURCES/0010-QQuickItem-avoid-emitting-signals-during-destruction.patch similarity index 86% rename from SOURCES/0011-QQuickItem-avoid-emitting-signals-during-destruction.patch rename to SOURCES/0010-QQuickItem-avoid-emitting-signals-during-destruction.patch index 059c4bb..92aa09a 100644 --- a/SOURCES/0011-QQuickItem-avoid-emitting-signals-during-destruction.patch +++ b/SOURCES/0010-QQuickItem-avoid-emitting-signals-during-destruction.patch @@ -1,7 +1,7 @@ -From 19afcf36b92dc36e83b613e4b9ee383f6beb02dc Mon Sep 17 00:00:00 2001 +From 6aeb36a5a37a3ad25f90ad72b14bb97445c1650d Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Wed, 9 Nov 2022 15:34:11 +0100 -Subject: [PATCH 11/19] QQuickItem: avoid emitting signals during destruction +Subject: [PATCH 10/25] QQuickItem: avoid emitting signals during destruction If a QQuickItem is in the QQuickItem destructor, then it is both unsafe and unnecessary to emit property change notifications. Connected code @@ -29,10 +29,10 @@ Reviewed-by: Mitch Curtis 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp -index 499fb61d1b..5ee2a440a3 100644 +index 552c3330a2..867bfc8172 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp -@@ -2327,6 +2327,7 @@ QQuickItem::QQuickItem(QQuickItemPrivate &dd, QQuickItem *parent) +@@ -2328,6 +2328,7 @@ QQuickItem::QQuickItem(QQuickItemPrivate &dd, QQuickItem *parent) QQuickItem::~QQuickItem() { Q_D(QQuickItem); @@ -40,7 +40,7 @@ index 499fb61d1b..5ee2a440a3 100644 if (d->windowRefCount > 1) d->windowRefCount = 1; // Make sure window is set to null in next call to derefWindow(). -@@ -2694,9 +2695,8 @@ void QQuickItem::setParentItem(QQuickItem *parentItem) +@@ -2695,9 +2696,8 @@ void QQuickItem::setParentItem(QQuickItem *parentItem) const bool wasVisible = isVisible(); op->removeChild(this); @@ -51,7 +51,7 @@ index 499fb61d1b..5ee2a440a3 100644 } else if (d->window) { QQuickWindowPrivate::get(d->window)->parentlessItems.remove(this); } -@@ -2773,8 +2773,9 @@ void QQuickItem::setParentItem(QQuickItem *parentItem) +@@ -2774,8 +2774,9 @@ void QQuickItem::setParentItem(QQuickItem *parentItem) d->itemChange(ItemParentHasChanged, d->parentItem); @@ -63,7 +63,7 @@ index 499fb61d1b..5ee2a440a3 100644 emit d->parentItem->visibleChildrenChanged(); } -@@ -2970,7 +2971,8 @@ void QQuickItemPrivate::removeChild(QQuickItem *child) +@@ -2971,7 +2972,8 @@ void QQuickItemPrivate::removeChild(QQuickItem *child) itemChange(QQuickItem::ItemChildRemovedChange, child); @@ -73,7 +73,7 @@ index 499fb61d1b..5ee2a440a3 100644 } void QQuickItemPrivate::refWindow(QQuickWindow *c) -@@ -3199,6 +3201,7 @@ QQuickItemPrivate::QQuickItemPrivate() +@@ -3200,6 +3202,7 @@ QQuickItemPrivate::QQuickItemPrivate() , touchEnabled(false) #endif , hasCursorHandler(false) @@ -81,7 +81,7 @@ index 499fb61d1b..5ee2a440a3 100644 , dirtyAttributes(0) , nextDirtyItem(nullptr) , prevDirtyItem(nullptr) -@@ -6118,9 +6121,11 @@ bool QQuickItemPrivate::setEffectiveVisibleRecur(bool newEffectiveVisible) +@@ -6119,9 +6122,11 @@ bool QQuickItemPrivate::setEffectiveVisibleRecur(bool newEffectiveVisible) QAccessible::updateAccessibility(&ev); } #endif @@ -109,5 +109,5 @@ index 841d91bb40..ade8fb61f2 100644 enum DirtyType { TransformOrigin = 0x00000001, -- -2.40.0 +2.46.0 diff --git a/SOURCES/0012-a11y-track-item-enabled-state.patch b/SOURCES/0011-a11y-track-item-enabled-state.patch similarity index 89% rename from SOURCES/0012-a11y-track-item-enabled-state.patch rename to SOURCES/0011-a11y-track-item-enabled-state.patch index 3778eee..b942572 100644 --- a/SOURCES/0012-a11y-track-item-enabled-state.patch +++ b/SOURCES/0011-a11y-track-item-enabled-state.patch @@ -1,7 +1,7 @@ -From 5ed173f4ba070bca6c9ec3335b84cc322885b01d Mon Sep 17 00:00:00 2001 +From 24dd58166de07a3657486fceaf93d64ea6824467 Mon Sep 17 00:00:00 2001 From: Harald Sitter Date: Mon, 28 Nov 2022 14:59:33 +0100 -Subject: [PATCH 12/19] a11y: track item enabled state +Subject: [PATCH 11/25] a11y: track item enabled state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -33,10 +33,10 @@ index 0692ce634d..a8df58d450 100644 } diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp -index 5ee2a440a3..c370d6e5c3 100644 +index 867bfc8172..708dc5fe5e 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp -@@ -6174,6 +6174,15 @@ void QQuickItemPrivate::setEffectiveEnableRecur(QQuickItem *scope, bool newEffec +@@ -6175,6 +6175,15 @@ void QQuickItemPrivate::setEffectiveEnableRecur(QQuickItem *scope, bool newEffec } itemChange(QQuickItem::ItemEnabledHasChanged, effectiveEnable); @@ -53,5 +53,5 @@ index 5ee2a440a3..c370d6e5c3 100644 } -- -2.40.0 +2.46.0 diff --git a/SOURCES/0013-Make-QaccessibleQuickWidget-private-API.patch b/SOURCES/0012-Make-QaccessibleQuickWidget-private-API.patch similarity index 95% rename from SOURCES/0013-Make-QaccessibleQuickWidget-private-API.patch rename to SOURCES/0012-Make-QaccessibleQuickWidget-private-API.patch index 1b9fa28..ace2eef 100644 --- a/SOURCES/0013-Make-QaccessibleQuickWidget-private-API.patch +++ b/SOURCES/0012-Make-QaccessibleQuickWidget-private-API.patch @@ -1,7 +1,7 @@ -From a8fa6c930597b633367777044f4c0328012f6bd5 Mon Sep 17 00:00:00 2001 +From 57db70756b3b96c6ce600474c7d169ff389d4ef1 Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Tue, 1 Jun 2021 16:40:44 +0200 -Subject: [PATCH 13/19] Make QaccessibleQuickWidget private API +Subject: [PATCH 12/25] Make QaccessibleQuickWidget private API Its base class is private API, so it should be private API, too. @@ -83,5 +83,5 @@ index f46deb54ac..85d156b8a3 100644 SOURCES += \ -- -2.40.0 +2.46.0 diff --git a/SOURCES/0017-QQmlImportDatabase-Make-sure-the-newly-added-import-.patch b/SOURCES/0013-QQmlImportDatabase-Make-sure-the-newly-added-import-.patch similarity index 89% rename from SOURCES/0017-QQmlImportDatabase-Make-sure-the-newly-added-import-.patch rename to SOURCES/0013-QQmlImportDatabase-Make-sure-the-newly-added-import-.patch index 9fa8e0d..0890fdb 100644 --- a/SOURCES/0017-QQmlImportDatabase-Make-sure-the-newly-added-import-.patch +++ b/SOURCES/0013-QQmlImportDatabase-Make-sure-the-newly-added-import-.patch @@ -1,7 +1,7 @@ -From c1e41d061329cc886a56477c8c2fd0e81add7780 Mon Sep 17 00:00:00 2001 +From 3a202762808c2671ec67dd53eb68449ef86f669a Mon Sep 17 00:00:00 2001 From: Jaeyoon Jung Date: Fri, 19 Feb 2021 08:11:57 +0900 -Subject: [PATCH 17/19] QQmlImportDatabase: Make sure the newly added import +Subject: [PATCH 13/25] QQmlImportDatabase: Make sure the newly added import path be first If it already exists in the import list, move it to the first place. @@ -17,10 +17,10 @@ Reviewed-by: Ulf Hermann 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp -index 10c6c41338..39bfcdc999 100644 +index e7263d1850..289f11d006 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp -@@ -2120,9 +2120,12 @@ void QQmlImportDatabase::addImportPath(const QString& path) +@@ -2119,9 +2119,12 @@ void QQmlImportDatabase::addImportPath(const QString& path) cPath.replace(Backslash, Slash); } @@ -53,5 +53,5 @@ index 9c865b3f73..1f788f7a7f 100644 Q_DECLARE_METATYPE(QQmlImports::ImportVersion) -- -2.40.0 +2.46.0 diff --git a/SOURCES/0018-QQuickState-when-handle-QJSValue-properties-correctl.patch b/SOURCES/0014-QQuickState-when-handle-QJSValue-properties-correctl.patch similarity index 96% rename from SOURCES/0018-QQuickState-when-handle-QJSValue-properties-correctl.patch rename to SOURCES/0014-QQuickState-when-handle-QJSValue-properties-correctl.patch index 8c35853..b8bc6b9 100644 --- a/SOURCES/0018-QQuickState-when-handle-QJSValue-properties-correctl.patch +++ b/SOURCES/0014-QQuickState-when-handle-QJSValue-properties-correctl.patch @@ -1,7 +1,7 @@ -From 0e1bed3c3e27d44d86d6f68a8b93b96a4821575c Mon Sep 17 00:00:00 2001 +From 983f65f04c7b0570b8fbed2343a7328f04983b2b Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Wed, 20 Jul 2022 11:44:43 +0200 -Subject: [PATCH 18/19] QQuickState::when: handle QJSValue properties correctly +Subject: [PATCH 14/25] QQuickState::when: handle QJSValue properties correctly If one assigns a binding whose evaluation results in a QJSValue, care must be take to correctly convert it into a bool. Instead of directly @@ -98,5 +98,5 @@ index aa55b42935..26e86672b0 100644 { QQmlEngine engine; -- -2.40.0 +2.46.0 diff --git a/SOURCES/0014-Qml-Don-t-crash-when-as-casting-to-type-with-errors.patch b/SOURCES/0014-Qml-Don-t-crash-when-as-casting-to-type-with-errors.patch deleted file mode 100644 index 58d751c..0000000 --- a/SOURCES/0014-Qml-Don-t-crash-when-as-casting-to-type-with-errors.patch +++ /dev/null @@ -1,113 +0,0 @@ -From 7be5422134167fe6d9fd44ef683f407bbda1bce7 Mon Sep 17 00:00:00 2001 -From: Ulf Hermann -Date: Tue, 30 Nov 2021 14:39:48 +0100 -Subject: [PATCH 14/19] Qml: Don't crash when as-casting to type with errors - -Such types don't have a compilation unit, but we still know their names. - -Pick-to: 6.2 -Fixes: QTBUG-98792 -Change-Id: I2db8dea3a5a02ec1492f7f7a054fd3ad4c6ad69a -Reviewed-by: Fabian Kosmale -Reviewed-by: Mitch Curtis -(cherry picked from commit e0cd201e91ae64b9c03e0128cd17656b00611fbb) ---- - src/qml/qml/qqmltypewrapper.cpp | 6 ++++-- - src/qml/types/qqmlconnections.cpp | 2 +- - tests/auto/qml/qqmllanguage/data/Broken.qml | 5 +++++ - tests/auto/qml/qqmllanguage/data/asBroken.qml | 6 ++++++ - tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 16 ++++++++++++++++ - 5 files changed, 32 insertions(+), 3 deletions(-) - create mode 100644 tests/auto/qml/qqmllanguage/data/Broken.qml - create mode 100644 tests/auto/qml/qqmllanguage/data/asBroken.qml - -diff --git a/src/qml/qml/qqmltypewrapper.cpp b/src/qml/qml/qqmltypewrapper.cpp -index 175de8b936..a6ba4b8cb3 100644 ---- a/src/qml/qml/qqmltypewrapper.cpp -+++ b/src/qml/qml/qqmltypewrapper.cpp -@@ -419,8 +419,10 @@ ReturnedValue QQmlTypeWrapper::virtualInstanceOf(const Object *typeObject, const - return Encode(false); - - QQmlRefPointer td = qenginepriv->typeLoader.getType(typeWrapper->d()->type().sourceUrl()); -- ExecutableCompilationUnit *cu = td->compilationUnit(); -- myQmlType = qenginepriv->metaObjectForType(cu->metaTypeId); -+ if (ExecutableCompilationUnit *cu = td->compilationUnit()) -+ myQmlType = qenginepriv->metaObjectForType(cu->metaTypeId); -+ else -+ return Encode(false); // It seems myQmlType has some errors, so we could not compile it. - } else { - myQmlType = qenginepriv->metaObjectForType(myTypeId); - } -diff --git a/src/qml/types/qqmlconnections.cpp b/src/qml/types/qqmlconnections.cpp -index 29ed62cd39..aba930dfe1 100644 ---- a/src/qml/types/qqmlconnections.cpp -+++ b/src/qml/types/qqmlconnections.cpp -@@ -338,7 +338,7 @@ void QQmlConnections::connectSignalsToMethods() - && propName.at(2).isUpper()) { - qmlWarning(this) << tr("Detected function \"%1\" in Connections element. " - "This is probably intended to be a signal handler but no " -- "signal of the target matches the name.").arg(propName); -+ "signal of the \"%2\" target matches the name.").arg(propName).arg(target->metaObject()->className()); - } - } - } -diff --git a/tests/auto/qml/qqmllanguage/data/Broken.qml b/tests/auto/qml/qqmllanguage/data/Broken.qml -new file mode 100644 -index 0000000000..e24d9112a8 ---- /dev/null -+++ b/tests/auto/qml/qqmllanguage/data/Broken.qml -@@ -0,0 +1,5 @@ -+import QtQml 2.15 -+ -+QtObject { -+ notThere: 5 -+} -diff --git a/tests/auto/qml/qqmllanguage/data/asBroken.qml b/tests/auto/qml/qqmllanguage/data/asBroken.qml -new file mode 100644 -index 0000000000..bd88d14c76 ---- /dev/null -+++ b/tests/auto/qml/qqmllanguage/data/asBroken.qml -@@ -0,0 +1,6 @@ -+import QtQml 2.15 -+ -+QtObject { -+ id: self -+ property var selfAsBroken: self as Broken -+} -diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp -index bffb62c59e..97cc64991f 100644 ---- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp -+++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp -@@ -336,6 +336,7 @@ private slots: - void bareInlineComponent(); - - void hangOnWarning(); -+ void objectAsBroken(); - - void ambiguousContainingType(); - -@@ -5876,6 +5877,21 @@ void tst_qqmllanguage::ambiguousContainingType() - } - } - -+void tst_qqmllanguage::objectAsBroken() -+{ -+ QQmlEngine engine; -+ QQmlComponent c(&engine, testFileUrl("asBroken.qml")); -+ QVERIFY2(c.isReady(), qPrintable(c.errorString())); -+ QScopedPointer o(c.create()); -+ QVERIFY(!o.isNull()); -+ QVariant selfAsBroken = o->property("selfAsBroken"); -+ QVERIFY(selfAsBroken.isValid()); -+ // QCOMPARE(selfAsBroken.metaType(), QMetaType::fromType()); -+ -+ QQmlComponent b(&engine, testFileUrl("Broken.qml")); -+ QVERIFY(b.isError()); -+} -+ - QTEST_MAIN(tst_qqmllanguage) - - #include "tst_qqmllanguage.moc" --- -2.40.0 - diff --git a/SOURCES/0015-Fix-missing-glyphs-when-using-NativeRendering.patch b/SOURCES/0015-Fix-missing-glyphs-when-using-NativeRendering.patch deleted file mode 100644 index e761faa..0000000 --- a/SOURCES/0015-Fix-missing-glyphs-when-using-NativeRendering.patch +++ /dev/null @@ -1,54 +0,0 @@ -From d54b978c0cba2bf75e145c9e1b00d2a9ab495d70 Mon Sep 17 00:00:00 2001 -From: Eskil Abrahamsen Blomfeldt -Date: Mon, 19 Dec 2022 10:05:33 +0100 -Subject: [PATCH 15/19] Fix missing glyphs when using NativeRendering - -When we look up glyphs with subpixel positions in the glyph cache, -we use the calculated subpixel position (from a set of predefined -subpixel positions) as key. In some very rare cases, we could end -up with different subpixel positions when looking up an on-screen -position than when we entered it into the cache, due to numerical -differences when doing the calculation. - -The reason for this was that when entering the glyph into the -cache, we used the 16.6 fixed point representation, whereas when -looking up, we used the unmodified float. In some cases, the -converted fixed point approximation might snap to a different -predefined subpixel position than the floating point equivalent. - -To avoid this, we reuse the converted fixed point positions when -looking up the glyphs in the cache. - -[ChangeLog][Text] Fixed an issue where text using NativeRendering -would sometimes be missing glyphs. - -Pick-to: 5.15 6.2 6.4 6.5 -Fixes: QTBUG-108713 -Change-Id: Iecc264eb3d27e875c24257eaefcfb18a1a5fb5be -Reviewed-by: Qt CI Bot -Reviewed-by: Lars Knoll -(cherry picked from commit 4bad329985b75090c68a70cceee7edadc172d7ab) ---- - src/quick/scenegraph/qsgdefaultglyphnode_p.cpp | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp -index f912da5799..fd128aa06e 100644 ---- a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp -+++ b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp -@@ -839,9 +839,11 @@ void QSGTextMaskMaterial::populate(const QPointF &p, - bool supportsSubPixelPositions = fontD->fontEngine->supportsSubPixelPositions(); - for (int i=0; ifontEngine->subPixelPositionForX(QFixed::fromReal(glyphPosition.x())); -+ subPixelPosition = fontD->fontEngine->subPixelPositionForX(QFixed::fromReal(fixedPointPosition.x.toReal() * glyphCacheScaleX)); - - QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphIndexes.at(i), subPixelPosition); - const QTextureGlyphCache::Coord &c = cache->coords.value(glyph); --- -2.40.0 - diff --git a/SOURCES/0015-Models-Avoid-crashes-when-deleting-cache-items.patch b/SOURCES/0015-Models-Avoid-crashes-when-deleting-cache-items.patch new file mode 100644 index 0000000..474baa6 --- /dev/null +++ b/SOURCES/0015-Models-Avoid-crashes-when-deleting-cache-items.patch @@ -0,0 +1,51 @@ +From 7882c22b04ecd7bc349d3d585b3de860b2c64781 Mon Sep 17 00:00:00 2001 +From: Ulf Hermann +Date: Wed, 29 Mar 2023 16:36:03 +0200 +Subject: [PATCH 15/25] Models: Avoid crashes when deleting cache items + +Pick-to: 6.5 6.2 5.15 +Fixes: QTBUG-91425 +Change-Id: I58cf9ee29922f83fc6621f771b80ed557b31f106 +Reviewed-by: Shawn Rutledge +Reviewed-by: Fabian Kosmale +(cherry picked from commit 0cfdecba54e4f40468c4c9a8a6668cc1bc0eff65) + +* asturmlechner 2023-04-08: Resolve conflict with dev branch commit + c2d490a2385ea6f389340a296acaac0fa198c8b9 (qAsConst to std::as_const) +--- + .../qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp +index e128d77c52..e5daf2d28b 100644 +--- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp ++++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp +@@ -51,6 +51,7 @@ private slots: + void contextAccessedByHandler(); + void deleteRace(); + void redrawUponColumnChange(); ++ void deleteRace(); + }; + + class AbstractItemModel : public QAbstractItemModel +@@ -214,6 +215,17 @@ void tst_QQmlDelegateModel::redrawUponColumnChange() + QCOMPARE(item->property("text").toString(), "Coconut"); + } + ++void tst_QQmlDelegateModel::deleteRace() ++{ ++ QQmlEngine engine; ++ QQmlComponent c(&engine, testFileUrl("deleteRace.qml")); ++ QVERIFY2(c.isReady(), qPrintable(c.errorString())); ++ QScopedPointer o(c.create()); ++ QVERIFY(!o.isNull()); ++ QTRY_COMPARE(o->property("count").toInt(), 2); ++ QTRY_COMPARE(o->property("count").toInt(), 0); ++} ++ + QTEST_MAIN(tst_QQmlDelegateModel) + + #include "tst_qqmldelegatemodel.moc" +-- +2.46.0 + diff --git a/SOURCES/0016-Revert-Fix-missing-glyphs-when-using-NativeRendering.patch b/SOURCES/0016-Revert-Fix-missing-glyphs-when-using-NativeRendering.patch deleted file mode 100644 index 4cf5df5..0000000 --- a/SOURCES/0016-Revert-Fix-missing-glyphs-when-using-NativeRendering.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 70b44dd18b9727e9aae857297265a751700a297e Mon Sep 17 00:00:00 2001 -From: Fushan Wen -Date: Tue, 10 Jan 2023 20:42:04 +0800 -Subject: [PATCH 16/19] Revert "Fix missing glyphs when using NativeRendering" - -This reverts commit da5e53b649f50cd9cdd89dadbba16f05e4070be2. - -It breaks fonts on Wayland when global scale > 100%. ---- - src/quick/scenegraph/qsgdefaultglyphnode_p.cpp | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp -index fd128aa06e..f912da5799 100644 ---- a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp -+++ b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp -@@ -839,11 +839,9 @@ void QSGTextMaskMaterial::populate(const QPointF &p, - bool supportsSubPixelPositions = fontD->fontEngine->supportsSubPixelPositions(); - for (int i=0; ifontEngine->subPixelPositionForX(QFixed::fromReal(fixedPointPosition.x.toReal() * glyphCacheScaleX)); -+ subPixelPosition = fontD->fontEngine->subPixelPositionForX(QFixed::fromReal(glyphPosition.x())); - - QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphIndexes.at(i), subPixelPosition); - const QTextureGlyphCache::Coord &c = cache->coords.value(glyph); --- -2.40.0 - diff --git a/SOURCES/0016-qv4function-Fix-crash-due-to-reference-being-invalid.patch b/SOURCES/0016-qv4function-Fix-crash-due-to-reference-being-invalid.patch new file mode 100644 index 0000000..599a939 --- /dev/null +++ b/SOURCES/0016-qv4function-Fix-crash-due-to-reference-being-invalid.patch @@ -0,0 +1,35 @@ +From e2c7bdca3d1442b9e4e265378ee17b9ac347b4c3 Mon Sep 17 00:00:00 2001 +From: Maximilian Goldstein +Date: Wed, 9 Jun 2021 15:02:45 +0200 +Subject: [PATCH 16/25] qv4function: Fix crash due to reference being + invalidated + +Function::updateInternalClass creates a reference to a QStringList that is appended to before being used. +This is unsafe and can leads to a segfault if the append() causes a reallocation. + +Fixes: QTBUG-94360 +Pick-to: 5.15 6.1 6.2 +Change-Id: Iac49e8d816cf440ca2b70e133c88314eb8df6b91 +Reviewed-by: Fabian Kosmale +Reviewed-by: Andrei Golubev +(cherry picked from commit 7fa28f98824a94396106eadfc028b329985a0cfc) +--- + src/qml/jsruntime/qv4function.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/qml/jsruntime/qv4function.cpp b/src/qml/jsruntime/qv4function.cpp +index cf8a53cf9f..223e64271e 100644 +--- a/src/qml/jsruntime/qv4function.cpp ++++ b/src/qml/jsruntime/qv4function.cpp +@@ -136,7 +136,7 @@ void Function::updateInternalClass(ExecutionEngine *engine, const QList +Date: Tue, 29 Mar 2022 10:44:04 +0200 +Subject: [PATCH 17/25] Quick Animations: Fix crash + +SwipeDelegate causes the running animation job to be deleted when +calling swipe.close in swipe.completed. Employ the RETURN_IF_DELETED +check in more places to avoid crashes. + +Fixes: QTBUG-100560 +Task-number: QTBUG-103223 +Pick-to: 6.3 6.2 5.15 +Change-Id: I276eeaa9aed1bdb36449b322a24641fa02c4d5e4 +Reviewed-by: Ulf Hermann +(cherry picked from commit 0238af0bd48b831d72126f2228d5913eccf67bae) + +* asturmlechner 2023-04-09: Resolve conflict with dev branch commit + 4938984f9a779192264757a06e6ca555fc8f5e91 +--- + .../qcontinuinganimationgroupjob.cpp | 4 +- + .../animations/qparallelanimationgroupjob.cpp | 4 +- + .../swipedelegate/CloseOnCompletedWorks.qml | 74 +++++++++++++++++++ + 3 files changed, 78 insertions(+), 4 deletions(-) + create mode 100644 tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml + +diff --git a/src/qml/animations/qcontinuinganimationgroupjob.cpp b/src/qml/animations/qcontinuinganimationgroupjob.cpp +index 88c0e9e60e..61a9dc36f8 100644 +--- a/src/qml/animations/qcontinuinganimationgroupjob.cpp ++++ b/src/qml/animations/qcontinuinganimationgroupjob.cpp +@@ -82,9 +82,9 @@ void QContinuingAnimationGroupJob::updateState(QAbstractAnimationJob::State newS + return; + } + for (QAbstractAnimationJob *animation = firstChild(); animation; animation = animation->nextSibling()) { +- resetUncontrolledAnimationFinishTime(animation); ++ RETURN_IF_DELETED(resetUncontrolledAnimationFinishTime(animation)); + animation->setDirection(m_direction); +- animation->start(); ++ RETURN_IF_DELETED(animation->start()); + } + break; + } +diff --git a/src/qml/animations/qparallelanimationgroupjob.cpp b/src/qml/animations/qparallelanimationgroupjob.cpp +index 420a934ba2..a828d0e234 100644 +--- a/src/qml/animations/qparallelanimationgroupjob.cpp ++++ b/src/qml/animations/qparallelanimationgroupjob.cpp +@@ -144,10 +144,10 @@ void QParallelAnimationGroupJob::updateState(QAbstractAnimationJob::State newSta + animation->stop(); + m_previousLoop = m_direction == Forward ? 0 : m_loopCount - 1; + } +- resetUncontrolledAnimationFinishTime(animation); ++ RETURN_IF_DELETED(resetUncontrolledAnimationFinishTime(animation)); + animation->setDirection(m_direction); + if (shouldAnimationStart(animation, oldState == Stopped)) +- animation->start(); ++ RETURN_IF_DELETED(animation->start()); + } + break; + } +diff --git a/tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml b/tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml +new file mode 100644 +index 0000000000..38dfde41c3 +--- /dev/null ++++ b/tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml +@@ -0,0 +1,74 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2022 The Qt Company Ltd. ++** Contact: https://www.qt.io/licensing/ ++** ++** This file is part of the test suite of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:BSD$ ++** Commercial License Usage ++** Licensees holding valid commercial Qt licenses may use this file in ++** accordance with the commercial license agreement provided with the ++** Software or, alternatively, in accordance with the terms contained in ++** a written agreement between you and The Qt Company. For licensing terms ++** and conditions see https://www.qt.io/terms-conditions. For further ++** information use the contact form at https://www.qt.io/contact-us. ++** ++** BSD License Usage ++** Alternatively, you may use this file under the terms of the BSD license ++** as follows: ++** ++** "Redistribution and use in source and binary forms, with or without ++** modification, are permitted provided that the following conditions are ++** met: ++** * Redistributions of source code must retain the above copyright ++** notice, this list of conditions and the following disclaimer. ++** * Redistributions in binary form must reproduce the above copyright ++** notice, this list of conditions and the following disclaimer in ++** the documentation and/or other materials provided with the ++** distribution. ++** * Neither the name of The Qt Company Ltd nor the names of its ++** contributors may be used to endorse or promote products derived ++** from this software without specific prior written permission. ++** ++** ++** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++import QtQuick 2 ++import QtQuick.Controls 2 ++ApplicationWindow { ++ visible: true ++ width: 640 ++ height: 480 ++ ++ ListView { ++ anchors.fill: parent ++ model: 2 ++ ++ delegate: SwipeDelegate { ++ text: "Swipe me left (should not crash)" ++ ++ swipe.right: Label { ++ text: "Release (should not crash)" ++ } ++ ++ swipe.onCompleted: { ++ swipe.close() ++ } ++ } ++ } ++} +-- +2.46.0 + diff --git a/SOURCES/0018-Prevent-crash-when-destroying-asynchronous-Loader.patch b/SOURCES/0018-Prevent-crash-when-destroying-asynchronous-Loader.patch new file mode 100644 index 0000000..c80b729 --- /dev/null +++ b/SOURCES/0018-Prevent-crash-when-destroying-asynchronous-Loader.patch @@ -0,0 +1,129 @@ +From d6d08e3bee98f150cc3182dba9b38996b1409a34 Mon Sep 17 00:00:00 2001 +From: Joni Poikelin +Date: Thu, 3 Sep 2020 14:22:26 +0300 +Subject: [PATCH 18/25] Prevent crash when destroying asynchronous Loader + +Fixes: QTBUG-86255 +Pick-to: 5.15 +Change-Id: I30488b64d910a1409a43e2e98ee7ab084aec33d2 +Reviewed-by: Ulf Hermann +(cherry picked from commit 149c1dd07b54ee0c027d94a49d52160dc4f4e2ac) + +* asturmlechner 2023-01-06: Resolve conflict with dev branch commits + d51c007ecc8aa6256cb95cf3992e5ac34a70fa3f and + b2a4a61e8cb0839ba293783ac03c72f35c7b1307 +--- + src/qml/qml/qqmlvmemetaobject.cpp | 2 +- + .../quick/qquickgridview/data/qtbug86255.qml | 55 +++++++++++++++++++ + .../qquickgridview/tst_qquickgridview.cpp | 13 +++++ + 3 files changed, 69 insertions(+), 1 deletion(-) + create mode 100644 tests/auto/quick/qquickgridview/data/qtbug86255.qml + +diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp +index 1e0e4e419f..a0532d1794 100644 +--- a/src/qml/qml/qqmlvmemetaobject.cpp ++++ b/src/qml/qml/qqmlvmemetaobject.cpp +@@ -251,7 +251,7 @@ void QQmlVMEMetaObjectEndpoint::tryConnect() + if (!pd) + return; + +- if (pd->notifyIndex() != -1) ++ if (pd->notifyIndex() != -1 && ctxt->engine) + connect(target, pd->notifyIndex(), ctxt->engine); + } + +diff --git a/tests/auto/quick/qquickgridview/data/qtbug86255.qml b/tests/auto/quick/qquickgridview/data/qtbug86255.qml +new file mode 100644 +index 0000000000..20688b1967 +--- /dev/null ++++ b/tests/auto/quick/qquickgridview/data/qtbug86255.qml +@@ -0,0 +1,55 @@ ++import QtQuick 2.15 ++ ++Item { ++ width: 240 ++ height: 320 ++ ++ GridView { ++ id: grid ++ objectName: "view" ++ anchors.fill: parent ++ cellWidth: 64 ++ cellHeight: 64 ++ model: ListModel { ++ id: listModel ++ ++ Component.onCompleted: reload() ++ ++ function reload() { ++ clear(); ++ for (let i = 0; i < 1000; i++) { ++ let magic = Math.random(); ++ append( { magic } ); ++ } ++ } ++ } ++ clip: true ++ delegate: Item { ++ id: d ++ property string val: magic ++ Loader { ++ property alias value: d.val ++ asynchronous: true ++ sourceComponent: cmp ++ } ++ } ++ } ++ ++ Timer { ++ running: true ++ interval: 1000 ++ onTriggered: listModel.reload() ++ } ++ Timer { ++ running: true ++ interval: 500 ++ onTriggered: grid.flick(0, -4000) ++ } ++ ++ Component { ++ id: cmp ++ Text { ++ text: value ++ } ++ } ++} +diff --git a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp +index 94ec4f44d5..7d0d9fa7a7 100644 +--- a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp ++++ b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp +@@ -213,6 +213,7 @@ private slots: + void QTBUG_45640(); + void QTBUG_49218(); + void QTBUG_48870_fastModelUpdates(); ++ void QTBUG_86255(); + + void keyNavigationEnabled(); + void resizeDynamicCellWidthRtL(); +@@ -6814,6 +6815,18 @@ void tst_QQuickGridView::resizeDynamicCellWidthRtL() + QTRY_COMPARE(gridview->contentX(), 0.f); + } + ++void tst_QQuickGridView::QTBUG_86255() ++{ ++ QScopedPointer window(createView()); ++ window->setSource(testFileUrl("qtbug86255.qml")); ++ window->show(); ++ QVERIFY(QTest::qWaitForWindowExposed(window.data())); ++ QQuickGridView *view = findItem(window->rootObject(), "view"); ++ QVERIFY(view != nullptr); ++ QTRY_COMPARE(view->isFlicking(), true); ++ QTRY_COMPARE(view->isFlicking(), false); ++} ++ + void tst_QQuickGridView::releaseItems() + { + QScopedPointer view(createView()); +-- +2.46.0 + diff --git a/SOURCES/0019-Models-Avoid-crashes-when-deleting-cache-items.patch b/SOURCES/0019-Models-Avoid-crashes-when-deleting-cache-items.patch deleted file mode 100644 index 36c78c4..0000000 --- a/SOURCES/0019-Models-Avoid-crashes-when-deleting-cache-items.patch +++ /dev/null @@ -1,162 +0,0 @@ -From 89bf481b9b14f038c5e16421a7fce6dc6523785f Mon Sep 17 00:00:00 2001 -From: Ulf Hermann -Date: Wed, 29 Mar 2023 16:36:03 +0200 -Subject: [PATCH 19/19] Models: Avoid crashes when deleting cache items - -Pick-to: 6.5 6.2 5.15 -Fixes: QTBUG-91425 -Change-Id: I58cf9ee29922f83fc6621f771b80ed557b31f106 -Reviewed-by: Shawn Rutledge -Reviewed-by: Fabian Kosmale -(cherry picked from commit 0cfdecba54e4f40468c4c9a8a6668cc1bc0eff65) - -* asturmlechner 2023-04-08: Resolve conflict with dev branch commit - c2d490a2385ea6f389340a296acaac0fa198c8b9 (qAsConst to std::as_const) ---- - src/qmlmodels/qqmldelegatemodel.cpp | 23 ++++++--- - .../qml/qqmldelegatemodel/data/deleteRace.qml | 50 +++++++++++++++++++ - .../tst_qqmldelegatemodel.cpp | 12 +++++ - 3 files changed, 78 insertions(+), 7 deletions(-) - create mode 100644 tests/auto/qml/qqmldelegatemodel/data/deleteRace.qml - -diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp -index bc6b2447af..551e0ede95 100644 ---- a/src/qmlmodels/qqmldelegatemodel.cpp -+++ b/src/qmlmodels/qqmldelegatemodel.cpp -@@ -1883,10 +1883,15 @@ void QQmlDelegateModelPrivate::emitChanges() - for (int i = 1; i < m_groupCount; ++i) - QQmlDelegateModelGroupPrivate::get(m_groups[i])->emitModelUpdated(reset); - -- auto cacheCopy = m_cache; // deliberate; emitChanges may alter m_cache -- for (QQmlDelegateModelItem *cacheItem : qAsConst(cacheCopy)) { -- if (cacheItem->attached) -- cacheItem->attached->emitChanges(); -+ // emitChanges may alter m_cache and delete items -+ QVarLengthArray> attachedObjects; -+ attachedObjects.reserve(m_cache.length()); -+ for (const QQmlDelegateModelItem *cacheItem : qAsConst(m_cache)) -+ attachedObjects.append(cacheItem->attached); -+ -+ for (const QPointer &attached : qAsConst(attachedObjects)) { -+ if (attached && attached->m_cacheItem) -+ attached->emitChanges(); - } - } - -@@ -2707,20 +2712,24 @@ void QQmlDelegateModelAttached::emitChanges() - m_previousGroups = m_cacheItem->groups; - - int indexChanges = 0; -- for (int i = 1; i < m_cacheItem->metaType->groupCount; ++i) { -+ const int groupCount = m_cacheItem->metaType->groupCount; -+ for (int i = 1; i < groupCount; ++i) { - if (m_previousIndex[i] != m_currentIndex[i]) { - m_previousIndex[i] = m_currentIndex[i]; - indexChanges |= (1 << i); - } - } - -+ // Don't access m_cacheItem anymore once we've started sending signals. -+ // We don't own it and someone might delete it. -+ - int notifierId = 0; - const QMetaObject *meta = metaObject(); -- for (int i = 1; i < m_cacheItem->metaType->groupCount; ++i, ++notifierId) { -+ for (int i = 1; i < groupCount; ++i, ++notifierId) { - if (groupChanges & (1 << i)) - QMetaObject::activate(this, meta, notifierId, nullptr); - } -- for (int i = 1; i < m_cacheItem->metaType->groupCount; ++i, ++notifierId) { -+ for (int i = 1; i < groupCount; ++i, ++notifierId) { - if (indexChanges & (1 << i)) - QMetaObject::activate(this, meta, notifierId, nullptr); - } -diff --git a/tests/auto/qml/qqmldelegatemodel/data/deleteRace.qml b/tests/auto/qml/qqmldelegatemodel/data/deleteRace.qml -new file mode 100644 -index 0000000000..23874970e7 ---- /dev/null -+++ b/tests/auto/qml/qqmldelegatemodel/data/deleteRace.qml -@@ -0,0 +1,50 @@ -+import QtQuick 2.15 -+import QtQml.Models 2.15 -+ -+Item { -+ DelegateModel { -+ id: delegateModel -+ model: ListModel { -+ id: sourceModel -+ -+ ListElement { title: "foo" } -+ ListElement { title: "bar" } -+ -+ function clear() { -+ if (count > 0) -+ remove(0, count); -+ } -+ } -+ -+ groups: [ -+ DelegateModelGroup { name: "selectedItems" } -+ ] -+ -+ delegate: Text { -+ height: DelegateModel.inSelectedItems ? implicitHeight * 2 : implicitHeight -+ Component.onCompleted: { -+ if (index === 0) -+ DelegateModel.inSelectedItems = true; -+ } -+ } -+ -+ Component.onCompleted: { -+ items.create(0) -+ items.create(1) -+ } -+ } -+ -+ ListView { -+ anchors.fill: parent -+ model: delegateModel -+ } -+ -+ Timer { -+ running: true -+ interval: 10 -+ onTriggered: sourceModel.clear() -+ } -+ -+ property int count: delegateModel.items.count -+} -+ -diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp -index 1722447830..f473cff75f 100644 ---- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp -+++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp -@@ -50,6 +50,7 @@ private slots: - void qtbug_86017(); - void contextAccessedByHandler(); - void redrawUponColumnChange(); -+ void deleteRace(); - }; - - class AbstractItemModel : public QAbstractItemModel -@@ -213,6 +214,17 @@ void tst_QQmlDelegateModel::redrawUponColumnChange() - QCOMPARE(item->property("text").toString(), "Coconut"); - } - -+void tst_QQmlDelegateModel::deleteRace() -+{ -+ QQmlEngine engine; -+ QQmlComponent c(&engine, testFileUrl("deleteRace.qml")); -+ QVERIFY2(c.isReady(), qPrintable(c.errorString())); -+ QScopedPointer o(c.create()); -+ QVERIFY(!o.isNull()); -+ QTRY_COMPARE(o->property("count").toInt(), 2); -+ QTRY_COMPARE(o->property("count").toInt(), 0); -+} -+ - QTEST_MAIN(tst_QQmlDelegateModel) - - #include "tst_qqmldelegatemodel.moc" --- -2.40.0 - diff --git a/SOURCES/0019-QQuickItem-Fix-effective-visibility-for-items-withou.patch b/SOURCES/0019-QQuickItem-Fix-effective-visibility-for-items-withou.patch new file mode 100644 index 0000000..fecead8 --- /dev/null +++ b/SOURCES/0019-QQuickItem-Fix-effective-visibility-for-items-withou.patch @@ -0,0 +1,81 @@ +From 11f5bc3d80c57ad2094ab2e8010955a1a0130feb Mon Sep 17 00:00:00 2001 +From: Volker Hilsheimer +Date: Fri, 18 Nov 2022 14:20:20 +0100 +Subject: [PATCH 19/25] QQuickItem: Fix effective visibility for items without + parent + +Items are visible if they are children of a visible parent, and not +explicitly hidden. The effectiveVisible member stores the state and is +updated when conditions that impact the item visibility changes. + +The old code returned true for items outside a visual hierarchy, which +broke signal emission when items were removed from a parent, e.g. +because the parent got destroyed. With this change, items removed from +a visual hierarchy will emit the visibleChanged signal. + +Note: QQuickItem initializes the effectiveVisible member to true, even +if the item was created without parent item. Visual items are required +to be added to a visual hierarchy via setParentItem. For this reason, +newly created items never emit visibleChanged when they are added to +a parent. + +Adjust the QQuickItem::visible test - it creates an item hierarchy +without window. Such items are never visible, so add a window and +parent the test item hierarchy to the window's content item. + +This fixes the expected failures in the tests. It does introduce an +incompatibility with QGraphicsView and QGraphicsItem, which continue +to return true from QGraphicsItem::isVisible for items that are not +in an item hierarchy. + +[ChangeLog][Qt Quick][QQuickItem] The visible property of Items without +a parent now always returns false, and the visibleChanged signal gets +emitted when the parent item of a visible item becomes null. + +Fixes: QTBUG-108213 +Change-Id: If4b2947cefd1407853f0f29e6c3fdbd49fc9af65 +Reviewed-by: Fabian Kosmale +Reviewed-by: Shawn Rutledge +(cherry picked from commit d1b9a4cacfb966cf0a37983d8f8044f3aedf5de3) + +CCBUG: 467909 +CCBUG: 396359 +--- + src/quick/items/qquickitem.cpp | 6 ++---- + tests/auto/quick/qquickitem/tst_qquickitem.cpp | 2 ++ + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp +index 708dc5fe5e..7236973216 100644 +--- a/src/quick/items/qquickitem.cpp ++++ b/src/quick/items/qquickitem.cpp +@@ -6082,10 +6082,8 @@ void QQuickItem::setEnabled(bool e) + + bool QQuickItemPrivate::calcEffectiveVisible() const + { +- // XXX todo - Should the effective visible of an element with no parent just be the current +- // effective visible? This would prevent pointless re-processing in the case of an element +- // moving to/from a no-parent situation, but it is different from what graphics view does. +- return explicitVisible && (!parentItem || QQuickItemPrivate::get(parentItem)->effectiveVisible); ++ // An item is visible if it is a child of a visible parent, and not explicitly hidden. ++ return explicitVisible && parentItem && QQuickItemPrivate::get(parentItem)->effectiveVisible; + } + + bool QQuickItemPrivate::setEffectiveVisibleRecur(bool newEffectiveVisible) +diff --git a/tests/auto/quick/qquickitem/tst_qquickitem.cpp b/tests/auto/quick/qquickitem/tst_qquickitem.cpp +index 42348d8dd1..34eefd85e6 100644 +--- a/tests/auto/quick/qquickitem/tst_qquickitem.cpp ++++ b/tests/auto/quick/qquickitem/tst_qquickitem.cpp +@@ -989,7 +989,9 @@ void tst_qquickitem::setParentItem() + + void tst_qquickitem::visible() + { ++ QQuickWindow window; + QQuickItem *root = new QQuickItem; ++ root->setParentItem(window.contentItem()); + + QQuickItem *child1 = new QQuickItem; + child1->setParentItem(root); +-- +2.46.0 + diff --git a/SOURCES/0020-Revert-QQuickItem-Fix-effective-visibility-for-items.patch b/SOURCES/0020-Revert-QQuickItem-Fix-effective-visibility-for-items.patch new file mode 100644 index 0000000..36e76f1 --- /dev/null +++ b/SOURCES/0020-Revert-QQuickItem-Fix-effective-visibility-for-items.patch @@ -0,0 +1,51 @@ +From 9c27fd5c02dd4314192d142a9f2120be45748414 Mon Sep 17 00:00:00 2001 +From: Fushan Wen +Date: Fri, 21 Apr 2023 23:38:04 +0800 +Subject: [PATCH 20/25] Revert "QQuickItem: Fix effective visibility for items + without parent" + +This breaks applications that use QQmlPropertyList to store QQuickItem +and don't set a parentItem for them. + +Ref: https://github.com/musescore/MuseScore/issues/17276 + +This reverts commit 45c22a0221937682f4496801a495458a00f76d3a. +--- + src/quick/items/qquickitem.cpp | 6 ++++-- + tests/auto/quick/qquickitem/tst_qquickitem.cpp | 2 -- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp +index 7236973216..708dc5fe5e 100644 +--- a/src/quick/items/qquickitem.cpp ++++ b/src/quick/items/qquickitem.cpp +@@ -6082,8 +6082,10 @@ void QQuickItem::setEnabled(bool e) + + bool QQuickItemPrivate::calcEffectiveVisible() const + { +- // An item is visible if it is a child of a visible parent, and not explicitly hidden. +- return explicitVisible && parentItem && QQuickItemPrivate::get(parentItem)->effectiveVisible; ++ // XXX todo - Should the effective visible of an element with no parent just be the current ++ // effective visible? This would prevent pointless re-processing in the case of an element ++ // moving to/from a no-parent situation, but it is different from what graphics view does. ++ return explicitVisible && (!parentItem || QQuickItemPrivate::get(parentItem)->effectiveVisible); + } + + bool QQuickItemPrivate::setEffectiveVisibleRecur(bool newEffectiveVisible) +diff --git a/tests/auto/quick/qquickitem/tst_qquickitem.cpp b/tests/auto/quick/qquickitem/tst_qquickitem.cpp +index 34eefd85e6..42348d8dd1 100644 +--- a/tests/auto/quick/qquickitem/tst_qquickitem.cpp ++++ b/tests/auto/quick/qquickitem/tst_qquickitem.cpp +@@ -989,9 +989,7 @@ void tst_qquickitem::setParentItem() + + void tst_qquickitem::visible() + { +- QQuickWindow window; + QQuickItem *root = new QQuickItem; +- root->setParentItem(window.contentItem()); + + QQuickItem *child1 = new QQuickItem; + child1->setParentItem(root); +-- +2.46.0 + diff --git a/SOURCES/0021-Accessibility-respect-value-in-attached-Accessible-i.patch b/SOURCES/0021-Accessibility-respect-value-in-attached-Accessible-i.patch new file mode 100644 index 0000000..202724a --- /dev/null +++ b/SOURCES/0021-Accessibility-respect-value-in-attached-Accessible-i.patch @@ -0,0 +1,111 @@ +From 9a1488c33d888e8d22905373599219b1d716aa8a Mon Sep 17 00:00:00 2001 +From: Volker Hilsheimer +Date: Tue, 18 Apr 2023 22:05:36 +0200 +Subject: [PATCH 21/25] Accessibility: respect value in attached Accessible in + controls +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +QQuickItemPrivate::accessibleRole is virtual and called by the framework +to determine the role of an item. The default implementation checks and +respects a possible Accessible attached object. However, subclasses that +override the virtual don't, so the attached properties are ignored, and +the class-specific implementation wins. This makes it impossible to +change the role of e.g. a checkable button. + +To fix that, move the code respecting the attached object into a non- +virtual function that the framework calls instead, and only call the +virtual member if there is no attached object, or if that object is not +initialized with a role. Replace calls to the virtual from the +framework with calls to the non-virtual wrapper. + +Do this for both QQuickItem and for QQuickPopup, and adjust the logic +in QQuickControl types that create an attached object and initialize +it's role when accessibility becomes active. Use the non-overridable +effective role value for that as well. + +Add a test case, and to avoid any new framework calls to the virtual, +make it private. + +Fixes: QTBUG-110114 +Pick-to: 6.5 6.2 +Change-Id: Ia709cecbd181b6d8ee3297a4af60c1e7db9a2c51 +Reviewed-by: Qt CI Bot +Reviewed-by: Jan Arve Sæther +(cherry picked from commit 3c08d08ae2bbd449cc0579a1b3cb499383c7a60c) +--- + src/quick/accessible/qaccessiblequickitem.cpp | 2 +- + src/quick/items/qquickitem.cpp | 17 ++++++++++++----- + src/quick/items/qquickitem_p.h | 3 +++ + 3 files changed, 16 insertions(+), 6 deletions(-) + +diff --git a/src/quick/accessible/qaccessiblequickitem.cpp b/src/quick/accessible/qaccessiblequickitem.cpp +index a8df58d450..99e6eff7c3 100644 +--- a/src/quick/accessible/qaccessiblequickitem.cpp ++++ b/src/quick/accessible/qaccessiblequickitem.cpp +@@ -230,7 +230,7 @@ QAccessible::Role QAccessibleQuickItem::role() const + + QAccessible::Role role = QAccessible::NoRole; + if (item()) +- role = QQuickItemPrivate::get(item())->accessibleRole(); ++ role = QQuickItemPrivate::get(item())->effectiveAccessibleRole(); + if (role == QAccessible::NoRole) { + if (qobject_cast(const_cast(item()))) + role = QAccessible::StaticText; +diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp +index 708dc5fe5e..8b139cb539 100644 +--- a/src/quick/items/qquickitem.cpp ++++ b/src/quick/items/qquickitem.cpp +@@ -2401,7 +2401,7 @@ bool QQuickItemPrivate::canAcceptTabFocus(QQuickItem *item) + return true; + + #if QT_CONFIG(accessibility) +- QAccessible::Role role = QQuickItemPrivate::get(item)->accessibleRole(); ++ QAccessible::Role role = QQuickItemPrivate::get(item)->effectiveAccessibleRole(); + if (role == QAccessible::EditableText || role == QAccessible::Table || role == QAccessible::List) { + return true; + } else if (role == QAccessible::ComboBox || role == QAccessible::SpinBox) { +@@ -9010,13 +9010,20 @@ QQuickItemPrivate::ExtraData::ExtraData() + + + #if QT_CONFIG(accessibility) +-QAccessible::Role QQuickItemPrivate::accessibleRole() const ++QAccessible::Role QQuickItemPrivate::effectiveAccessibleRole() const + { + Q_Q(const QQuickItem); +- QQuickAccessibleAttached *accessibleAttached = qobject_cast(qmlAttachedPropertiesObject(q, false)); +- if (accessibleAttached) +- return accessibleAttached->role(); ++ auto *attached = qmlAttachedPropertiesObject(q, false); ++ auto role = QAccessible::NoRole; ++ if (auto *accessibleAttached = qobject_cast(attached)) ++ role = accessibleAttached->role(); ++ if (role == QAccessible::NoRole) ++ role = accessibleRole(); ++ return role; ++} + ++QAccessible::Role QQuickItemPrivate::accessibleRole() const ++{ + return QAccessible::NoRole; + } + #endif +diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h +index ade8fb61f2..6f329bd119 100644 +--- a/src/quick/items/qquickitem_p.h ++++ b/src/quick/items/qquickitem_p.h +@@ -575,7 +575,10 @@ public: + virtual void implicitHeightChanged(); + + #if QT_CONFIG(accessibility) ++ QAccessible::Role effectiveAccessibleRole() const; ++private: + virtual QAccessible::Role accessibleRole() const; ++public: + #endif + + void setImplicitAntialiasing(bool antialiasing); +-- +2.46.0 + diff --git a/SOURCES/0022-QtQml-Clean-up-QQmlData-ctor.patch b/SOURCES/0022-QtQml-Clean-up-QQmlData-ctor.patch new file mode 100644 index 0000000..f72f06b --- /dev/null +++ b/SOURCES/0022-QtQml-Clean-up-QQmlData-ctor.patch @@ -0,0 +1,111 @@ +From 788c7ea1500dd6e82dd602fc51e5aa6f639bcf5e Mon Sep 17 00:00:00 2001 +From: Ulf Hermann +Date: Mon, 10 Jul 2023 07:43:28 +0200 +Subject: [PATCH 22/25] QtQml: Clean up QQmlData ctor +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Initialize the "dummy" member even though we never use it. Static +analyzers complain about it and we may appreciate it having a defined +value in the future. Also, initialize other members inline where +possible. + +Coverity-Id: 415867 +Change-Id: Ie428eb3294d6363afe9d7ab2d2bed6e52df0b304 +Reviewed-by: Olivier De Cannière +Reviewed-by: Fabian Kosmale +(cherry picked from commit 10985a568db8cfb4140140967f7d247627ec4350) + +* asturmlechner 2023-08-12: Resolve conflicts with dev branch commits + 10985a568db8cfb4140140967f7d247627ec4350 and + e5246cafffb93f69a49c133210390c253fcb71f2 and + d3b3fef5a878d7fd53de6a9f9fff196a273930e3 +--- + src/qml/qml/qqmldata_p.h | 20 ++++++++++---------- + src/qml/qml/qqmlengine.cpp | 7 ++----- + 2 files changed, 12 insertions(+), 15 deletions(-) + +diff --git a/src/qml/qml/qqmldata_p.h b/src/qml/qml/qqmldata_p.h +index ee31cb38d9..bb0adf9dfa 100644 +--- a/src/qml/qml/qqmldata_p.h ++++ b/src/qml/qml/qqmldata_p.h +@@ -187,7 +187,7 @@ public: + private: + void layout(QQmlNotifierEndpoint*); + }; +- NotifyList *notifyList; ++ NotifyList *notifyList = nullptr; + + inline QQmlNotifierEndpoint *notify(int index); + void addNotify(int index, QQmlNotifierEndpoint *); +@@ -201,12 +201,12 @@ public: + QQmlContextData *outerContext = nullptr; + QQmlContextDataRef ownContext; + +- QQmlAbstractBinding *bindings; +- QQmlBoundSignal *signalHandlers; ++ QQmlAbstractBinding *bindings = nullptr; ++ QQmlBoundSignal *signalHandlers = nullptr; + + // Linked list for QQmlContext::contextObjects +- QQmlData *nextContextObject; +- QQmlData**prevContextObject; ++ QQmlData *nextContextObject = nullptr; ++ QQmlData**prevContextObject = nullptr; + + inline bool hasBindingBit(int) const; + inline void setBindingBit(QObject *obj, int); +@@ -216,10 +216,10 @@ public: + inline void setPendingBindingBit(QObject *obj, int); + inline void clearPendingBindingBit(int); + +- quint16 lineNumber; +- quint16 columnNumber; ++ quint16 lineNumber = 0; ++ quint16 columnNumber = 0; + +- quint32 jsEngineId; // id of the engine that created the jsWrapper ++ quint32 jsEngineId = 0; // id of the engine that created the jsWrapper + + struct DeferredData { + DeferredData(); +@@ -240,7 +240,7 @@ public: + + QQmlPropertyCache *propertyCache; + +- QQmlGuardImpl *guards; ++ QQmlGuardImpl *guards = 0; + + static QQmlData *get(const QObject *object, bool create = false) { + QObjectPrivate *priv = QObjectPrivate::get(const_cast(object)); +@@ -289,7 +289,7 @@ public: + + private: + // For attachedProperties +- mutable QQmlDataExtended *extendedData; ++ mutable QQmlDataExtended *extendedData = nullptr; + + Q_NEVER_INLINE static QQmlData *createQQmlData(QObjectPrivate *priv); + Q_NEVER_INLINE static QQmlPropertyCache *createPropertyCache(QJSEngine *engine, QObject *object); +diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp +index 852a673ebd..86a2d2b45a 100644 +--- a/src/qml/qml/qqmlengine.cpp ++++ b/src/qml/qml/qqmlengine.cpp +@@ -725,11 +725,8 @@ void QQmlPrivate::qdeclarativeelement_destructor(QObject *o) + QQmlData::QQmlData() + : ownedByQml1(false), ownMemory(true), indestructible(true), explicitIndestructibleSet(false), + hasTaintedV4Object(false), isQueuedForDeletion(false), rootObjectInCreation(false), +- hasInterceptorMetaObject(false), hasVMEMetaObject(false), parentFrozen(false), +- bindingBitsArraySize(InlineBindingArraySize), notifyList(nullptr), +- bindings(nullptr), signalHandlers(nullptr), nextContextObject(nullptr), prevContextObject(nullptr), +- lineNumber(0), columnNumber(0), jsEngineId(0), +- propertyCache(nullptr), guards(nullptr), extendedData(nullptr) ++ hasInterceptorMetaObject(false), hasVMEMetaObject(false), parentFrozen(false), dummy(0), ++ bindingBitsArraySize(InlineBindingArraySize), propertyCache(nullptr) + { + memset(bindingBitsValue, 0, sizeof(bindingBitsValue)); + init(); +-- +2.46.0 + diff --git a/SOURCES/0023-QML-Make-notify-list-thread-safe.patch b/SOURCES/0023-QML-Make-notify-list-thread-safe.patch new file mode 100644 index 0000000..6068058 --- /dev/null +++ b/SOURCES/0023-QML-Make-notify-list-thread-safe.patch @@ -0,0 +1,277 @@ +From d15877e074b5e7c0e61589168b5eaaced7e55bf4 Mon Sep 17 00:00:00 2001 +From: Ulf Hermann +Date: Tue, 8 Aug 2023 14:54:01 +0200 +Subject: [PATCH 23/25] QML: Make notify list thread safe + +We keep the notifyList itself alive until the QQmlData itself is +deleted. This way any isSignalConnected() called while an +intermediate dtor runs can safely access it. We use atomics to make the +concurrent access to the pointer and the connection mask defined +behavior. However, we never need anything but relaxed semantics when +accessing it. + +Pick-to: 5.15 6.2 6.5 6.6 +Fixes: QTBUG-105090 +Change-Id: I82537be86e5cc33c2a3d76ec639fcbac87eb45ad +Reviewed-by: Fabian Kosmale +Reviewed-by: Qt CI Bot +(cherry picked from commit 691956654c1acab356ce704c58602cc3a99fabc3) + +* asturmlechner 2023-08-12: Resolve conflict with dev branch commit + c249edb83fa67b3e5f711b28923397e66876182d which introduces a behavior + change, so cannot be backported. Applied changes logically as if that + commit never happened. +--- + src/qml/qml/qqmldata_p.h | 66 ++++++++++++++++++----------- + src/qml/qml/qqmlengine.cpp | 85 +++++++++++++++++++++++++------------- + 2 files changed, 99 insertions(+), 52 deletions(-) + +diff --git a/src/qml/qml/qqmldata_p.h b/src/qml/qml/qqmldata_p.h +index bb0adf9dfa..187339169b 100644 +--- a/src/qml/qml/qqmldata_p.h ++++ b/src/qml/qml/qqmldata_p.h +@@ -176,24 +176,24 @@ public: + }; + + struct NotifyList { +- quint64 connectionMask; +- +- quint16 maximumTodoIndex; +- quint16 notifiesSize; +- +- QQmlNotifierEndpoint *todo; +- QQmlNotifierEndpoint**notifies; ++ QAtomicInteger connectionMask; ++ QQmlNotifierEndpoint *todo = nullptr; ++ QQmlNotifierEndpoint**notifies = nullptr; ++ quint16 maximumTodoIndex = 0; ++ quint16 notifiesSize = 0; + void layout(); + private: + void layout(QQmlNotifierEndpoint*); + }; +- NotifyList *notifyList = nullptr; ++ QAtomicPointer notifyList; + +- inline QQmlNotifierEndpoint *notify(int index); ++ inline QQmlNotifierEndpoint *notify(int index) const; + void addNotify(int index, QQmlNotifierEndpoint *); + int endpointCount(int index); + bool signalHasEndpoint(int index) const; +- void disconnectNotifiers(); ++ ++ enum class DeleteNotifyList { Yes, No }; ++ void disconnectNotifiers(DeleteNotifyList doDelete); + + // The context that created the C++ object + QQmlContextData *context = nullptr; +@@ -240,7 +240,7 @@ public: + + QQmlPropertyCache *propertyCache; + +- QQmlGuardImpl *guards = 0; ++ QQmlGuardImpl *guards = nullptr; + + static QQmlData *get(const QObject *object, bool create = false) { + QObjectPrivate *priv = QObjectPrivate::get(const_cast(object)); +@@ -342,23 +342,31 @@ bool QQmlData::wasDeleted(const QObject *object) + return ddata && ddata->isQueuedForDeletion; + } + +-QQmlNotifierEndpoint *QQmlData::notify(int index) ++inline bool isIndexInConnectionMask(quint64 connectionMask, int index) ++{ ++ return connectionMask & (1ULL << quint64(index % 64)); ++} ++ ++QQmlNotifierEndpoint *QQmlData::notify(int index) const + { ++ // Can only happen on "home" thread. We apply relaxed semantics when loading the atomics. ++ + Q_ASSERT(index <= 0xFFFF); + +- if (!notifyList || !(notifyList->connectionMask & (1ULL << quint64(index % 64)))) { ++ NotifyList *list = notifyList.loadRelaxed(); ++ if (!list || !isIndexInConnectionMask(list->connectionMask.loadRelaxed(), index)) + return nullptr; +- } else if (index < notifyList->notifiesSize) { +- return notifyList->notifies[index]; +- } else if (index <= notifyList->maximumTodoIndex) { +- notifyList->layout(); +- } + +- if (index < notifyList->notifiesSize) { +- return notifyList->notifies[index]; +- } else { +- return nullptr; ++ if (index < list->notifiesSize) ++ return list->notifies[index]; ++ ++ if (index <= list->maximumTodoIndex) { ++ list->layout(); ++ if (index < list->notifiesSize) ++ return list->notifies[index]; + } ++ ++ return nullptr; + } + + /* +@@ -367,7 +375,19 @@ QQmlNotifierEndpoint *QQmlData::notify(int index) + */ + inline bool QQmlData::signalHasEndpoint(int index) const + { +- return notifyList && (notifyList->connectionMask & (1ULL << quint64(index % 64))); ++ // This can be called from any thread. ++ // We still use relaxed semantics. If we're on a thread different from the "home" thread ++ // of the QQmlData, two interesting things might happen: ++ // ++ // 1. The list might go away while we hold it. In that case we are dealing with an object whose ++ // QObject dtor is being executed concurrently. This is UB already without the notify lists. ++ // Therefore, we don't need to consider it. ++ // 2. The connectionMask may be amended or zeroed while we are looking at it. In that case ++ // we "misreport" the endpoint. Since ordering of events across threads is inherently ++ // nondeterministic, either result is correct in that case. We can accept it. ++ ++ NotifyList *list = notifyList.loadRelaxed(); ++ return list && isIndexInConnectionMask(list->connectionMask.loadRelaxed(), index); + } + + bool QQmlData::hasBindingBit(int coreIndex) const +diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp +index 86a2d2b45a..d6b2711c2d 100644 +--- a/src/qml/qml/qqmlengine.cpp ++++ b/src/qml/qml/qqmlengine.cpp +@@ -718,7 +718,7 @@ void QQmlPrivate::qdeclarativeelement_destructor(QObject *o) + // Disconnect the notifiers now - during object destruction this would be too late, since + // the disconnect call wouldn't be able to call disconnectNotify(), as it isn't possible to + // get the metaobject anymore. +- d->disconnectNotifiers(); ++ d->disconnectNotifiers(QQmlData::DeleteNotifyList::No); + } + } + +@@ -786,7 +786,10 @@ void QQmlData::signalEmitted(QAbstractDeclarativeData *, QObject *object, int in + // QQmlEngine to emit signals from a different thread. These signals are then automatically + // marshalled back onto the QObject's thread and handled by QML from there. This is tested + // by the qqmlecmascript::threadSignal() autotest. +- if (!ddata->notifyList) ++ ++ // Relaxed semantics here. If we're on a different thread we might schedule a useless event, ++ // but that should be rare. ++ if (!ddata->notifyList.loadRelaxed()) + return; + + auto objectThreadData = QObjectPrivate::get(object)->threadData.loadRelaxed(); +@@ -1832,49 +1835,73 @@ void QQmlData::releaseDeferredData() + + void QQmlData::addNotify(int index, QQmlNotifierEndpoint *endpoint) + { +- if (!notifyList) { +- notifyList = (NotifyList *)malloc(sizeof(NotifyList)); +- notifyList->connectionMask = 0; +- notifyList->maximumTodoIndex = 0; +- notifyList->notifiesSize = 0; +- notifyList->todo = nullptr; +- notifyList->notifies = nullptr; ++ // Can only happen on "home" thread. We apply relaxed semantics when loading the atomics. ++ ++ NotifyList *list = notifyList.loadRelaxed(); ++ ++ if (!list) { ++ list = new NotifyList; ++ // We don't really care when this change takes effect on other threads. The notifyList can ++ // only become non-null once in the life time of a QQmlData. It becomes null again when the ++ // underlying QObject is deleted. At that point any interaction with the QQmlData is UB ++ // anyway. So, for all intents and purposese, the list becomes non-null once and then stays ++ // non-null "forever". We can apply relaxed semantics. ++ notifyList.storeRelaxed(list); + } + + Q_ASSERT(!endpoint->isConnected()); + + index = qMin(index, 0xFFFF - 1); +- notifyList->connectionMask |= (1ULL << quint64(index % 64)); + +- if (index < notifyList->notifiesSize) { ++ // Likewise, we don't really care _when_ the change in the connectionMask is propagated to other ++ // threads. Cross-thread event ordering is inherently nondeterministic. Therefore, when querying ++ // the conenctionMask in the presence of concurrent modification, any result is correct. ++ list->connectionMask.storeRelaxed( ++ list->connectionMask.loadRelaxed() | (1ULL << quint64(index % 64))); + +- endpoint->next = notifyList->notifies[index]; ++ if (index < list->notifiesSize) { ++ endpoint->next = list->notifies[index]; + if (endpoint->next) endpoint->next->prev = &endpoint->next; +- endpoint->prev = ¬ifyList->notifies[index]; +- notifyList->notifies[index] = endpoint; +- ++ endpoint->prev = &list->notifies[index]; ++ list->notifies[index] = endpoint; + } else { +- notifyList->maximumTodoIndex = qMax(int(notifyList->maximumTodoIndex), index); ++ list->maximumTodoIndex = qMax(int(list->maximumTodoIndex), index); + +- endpoint->next = notifyList->todo; ++ endpoint->next = list->todo; + if (endpoint->next) endpoint->next->prev = &endpoint->next; +- endpoint->prev = ¬ifyList->todo; +- notifyList->todo = endpoint; ++ endpoint->prev = &list->todo; ++ list->todo = endpoint; + } + } + +-void QQmlData::disconnectNotifiers() ++void QQmlData::disconnectNotifiers(QQmlData::DeleteNotifyList doDelete) + { +- if (notifyList) { +- while (notifyList->todo) +- notifyList->todo->disconnect(); +- for (int ii = 0; ii < notifyList->notifiesSize; ++ii) { +- while (QQmlNotifierEndpoint *ep = notifyList->notifies[ii]) ++ // Can only happen on "home" thread. We apply relaxed semantics when loading the atomics. ++ if (NotifyList *list = notifyList.loadRelaxed()) { ++ while (QQmlNotifierEndpoint *todo = list->todo) ++ todo->disconnect(); ++ for (int ii = 0; ii < list->notifiesSize; ++ii) { ++ while (QQmlNotifierEndpoint *ep = list->notifies[ii]) + ep->disconnect(); + } +- free(notifyList->notifies); +- free(notifyList); +- notifyList = nullptr; ++ free(list->notifies); ++ ++ if (doDelete == DeleteNotifyList::Yes) { ++ // We can only get here from QQmlData::destroyed(), and that can only come from the ++ // the QObject dtor. If you're still sending signals at that point you have UB already ++ // without any threads. Therefore, it's enough to apply relaxed semantics. ++ notifyList.storeRelaxed(nullptr); ++ delete list; ++ } else { ++ // We can use relaxed semantics here. The worst thing that can happen is that some ++ // signal is falsely reported as connected. Signal connectedness across threads ++ // is not quite deterministic anyway. ++ list->connectionMask.storeRelaxed(0); ++ list->maximumTodoIndex = 0; ++ list->notifiesSize = 0; ++ list->notifies = nullptr; ++ ++ } + } + } + +@@ -1958,7 +1985,7 @@ void QQmlData::destroyed(QObject *object) + guard->objectDestroyed(object); + } + +- disconnectNotifiers(); ++ disconnectNotifiers(DeleteNotifyList::Yes); + + if (extendedData) + delete extendedData; +-- +2.46.0 + diff --git a/SOURCES/0024-QML-Fortify-qmlExecuteDeferred-some-more.patch b/SOURCES/0024-QML-Fortify-qmlExecuteDeferred-some-more.patch new file mode 100644 index 0000000..084e120 --- /dev/null +++ b/SOURCES/0024-QML-Fortify-qmlExecuteDeferred-some-more.patch @@ -0,0 +1,54 @@ +From 83cac09d86872edaa6fd4779597d6ba0bc4d2a8e Mon Sep 17 00:00:00 2001 +From: Ulf Hermann +Date: Wed, 8 Feb 2023 12:14:21 +0100 +Subject: [PATCH 24/25] QML: Fortify qmlExecuteDeferred some more + +I don't know how to trigger this, but a recent crash report from the CI +shows that we can get there without a valid engine. + +Pick-to: 6.5 +Change-Id: I9f17894da82b8e7eab88181c96dfa8eaf7795523 +Reviewed-by: Fabian Kosmale +(cherry picked from commit f69b6f0940b178b46ecbaa5f0b4956ac44e8379e) +--- + src/qml/qml/qqmlengine.cpp | 21 +++++++++++++-------- + 1 file changed, 13 insertions(+), 8 deletions(-) + +diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp +index d6b2711c2d..5f3367e4d2 100644 +--- a/src/qml/qml/qqmlengine.cpp ++++ b/src/qml/qml/qqmlengine.cpp +@@ -1588,17 +1588,22 @@ void qmlExecuteDeferred(QObject *object) + { + QQmlData *data = QQmlData::get(object); + +- if (data && !data->deferredData.isEmpty() && !data->wasDeleted(object)) { +- QQmlEnginePrivate *ep = QQmlEnginePrivate::get(data->context->engine); ++ if (!data ++ || !data->context ++ || !data->context->engine ++ || data->deferredData.isEmpty() ++ || data->wasDeleted(object)) { ++ return; ++ } + +- QQmlComponentPrivate::DeferredState state; +- QQmlComponentPrivate::beginDeferred(ep, object, &state); ++ QQmlEnginePrivate *ep = QQmlEnginePrivate::get(data->context->engine); ++ QQmlComponentPrivate::DeferredState state; ++ QQmlComponentPrivate::beginDeferred(ep, object, &state); + +- // Release the reference for the deferral action (we still have one from construction) +- data->releaseDeferredData(); ++ // Release the reference for the deferral action (we still have one from construction) ++ data->releaseDeferredData(); + +- QQmlComponentPrivate::completeDeferred(ep, &state); +- } ++ QQmlComponentPrivate::completeDeferred(ep, &state); + } + + QQmlContext *qmlContext(const QObject *obj) +-- +2.46.0 + diff --git a/SOURCES/0025-masm-Don-t-crash-on-failed-MADV_DONTNEED-on-Linux.patch b/SOURCES/0025-masm-Don-t-crash-on-failed-MADV_DONTNEED-on-Linux.patch new file mode 100644 index 0000000..b7818ff --- /dev/null +++ b/SOURCES/0025-masm-Don-t-crash-on-failed-MADV_DONTNEED-on-Linux.patch @@ -0,0 +1,52 @@ +From 310c124dac82d711ab15309a9cb0b9d95db9ea8f Mon Sep 17 00:00:00 2001 +From: Antonio Napolitano +Date: Sat, 30 Dec 2023 19:11:32 +0100 +Subject: [PATCH 25/25] masm: Don't crash on failed MADV_DONTNEED on Linux + +The application could call mlockall(MCL_CURRENT|MCL_FUTURE) to lock all +its memory for performance reasons, causing the madvise call to fail. +There's no need to crash. Instead, manually zero-out the memory when +decommitting. + +Fixes: QTBUG-120450 +Pick-to: 5.15 6.2 6.5 6.6 6.7 +Change-Id: I6f1a8968853cc5e61561371bd2a435a686eaf0e4 +Reviewed-by: Fabian Kosmale +Reviewed-by: Ulf Hermann +(cherry picked from commit 524d260c5c135d193e06350e48357444ddb13ddb) +--- + src/3rdparty/masm/wtf/OSAllocatorPosix.cpp | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp b/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp +index b5c5f6a2b0..1a3d3cdf97 100644 +--- a/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp ++++ b/src/3rdparty/masm/wtf/OSAllocatorPosix.cpp +@@ -112,10 +112,7 @@ void* OSAllocator::reserveUncommitted(size_t bytes, Usage usage, bool writable, + if (result == MAP_FAILED) + CRASH(); + +- while (madvise(result, bytes, MADV_DONTNEED)) { +- if (errno != EAGAIN) +- CRASH(); +- } ++ while (madvise(result, bytes, MADV_DONTNEED) == -1 && errno == EAGAIN) { } + + if (fd != -1) + close(fd); +@@ -248,8 +245,10 @@ void OSAllocator::decommit(void* address, size_t bytes) + mmap(address, bytes, PROT_NONE, MAP_FIXED | MAP_LAZY | MAP_PRIVATE | MAP_ANON, -1, 0); + #elif OS(LINUX) + while (madvise(address, bytes, MADV_DONTNEED)) { +- if (errno != EAGAIN) +- CRASH(); ++ if (errno != EAGAIN) { ++ memset(address, 0, bytes); // We rely on madvise to zero-out the memory ++ break; ++ } + } + if (mprotect(address, bytes, PROT_NONE)) + CRASH(); +-- +2.46.0 + diff --git a/SOURCES/qt-QTBUG-111935-fix-V4-jit.patch b/SOURCES/qt-QTBUG-111935-fix-V4-jit.patch deleted file mode 100644 index 96ad2c1..0000000 --- a/SOURCES/qt-QTBUG-111935-fix-V4-jit.patch +++ /dev/null @@ -1,44 +0,0 @@ -From e2bdde18d9758efdc6a0d7d106aad56995df1271 Mon Sep 17 00:00:00 2001 -From: Ulf Hermann -Date: Wed, 15 Mar 2023 08:59:43 +0100 -Subject: [PATCH] JIT: Add missing {STORE|LOAD}_ACC() to CreateCallContext - -We cannot assume anything about the accumulator register after calling -PushCallContext::call(). Also add a note about not needing to re-load -the accumulator on ThrowException. - -Pick-to: 6.5 6.2 5.15 -Fixes: QTBUG-111935 -Change-Id: I7196585e1d2697c215f4fe87d8d7ac9b98b622a3 ---- - src/qml/jit/qv4baselinejit.cpp | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp -index 14e183adb8..1d65169dce 100644 ---- a/src/qml/jit/qv4baselinejit.cpp -+++ b/src/qml/jit/qv4baselinejit.cpp -@@ -506,6 +506,8 @@ void BaselineJIT::generate_ThrowException() - as->passEngineAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(ThrowException, CallResultDestination::Ignore); - as->gotoCatchException(); -+ -+ // LOAD_ACC(); <- not needed here since it would be unreachable. - } - - void BaselineJIT::generate_GetException() { as->getException(); } -@@ -513,9 +515,11 @@ void BaselineJIT::generate_SetException() { as->setException(); } - - void BaselineJIT::generate_CreateCallContext() - { -+ STORE_ACC(); - as->prepareCallWithArgCount(1); - as->passCppFrameAsArg(0); - BASELINEJIT_GENERATE_RUNTIME_CALL(PushCallContext, CallResultDestination::Ignore); -+ LOAD_ACC(); - } - - void BaselineJIT::generate_PushCatchContext(int index, int name) { as->pushCatchContext(index, name); } --- -2.39.2 - diff --git a/SOURCES/qtdeclarative-disable-test-not-running-in-gating.patch b/SOURCES/qtdeclarative-disable-test-not-running-in-gating.patch deleted file mode 100644 index 1e644df..0000000 --- a/SOURCES/qtdeclarative-disable-test-not-running-in-gating.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/tests/auto/qml/qml.pro b/tests/auto/qml/qml.pro -index 621e8bb4..24ea2201 100644 ---- a/tests/auto/qml/qml.pro -+++ b/tests/auto/qml/qml.pro -@@ -25,7 +25,6 @@ PUBLICTESTS += \ - qqmlmoduleplugin \ - qqmlnotifier \ - qqmlqt \ -- qqmlxmlhttprequest \ - qqmlpromise \ - qtqmlmodules \ - qquickfolderlistmodel \ diff --git a/SPECS/qt5-qtdeclarative.spec b/SPECS/qt5-qtdeclarative.spec index f63f6ae..9e3b856 100644 --- a/SPECS/qt5-qtdeclarative.spec +++ b/SPECS/qt5-qtdeclarative.spec @@ -1,3 +1,4 @@ + # Bug: https://bugzilla.redhat.com/show_bug.cgi?id=2061194 %define _lto_cflags %{nil} @@ -6,17 +7,15 @@ # definition borrowed from qtbase %global multilib_archs x86_64 %{ix86} %{?mips} ppc64 ppc s390x s390 sparc64 sparcv9 -%global build_tests 1 - #global bootstrap 1 Summary: Qt5 - QtDeclarative component Name: qt5-%{qt_module} -Version: 5.15.9 -Release: 3%{?dist} +Version: 5.15.15 +Release: 1%{?dist} # See LICENSE.GPL LICENSE.LGPL LGPL_EXCEPTION.txt, for details -License: LGPLv2 with exceptions or GPLv3 with exceptions +License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0 Url: http://www.qt.io %global majmin %(echo %{version} | cut -d. -f1-2) Source0: https://download.qt.io/official_releases/qt/%{majmin}/%{version}/submodules/%{qt_module}-everywhere-opensource-src-%{version}.tar.xz @@ -28,37 +27,37 @@ Source5: qv4global_p-multilib.h ## upstream patches ## repo: https://invent.kde.org/qt/qt/qtdeclarative ## branch: kde/5.15 -## git format-patch v5.15.9-lts-lgpl +## git format-patch v5.15.15-lts-lgpl Patch1: 0001-Remove-unused-QPointer-QQuickPointerMask.patch Patch2: 0002-QQmlDelegateModel-Refresh-the-view-when-a-column-is-.patch Patch3: 0003-Fix-TapHandler-so-that-it-actually-registers-a-tap.patch Patch4: 0004-Revert-Fix-TapHandler-so-that-it-actually-registers-.patch Patch5: 0005-Make-sure-QQuickWidget-and-its-offscreen-window-s-sc.patch -Patch6: 0006-QQuickItem-Guard-against-cycles-in-nextPrevItemInTab.patch -Patch7: 0007-Don-t-convert-QByteArray-in-startDrag.patch -Patch8: 0008-Fix-build-after-95290f66b806a307b8da1f72f8fc2c698019.patch -Patch9: 0009-Implement-accessibility-for-QQuickWidget.patch -Patch10: 0010-Send-ObjectShow-event-for-visible-components-after-i.patch -Patch11: 0011-QQuickItem-avoid-emitting-signals-during-destruction.patch -Patch12: 0012-a11y-track-item-enabled-state.patch -Patch13: 0013-Make-QaccessibleQuickWidget-private-API.patch -Patch14: 0014-Qml-Don-t-crash-when-as-casting-to-type-with-errors.patch -Patch15: 0015-Fix-missing-glyphs-when-using-NativeRendering.patch -Patch16: 0016-Revert-Fix-missing-glyphs-when-using-NativeRendering.patch -Patch17: 0017-QQmlImportDatabase-Make-sure-the-newly-added-import-.patch -Patch18: 0018-QQuickState-when-handle-QJSValue-properties-correctl.patch -Patch19: 0019-Models-Avoid-crashes-when-deleting-cache-items.patch +Patch6: 0006-Don-t-convert-QByteArray-in-startDrag.patch +Patch7: 0007-Fix-build-after-95290f66b806a307b8da1f72f8fc2c698019.patch +Patch8: 0008-Implement-accessibility-for-QQuickWidget.patch +Patch9: 0009-Send-ObjectShow-event-for-visible-components-after-i.patch +Patch10: 0010-QQuickItem-avoid-emitting-signals-during-destruction.patch +Patch11: 0011-a11y-track-item-enabled-state.patch +Patch12: 0012-Make-QaccessibleQuickWidget-private-API.patch +Patch13: 0013-QQmlImportDatabase-Make-sure-the-newly-added-import-.patch +Patch14: 0014-QQuickState-when-handle-QJSValue-properties-correctl.patch +Patch15: 0015-Models-Avoid-crashes-when-deleting-cache-items.patch +Patch16: 0016-qv4function-Fix-crash-due-to-reference-being-invalid.patch +Patch17: 0017-Quick-Animations-Fix-crash.patch +Patch18: 0018-Prevent-crash-when-destroying-asynchronous-Loader.patch +Patch19: 0019-QQuickItem-Fix-effective-visibility-for-items-withou.patch +Patch20: 0020-Revert-QQuickItem-Fix-effective-visibility-for-items.patch +Patch21: 0021-Accessibility-respect-value-in-attached-Accessible-i.patch +Patch22: 0022-QtQml-Clean-up-QQmlData-ctor.patch +Patch23: 0023-QML-Make-notify-list-thread-safe.patch +Patch24: 0024-QML-Fortify-qmlExecuteDeferred-some-more.patch +Patch25: 0025-masm-Don-t-crash-on-failed-MADV_DONTNEED-on-Linux.patch ## upstreamable patches Patch100: %{name}-gcc11.patch # https://pagure.io/fedora-kde/SIG/issue/82 Patch101: qtdeclarative-5.15.0-FixMaxXMaxYExtent.patch -# From: https://codereview.qt-project.org/c/qt/qtdeclarative/+/466808 -# Cf. https://bugzilla.redhat.com/show_bug.cgi?id=2177696 -Patch102: qt-QTBUG-111935-fix-V4-jit.patch - -# gating related patches -Patch200: qtdeclarative-disable-test-not-running-in-gating.patch # filter qml provides %global __provides_exclude_from ^%{_qt5_archdatadir}/qml/.*\\.so$ @@ -79,7 +78,7 @@ Obsoletes: %{name}-examples < %{version}-%{release} %global no_examples CONFIG-=compile_examples %endif -%if 0%{?build_tests} +%if 0%{?tests} BuildRequires: dbus-x11 BuildRequires: mesa-dri-drivers BuildRequires: time @@ -112,15 +111,6 @@ Requires: %{name}%{?_isa} = %{version}-%{release} %{summary}. -%if 0%{?build_tests} -%package tests -Summary: Unit tests for %{name} -Requires: %{name}%{?_isa} = %{version}-%{release} - -%description tests -%{summary}. -%endif - %prep %autosetup -n %{qt_module}-everywhere-src-%{version} -p1 @@ -135,17 +125,10 @@ export PATH=`pwd`:$PATH %make_build -%if 0%{?build_tests} -%qt5_build_tests -%endif %install %make_install INSTALL_ROOT=%{buildroot} -%if 0%{?build_tests} -%qt5_install_tests -%endif - %ifarch %{multilib_archs} # multilib: qv4global_p.h mv %{buildroot}%{_qt5_headerdir}/QtQml/%{version}/QtQml/private/qv4global_p.h \ @@ -213,7 +196,8 @@ make check -k -C tests ||: %{_qt5_libdir}/libQt5QuickShapes.so.5* %{_qt5_libdir}/libQt5QuickTest.so.5* %{_qt5_plugindir}/qmltooling/ -%{_qt5_archdatadir}/qml/ +%{_qt5_archdatadir}/qml/Qt* +%{_qt5_archdatadir}/qml/builtins.qmltypes %files devel %{_bindir}/qml* @@ -250,53 +234,104 @@ make check -k -C tests ||: %{_qt5_examplesdir}/ %endif -%if 0%{?build_tests} -%files tests -%{_qt5_libdir}/qt5/tests -%endif %changelog -* Wed Apr 26 2023 Jan Grulich - 5.15.9-3 -- Rebuild (elfutils#2188064) - Resolves: bz#2175728 - -* Mon Apr 17 2023 Jan Grulich - 5.15.9-2 -- Disable tests failing in gating - Resolves: bz#2175728 - -* Mon Apr 17 2023 Jan Grulich - 5.15.9-1 -- 5.15.9 + sync with Fedora - Resolves: bz#2178624 - Resolves: bz#2175728 - -* Fri Mar 25 2022 Jan Grulich - 5.15.3-1 -- 5.15.3 + sync with Fedora - Resolves: bz#2061355 - -* Thu Dec 09 2021 Jan Grulich - 5.15.2-10 -- Sync with Fedora - Resolves: bz#2025420 - -* Wed Sep 08 2021 Jan Grulich - 5.15.2-9 -- Sync with Fedora: - - sync kde/5.15 branch fixes - - pull in candidate fix QTBUG-83890 - Resolves: bz#1988934 - -* Tue Aug 10 2021 Mohan Boddu - 5.15.2-8 -- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags - Related: rhbz#1991688 - -* Thu Jun 10 2021 Jan Grulich - 5.15.2-7 -- Let qt5_install_tests macro handle mangling python shebangs - Resolves: bz#1968462 - -* Wed Jun 09 2021 Jan Grulich - 5.15.2-6 -- Add gating tests - Resolves: bz#1968462 - -* Fri Apr 16 2021 Mohan Boddu - 5.15.2-5 -- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 +* Wed Dec 25 2024 Arkady L. Shane - 5.15.15-1 +- Rebuilt for MSVSphere 10 + +* Wed Sep 04 2024 Jan Grulich +- 5.15.15 + +* Fri Jul 19 2024 Fedora Release Engineering - 5.15.14-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Mon Jul 15 2024 Jan Grulich - 5.15.14-2 +- Do not own /usr/lib[64]/qml directory + +* Wed May 29 2024 Jan Grulich - 5.15.14-1 +- 5.15.14 + +* Thu Mar 14 2024 Jan Grulich - 5.15.13-1 +- 5.15.13 + +* Fri Jan 26 2024 Fedora Release Engineering - 5.15.12-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Mon Jan 22 2024 Fedora Release Engineering - 5.15.12-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Tue Jan 02 2024 Jan Grulich - 5.15.12-1 +- 5.15.12 + +* Mon Oct 30 2023 Jan Grulich - 5.15.11-2 +- Upstream backport: QML: Fortify qmlExecuteDeferred some more + +* Fri Oct 06 2023 Jan Grulich - 5.15.11-1 +- 5.15.11 + +* Fri Jul 21 2023 Fedora Release Engineering - 5.15.10-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Mon Jun 12 2023 Jan Grulich - 5.15.10-1 +- 5.15.10 + +* Tue Apr 11 2023 Jan Grulich - 5.15.9-1 +- 5.15.9 + +* Wed Mar 15 2023 Neal Gompa - 5.15.8-4 +- Backport fix for crashes in V4 JIT (#2177696) + +* Tue Jan 31 2023 Jan Grulich - 5.15.8-3 +- migrated to SPDX license + +* Fri Jan 20 2023 Fedora Release Engineering - 5.15.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Thu Jan 05 2023 Jan Grulich - 5.15.8-1 +- 5.15.8 + +* Mon Oct 31 2022 Jan Grulich - 5.15.7-1 +- 5.15.7 + +* Tue Sep 20 2022 Jan Grulich - 5.15.6-1 +- 5.15.6 + +* Sat Jul 23 2022 Fedora Release Engineering - 5.15.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Wed Jul 13 2022 Jan Grulich - 5.15.5-1 +- 5.15.5 + +* Mon May 16 2022 Jan Grulich - 5.15.4-1 +- 5.15.4 + +* Mon Mar 07 2022 Jan Grulich - 5.15.3-2 +- Disable LTO + +* Fri Mar 04 2022 Jan Grulich - 5.15.3-1 +- 5.15.3 + kde-5.15 fixes + +* Fri Jan 21 2022 Fedora Release Engineering - 5.15.2-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Wed Nov 17 2021 Rex Dieter - 5.15.2-10 +- sync kde/5.15 branch fixes + +* Sat Oct 30 2021 Rex Dieter - 5.15.2-9 +- sync kde/5.15 branch fixes + +* Mon Oct 18 2021 Adam Williamson - 5.15.2-8 +- Backport Qt review #372646 to partially fix #2011774 + +* Fri Jul 30 2021 Rex Dieter - 5.15.2-7 +- sync kde/5.15 branch fixes +- pull in candidate fix QTBUG-83890 + +* Fri Jul 23 2021 Fedora Release Engineering - 5.15.2-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Tue Jun 01 2021 Rex Dieter - 5.15.2-5 +- pull in kde/5.15 branch fixes * Wed Jan 27 2021 Fedora Release Engineering - 5.15.2-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild