Bug#1107343: unblock: kf6-kirigami/6.13.0-2
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
+
Reply to: