File 0002-test-desktop-icons.patch of Package plasma6-desktop

diff -uprN plasma-desktop-6.5.3-orig/containments/desktop/plugins/folder/foldermodel.cpp plasma-desktop-6.5.3/containments/desktop/plugins/folder/foldermodel.cpp
--- plasma-desktop-6.5.3-orig/containments/desktop/plugins/folder/foldermodel.cpp	2025-11-18 09:03:47.000000000 +0100
+++ plasma-desktop-6.5.3/containments/desktop/plugins/folder/foldermodel.cpp	2025-12-01 21:26:32.087300781 +0100
@@ -762,14 +762,18 @@ void FolderModel::setFilterMimeTypes(con
     }
 }
 
-void FolderModel::setScreen(int screen)
+void FolderModel::setScreen(int screen, bool moveIcons)
 {
     bool screenUsed = (screen != -1);
 
     if (screenUsed && m_screen != screen) {
+        const int prevScreen = m_screen;
         m_screen = screen;
         if (m_usedByContainment && !m_screenMapper->sharedDesktops()) {
             m_screenMapper->addScreen(screen, m_currentActivity, resolvedUrl());
+            if (moveIcons && prevScreen > -1 && screen > -1) {
+                m_screenMapper->addScreenTransition(prevScreen, screen, m_currentActivity);
+            }
         }
     }
     m_screenUsed = screenUsed;
@@ -1708,6 +1712,7 @@ bool FolderModel::filterAcceptsRow(int s
             // time we see it or the folderview was previously used as a regular applet.
             // Associated with this folderview if the view is on the first available screen
             if (m_screen == m_screenMapper->firstAvailableScreen(resolvedUrl(), m_currentActivity)) {
+                m_screenMapper->maybeMoveToDisabledScreens(url, m_currentActivity);
                 m_screenMapper->addMapping(url, m_screen, m_currentActivity, ScreenMapper::DelayedSignal);
             } else {
                 return false;
@@ -2215,7 +2220,9 @@ void FolderModel::setApplet(Plasma::Appl
                     m_screenMapper->setCorona(corona);
                 }
                 setScreen(containment->screen());
-                connect(containment, &Plasma::Containment::screenChanged, this, &FolderModel::setScreen);
+                connect(containment, &Plasma::Containment::screenChanged, this, [this](int newScreen) {
+                    setScreen(newScreen, true);
+                });
                 connect(containment, &Plasma::Containment::screenGeometryChanged, this, &FolderModel::screenGeometryChanged);
                 connect(containment, &Plasma::Containment::availableRelativeScreenRectChanged, this, &FolderModel::availableRelativeScreenRectChanged);
             }
diff -uprN plasma-desktop-6.5.3-orig/containments/desktop/plugins/folder/foldermodel.h plasma-desktop-6.5.3/containments/desktop/plugins/folder/foldermodel.h
--- plasma-desktop-6.5.3-orig/containments/desktop/plugins/folder/foldermodel.h	2025-11-18 09:03:47.000000000 +0100
+++ plasma-desktop-6.5.3/containments/desktop/plugins/folder/foldermodel.h	2025-12-01 21:22:35.468294759 +0100
@@ -252,7 +252,7 @@ public:
 
     bool screenUsed();
 
-    void setScreen(int screen);
+    void setScreen(int screen, bool moveIcons = false);
 
     QRectF screenGeometry();
 
diff -uprN plasma-desktop-6.5.3-orig/containments/desktop/plugins/folder/screenmapper.cpp plasma-desktop-6.5.3/containments/desktop/plugins/folder/screenmapper.cpp
--- plasma-desktop-6.5.3-orig/containments/desktop/plugins/folder/screenmapper.cpp	2025-11-18 09:03:47.000000000 +0100
+++ plasma-desktop-6.5.3/containments/desktop/plugins/folder/screenmapper.cpp	2025-12-01 21:22:35.468506997 +0100
@@ -42,11 +42,17 @@ ScreenMapper *ScreenMapper::instance()
 ScreenMapper::ScreenMapper(QObject *parent)
     : QObject(parent)
     , m_screenMappingChangedTimer(new QTimer(this))
+    , m_screenTransitionTimer(new QTimer(this))
 
 {
     connect(m_screenMappingChangedTimer, &QTimer::timeout, this, &ScreenMapper::screenMappingChanged);
 
     connect(this, &ScreenMapper::screenMappingChanged, this, [this] {
+        if (m_disabledScreensMapDirty) {
+            saveDisabledScreensMap();
+            m_disabledScreensMapDirty = false;
+        }
+
         if (!m_corona)
             return;
 
@@ -61,6 +67,10 @@ ScreenMapper::ScreenMapper(QObject *pare
     // that doesn't delay too much the signal, but still compresses as much as possible
     m_screenMappingChangedTimer->setInterval(100ms);
     m_screenMappingChangedTimer->setSingleShot(true);
+
+    m_screenTransitionTimer->setInterval(0);
+    m_screenTransitionTimer->setSingleShot(true);
+    m_screenTransitionTimer->callOnTimeout(this, &ScreenMapper::processScreenTransition);
 }
 
 void ScreenMapper::removeScreen(int screenId, const QString &activity, const QUrl &screenUrl)
@@ -160,6 +170,17 @@ void ScreenMapper::addScreen(int screenI
     Q_EMIT screensChanged();
 }
 
+void ScreenMapper::maybeMoveToDisabledScreens(const QUrl &url, const QString &activity)
+{
+    if (auto it = m_screenItemMap.find(std::make_pair(url, activity)); it != m_screenItemMap.end() && it.value() > -1) {
+        m_itemsOnDisabledScreensMap[std::make_pair(it.value(), activity)].insert(url);
+        m_screenItemMap.erase(it);
+        m_disabledScreensMapDirty = true;
+
+        m_screenMappingChangedTimer->start();
+    }
+}
+
 void ScreenMapper::addMapping(const QUrl &url, int screen, const QString &activity, MappingSignalBehavior behavior)
 {
     if (m_screenItemMap.count() > MAX_MAPPING_COUNT) {
@@ -179,6 +200,7 @@ void ScreenMapper::addMapping(const QUrl
     if (behavior == DelayedSignal) {
         m_screenMappingChangedTimer->start();
     } else {
+        m_screenMappingChangedTimer->stop();
         Q_EMIT screenMappingChanged();
     }
 }
@@ -220,6 +242,16 @@ void ScreenMapper::removeItemFromDisable
     }
 }
 
+void ScreenMapper::addScreenTransition(int screenSrc, int screenDst, const QString &activity)
+{
+    Q_ASSERT(screenSrc > -1);
+    Q_ASSERT(screenDst > -1);
+
+    m_screenTransitions.push_back(std::make_tuple(screenSrc, screenDst, activity));
+
+    m_screenTransitionTimer->start();
+}
+
 void ScreenMapper::setSharedDesktop(bool sharedDesktops)
 {
     if (m_sharedDesktops != sharedDesktops) {
@@ -294,25 +326,14 @@ void ScreenMapper::setScreenMapping(cons
     Q_ASSERT(count % sizeOfParamGroup == 0);
 
     newMap.reserve(count / sizeOfParamGroup);
-    QMap<int, int> screenConsistencyMap;
     for (int i = 0; i < count - (sizeOfParamGroup - 1); i += sizeOfParamGroup) {
         if (i + (sizeOfParamGroup - 1) < count) {
             const QUrl url = QUrl::fromUserInput(mapping[i], {}, QUrl::AssumeLocalFile);
             const QString activity = mapping[i + 2];
             newMap[std::make_pair(url, activity)] = mapping[i + 1].toInt();
-            screenConsistencyMap[mapping[i + 1].toInt()] = -1;
         }
     }
 
-    int lastMappedScreen = 0;
-    for (int key : screenConsistencyMap.keys()) {
-        screenConsistencyMap[key] = lastMappedScreen++;
-    }
-
-    for (auto it = newMap.begin(); it != newMap.end(); it++) {
-        newMap[it.key()] = screenConsistencyMap.value(it.value());
-    }
-
     if (m_screenItemMap != newMap) {
         m_screenItemMap = newMap;
         Q_EMIT screenMappingChanged();
@@ -334,6 +355,36 @@ QUrl ScreenMapper::stringToUrl(const QSt
     return QUrl::fromUserInput(path, {}, QUrl::AssumeLocalFile);
 }
 
+void ScreenMapper::processScreenTransition()
+{
+    auto cleaner = qScopeGuard([this] {
+        m_screenTransitions.clear();
+    });
+
+    if (m_screenTransitions.size() != 2) {
+        return;
+    }
+
+    auto &&[screen1, screen2, activity] = m_screenTransitions.constFirst();
+    auto &&[screenTmp2, screenTmp1, activityTmp] = m_screenTransitions.constLast();
+    if (screen1 != screenTmp1 || screen2 != screenTmp2 || activity != activityTmp) {
+        return;
+    }
+
+    for (auto &&[pair, screen] : m_screenItemMap.asKeyValueRange()) {
+        if (pair.second != activity) {
+            continue;
+        }
+        if (screen == screen1) {
+            screen = screen2;
+        } else if (screen == screen2) {
+            screen = screen1;
+        }
+    }
+
+    m_screenMappingChangedTimer->start();
+}
+
 QStringList ScreenMapper::disabledScreensMap() const
 {
     QStringList serializedMap;
diff -uprN plasma-desktop-6.5.3-orig/containments/desktop/plugins/folder/screenmapper.h plasma-desktop-6.5.3/containments/desktop/plugins/folder/screenmapper.h
--- plasma-desktop-6.5.3-orig/containments/desktop/plugins/folder/screenmapper.h	2025-11-18 09:03:47.000000000 +0100
+++ plasma-desktop-6.5.3/containments/desktop/plugins/folder/screenmapper.h	2025-12-01 21:22:35.468729821 +0100
@@ -44,6 +44,7 @@ public:
     void setScreenMapping(const QStringList &mapping);
 
     int screenForItem(const QUrl &url, const QString &activity) const;
+    void maybeMoveToDisabledScreens(const QUrl &url, const QString &activity);
     void addMapping(const QUrl &url, int screen, const QString &activity, MappingSignalBehavior behavior = ImmediateSignal);
     void removeFromMap(const QUrl &url, const QString &activity);
     void setCorona(Plasma::Corona *corona);
@@ -53,6 +54,8 @@ public:
     int firstAvailableScreen(const QUrl &screenUrl, const QString &activity) const;
     void removeItemFromDisabledScreen(const QUrl &url);
 
+    void addScreenTransition(int screenSrc, int screenDst, const QString &activity);
+
     bool sharedDesktops() const
     {
         return m_sharedDesktops;
@@ -70,6 +73,8 @@ Q_SIGNALS:
     void screensChanged() const;
 
 private:
+    void processScreenTransition();
+
     /**
      * The format of DisabledScreensMap is:
      * - Screen ID (controlled by readingScreenId)
@@ -93,6 +98,9 @@ private:
     QPointer<Plasma::Corona> m_corona;
     QTimer *const m_screenMappingChangedTimer;
     bool m_sharedDesktops = false; // all screens share the same desktops, disabling the screen mapping
+    bool m_disabledScreensMapDirty = false;
+    QList<std::tuple<int /* screen src */, int /* screen dst */, QString /* activity ID */>> m_screenTransitions;
+    QTimer *const m_screenTransitionTimer;
 
     friend class ScreenMapperTest;
 };
openSUSE Build Service is sponsored by