Skip to content

Commit 44f422c

Browse files
JWWTSLBLumia
authored andcommitted
fix: Multi-screen launcher display anomaly
log: When retrieving wallpaper, the function GetCurrentWorkspaceBackgroundForMonitor was called using only the main screen or an incorrect screen name instead of the screen where the launcher currently resides. If this fails to return a valid result, the wallpaper won't update. Consequently, the appearance service consistently returns the main screen's wallpaper. pms: bug-343521
1 parent 57ef20e commit 44f422c

1 file changed

Lines changed: 24 additions & 12 deletions

File tree

src/ddeintegration/appearance.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,20 +65,32 @@ void Appearance::updateCurrentWallpaperBlurhash()
6565
return;
6666
}
6767

68-
// Use the current screen where the launcher is displayed
69-
// Priority: 1. LauncherController.currentScreen, 2. Dock position, 3. Cursor position, 4. Primary screen
70-
QString screenName = LauncherController::instance().currentScreen();
71-
if (screenName.isEmpty()) {
72-
// Try to get screen from dock position (launcher opens on the same screen as dock)
73-
QRect dockGeometry = DesktopIntegration::instance().dockGeometry();
74-
if (dockGeometry.isValid() && dockGeometry.x() >= 0) {
75-
QPoint dockCenter = dockGeometry.center();
76-
QScreen *screenAtDock = qApp->screenAt(dockCenter);
77-
if (screenAtDock) {
78-
screenName = screenAtDock->name();
79-
}
68+
// TODO: LauncherController.currentScreen is sometimes empty when read here (QML sets it from dock later),
69+
// so we fallback to dock geometry / cursor / primary. In practice we always hit dockGeometry; currentScreen
70+
// and dock are the same logical source. Could simplify to use only dock geometry first if desired.
71+
auto screenByName = [](const QString &name) -> QScreen * {
72+
if (name.isEmpty())
73+
return nullptr;
74+
for (QScreen *s : qApp->screens()) {
75+
if (s && s->name() == name)
76+
return s;
8077
}
78+
return nullptr;
79+
};
80+
QString requestedScreenName = LauncherController::instance().currentScreen();
81+
QScreen *targetScreen = screenByName(requestedScreenName);
82+
if (!targetScreen) {
83+
QRect dockGeometry = DesktopIntegration::instance().dockGeometry();
84+
if (dockGeometry.isValid() && dockGeometry.width() > 0 && dockGeometry.height() > 0)
85+
targetScreen = qApp->screenAt(dockGeometry.center());
8186
}
87+
if (!targetScreen)
88+
targetScreen = qApp->screenAt(QCursor::pos());
89+
if (!targetScreen)
90+
targetScreen = QGuiApplication::primaryScreen();
91+
QString screenName = targetScreen ? targetScreen->name() : QString();
92+
if (screenName.isEmpty() || !m_dbusAppearanceIface->isValid())
93+
return;
8294
qCDebug(logDdeIntegration) << "Getting wallpaper for screen:" << screenName;
8395
QDBusPendingReply<QString> async = m_dbusAppearanceIface->GetCurrentWorkspaceBackgroundForMonitor(screenName);
8496
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this);

0 commit comments

Comments
 (0)