summaryrefslogtreecommitdiff
path: root/user/qt5-qtquickcontrols2/kde-lts.patch
diff options
context:
space:
mode:
Diffstat (limited to 'user/qt5-qtquickcontrols2/kde-lts.patch')
-rw-r--r--user/qt5-qtquickcontrols2/kde-lts.patch403
1 files changed, 403 insertions, 0 deletions
diff --git a/user/qt5-qtquickcontrols2/kde-lts.patch b/user/qt5-qtquickcontrols2/kde-lts.patch
new file mode 100644
index 000000000..e69ee5f60
--- /dev/null
+++ b/user/qt5-qtquickcontrols2/kde-lts.patch
@@ -0,0 +1,403 @@
+From 38b25abb3d911b264ff01bfd99c906f74a2fb6c2 Mon Sep 17 00:00:00 2001
+From: David Redondo <qt@david-redondo.de>
+Date: Mon, 19 Jul 2021 10:06:17 +0200
+Subject: [PATCH 1/4] Unset mouseGrabberPopup if it's removed from children
+
+The mouseGrabberPopup is supposed to be unset in handleRelease, however
+when the exit transition of the mouseGrabberPopup (that closed itself on
+button press) finishes before the release event is delivered, it
+unparents itself from the overlay (see
+QQuickPopupPrivate::finalizeExitTransition) and the overlay sets itself
+invisible if there is nothing else visible in it. Because the overlay
+is not visible it handles no events anymore and the release is missed
+and the grabber is never unset. When opening another non-modal popup
+the overlay then will continue forwarding the events to now invisible
+popup.
+So when the overlay loses the currently grabbing popup as a child we need
+to reset mouseGrabberPopup.
+
+Fixes: QTBUG-95259
+Change-Id: I3c832d47f3cee216b81ef1b5cb7dd77bf4149991
+Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
+(adapted from commit d07ee1345acd8100fa5cbb7f05c0aaf5f87f4cae)
+
+(cherry picked from commit 1a59ef4218658ffc476909ef4fca13d6cf86d04b)
+---
+ src/quicktemplates2/qquickoverlay.cpp | 5 +-
+ .../data/releaseAfterExitTransition.qml | 78 +++++++++++++++++++
+ tests/auto/qquickpopup/tst_qquickpopup.cpp | 29 +++++++
+ 3 files changed, 111 insertions(+), 1 deletion(-)
+ create mode 100644 tests/auto/qquickpopup/data/releaseAfterExitTransition.qml
+
+diff --git a/src/quicktemplates2/qquickoverlay.cpp b/src/quicktemplates2/qquickoverlay.cpp
+index b8d417f29..c8cd142ae 100644
+--- a/src/quicktemplates2/qquickoverlay.cpp
++++ b/src/quicktemplates2/qquickoverlay.cpp
+@@ -399,8 +399,11 @@ void QQuickOverlay::itemChange(ItemChange change, const ItemChangeData &data)
+ Q_D(QQuickOverlay);
+ QQuickItem::itemChange(change, data);
+
+- if (change == ItemChildAddedChange || change == ItemChildRemovedChange)
++ if (change == ItemChildAddedChange || change == ItemChildRemovedChange) {
+ setVisible(!d->allDrawers.isEmpty() || !childItems().isEmpty());
++ if (data.item->parent() == d->mouseGrabberPopup)
++ d->setMouseGrabberPopup(nullptr);
++ }
+ }
+
+ void QQuickOverlay::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+diff --git a/tests/auto/qquickpopup/data/releaseAfterExitTransition.qml b/tests/auto/qquickpopup/data/releaseAfterExitTransition.qml
+new file mode 100644
+index 000000000..9e4598b9f
+--- /dev/null
++++ b/tests/auto/qquickpopup/data/releaseAfterExitTransition.qml
+@@ -0,0 +1,78 @@
++/****************************************************************************
++**
++** Copyright (C) 2021 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.15
++import QtQuick.Controls 2.15
++
++ApplicationWindow {
++ id: window
++ width: 400
++ height: 400
++ title: "releaseAfterExitTransition"
++
++ property alias popup: popup
++ property alias modalPopup: modalPopup
++
++ Popup {
++ id: popup
++ y: parent.height - height
++ width: 50
++ height: 50
++ }
++
++ Popup {
++ id: modalPopup
++ modal: true
++ y: parent.height - height
++ width: 50
++ height: 50
++ exit: Transition { PauseAnimation { duration: 100 } }
++ }
++}
+diff --git a/tests/auto/qquickpopup/tst_qquickpopup.cpp b/tests/auto/qquickpopup/tst_qquickpopup.cpp
+index ede3640c2..f1840946b 100644
+--- a/tests/auto/qquickpopup/tst_qquickpopup.cpp
++++ b/tests/auto/qquickpopup/tst_qquickpopup.cpp
+@@ -97,6 +97,7 @@ private slots:
+ void invisibleToolTipOpen();
+ void centerInOverlayWithinStackViewItem();
+ void destroyDuringExitTransition();
++ void releaseAfterExitTransition();
+ };
+
+ void tst_QQuickPopup::initTestCase()
+@@ -1459,6 +1460,34 @@ void tst_QQuickPopup::destroyDuringExitTransition()
+ QVERIFY(!button->isDown());
+ }
+
++void tst_QQuickPopup::releaseAfterExitTransition()
++{
++ QQuickApplicationHelper helper(this, "releaseAfterExitTransition.qml");
++ QVERIFY2(helper.ready, helper.failureMessage());
++
++ QQuickWindow *window = helper.window;
++ window->show();
++ QVERIFY(QTest::qWaitForWindowActive(window));
++
++ QQuickOverlay *overlay = QQuickOverlay::overlay(window);
++ QQuickPopup *modalPopup = window->property("modalPopup").value<QQuickPopup *>();
++ QQuickPopup *popup = window->property("popup").value<QQuickPopup *>();
++
++ modalPopup->open();
++ QTRY_VERIFY(modalPopup->isOpened());
++
++ QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
++ // wait until the transition is finished and the overlay hides itself
++ QTRY_VERIFY(!overlay->isVisible());
++ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
++
++ popup->open();
++ QTRY_VERIFY(popup->isOpened());
++ QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(1, 1));
++ QTRY_VERIFY(!popup->isOpened());
++}
++
++
+ QTEST_QUICKCONTROLS_MAIN(tst_QQuickPopup)
+
+ #include "tst_qquickpopup.moc"
+--
+2.36.0
+
+From cb0b21e52d2562e3dc46b1e36f248308de3fb204 Mon Sep 17 00:00:00 2001
+From: Aleix Pol <aleixpol@kde.org>
+Date: Tue, 4 Jan 2022 16:34:16 +0100
+Subject: [PATCH 2/4] Ensure we don't crash when changing sizes after cleanup
+
+This addresses the problems I've seen during destruction. Only
+encountered it when using complex layouts on a DialogButtonBox.
+
+Pick-to: 6.2 6.3
+Change-Id: I54528c8a2b57b4798d90f7e2021e3127f8404762
+(cherry picked from commit 8b24d2bf1655e8491bdd74013579e09cd009e8fc in
+qtdeclarative)
+---
+ src/quicktemplates2/qquickcontainer.cpp | 5 +++--
+ src/quicktemplates2/qquickdialogbuttonbox.cpp | 8 +++++++-
+ 2 files changed, 10 insertions(+), 3 deletions(-)
+
+diff --git a/src/quicktemplates2/qquickcontainer.cpp b/src/quicktemplates2/qquickcontainer.cpp
+index f38c2b09c..6eed2a024 100644
+--- a/src/quicktemplates2/qquickcontainer.cpp
++++ b/src/quicktemplates2/qquickcontainer.cpp
+@@ -225,6 +225,7 @@ void QQuickContainerPrivate::cleanup()
+ QObject::disconnect(contentModel, &QQmlObjectModel::countChanged, q, &QQuickContainer::countChanged);
+ QObject::disconnect(contentModel, &QQmlObjectModel::childrenChanged, q, &QQuickContainer::contentChildrenChanged);
+ delete contentModel;
++ contentModel = nullptr;
+ }
+
+ QQuickItem *QQuickContainerPrivate::itemAt(int index) const
+@@ -436,7 +437,7 @@ void QQuickContainerPrivate::contentChildren_clear(QQmlListProperty<QQuickItem>
+ void QQuickContainerPrivate::updateContentWidth()
+ {
+ Q_Q(QQuickContainer);
+- if (hasContentWidth || qFuzzyCompare(contentWidth, implicitContentWidth))
++ if (hasContentWidth || qFuzzyCompare(contentWidth, implicitContentWidth) || !contentModel)
+ return;
+
+ contentWidth = implicitContentWidth;
+@@ -446,7 +447,7 @@ void QQuickContainerPrivate::updateContentWidth()
+ void QQuickContainerPrivate::updateContentHeight()
+ {
+ Q_Q(QQuickContainer);
+- if (hasContentHeight || qFuzzyCompare(contentHeight, implicitContentHeight))
++ if (hasContentHeight || qFuzzyCompare(contentHeight, implicitContentHeight) || !contentModel)
+ return;
+
+ contentHeight = implicitContentHeight;
+diff --git a/src/quicktemplates2/qquickdialogbuttonbox.cpp b/src/quicktemplates2/qquickdialogbuttonbox.cpp
+index e6db14eb5..6197d1547 100644
+--- a/src/quicktemplates2/qquickdialogbuttonbox.cpp
++++ b/src/quicktemplates2/qquickdialogbuttonbox.cpp
+@@ -237,7 +237,7 @@ static QRectF alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment
+ void QQuickDialogButtonBoxPrivate::resizeContent()
+ {
+ Q_Q(QQuickDialogButtonBox);
+- if (!contentItem)
++ if (!contentItem || !contentModel)
+ return;
+
+ QRectF geometry = q->boundingRect().adjusted(q->leftPadding(), q->topPadding(), -q->rightPadding(), -q->bottomPadding());
+@@ -322,6 +322,9 @@ void QQuickDialogButtonBoxPrivate::updateLayout()
+ qreal QQuickDialogButtonBoxPrivate::getContentWidth() const
+ {
+ Q_Q(const QQuickDialogButtonBox);
++ if (!contentModel)
++ return 0;
++
+ const int count = contentModel->count();
+ const qreal totalSpacing = qMax(0, count - 1) * spacing;
+ qreal totalWidth = totalSpacing;
+@@ -341,6 +344,9 @@ qreal QQuickDialogButtonBoxPrivate::getContentWidth() const
+ qreal QQuickDialogButtonBoxPrivate::getContentHeight() const
+ {
+ Q_Q(const QQuickDialogButtonBox);
++ if (!contentModel)
++ return 0;
++
+ const int count = contentModel->count();
+ qreal maxHeight = 0;
+ for (int i = 0; i < count; ++i) {
+--
+2.36.0
+
+From c8fe3805d53a8c24e126bcd20bb0f708bfb10958 Mon Sep 17 00:00:00 2001
+From: Oliver Eftevaag <oliver.eftevaag@qt.io>
+Date: Wed, 19 Jan 2022 22:09:56 +0100
+Subject: [PATCH 3/4] QQuickAction: don't grab the same shortcut multiple times
+
+If the entry for the QQuickItem that the QQuickAction is set on has
+already grabbed the shortcut, then m_shortcutId is no longer 0 and we
+must not overwrite the value. Otherwise, the QQuickItem removing itself
+from the action might not remove the correct entry from Qt's shortcut
+map, leaving a dangling pointer behind.
+
+Multiple calls to QQuickActionPrivate::ShortcutEntry::grab are possible,
+because we grab the shortcut whenever the shortcut changes, or when an
+item representing the action becomes visible.
+
+The test case added reproduces this scenario by adding the action to a
+menu item and then making the menu explicitly visible, resulting in two
+calls to grab() which should be idempotent.
+
+Fixes: QTBUG-96551
+Fixes: QTBUG-96561
+Pick-to: 6.2
+Change-Id: I7d42a4f4c04f7d8759f2d0f24a133720f10e4c47
+Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
+Reviewed-by: Jarkko Koivikko <jarkko.koivikko@code-q.fi>
+Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
+
+(cherry picked from commit 45af5ef2f63704adc515e29260ad8c6aaf51f08e in
+qtdeclarative)
+---
+ src/quicktemplates2/qquickaction.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/quicktemplates2/qquickaction.cpp b/src/quicktemplates2/qquickaction.cpp
+index 2041e7741..8610cdfae 100644
+--- a/src/quicktemplates2/qquickaction.cpp
++++ b/src/quicktemplates2/qquickaction.cpp
+@@ -145,7 +145,7 @@ int QQuickActionPrivate::ShortcutEntry::shortcutId() const
+
+ void QQuickActionPrivate::ShortcutEntry::grab(const QKeySequence &shortcut, bool enabled)
+ {
+- if (shortcut.isEmpty())
++ if (shortcut.isEmpty() || m_shortcutId)
+ return;
+
+ Qt::ShortcutContext context = Qt::WindowShortcut; // TODO
+--
+2.36.0
+
+From 0d3d39e821ea7634c174a29910c18d7101bce6f7 Mon Sep 17 00:00:00 2001
+From: Ulf Hermann <ulf.hermann@qt.io>
+Date: Tue, 11 Jan 2022 12:42:47 +0100
+Subject: [PATCH 4/4] QQuickAbstractButton: fix crash on destruction
+
+If we listen for size changes we also need to remove the object listened
+to when it's deleted.
+
+Pick-to: 5.15 6.2 6.3
+Fixes: QTBUG-99644
+Change-Id: I613855ebd986b1e67685088020b88d8b070659cf
+Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
+(cherry picked from commit 720ffaeb60d43123522066e1de3a69ad551644aa in
+qtdeclarative)
+---
+ src/quicktemplates2/qquickabstractbutton.cpp | 11 +++++++++
+ .../qquickabstractbutton_p_p.h | 1 +
+ tests/auto/controls/data/tst_switch.qml | 23 +++++++++++++++++++
+ 3 files changed, 35 insertions(+)
+
+diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp
+index 950e4e099..1df0c706d 100644
+--- a/src/quicktemplates2/qquickabstractbutton.cpp
++++ b/src/quicktemplates2/qquickabstractbutton.cpp
+@@ -387,6 +387,17 @@ void QQuickAbstractButtonPrivate::itemImplicitHeightChanged(QQuickItem *item)
+ emit q->implicitIndicatorHeightChanged();
+ }
+
++void QQuickAbstractButtonPrivate::itemDestroyed(QQuickItem *item)
++{
++ Q_Q(QQuickAbstractButton);
++ QQuickControlPrivate::itemDestroyed(item);
++ if (item == indicator) {
++ indicator = nullptr;
++ emit q->implicitIndicatorWidthChanged();
++ emit q->implicitIndicatorHeightChanged();
++ }
++}
++
+ QQuickAbstractButton *QQuickAbstractButtonPrivate::findCheckedButton() const
+ {
+ Q_Q(const QQuickAbstractButton);
+diff --git a/src/quicktemplates2/qquickabstractbutton_p_p.h b/src/quicktemplates2/qquickabstractbutton_p_p.h
+index 9291c1a87..b729720f2 100644
+--- a/src/quicktemplates2/qquickabstractbutton_p_p.h
++++ b/src/quicktemplates2/qquickabstractbutton_p_p.h
+@@ -109,6 +109,7 @@ public:
+
+ void itemImplicitWidthChanged(QQuickItem *item) override;
+ void itemImplicitHeightChanged(QQuickItem *item) override;
++ void itemDestroyed(QQuickItem *item) override;
+
+ // copied from qabstractbutton.cpp
+ static const int AUTO_REPEAT_DELAY = 300;
+diff --git a/tests/auto/controls/data/tst_switch.qml b/tests/auto/controls/data/tst_switch.qml
+index b3fab41ca..10b6baa02 100644
+--- a/tests/auto/controls/data/tst_switch.qml
++++ b/tests/auto/controls/data/tst_switch.qml
+@@ -608,4 +608,27 @@ TestCase {
+ mouseClick(control.indicator)
+ verify(control.activeFocus)
+ }
++
++ Component {
++ id: deletionOrder1
++ Item {
++ Image { id: innerImage }
++ Switch { indicator: innerImage }
++ }
++ }
++
++ Component {
++ id: deletionOrder2
++ Item {
++ Switch { indicator: innerImage }
++ Image { id: innerImage }
++ }
++ }
++
++ function test_deletionOrder() {
++ var control1 = createTemporaryObject(deletionOrder1, testCase)
++ verify(control1)
++ var control2 = createTemporaryObject(deletionOrder2, testCase)
++ verify(control2)
++ }
+ }
+--
+2.36.0
+