https://invent.kde.org/plasma/plasma-desktop/-/commit/234cd860532449f017ecbbca6a8caad5473fcf8b From 234cd860532449f017ecbbca6a8caad5473fcf8b Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Sun, 25 Sep 2022 16:27:13 -0500 Subject: [PATCH] Use relayout locking This makes use of the layout locking freature introduced in The resize of the layout area can happen either by screen resolution change or available screen area change (a panel appears or is resized) This is not an atomic operation, as width and height are usually set in 2 different operations, and even worse the layout area is resized to match the available one with an animation, so many intermediate resizes that should never cause a relayout happen. A compression timer limits the actual relayouts to hopefully one, but if the system is really slowed down (for instance, startup) the timer may expire and cause relayouts in non useful sizes, losing the needed configuration The lock blocks all relayout and config writes when the size of the layout area doesn't correspond to corona availablescreenrect, which are the only "settled" cases. BUG:413645 --- a/containments/desktop/package/contents/ui/main.qml +++ b/containments/desktop/package/contents/ui/main.qml @@ -85,10 +85,10 @@ FolderViewDropArea { topMargin: (isContainment && plasmoid.availableScreenRect) ? plasmoid.availableScreenRect.y : 0 rightMargin: (isContainment && plasmoid.availableScreenRect) && parent - ? parent.width - (plasmoid.availableScreenRect.x + plasmoid.availableScreenRect.width) : 0 + ? Math.max(0, parent.width - (plasmoid.availableScreenRect.x + plasmoid.availableScreenRect.width)) : 0 bottomMargin: (isContainment && plasmoid.availableScreenRect) && parent - ? parent.height - (plasmoid.availableScreenRect.y + plasmoid.availableScreenRect.height) : 0 + ? Math.max(0, parent.height - (plasmoid.availableScreenRect.y + plasmoid.availableScreenRect.height)) : 0 } Behavior on anchors.topMargin { @@ -263,6 +263,7 @@ FolderViewDropArea { ContainmentLayoutManager.AppletsLayout { id: appletsLayout anchors.fill: parent + relayoutLock: width != plasmoid.availableScreenRect.width || height != plasmoid.availableScreenRect.height // NOTE: use plasmoid.availableScreenRect and not own width and height as they are updated not atomically configKey: "ItemGeometries-" + Math.round(plasmoid.screenGeometry.width) + "x" + Math.round(plasmoid.screenGeometry.height) fallbackConfigKey: plasmoid.availableScreenRect.width > plasmoid.availableScreenRect.height ? "ItemGeometriesHorizontal" : "ItemGeometriesVertical" GitLab