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;
};