From bb66d36c67a8e02bddf7f782a46fb1d3f877d00f Mon Sep 17 00:00:00 2001
From: Alexander Golubev <fatzer2@gmail.com>
Date: Mon, 23 Mar 2026 11:18:23 +0300
Subject: kcontrol/background: better support for old-school multihead setups

This fixes a couple of issues on "old-school multihead" X11 setups (with
several screens per display i.e. when DISPLAY has form ":x.y" also known
as "TDE_MULTIHEAD" or "Zaphod mode"):
* fixed an issue where on primary screen wallpaper is getting rendered
  for both secondary and primary on certain kdesktop configurations.
* fixed an issue on wallpaper config dialog where previews for two
  monitors were displayed overlapped.
---
 kcontrol/background/bgmonitor.cpp | 12 +++++++-----
 kcontrol/background/bgrender.cpp  |  7 ++++++-
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/kcontrol/background/bgmonitor.cpp b/kcontrol/background/bgmonitor.cpp
index fac987d9a..f1e6e3b54 100644
--- a/kcontrol/background/bgmonitor.cpp
+++ b/kcontrol/background/bgmonitor.cpp
@@ -40,12 +40,14 @@
 BGMonitorArrangement::BGMonitorArrangement(TQWidget *parent, const char *name)
     : TQWidget(parent, name)
 {
-    m_pBGMonitor.resize( TQApplication::desktop()->numScreens(), 0l );
+    TQDesktopWidget *desktop = TQApplication::desktop();
+    int numScreens = desktop->isVirtualDesktop() ? TQApplication::desktop()->numScreens() : 1;
+    m_pBGMonitor.reserve(numScreens);
 
-    for (int screen = 0; screen < TQApplication::desktop()->numScreens(); ++screen)
+    for (int screen = 0; screen < numScreens; ++screen)
     {
         BGMonitorLabel * label = new BGMonitorLabel(this);
-        m_pBGMonitor[screen] = label;
+        m_pBGMonitor.push_back(label);
 
         connect( label->monitor(), TQ_SIGNAL(imageDropped(const TQString &)), this, TQ_SIGNAL(imageDropped(const TQString &)) );
     }
@@ -94,7 +96,7 @@ void BGMonitorArrangement::updateArrangement()
     // will set the background preview back to the normal value.
 
     TQRect overallGeometry;
-    for (int screen = 0; screen < TQApplication::desktop()->numScreens(); ++screen)
+    for (size_t screen = 0; screen < m_pBGMonitor.size(); ++screen)
         overallGeometry |= TQApplication::desktop()->screenGeometry(screen);
 
     TQRect expandedOverallGeometry = expandToPreview(overallGeometry);
@@ -109,7 +111,7 @@ void BGMonitorArrangement::updateArrangement()
     m_maxPreviewSize = TQSize(0,0);
     int previousMax = 0;
 
-    for (int screen = 0; screen < TQApplication::desktop()->numScreens(); ++screen)
+    for (int screen = 0; screen <  m_pBGMonitor.size(); ++screen)
     {
         TQPoint topLeft = (TQApplication::desktop()->screenGeometry(screen).topLeft() - overallGeometry.topLeft()) * scale;
         TQPoint expandedTopLeft = expandToPreview(topLeft);
diff --git a/kcontrol/background/bgrender.cpp b/kcontrol/background/bgrender.cpp
index 9ec5a31fa..bba83a29c 100644
--- a/kcontrol/background/bgrender.cpp
+++ b/kcontrol/background/bgrender.cpp
@@ -1206,7 +1206,12 @@ void KVirtualBGRenderer::initRenderers()
 
     m_bCommonScreen = m_pConfig->readBoolEntry("CommonScreen", _defCommonScreen);
 
-    m_numRenderers = m_bDrawBackgroundPerScreen ? TDEApplication::desktop()->numScreens() : 1;
+    if (m_bDrawBackgroundPerScreen && TDEApplication::desktop()->isVirtualDesktop()) {
+        m_numRenderers = TDEApplication::desktop()->numScreens();
+    } else {
+        m_numRenderers = 1;
+    }
+
     if (m_numRenderers < 2) {
         // Only one screen is currently available; deactivate per-screen rendering but do not overwrite multi-screen settings
         m_bDrawBackgroundPerScreen = false;
-- 
cgit v1.2.3

