[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1107343: marked as done (unblock: kf6-kirigami/6.13.0-2)



Your message dated Fri, 06 Jun 2025 06:45:22 +0000
with message-id <E1uNQpO-007wHg-28@respighi.debian.org>
and subject line unblock kf6-kirigami
has caused the Debian Bug report #1107343,
regarding unblock: kf6-kirigami/6.13.0-2
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
1107343: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1107343
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
X-Debbugs-Cc: kf6-kirigami@packages.debian.org, Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Control: affects -1 + src:kf6-kirigami
User: release.debian.org@packages.debian.org
Usertags: unblock

Dear Release Team,

please unblock package kf6-kirigami.

[ Reason ]
It contains the following changes:
* Backport upstream commits:
  - Fix activation of links in inline messages. (kde#500578)
  - Fix smooth scrolling not behaving correctly for some movement sizes.
  (kde#484309)
  - Fix password and search fields not handling RTL languages properly.
  (kde#504091, kde#503012)
  - Fix for screen readers to no longer rather pointlessly announce “LAYERED
  PANE ZERO ITEMS” all the time in Kirigami-based apps and System Settings
  pages.

[ Tests ]
Upstream testsuite passes in sbuild.
Tested with the kirigami-gallery test app and no regression spotted.
No regression either on daily driven kirigami apps like elisa,
filelight, kde-connect, kinfocenter, kscreen, several parts of Plasma.

[ Risks ]
Only backport of upstream commits that apply cleanly. Further fixes can
easily be backported or the changes reverted.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing


Thanks!


unblock kf6-kirigami/6.13.0-2
diff -Nru kf6-kirigami-6.13.0/debian/changelog kf6-kirigami-6.13.0/debian/changelog
--- kf6-kirigami-6.13.0/debian/changelog	2025-04-12 19:34:19.000000000 +0200
+++ kf6-kirigami-6.13.0/debian/changelog	2025-05-20 08:38:42.000000000 +0200
@@ -1,3 +1,18 @@
+kf6-kirigami (6.13.0-2) unstable; urgency=medium
+
+  [ Aurélien COUDERC ]
+  * Backport upstream commits:
+    - Fix activation of links in inline messages. (kde#500578)
+    - Fix smooth scrolling not behaving correctly for some movement sizes.
+    (kde#484309)
+    - Fix password and search fields not handling RTL languages properly.
+    (kde#504091, kde#503012)
+    - Fix for screen readers to no longer rather pointlessly announce “LAYERED
+    PANE ZERO ITEMS” all the time in Kirigami-based apps and System Settings
+    pages.
+
+ -- Aurélien COUDERC <coucouf@debian.org>  Tue, 20 May 2025 08:38:42 +0200
+
 kf6-kirigami (6.13.0-1) unstable; urgency=medium
 
   [ Patrick Franz ]
diff -Nru kf6-kirigami-6.13.0/debian/patches/series kf6-kirigami-6.13.0/debian/patches/series
--- kf6-kirigami-6.13.0/debian/patches/series	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/series	2025-05-20 08:38:42.000000000 +0200
@@ -0,0 +1,10 @@
+upstream_e3c6af3b_layouts-Always-relayout-on-geometry-changes-in-ToolBarLayout.patch
+upstream_81352c22_layout-Set-implicit-width-of-ToolBarLayout-before-using-its-width.patch
+upstream_82abc769_controls-Fix-link-activation-for-text-of-InlineMessage.patch
+upstream_2c6cd90f_controls-Improve-calculation-of-InlineMessage-implicit-height.patch
+upstream_bae0957d_controls-Remove-redundant-states-from-InlineMessage.patch
+upstream_fb21ee82_WheelHandler-smooth-scroll-for-a-greater-variety-of-movement-sizes.patch
+upstream_bf7ead57_tst-scrolling-qml-don-t-set-default-angle-delta-to-verticalStepSize-don-t-test-if-smooth-scrolling-is-enabled-when-testing-angle-delta-moves.patch
+upstream_5bf798c3_Fix-ActionTextField-RTL.patch
+upstream_d803ca35_SearchField-fix-RTL-search-icon-positioning.patch
+upstream_481ee938_controls-PageRow-don-t-announce-StackView-over-screen-readers.patch
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_2c6cd90f_controls-Improve-calculation-of-InlineMessage-implicit-height.patch kf6-kirigami-6.13.0/debian/patches/upstream_2c6cd90f_controls-Improve-calculation-of-InlineMessage-implicit-height.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_2c6cd90f_controls-Improve-calculation-of-InlineMessage-implicit-height.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_2c6cd90f_controls-Improve-calculation-of-InlineMessage-implicit-height.patch	2025-05-16 18:14:21.000000000 +0200
@@ -0,0 +1,47 @@
+From 2c6cd90f785c40d6a3f72dcd824c6199634ba737 Mon Sep 17 00:00:00 2001
+From: Arjen Hiemstra <ahiemstra@heimr.nl>
+Date: Tue, 8 Apr 2025 11:10:47 +0200
+Subject: [PATCH] controls: Improve calculation of InlineMessage implicit
+ height
+
+If the text isn't long enough to wrap into mulitple lines, but we have
+many or large actions such that the actions are still put below the
+text, the actions and close button would overlap because the close
+button is not accounted for. To fix that, always anchor the actions at
+the bottom and calculate a more proper implicit height for the entire
+inline message that accounts for close button height if it is visible.
+---
+ src/controls/templates/InlineMessage.qml | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/controls/templates/InlineMessage.qml b/src/controls/templates/InlineMessage.qml
+index ecf3b6655..f8a868891 100644
+--- a/src/controls/templates/InlineMessage.qml
++++ b/src/controls/templates/InlineMessage.qml
+@@ -207,10 +207,11 @@ T.Control {
+         }
+ 
+         implicitHeight: {
++            let maximumTopHeight = Math.max(label.implicitHeight, icon.implicitHeight, (root.showCloseButton ? closeButton.implicitHeight : 0))
+             if (atBottom) {
+-                return label.implicitHeight + actionsLayout.implicitHeight + actionsLayout.anchors.topMargin
++                return maximumTopHeight + actionsLayout.implicitHeight + Kirigami.Units.smallSpacing
+             } else {
+-                return Math.max(icon.implicitHeight, label.implicitHeight, closeButton.implicitHeight, actionsLayout.implicitHeight)
++                return Math.max(maximumTopHeight, actionsLayout.implicitHeight)
+             }
+         }
+ 
+@@ -354,8 +355,7 @@ T.Control {
+             alignment: Qt.AlignRight
+ 
+             anchors {
+-                top: contentLayout.atBottom ? label.bottom : parent.top
+-                topMargin: contentLayout.atBottom ? Kirigami.Units.largeSpacing : 0
++                bottom: parent.bottom
+                 right: (!contentLayout.atBottom && root.showCloseButton) ? closeButton.left : parent.right
+                 rightMargin: !contentLayout.atBottom && root.showCloseButton ? Kirigami.Units.smallSpacing : 0
+             }
+-- 
+GitLab
+
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_481ee938_controls-PageRow-don-t-announce-StackView-over-screen-readers.patch kf6-kirigami-6.13.0/debian/patches/upstream_481ee938_controls-PageRow-don-t-announce-StackView-over-screen-readers.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_481ee938_controls-PageRow-don-t-announce-StackView-over-screen-readers.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_481ee938_controls-PageRow-don-t-announce-StackView-over-screen-readers.patch	2025-05-20 08:38:42.000000000 +0200
@@ -0,0 +1,39 @@
+From 481ee938211faeb4cd166134bc270491dd36420b Mon Sep 17 00:00:00 2001
+From: Christoph Wolk <cwo.kde@posteo.net>
+Date: Mon, 19 May 2025 08:05:07 +0200
+Subject: [PATCH] controls/PageRow: don't announce StackView over screen
+ readers
+
+PageRow has an internal StackView; it defaults to the Accessible.role
+LayeredPane, which is by default announced by screen readers (or at
+least by orca). This may be correct in some circumstances, but not here:
+it's a purely internal object that has no user relevance; hearing
+LAYERED PANE ZERO ITEMS every time a page in a PageRow is entered is
+confusing to screen reader users, they have typically no idea what it
+means, and if they do there is little they can do with this
+information. (I guess it indicates whether a modal layer is open, but in
+practice I couldn't seem to actually get this to work, and it seems
+better to indicate when a modal layer is open, not every single time
+when there isn't one - and that is a separate issue.)
+
+Instead we can set its role explicitly to Pane, that marks it as a
+filler in Accerciser and orca does not read it out every time.
+---
+ src/controls/PageRow.qml | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/controls/PageRow.qml b/src/controls/PageRow.qml
+index 99e8883c68..9fba38fbe8 100644
+--- a/src/controls/PageRow.qml
++++ b/src/controls/PageRow.qml
+@@ -698,6 +698,7 @@ QT.Control {
+     QQC2.StackView {
+         id: layersStack
+         z: 99
++        Accessible.role: Accessible.Pane
+         anchors {
+             left: parent.left
+             top: layerToolbarStack.bottom
+-- 
+GitLab
+
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_5bf798c3_Fix-ActionTextField-RTL.patch kf6-kirigami-6.13.0/debian/patches/upstream_5bf798c3_Fix-ActionTextField-RTL.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_5bf798c3_Fix-ActionTextField-RTL.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_5bf798c3_Fix-ActionTextField-RTL.patch	2025-05-20 08:36:42.000000000 +0200
@@ -0,0 +1,86 @@
+From 5bf798c37c712bd36abdb5eb9ed70be21975d534 Mon Sep 17 00:00:00 2001
+From: Nate Graham <nate@kde.org>
+Date: Tue, 13 May 2025 19:53:34 -0600
+Subject: [PATCH] Fix ActionTextField RTL
+
+This got broken in d8cbb0fd050861a0e08fd45192d311b65d2d4dc3, which was
+not technically correct; if it worked at the time, it broke since then.
+
+This reverts d8cbb0fd050861a0e08fd45192d311b65d2d4dc3
+
+BUG: 504091
+FIXED-IN: 6.15
+---
+ src/controls/ActionTextField.qml | 11 +++++------
+ src/controls/SearchField.qml     |  7 +++----
+ 2 files changed, 8 insertions(+), 10 deletions(-)
+
+diff --git a/src/controls/ActionTextField.qml b/src/controls/ActionTextField.qml
+index cda63ad76..ae64d3500 100644
+--- a/src/controls/ActionTextField.qml
++++ b/src/controls/ActionTextField.qml
+@@ -79,11 +79,12 @@ QQC2.TextField {
+ 
+     hoverEnabled: true
+ 
+-    // Manually setting this fixes alignment in RTL layouts
+-    horizontalAlignment: TextInput.AlignLeft
++    horizontalAlignment: Qt.AlignLeft
++    LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
++    LayoutMirroring.childrenInherit: true
+ 
+-    leftPadding: Kirigami.Units.smallSpacing + (root.effectiveHorizontalAlignment === TextInput.AlignRight ? rightActionsRow : leftActionsRow).width
+-    rightPadding: Kirigami.Units.smallSpacing + (root.effectiveHorizontalAlignment === TextInput.AlignRight ? leftActionsRow : rightActionsRow).width
++    leftPadding: Kirigami.Units.smallSpacing + (LayoutMirroring.enabled ? rightActionsRow : leftActionsRow).width
++    rightPadding: Kirigami.Units.smallSpacing + (LayoutMirroring.enabled ? leftActionsRow : rightActionsRow).width
+ 
+     Behavior on leftPadding {
+         NumberAnimation {
+@@ -164,7 +165,6 @@ QQC2.TextField {
+         padding: Kirigami.Units.smallSpacing
+         spacing: Kirigami.Units.smallSpacing
+         layoutDirection: Qt.LeftToRight
+-        LayoutMirroring.enabled: root.effectiveHorizontalAlignment === TextInput.AlignRight
+         anchors.left: parent.left
+         anchors.leftMargin: Kirigami.Units.smallSpacing
+         anchors.top: parent.top
+@@ -182,7 +182,6 @@ QQC2.TextField {
+         padding: Kirigami.Units.smallSpacing
+         spacing: Kirigami.Units.smallSpacing
+         layoutDirection: Qt.RightToLeft
+-        LayoutMirroring.enabled: root.effectiveHorizontalAlignment === TextInput.AlignRight
+         anchors.right: parent.right
+         anchors.rightMargin: Kirigami.Units.smallSpacing
+         anchors.top: parent.top
+diff --git a/src/controls/SearchField.qml b/src/controls/SearchField.qml
+index b130827e2..426da6056 100644
+--- a/src/controls/SearchField.qml
++++ b/src/controls/SearchField.qml
+@@ -59,12 +59,12 @@ Kirigami.ActionTextField {
+     property bool delaySearch: false
+ 
+     // padding to accommodate search icon nicely
+-    leftPadding: if (effectiveHorizontalAlignment === TextInput.AlignRight) {
++    leftPadding: if (Qt.application.layoutDirection === Qt.RightToLeft) {
+         return _rightActionsRow.width + Kirigami.Units.smallSpacing
+     } else {
+         return searchIcon.width + Kirigami.Units.smallSpacing * 3
+     }
+-    rightPadding: if (effectiveHorizontalAlignment === TextInput.AlignRight) {
++    rightPadding: if (Qt.application.layoutDirection === Qt.RightToLeft) {
+         return searchIcon.width + Kirigami.Units.smallSpacing * 3
+     } else {
+         return _rightActionsRow.width + Kirigami.Units.smallSpacing
+@@ -93,8 +93,7 @@ Kirigami.ActionTextField {
+     EnterKey.type: Qt.EnterKeySearch
+     rightActions: [
+         Kirigami.Action {
+-            //ltr confusingly refers to the direction of the arrow in the icon, not the text direction which it should be used in
+-            icon.name: root.effectiveHorizontalAlignment === TextInput.AlignRight ? "edit-clear-locationbar-ltr" : "edit-clear-locationbar-rtl"
++            icon.name: root.LayoutMirroring.enabled ? "edit-clear-locationbar-ltr" : "edit-clear-locationbar-rtl"
+             visible: root.text.length > 0
+             text: qsTr("Clear search")
+             onTriggered: {
+-- 
+GitLab
+
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_81352c22_layout-Set-implicit-width-of-ToolBarLayout-before-using-its-width.patch kf6-kirigami-6.13.0/debian/patches/upstream_81352c22_layout-Set-implicit-width-of-ToolBarLayout-before-using-its-width.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_81352c22_layout-Set-implicit-width-of-ToolBarLayout-before-using-its-width.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_81352c22_layout-Set-implicit-width-of-ToolBarLayout-before-using-its-width.patch	2025-05-16 18:08:50.000000000 +0200
@@ -0,0 +1,41 @@
+From 81352c225ce742e373130eb2fc808e0b4a8f4eeb Mon Sep 17 00:00:00 2001
+From: Arjen Hiemstra <ahiemstra@heimr.nl>
+Date: Mon, 7 Apr 2025 17:21:41 +0200
+Subject: [PATCH] layout: Set implicit width of ToolBarLayout before using its
+ width
+
+Split setting implicit size into setting width and height separately, so
+that we if we use width() it will use the implicit width if no width was
+set yet. This avoids us hiding all actions because width is 0, only to
+then show them again because implicit width (and thus width) is now a
+valid value.
+---
+ src/layouts/toolbarlayout.cpp | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/src/layouts/toolbarlayout.cpp b/src/layouts/toolbarlayout.cpp
+index dce591be3..2e214c2be 100644
+--- a/src/layouts/toolbarlayout.cpp
++++ b/src/layouts/toolbarlayout.cpp
+@@ -441,6 +441,8 @@ void ToolBarLayoutPrivate::calculateImplicitSize()
+ 
+     visibleActionsWidth = 0.0;
+ 
++    q->setImplicitWidth(maxWidth);
++
+     if (maxWidth > q->width() - (hiddenActions.isEmpty() ? 0.0 : moreButtonInstance->width() + spacing)) {
+         // We have more items than fit into the view, so start hiding some.
+ 
+@@ -473,7 +475,8 @@ void ToolBarLayoutPrivate::calculateImplicitSize()
+         maxHeight = std::max(maxHeight, moreButtonInstance->implicitHeight());
+     };
+ 
+-    q->setImplicitSize(maxWidth, maxHeight);
++    q->setImplicitHeight(maxHeight);
++
+     Q_EMIT q->hiddenActionsChanged();
+ 
+     implicitSizeValid = true;
+-- 
+GitLab
+
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_82abc769_controls-Fix-link-activation-for-text-of-InlineMessage.patch kf6-kirigami-6.13.0/debian/patches/upstream_82abc769_controls-Fix-link-activation-for-text-of-InlineMessage.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_82abc769_controls-Fix-link-activation-for-text-of-InlineMessage.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_82abc769_controls-Fix-link-activation-for-text-of-InlineMessage.patch	2025-05-16 18:14:39.000000000 +0200
@@ -0,0 +1,68 @@
+From 82abc7690b79556499d5ae25b223ca358618c72f Mon Sep 17 00:00:00 2001
+From: Arjen Hiemstra <ahiemstra@heimr.nl>
+Date: Mon, 7 Apr 2025 17:26:11 +0200
+Subject: [PATCH] controls: Fix link activation for text of InlineMessage
+
+Rather than stretching both the label and toolbar across the entire
+inline message, use implicit width for both, unless either would become
+larger than the InlineMessage width. Most importantly, since the toolbar
+only takes space that is not used by the text, this avoids links in the
+text not working correctly.
+
+BUG: 500578
+---
+ src/controls/templates/InlineMessage.qml | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+diff --git a/src/controls/templates/InlineMessage.qml b/src/controls/templates/InlineMessage.qml
+index 6781c437e3..ecf3b66556 100644
+--- a/src/controls/templates/InlineMessage.qml
++++ b/src/controls/templates/InlineMessage.qml
+@@ -216,13 +216,9 @@ T.Control {
+ 
+         Accessible.ignored: true
+ 
+-        readonly property real remainingWidth: width - (
+-            icon.width
+-            + label.anchors.leftMargin + label.implicitWidth + label.anchors.rightMargin
+-            + (root.showCloseButton ? closeButton.width : 0)
+-        )
++        readonly property real fixedContentWidth: icon.width + Kirigami.Units.smallSpacing * 3 + (root.showCloseButton ? closeButton.width + Kirigami.Units.smallSpacing : 0)
++        readonly property real remainingWidth: width - fixedContentWidth - label.implicitWidth
+         readonly property bool multiline: remainingWidth <= 0 || atBottom
+-
+         readonly property bool atBottom: (root.actions.length > 0) && (label.lineCount > 1 || actionsLayout.implicitWidth > remainingWidth)
+ 
+         Kirigami.Icon {
+@@ -302,11 +298,11 @@ T.Control {
+             anchors {
+                 left: icon.right
+                 leftMargin: Kirigami.Units.largeSpacing
+-                right: root.showCloseButton ? closeButton.left : parent.right
+-                rightMargin: root.showCloseButton ? Kirigami.Units.smallSpacing : 0
+                 top: parent.top
+             }
+ 
++            width: Math.min(parent.width - parent.fixedContentWidth, implicitWidth)
++
+             color: Kirigami.Theme.textColor
+             wrapMode: Text.WordWrap
+ 
+@@ -358,12 +354,13 @@ T.Control {
+             alignment: Qt.AlignRight
+ 
+             anchors {
+-                left: parent.left
+                 top: contentLayout.atBottom ? label.bottom : parent.top
+                 topMargin: contentLayout.atBottom ? Kirigami.Units.largeSpacing : 0
+                 right: (!contentLayout.atBottom && root.showCloseButton) ? closeButton.left : parent.right
+                 rightMargin: !contentLayout.atBottom && root.showCloseButton ? Kirigami.Units.smallSpacing : 0
+             }
++
++            width: Math.min(implicitWidth, parent.width)
+         }
+ 
+         QQC2.ToolButton {
+-- 
+GitLab
+
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_bae0957d_controls-Remove-redundant-states-from-InlineMessage.patch kf6-kirigami-6.13.0/debian/patches/upstream_bae0957d_controls-Remove-redundant-states-from-InlineMessage.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_bae0957d_controls-Remove-redundant-states-from-InlineMessage.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_bae0957d_controls-Remove-redundant-states-from-InlineMessage.patch	2025-05-16 18:15:04.000000000 +0200
@@ -0,0 +1,89 @@
+From bae0957d48d1f6c5d46dde05c5edb4bf709da519 Mon Sep 17 00:00:00 2001
+From: Arjen Hiemstra <ahiemstra@heimr.nl>
+Date: Tue, 8 Apr 2025 11:12:26 +0200
+Subject: [PATCH] controls: Remove redundant states from InlineMessage
+
+States describe changes from a base state. The base state can just be
+declared normally, there is no need to declare it as a separate state.
+This fixes centering the close button in single-line inline messages,
+because the "centered" state was never activated.
+---
+ src/controls/templates/InlineMessage.qml | 44 +++++++-----------------
+ 1 file changed, 13 insertions(+), 31 deletions(-)
+
+diff --git a/src/controls/templates/InlineMessage.qml b/src/controls/templates/InlineMessage.qml
+index f8a868891..f293c4b1e 100644
+--- a/src/controls/templates/InlineMessage.qml
++++ b/src/controls/templates/InlineMessage.qml
+@@ -300,6 +300,7 @@ T.Control {
+                 left: icon.right
+                 leftMargin: Kirigami.Units.largeSpacing
+                 top: parent.top
++                bottom: parent.bottom
+             }
+ 
+             width: Math.min(parent.width - parent.fixedContentWidth, implicitWidth)
+@@ -326,16 +327,6 @@ T.Control {
+                         target: label
+                         height: label.implicitHeight
+                     }
+-                },
+-                // States are evaluated in the order they are declared.
+-                // This is a fallback state.
+-                State {
+-                    name: "single-line"
+-                    when: true
+-                    AnchorChanges {
+-                        target: label
+-                        anchors.bottom: label.parent.bottom
+-                    }
+                 }
+             ]
+ 
+@@ -368,31 +359,22 @@ T.Control {
+ 
+             visible: root.showCloseButton
+ 
+-            anchors.right: parent.right
++            anchors {
++                verticalCenter: parent.verticalCenter
++                right: parent.right
++            }
+ 
+             // Incompatible anchors need to be evaluated in a given order,
+             // which simple declarative bindings cannot assure
+-            states: [
+-                State {
+-                    name: "onTop"
+-                    when: contentLayout.atBottom
+-                    AnchorChanges {
+-                        target: closeButton
+-                        anchors.top: parent.top
+-                        anchors.verticalCenter: undefined
+-                    }
+-                } ,
+-                State {
+-                    name: "centered"
+-                    AnchorChanges {
+-                        target: closeButton
+-                        anchors.top: undefined
+-                        anchors.verticalCenter: parent.verticalCenter
+-                    }
++            states: State {
++                name: "onTop"
++                when: contentLayout.atBottom
++                AnchorChanges {
++                    target: closeButton
++                    anchors.top: parent.top
++                    anchors.verticalCenter: undefined
+                 }
+-            ]
+-
+-            height: contentLayout.atBottom ? implicitHeight : implicitHeight
++            }
+ 
+             text: qsTr("Close")
+             display: QQC2.ToolButton.IconOnly
+-- 
+GitLab
+
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_bf7ead57_tst-scrolling-qml-don-t-set-default-angle-delta-to-verticalStepSize-don-t-test-if-smooth-scrolling-is-enabled-when-testing-angle-delta-moves.patch kf6-kirigami-6.13.0/debian/patches/upstream_bf7ead57_tst-scrolling-qml-don-t-set-default-angle-delta-to-verticalStepSize-don-t-test-if-smooth-scrolling-is-enabled-when-testing-angle-delta-moves.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_bf7ead57_tst-scrolling-qml-don-t-set-default-angle-delta-to-verticalStepSize-don-t-test-if-smooth-scrolling-is-enabled-when-testing-angle-delta-moves.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_bf7ead57_tst-scrolling-qml-don-t-set-default-angle-delta-to-verticalStepSize-don-t-test-if-smooth-scrolling-is-enabled-when-testing-angle-delta-moves.patch	2025-05-16 18:19:41.000000000 +0200
@@ -0,0 +1,99 @@
+From bf7ead578d39c9b279c5fd8f4e458923280a4dcb Mon Sep 17 00:00:00 2001
+From: Noah Davis <noahadvs@gmail.com>
+Date: Mon, 14 Apr 2025 13:54:25 -0400
+Subject: [PATCH] tst_scrolling.qml: don't set default angle delta to
+ verticalStepSize, don't test if smooth scrolling is enabled when testing
+ angle delta moves
+
+While arbitrary angle deltas are allowed, setting the default angle delta size to verticalStepSize is not semantically correct because verticalStepSize is not an angle delta.
+
+We shouldn't make more assumptions about WheelHandler's internal logic than necessary since there is already a way to avoid failing the test when smooth scrolling is enabled.
+---
+ autotests/wheelhandler/tst_scrolling.qml | 50 +++++-------------------
+ 1 file changed, 9 insertions(+), 41 deletions(-)
+
+diff --git a/autotests/wheelhandler/tst_scrolling.qml b/autotests/wheelhandler/tst_scrolling.qml
+index 425dcc995..bde386655 100644
+--- a/autotests/wheelhandler/tst_scrolling.qml
++++ b/autotests/wheelhandler/tst_scrolling.qml
+@@ -24,36 +24,20 @@ TestCase {
+     width: flickable.implicitWidth
+     height: flickable.implicitHeight
+ 
+-    function wheelScrolling(angleDelta = wheelHandler.verticalStepSize) {
++    function wheelScrolling(angleDelta = 120) {
+         let x = flickable.contentX
+         let y = flickable.contentY
+         const angleDeltaFactor = angleDelta / 120
+         mouseWheel(flickable, flickable.leftMargin, 0, -angleDelta, -angleDelta, Qt.NoButton)
+-        if (angleDelta === wheelHandler.verticalStepSize) {
+-            tryCompare(flickable, "contentX", Math.round(x + hstep * angleDeltaFactor), Kirigami.Units.longDuration * 2, "+xTick")
+-        } else {
+-            compare(flickable.contentX, Math.round(x + hstep * angleDeltaFactor), "+xTick")
+-        }
++        tryCompare(flickable, "contentX", Math.round(x + hstep * angleDeltaFactor), Kirigami.Units.longDuration * 2, "+xTick")
+         x = flickable.contentX
+-        if (angleDelta === wheelHandler.verticalStepSize) {
+-            tryCompare(flickable, "contentY", Math.round(y + vstep * angleDeltaFactor), Kirigami.Units.longDuration * 2, "+yTick")
+-        } else {
+-            compare(flickable.contentY, Math.round(y + vstep * angleDeltaFactor), "+yTick")
+-        }
++        tryCompare(flickable, "contentY", Math.round(y + vstep * angleDeltaFactor), Kirigami.Units.longDuration * 2, "+yTick")
+         y = flickable.contentY
+ 
+         mouseWheel(flickable, flickable.leftMargin, 0, angleDelta, angleDelta, Qt.NoButton)
+-        if (angleDelta === wheelHandler.verticalStepSize) {
+-            tryCompare(flickable, "contentX", Math.round(x - hstep * angleDeltaFactor), Kirigami.Units.longDuration * 2, "-xTick")
+-        } else {
+-            compare(flickable.contentX, Math.round(x - hstep * angleDeltaFactor), "-xTick")
+-        }
++        tryCompare(flickable, "contentX", Math.round(x - hstep * angleDeltaFactor), Kirigami.Units.longDuration * 2, "-xTick")
+         x = flickable.contentX
+-        if (angleDelta === wheelHandler.verticalStepSize) {
+-            tryCompare(flickable, "contentY", Math.round(y - vstep * angleDeltaFactor), Kirigami.Units.longDuration * 2, "-yTick")
+-        } else {
+-            compare(flickable.contentY, Math.round(y - vstep * angleDeltaFactor), "-yTick")
+-        }
++        tryCompare(flickable, "contentY", Math.round(y - vstep * angleDeltaFactor), Kirigami.Units.longDuration * 2, "-yTick")
+         y = flickable.contentY
+ 
+         if (Qt.platform.pluginName !== "xcb") {
+@@ -69,31 +53,15 @@ TestCase {
+         }
+ 
+         mouseWheel(flickable, flickable.leftMargin, 0, -angleDelta, -angleDelta, Qt.NoButton, wheelHandler.pageScrollModifiers)
+-        if (angleDelta === wheelHandler.verticalStepSize) {
+-            tryCompare(flickable, "contentX", Math.round(x + pageWidth * angleDeltaFactor), Kirigami.Units.longDuration * 2, "+xPage")
+-        } else {
+-            compare(flickable.contentX, Math.round(x + pageWidth * angleDeltaFactor), "+xPage")
+-        }
++        tryCompare(flickable, "contentX", Math.round(x + pageWidth * angleDeltaFactor), Kirigami.Units.longDuration * 2, "+xPage")
+         x = flickable.contentX
+-        if (angleDelta === wheelHandler.verticalStepSize) {
+-            tryCompare(flickable, "contentY", Math.round(y + pageHeight * angleDeltaFactor), Kirigami.Units.longDuration * 2, "+yPage")
+-        } else {
+-            compare(flickable.contentY, Math.round(y + pageHeight * angleDeltaFactor), "+yPage")
+-        }
++        tryCompare(flickable, "contentY", Math.round(y + pageHeight * angleDeltaFactor), Kirigami.Units.longDuration * 2, "+yPage")
+         y = flickable.contentY
+ 
+         mouseWheel(flickable, flickable.leftMargin, 0, angleDelta, angleDelta, Qt.NoButton, wheelHandler.pageScrollModifiers)
+-        if (angleDelta === wheelHandler.verticalStepSize) {
+-            tryCompare(flickable, "contentX", Math.round(x - pageWidth * angleDeltaFactor), Kirigami.Units.longDuration * 2, "-xPage")
+-        } else {
+-            compare(flickable.contentX, Math.round(x - pageWidth * angleDeltaFactor), "-xPage")
+-        }
++        tryCompare(flickable, "contentX", Math.round(x - pageWidth * angleDeltaFactor), Kirigami.Units.longDuration * 2, "-xPage")
+         x = flickable.contentX
+-        if (angleDelta === wheelHandler.verticalStepSize) {
+-            tryCompare(flickable, "contentY", Math.round(y - pageHeight * angleDeltaFactor), Kirigami.Units.longDuration * 2, "-yPage")
+-        } else {
+-            compare(flickable.contentY, Math.round(y - pageHeight * angleDeltaFactor), "-yPage")
+-        }
++        tryCompare(flickable, "contentY", Math.round(y - pageHeight * angleDeltaFactor), Kirigami.Units.longDuration * 2, "-yPage")
+         y = flickable.contentY
+ 
+         if (Qt.platform.pluginName !== "xcb") {
+-- 
+GitLab
+
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_d803ca35_SearchField-fix-RTL-search-icon-positioning.patch kf6-kirigami-6.13.0/debian/patches/upstream_d803ca35_SearchField-fix-RTL-search-icon-positioning.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_d803ca35_SearchField-fix-RTL-search-icon-positioning.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_d803ca35_SearchField-fix-RTL-search-icon-positioning.patch	2025-05-20 08:38:42.000000000 +0200
@@ -0,0 +1,30 @@
+From d803ca3583838eb9e4a6854763be45be91925523 Mon Sep 17 00:00:00 2001
+From: Nate Graham <nate@kde.org>
+Date: Thu, 8 May 2025 15:21:50 -0600
+Subject: [PATCH] SearchField fix RTL search icon positioning
+
+We're overriding the value of LayoutMirroring.enabled unnecessarily and
+incorrectly, causing the icon to always appear on the left regardless of
+RTL. Just let it cascade to this component normally.
+
+BUG: 503012
+FIXED-IN: 6.15
+---
+ src/controls/SearchField.qml | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/src/controls/SearchField.qml b/src/controls/SearchField.qml
+index 806871f56..b130827e2 100644
+--- a/src/controls/SearchField.qml
++++ b/src/controls/SearchField.qml
+@@ -72,7 +72,6 @@ Kirigami.ActionTextField {
+ 
+     Kirigami.Icon {
+         id: searchIcon
+-        LayoutMirroring.enabled: root.effectiveHorizontalAlignment === TextInput.AlignRight
+         anchors.left: root.left
+         anchors.leftMargin: Kirigami.Units.smallSpacing * 2
+         anchors.verticalCenter: root.verticalCenter
+-- 
+GitLab
+
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_e3c6af3b_layouts-Always-relayout-on-geometry-changes-in-ToolBarLayout.patch kf6-kirigami-6.13.0/debian/patches/upstream_e3c6af3b_layouts-Always-relayout-on-geometry-changes-in-ToolBarLayout.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_e3c6af3b_layouts-Always-relayout-on-geometry-changes-in-ToolBarLayout.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_e3c6af3b_layouts-Always-relayout-on-geometry-changes-in-ToolBarLayout.patch	2025-05-16 18:06:06.000000000 +0200
@@ -0,0 +1,31 @@
+From e3c6af3b9169f0abb5bad9c809e0065410c1f9c8 Mon Sep 17 00:00:00 2001
+From: Arjen Hiemstra <ahiemstra@heimr.nl>
+Date: Mon, 7 Apr 2025 17:15:24 +0200
+Subject: [PATCH] layouts: Always relayout on geometry changes in ToolBarLayout
+
+Otherwise we end up with several corner cases where the implicit width
+is the same as width but we still have actions hidden.
+---
+ src/layouts/toolbarlayout.cpp | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/src/layouts/toolbarlayout.cpp b/src/layouts/toolbarlayout.cpp
+index a4ef08265..dce591be3 100644
+--- a/src/layouts/toolbarlayout.cpp
++++ b/src/layouts/toolbarlayout.cpp
+@@ -348,11 +348,7 @@ void ToolBarLayout::componentComplete()
+ void ToolBarLayout::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
+ {
+     if (newGeometry != oldGeometry) {
+-        if (newGeometry.size() != QSizeF{implicitWidth(), implicitHeight()}) {
+-            relayout();
+-        } else {
+-            polish();
+-        }
++        relayout();
+     }
+     QQuickItem::geometryChange(newGeometry, oldGeometry);
+ }
+-- 
+GitLab
+
diff -Nru kf6-kirigami-6.13.0/debian/patches/upstream_fb21ee82_WheelHandler-smooth-scroll-for-a-greater-variety-of-movement-sizes.patch kf6-kirigami-6.13.0/debian/patches/upstream_fb21ee82_WheelHandler-smooth-scroll-for-a-greater-variety-of-movement-sizes.patch
--- kf6-kirigami-6.13.0/debian/patches/upstream_fb21ee82_WheelHandler-smooth-scroll-for-a-greater-variety-of-movement-sizes.patch	1970-01-01 01:00:00.000000000 +0100
+++ kf6-kirigami-6.13.0/debian/patches/upstream_fb21ee82_WheelHandler-smooth-scroll-for-a-greater-variety-of-movement-sizes.patch	2025-05-16 18:19:19.000000000 +0200
@@ -0,0 +1,125 @@
+From fb21ee822f448136bfa032e0da5faca6ffc82b72 Mon Sep 17 00:00:00 2001
+From: Noah Davis <noahadvs@gmail.com>
+Date: Mon, 14 Apr 2025 13:49:23 -0400
+Subject: [PATCH] WheelHandler: smooth scroll for a greater variety of movement
+ sizes
+
+Duration is based on the duration and movement for 120 angle delta.
+Shorten duration for smaller movements, limit duration for big movements.
+We don't want fine deltas to feel extra slow and fast scrolling should still feel fast.
+Minimum 3 frames for a 60hz display if delta > 2 physical pixels
+(start already rendered -> 1/3 rendered -> 2/3 rendered -> end rendered).
+Skip animation if <= 2 real frames for low refresh rate screens.
+Otherwise, we don't scale the duration based on refresh rate or
+device pixel ratio to avoid making the animation unexpectedly
+longer or shorter on different screens.
+
+BUG: 484309
+---
+ src/wheelhandler.cpp | 56 +++++++++++++++++++++++++-------------------
+ src/wheelhandler.h   |  1 -
+ 2 files changed, 32 insertions(+), 25 deletions(-)
+
+diff --git a/src/wheelhandler.cpp b/src/wheelhandler.cpp
+index f8734a1211..dc88b50de2 100644
+--- a/src/wheelhandler.cpp
++++ b/src/wheelhandler.cpp
+@@ -388,25 +388,12 @@ void WheelHandler::classBegin()
+     m_engine = qmlEngine(this);
+     m_units = m_engine->singletonInstance<Kirigami::Platform::Units *>("org.kde.kirigami.platform", "Units");
+     m_settings = m_engine->singletonInstance<Kirigami::Platform::Settings *>("org.kde.kirigami.platform", "Settings");
+-    initSmoothScrollDuration();
+-
+-    connect(m_units, &Kirigami::Platform::Units::longDurationChanged, this, &WheelHandler::initSmoothScrollDuration);
+-    connect(m_settings, &Kirigami::Platform::Settings::smoothScrollChanged, this, &WheelHandler::initSmoothScrollDuration);
+ }
+ 
+ void WheelHandler::componentComplete()
+ {
+ }
+ 
+-void WheelHandler::initSmoothScrollDuration()
+-{
+-    if (m_settings->smoothScroll()) {
+-        m_yScrollAnimation.setDuration(m_units->longDuration());
+-    } else {
+-        m_yScrollAnimation.setDuration(0);
+-    }
+-}
+-
+ void WheelHandler::setScrolling(bool scrolling)
+ {
+     if (m_wheelScrolling == scrolling) {
+@@ -514,11 +501,39 @@ bool WheelHandler::scrollFlickable(QPointF pixelDelta, QPointF angleDelta, Qt::K
+         newContentY = std::round(newContentY * devicePixelRatio) / devicePixelRatio;
+         if (contentY != newContentY) {
+             scrolled = true;
+-            if (m_wasTouched || !m_engine) {
+-                m_flickable->setProperty("contentY", newContentY);
++            // Can't use wheelEvent->deviceType() to determine device type since
++            // on Wayland mouse is always regarded as touchpad:
++            // https://invent.kde.org/qt/qt/qtwayland/-/blob/e695a39519a7629c1549275a148cfb9ab99a07a9/src/client/qwaylandinputdevice.cpp#L445
++            // Mouse wheel can generate angle delta like 240, 360 and so on when
++            // scrolling very fast on some mice such as the Logitech M150.
++            // Mice with hi-res mouse wheels such as the Logitech MX Master 3 can
++            // generate angle deltas as small as 16.
++            // On X11, trackpads can also generate very fine angle deltas.
++            qreal refreshRate = window && window->screen() ? window->screen()->refreshRate() : 0;
++            if (m_settings->smoothScroll() && m_engine && refreshRate > 0) {
++                // Duration is based on the duration and movement for 120 angle delta.
++                // Shorten duration for smaller movements, limit duration for big movements.
++                // We don't want fine deltas to feel extra slow and fast scrolling should still feel fast.
++                // Minimum 3 frames for a 60hz display if delta > 2 physical pixels
++                // (start already rendered -> 1/3 rendered -> 2/3 rendered -> end rendered).
++                // Skip animation if <= 2 real frames for low refresh rate screens.
++                // Otherwise, we don't scale the duration based on refresh rate or
++                // device pixel ratio to avoid making the animation unexpectedly
++                // longer or shorter on different screens.
++                qreal absPixelDelta = std::abs(newContentY - contentY);
++                int duration = absPixelDelta * devicePixelRatio > 2 //
++                    ? std::clamp(qRound(absPixelDelta * m_units->longDuration() / m_verticalStepSize), qCeil(1000.0 / 60.0 * 3), m_units->longDuration())
++                    : 0;
++                m_yScrollAnimation.setDuration(duration <= qCeil(1000.0 / refreshRate * 2) ? 0 : duration);
++                if (m_yScrollAnimation.duration() > 0) {
++                    m_yScrollAnimation.setEndValue(newContentY);
++                    m_yScrollAnimation.start(QAbstractAnimation::KeepWhenStopped);
++                } else {
++                    m_flickable->setProperty("contentY", newContentY);
++                }
+             } else {
+-                m_yScrollAnimation.setEndValue(newContentY);
+-                m_yScrollAnimation.start(QAbstractAnimation::KeepWhenStopped);
++                m_yScrollAnimation.setDuration(0);
++                m_flickable->setProperty("contentY", newContentY);
+             }
+         }
+     }
+@@ -602,13 +617,6 @@ bool WheelHandler::eventFilter(QObject *watched, QEvent *event)
+         }
+         QWheelEvent *wheelEvent = static_cast<QWheelEvent *>(event);
+ 
+-        // Can't use wheelEvent->deviceType() to determine device type since on Wayland mouse is always regarded as touchpad
+-        // https://invent.kde.org/qt/qt/qtwayland/-/blob/e695a39519a7629c1549275a148cfb9ab99a07a9/src/client/qwaylandinputdevice.cpp#L445
+-        // and we can only expect a touchpad never generates the same angle delta as a mouse
+-
+-        // mouse wheel can also generate angle delta like 240, 360 and so on when scrolling very fast
+-        // only checking wheelEvent->angleDelta().y() because we only animate for contentY
+-        m_wasTouched = (std::abs(wheelEvent->angleDelta().y()) != 0 && std::abs(wheelEvent->angleDelta().y()) % 120 != 0);
+         // NOTE: On X11 with libinput, pixelDelta is identical to angleDelta when using a mouse that shouldn't use pixelDelta.
+         // If faulty pixelDelta, reset pixelDelta to (0,0).
+         if (wheelEvent->pixelDelta() == wheelEvent->angleDelta()) {
+diff --git a/src/wheelhandler.h b/src/wheelhandler.h
+index 70ff9d9c78..b1a4d269fa 100644
+--- a/src/wheelhandler.h
++++ b/src/wheelhandler.h
+@@ -361,7 +361,6 @@ private Q_SLOTS:
+ private:
+     void classBegin() override;
+     void componentComplete() override;
+-    void initSmoothScrollDuration();
+ 
+     void setScrolling(bool scrolling);
+     bool scrollFlickable(QPointF pixelDelta, QPointF angleDelta = {}, Qt::KeyboardModifiers modifiers = Qt::NoModifier);
+-- 
+GitLab
+

--- End Message ---
--- Begin Message ---
Unblocked.

--- End Message ---

Reply to: