diff options
author | Wolfgang Müller | 2024-10-13 16:51:28 +0200 |
---|---|---|
committer | Wolfgang Müller | 2024-10-13 16:51:28 +0200 |
commit | d3b0d8c75845d401425bd3bd9ef178d3936ade00 (patch) | |
tree | b853ecad0b4f6362f7e4812716655811c11e220f /desktop-plasma/patches | |
parent | a85974c177a9bde6f87c1facf7bd1472f4e13f27 (diff) | |
download | portage-roles-d3b0d8c75845d401425bd3bd9ef178d3936ade00.tar.gz |
desktop-plasma: Add patch fixing infinite loop in plasmashell
This fix has also been sent upstream [1] but won't be available in a
release any time soon.
[1] https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/2574
Diffstat (limited to 'desktop-plasma/patches')
-rw-r--r-- | desktop-plasma/patches/kde-plasma/plasma-desktop/0001-activitymanager-Avoid-infinite-loop-in-ActivityList.patch | 70 |
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 + |