summaryrefslogtreecommitdiffstats
path: root/desktop-plasma
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--desktop-plasma/patches/kde-plasma/plasma-desktop/0001-activitymanager-Avoid-infinite-loop-in-ActivityList.patch70
1 files changed, 70 insertions, 0 deletions
diff --git a/desktop-plasma/patches/kde-plasma/plasma-desktop/0001-activitymanager-Avoid-infinite-loop-in-ActivityList.patch b/desktop-plasma/patches/kde-plasma/plasma-desktop/0001-activitymanager-Avoid-infinite-loop-in-ActivityList.patch
new file mode 100644
index 0000000..977ce66
--- /dev/null
+++ b/desktop-plasma/patches/kde-plasma/plasma-desktop/0001-activitymanager-Avoid-infinite-loop-in-ActivityList.patch
@@ -0,0 +1,70 @@
+From 6ee8b63fa490477b03f4104ed91ab585c53d8001 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Wolfgang=20M=C3=BCller?= <wolf@oriole.systems>
+Date: Sat, 12 Oct 2024 14:39:03 +0200
+Subject: [PATCH] activitymanager: Avoid infinite loop in ActivityList
+
+When updating the selection in the activity manager we search through
+activities using using a do while loop. Each iteration of the loop
+increments or decrements selectedIndex depending on the search
+direction, wrapping around if needed. The loop stops only once we have
+found a visible item to select or if we have looped back to the item we
+started with. The latter is done by comparing selectedIndex with the
+index we started at, saved earlier in startingWithSelected.
+
+If the user triggers the activity manager and starts searching
+activities right away without first selecting one, startingWithSelected
+will remain at its initial value of -1. If there are no matches and the
+user then attempts to select the next or previous item, we will loop
+infinitely because there are no visible items and selectedIndex can
+never again equal -1. This infinite loop will hang the entirety of
+plasmashell.
+
+To fix this, keep track of how many items we have visited and forcibly
+break out of the loop if we have seen all activities (meaning that we
+have wrapped around). This does not rely on the value of either
+selectedIndex or startingWithSelected, meaning it also works if no
+activities are visible. We can also keep the old selection behaviour by
+setting selectedIndex to startingWithSelected right before we break.
+---
+ .../contents/activitymanager/ActivityList.qml | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+diff --git a/desktoppackage/contents/activitymanager/ActivityList.qml b/desktoppackage/contents/activitymanager/ActivityList.qml
+index 4b3402736..7a5cd7bab 100644
+--- a/desktoppackage/contents/activitymanager/ActivityList.qml
++++ b/desktoppackage/contents/activitymanager/ActivityList.qml
+@@ -28,9 +28,11 @@ Flickable {
+ function _selectRelativeToCurrent(distance)
+ {
+ var startingWithSelected = selectedIndex;
++ var visited = 0;
+
+ do {
+ selectedIndex += distance;
++ visited++;
+
+ if (selectedIndex >= activitiesList.count) {
+ selectedIndex = 0;
+@@ -40,11 +42,15 @@ Flickable {
+ selectedIndex = activitiesList.count - 1;
+ }
+
+- // Searching for the first item that is visible, or back to the one
+- // that we started with
+- } while (!activitiesList.itemAt(selectedIndex).visible
+- && startingWithSelected !== selectedIndex);
++ if (visited >= activitiesList.count) {
++ // we've visited all activities but could not find a visible
++ // one, so stop searching and select the one we started with
++ selectedIndex = startingWithSelected;
++ break;
++ }
+
++ // Searching for the first item that is visible
++ } while (!activitiesList.itemAt(selectedIndex).visible);
+ _updateSelectedItem();
+
+ }
+--
+2.47.0
+