[neon/qt/qtquickcontrols2/Neon/unstable] debian: Add patches from KDE's Qt 5 Patch Collection up to 2022-06-17.

Dmitry Shachnev null at kde.org
Mon Apr 29 17:44:21 BST 2024


Git commit 0af2f498f52819fd0a1628145f8d833ca00b1dc9 by Dmitry Shachnev.
Committed on 17/07/2022 at 21:33.
Pushed by jriddell into branch 'Neon/unstable'.

Add patches from KDE's Qt 5 Patch Collection up to 2022-06-17.

This removes file which erroneously had a commercial-only license header.

M  +1    -0    debian/changelog
A  +172  -0    debian/patches/0001-Unset-mouseGrabberPopup-if-it-s-removed-from-childre.patch
A  +76   -0    debian/patches/0002-Ensure-we-don-t-crash-when-changing-sizes-after-clea.patch
A  +44   -0    debian/patches/0003-QQuickAction-don-t-grab-the-same-shortcut-multiple-t.patch
A  +80   -0    debian/patches/0004-QQuickAbstractButton-fix-crash-on-destruction.patch
A  +423  -0    debian/patches/0005-Revert-Allow-creation-of-custom-QQuickPopupItem-deri.patch
M  +5    -0    debian/patches/series

https://invent.kde.org/neon/qt/qtquickcontrols2/-/commit/0af2f498f52819fd0a1628145f8d833ca00b1dc9

diff --git a/debian/changelog b/debian/changelog
index 9e58c15..58fd240 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,6 +4,7 @@ qtquickcontrols2-opensource-src (5.15.5+dfsg-1) UNRELEASED; urgency=medium
   * New upstream release.
   * Bump Qt build-dependencies to 5.15.5.
   * Use symver directive to catch all private symbols at once.
+  * Add patches from KDE's Qt 5 Patch Collection up to 2022-06-17.
 
  -- Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org>  Sun, 03 Jul 2022 16:44:40 +0300
 
diff --git a/debian/patches/0001-Unset-mouseGrabberPopup-if-it-s-removed-from-childre.patch b/debian/patches/0001-Unset-mouseGrabberPopup-if-it-s-removed-from-childre.patch
new file mode 100644
index 0000000..aca89a4
--- /dev/null
+++ b/debian/patches/0001-Unset-mouseGrabberPopup-if-it-s-removed-from-childre.patch
@@ -0,0 +1,172 @@
+From bfdaef37a08a24f043e7b24023ae3835e03ef68a Mon Sep 17 00:00:00 2001
+From: David Redondo <qt at david-redondo.de>
+Date: Mon, 19 Jul 2021 10:06:17 +0200
+Subject: [PATCH] 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 at 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
+
+--- 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)
+--- /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 } }
++    }
++}
+--- 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"
diff --git a/debian/patches/0002-Ensure-we-don-t-crash-when-changing-sizes-after-clea.patch b/debian/patches/0002-Ensure-we-don-t-crash-when-changing-sizes-after-clea.patch
new file mode 100644
index 0000000..9f7fc96
--- /dev/null
+++ b/debian/patches/0002-Ensure-we-don-t-crash-when-changing-sizes-after-clea.patch
@@ -0,0 +1,76 @@
+From d652727e3564d3a5f21788d9f75f903efbd4840c Mon Sep 17 00:00:00 2001
+From: Aleix Pol <aleixpol at kde.org>
+Date: Tue, 4 Jan 2022 16:34:16 +0100
+Subject: [PATCH] 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(-)
+
+--- 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;
+--- 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) {
diff --git a/debian/patches/0003-QQuickAction-don-t-grab-the-same-shortcut-multiple-t.patch b/debian/patches/0003-QQuickAction-don-t-grab-the-same-shortcut-multiple-t.patch
new file mode 100644
index 0000000..a42afa2
--- /dev/null
+++ b/debian/patches/0003-QQuickAction-don-t-grab-the-same-shortcut-multiple-t.patch
@@ -0,0 +1,44 @@
+From 5ac8f83ed1d34712d11a6b75a5bb1f877b24706a Mon Sep 17 00:00:00 2001
+From: Oliver Eftevaag <oliver.eftevaag at qt.io>
+Date: Wed, 19 Jan 2022 22:09:56 +0100
+Subject: [PATCH] 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 at qt.io>
+Reviewed-by: Jarkko Koivikko <jarkko.koivikko at code-q.fi>
+Reviewed-by: Volker Hilsheimer <volker.hilsheimer at qt.io>
+
+(cherry picked from commit 45af5ef2f63704adc515e29260ad8c6aaf51f08e in
+qtdeclarative)
+---
+ src/quicktemplates2/qquickaction.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- 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
diff --git a/debian/patches/0004-QQuickAbstractButton-fix-crash-on-destruction.patch b/debian/patches/0004-QQuickAbstractButton-fix-crash-on-destruction.patch
new file mode 100644
index 0000000..e9c134a
--- /dev/null
+++ b/debian/patches/0004-QQuickAbstractButton-fix-crash-on-destruction.patch
@@ -0,0 +1,80 @@
+From 38dbeb8f5aa346f490003c75d9fa6e4b817f5bc8 Mon Sep 17 00:00:00 2001
+From: Ulf Hermann <ulf.hermann at qt.io>
+Date: Tue, 11 Jan 2022 12:42:47 +0100
+Subject: [PATCH] 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 at 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(+)
+
+--- 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);
+--- 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;
+--- 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)
++    }
+ }
diff --git a/debian/patches/0005-Revert-Allow-creation-of-custom-QQuickPopupItem-deri.patch b/debian/patches/0005-Revert-Allow-creation-of-custom-QQuickPopupItem-deri.patch
new file mode 100644
index 0000000..170c11d
--- /dev/null
+++ b/debian/patches/0005-Revert-Allow-creation-of-custom-QQuickPopupItem-deri.patch
@@ -0,0 +1,423 @@
+From 59cc1cc5b3719713598a1f426d82a9d895b5dccb Mon Sep 17 00:00:00 2001
+From: Albert Astals Cid <aacid at kde.org>
+Date: Fri, 17 Jun 2022 15:24:13 +0200
+Subject: [PATCH] Revert "Allow creation of custom QQuickPopupItem-derived
+ types"
+
+This reverts commit 6b8a9673.
+
+The follow-up commit a063cd0b
+
+causes QTBUG-94764, so we don't need this enabling change for now.
+
+Task-number: QTBUG-83630
+Task-number: QTBUG-94764
+Pick-to: 5.15 6.1 6.2
+Change-Id: I1aec8571dcdcc2103d0e56c3d0bbfc4a4872d8db
+Reviewed-by: default avatarRichard Moe Gustavsen <richard.gustavsen at qt.io>
+
+(cherry-picked from qtdeclarative b69d071c10dfa4c5d7b62692b8a9d7bb659a4ab5)
+---
+ src/quicktemplates2/qquickmenu.cpp        |   1 -
+ src/quicktemplates2/qquickmenu_p_p.h      |   2 +-
+ src/quicktemplates2/qquickpopup.cpp       |  17 +--
+ src/quicktemplates2/qquickpopup_p_p.h     |   4 +-
+ src/quicktemplates2/qquickpopupitem.cpp   |  70 +++++++------
+ src/quicktemplates2/qquickpopupitem_p.h   | 121 ----------------------
+ src/quicktemplates2/qquickpopupitem_p_p.h |  80 +++++++++-----
+ src/quicktemplates2/quicktemplates2.pri   |   1 -
+ 8 files changed, 100 insertions(+), 196 deletions(-)
+ delete mode 100644 src/quicktemplates2/qquickpopupitem_p.h
+
+--- a/src/quicktemplates2/qquickmenu.cpp
++++ b/src/quicktemplates2/qquickmenu.cpp
+@@ -222,7 +222,6 @@ QQuickMenuPrivate::QQuickMenuPrivate()
+ void QQuickMenuPrivate::init()
+ {
+     Q_Q(QQuickMenu);
+-    QQuickPopupPrivate::init();
+     contentModel = new QQmlObjectModel(q);
+ }
+ 
+--- a/src/quicktemplates2/qquickmenu_p_p.h
++++ b/src/quicktemplates2/qquickmenu_p_p.h
+@@ -73,7 +73,7 @@ public:
+         return menu->d_func();
+     }
+ 
+-    void init() override;
++    void init();
+ 
+     QQuickItem *itemAt(int index) const;
+     void insertItem(int index, QQuickItem *item);
+--- a/src/quicktemplates2/qquickpopup.cpp
++++ b/src/quicktemplates2/qquickpopup.cpp
+@@ -275,21 +275,9 @@ QQuickPopupPrivate::QQuickPopupPrivate()
+ void QQuickPopupPrivate::init()
+ {
+     Q_Q(QQuickPopup);
+-    createPopupItem();
++    popupItem = new QQuickPopupItem(q);
+     popupItem->setVisible(false);
+     q->setParentItem(qobject_cast<QQuickItem *>(parent));
+-    connectToPopupItem();
+-}
+-
+-void QQuickPopupPrivate::createPopupItem()
+-{
+-    Q_Q(QQuickPopup);
+-    popupItem = new QQuickPopupItem(q);
+-}
+-
+-void QQuickPopupPrivate::connectToPopupItem()
+-{
+-    Q_Q(QQuickPopup);
+     QObject::connect(popupItem, &QQuickControl::paddingChanged, q, &QQuickPopup::paddingChanged);
+     QObject::connect(popupItem, &QQuickControl::backgroundChanged, q, &QQuickPopup::backgroundChanged);
+     QObject::connect(popupItem, &QQuickControl::contentItemChanged, q, &QQuickPopup::contentItemChanged);
+@@ -854,7 +842,8 @@ QQuickPopup::QQuickPopup(QObject *parent)
+ QQuickPopup::QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
+     : QObject(dd, parent)
+ {
+-    dd.init();
++    Q_D(QQuickPopup);
++    d->init();
+ }
+ 
+ QQuickPopup::~QQuickPopup()
+--- a/src/quicktemplates2/qquickpopup_p_p.h
++++ b/src/quicktemplates2/qquickpopup_p_p.h
+@@ -96,9 +96,7 @@ public:
+     QQmlListProperty<QObject> contentData();
+     QQmlListProperty<QQuickItem> contentChildren();
+ 
+-    virtual void init();
+-    void createPopupItem();
+-    void connectToPopupItem();
++    void init();
+     void closeOrReject();
+     bool tryClose(const QPointF &pos, QQuickPopup::ClosePolicy flags);
+ 
+--- a/src/quicktemplates2/qquickpopupitem.cpp
++++ b/src/quicktemplates2/qquickpopupitem.cpp
+@@ -53,33 +53,38 @@
+ 
+ QT_BEGIN_NAMESPACE
+ 
++class QQuickPopupItemPrivate : public QQuickPagePrivate
++{
++    Q_DECLARE_PUBLIC(QQuickPopupItem)
++
++public:
++    QQuickPopupItemPrivate(QQuickPopup *popup);
++
++    void implicitWidthChanged() override;
++    void implicitHeightChanged() override;
++
++    void resolveFont() override;
++    void resolvePalette() override;
++
++    QQuickItem *getContentItem() override;
++
++    void cancelContentItem() override;
++    void executeContentItem(bool complete = false) override;
++
++    void cancelBackground() override;
++    void executeBackground(bool complete = false) override;
++
++    int backId = 0;
++    int escapeId = 0;
++    QQuickPopup *popup = nullptr;
++};
++
+ QQuickPopupItemPrivate::QQuickPopupItemPrivate(QQuickPopup *popup)
+     : popup(popup)
+ {
+     isTabFence = true;
+ }
+ 
+-void QQuickPopupItemPrivate::init()
+-{
+-    Q_Q(QQuickPopupItem);
+-    q->setParent(popup);
+-    q->setFlag(QQuickItem::ItemIsFocusScope);
+-    q->setAcceptedMouseButtons(Qt::AllButtons);
+-#if QT_CONFIG(quicktemplates2_multitouch)
+-    q->setAcceptTouchEvents(true);
+-#endif
+-#if QT_CONFIG(cursor)
+-    q->setCursor(Qt::ArrowCursor);
+-#endif
+-
+-#if QT_CONFIG(quicktemplates2_hover)
+-    // TODO: switch to QStyleHints::useHoverEffects in Qt 5.8
+-    q->setHoverEnabled(true);
+-    // setAcceptHoverEvents(QGuiApplication::styleHints()->useHoverEffects());
+-    // connect(QGuiApplication::styleHints(), &QStyleHints::useHoverEffectsChanged, this, &QQuickItem::setAcceptHoverEvents);
+-#endif
+-}
+-
+ void QQuickPopupItemPrivate::implicitWidthChanged()
+ {
+     QQuickPagePrivate::implicitWidthChanged();
+@@ -156,15 +161,22 @@ void QQuickPopupItemPrivate::executeBackground(bool complete)
+ QQuickPopupItem::QQuickPopupItem(QQuickPopup *popup)
+     : QQuickPage(*(new QQuickPopupItemPrivate(popup)), nullptr)
+ {
+-    Q_D(QQuickPopupItem);
+-    d->init();
+-}
++    setParent(popup);
++    setFlag(ItemIsFocusScope);
++    setAcceptedMouseButtons(Qt::AllButtons);
++#if QT_CONFIG(quicktemplates2_multitouch)
++    setAcceptTouchEvents(true);
++#endif
++#if QT_CONFIG(cursor)
++    setCursor(Qt::ArrowCursor);
++#endif
+ 
+-QQuickPopupItem::QQuickPopupItem(QQuickPopupItemPrivate &dd) :
+-    QQuickPage(dd, nullptr)
+-{
+-    Q_D(QQuickPopupItem);
+-    d->init();
++#if QT_CONFIG(quicktemplates2_hover)
++    // TODO: switch to QStyleHints::useHoverEffects in Qt 5.8
++    setHoverEnabled(true);
++    // setAcceptHoverEvents(QGuiApplication::styleHints()->useHoverEffects());
++    // connect(QGuiApplication::styleHints(), &QStyleHints::useHoverEffectsChanged, this, &QQuickItem::setAcceptHoverEvents);
++#endif
+ }
+ 
+ void QQuickPopupItem::grabShortcut()
+--- a/src/quicktemplates2/qquickpopupitem_p.h
++++ /dev/null
+@@ -1,121 +0,0 @@
+-/****************************************************************************
+-**
+-** Copyright (C) 2021 The Qt Company Ltd.
+-** Contact: https://www.qt.io/licensing/
+-**
+-** This file is part of the Qt Quick Templates 2 module of the Qt Toolkit.
+-**
+-** $QT_BEGIN_LICENSE:COMM$
+-**
+-** 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.
+-**
+-** $QT_END_LICENSE$
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-**
+-****************************************************************************/
+-
+-#ifndef QQUICKPOPUPITEM_P_H
+-#define QQUICKPOPUPITEM_P_H
+-
+-//
+-//  W A R N I N G
+-//  -------------
+-//
+-// This file is not part of the Qt API.  It exists purely as an
+-// implementation detail.  This header file may change from version to
+-// version without notice, or even be removed.
+-//
+-// We mean it.
+-//
+-
+-#include <QtQuickTemplates2/private/qquickpage_p.h>
+-#include <QtQuickTemplates2/private/qquickpage_p_p.h>
+-
+-QT_BEGIN_NAMESPACE
+-
+-class QQuickPopup;
+-class QQuickPopupItemPrivate;
+-
+-class QQuickPopupItem : public QQuickPage
+-{
+-    Q_OBJECT
+-
+-public:
+-    explicit QQuickPopupItem(QQuickPopup *popup);
+-
+-    void grabShortcut();
+-    void ungrabShortcut();
+-
+-protected:
+-    void updatePolish() override;
+-
+-    bool event(QEvent *event) override;
+-    bool childMouseEventFilter(QQuickItem *child, QEvent *event) override;
+-    void focusInEvent(QFocusEvent *event) override;
+-    void focusOutEvent(QFocusEvent *event) override;
+-    void keyPressEvent(QKeyEvent *event) override;
+-    void keyReleaseEvent(QKeyEvent *event) override;
+-    void mousePressEvent(QMouseEvent *event) override;
+-    void mouseMoveEvent(QMouseEvent *event) override;
+-    void mouseReleaseEvent(QMouseEvent *event) override;
+-    void mouseDoubleClickEvent(QMouseEvent *event) override;
+-    void mouseUngrabEvent() override;
+-#if QT_CONFIG(quicktemplates2_multitouch)
+-    void touchEvent(QTouchEvent *event) override;
+-    void touchUngrabEvent() override;
+-#endif
+-#if QT_CONFIG(wheelevent)
+-    void wheelEvent(QWheelEvent *event) override;
+-#endif
+-
+-    void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) override;
+-    void contentSizeChange(const QSizeF &newSize, const QSizeF &oldSize) override;
+-    void fontChange(const QFont &newFont, const QFont &oldFont) override;
+-    void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
+-    void localeChange(const QLocale &newLocale, const QLocale &oldLocale) override;
+-    void mirrorChange() override;
+-    void itemChange(ItemChange change, const ItemChangeData &data) override;
+-    void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) override;
+-    void paletteChange(const QPalette &newPalette, const QPalette &oldPalette) override;
+-    void enabledChange() override;
+-
+-    QFont defaultFont() const override;
+-    QPalette defaultPalette() const override;
+-
+-#if QT_CONFIG(accessibility)
+-    QAccessible::Role accessibleRole() const override;
+-    void accessibilityActiveChanged(bool active) override;
+-#endif
+-
+-protected:
+-    QQuickPopupItem(QQuickPopupItemPrivate &dd);
+-
+-private:
+-    Q_DISABLE_COPY(QQuickPopupItem)
+-    Q_DECLARE_PRIVATE(QQuickPopupItem)
+-    friend class QQuickPopup;
+-};
+-
+-QT_END_NAMESPACE
+-
+-#endif // QQUICKPOPUPITEM_P_H
+--- a/src/quicktemplates2/qquickpopupitem_p_p.h
++++ b/src/quicktemplates2/qquickpopupitem_p_p.h
+@@ -48,39 +48,67 @@
+ // We mean it.
+ //
+ 
+-#include <QtQuickTemplates2/private/qquickpopupitem_p.h>
+-#include <QtQuickTemplates2/private/qquickpalette_p.h>
++#include <QtQuickTemplates2/private/qquickpage_p.h>
+ 
+ QT_BEGIN_NAMESPACE
+ 
+ class QQuickPopup;
+-
+-class QQuickPopupItemPrivate : public QQuickPagePrivate
++class QQuickPopupItemPrivate;
++class QQuickPopupItem : public QQuickPage
+ {
+-    Q_DECLARE_PUBLIC(QQuickPopupItem)
++    Q_OBJECT
+ 
+ public:
+-    QQuickPopupItemPrivate(QQuickPopup *popup);
+-
+-    void init();
+-
+-    void implicitWidthChanged() override;
+-    void implicitHeightChanged() override;
+-
+-    void resolveFont() override;
+-    void resolvePalette() override;
+-
+-    QQuickItem *getContentItem() override;
+-
+-    void cancelContentItem() override;
+-    void executeContentItem(bool complete = false) override;
+-
+-    void cancelBackground() override;
+-    void executeBackground(bool complete = false) override;
+-
+-    int backId = 0;
+-    int escapeId = 0;
+-    QQuickPopup *popup = nullptr;
++    explicit QQuickPopupItem(QQuickPopup *popup);
++
++    void grabShortcut();
++    void ungrabShortcut();
++
++protected:
++    void updatePolish() override;
++
++    bool event(QEvent *event) override;
++    bool childMouseEventFilter(QQuickItem *child, QEvent *event) override;
++    void focusInEvent(QFocusEvent *event) override;
++    void focusOutEvent(QFocusEvent *event) override;
++    void keyPressEvent(QKeyEvent *event) override;
++    void keyReleaseEvent(QKeyEvent *event) override;
++    void mousePressEvent(QMouseEvent *event) override;
++    void mouseMoveEvent(QMouseEvent *event) override;
++    void mouseReleaseEvent(QMouseEvent *event) override;
++    void mouseDoubleClickEvent(QMouseEvent *event) override;
++    void mouseUngrabEvent() override;
++#if QT_CONFIG(quicktemplates2_multitouch)
++    void touchEvent(QTouchEvent *event) override;
++    void touchUngrabEvent() override;
++#endif
++#if QT_CONFIG(wheelevent)
++    void wheelEvent(QWheelEvent *event) override;
++#endif
++
++    void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) override;
++    void contentSizeChange(const QSizeF &newSize, const QSizeF &oldSize) override;
++    void fontChange(const QFont &newFont, const QFont &oldFont) override;
++    void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
++    void localeChange(const QLocale &newLocale, const QLocale &oldLocale) override;
++    void mirrorChange() override;
++    void itemChange(ItemChange change, const ItemChangeData &data) override;
++    void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) override;
++    void paletteChange(const QPalette &newPalette, const QPalette &oldPalette) override;
++    void enabledChange() override;
++
++    QFont defaultFont() const override;
++    QPalette defaultPalette() const override;
++
++#if QT_CONFIG(accessibility)
++    QAccessible::Role accessibleRole() const override;
++    void accessibilityActiveChanged(bool active) override;
++#endif
++
++private:
++    Q_DISABLE_COPY(QQuickPopupItem)
++    Q_DECLARE_PRIVATE(QQuickPopupItem)
++    friend class QQuickPopup;
+ };
+ 
+ QT_END_NAMESPACE
+--- a/src/quicktemplates2/quicktemplates2.pri
++++ b/src/quicktemplates2/quicktemplates2.pri
+@@ -60,7 +60,6 @@ HEADERS += \
+     $$PWD/qquickpopup_p_p.h \
+     $$PWD/qquickpopupanchors_p.h \
+     $$PWD/qquickpopupanchors_p_p.h \
+-    $$PWD/qquickpopupitem_p.h \
+     $$PWD/qquickpopupitem_p_p.h \
+     $$PWD/qquickpopuppositioner_p_p.h \
+     $$PWD/qquickpresshandler_p_p.h \
diff --git a/debian/patches/series b/debian/patches/series
index 808701a..a01165b 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,6 @@
+0001-Unset-mouseGrabberPopup-if-it-s-removed-from-childre.patch
+0002-Ensure-we-don-t-crash-when-changing-sizes-after-clea.patch
+0003-QQuickAction-don-t-grab-the-same-shortcut-multiple-t.patch
+0004-QQuickAbstractButton-fix-crash-on-destruction.patch
+0005-Revert-Allow-creation-of-custom-QQuickPopupItem-deri.patch
 disable_fontless_examples_build.patch



More information about the Neon-commits mailing list