diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp b/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp index b45e28ac59f..a8eb8c018f2 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp +++ b/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp @@ -716,13 +716,6 @@ void FancyZones::AddWorkArea(HMONITOR monitor, const FancyZonesDataTypes::WorkAr Logger::debug(L"Add new work area on virtual desktop {}", virtualDesktopIdStr.get()); } - FancyZonesDataTypes::WorkAreaId parentId{}; - auto parentArea = m_workAreaHandler.GetWorkArea(monitor); - if (parentArea) - { - parentId = parentArea->UniqueId(); - } - FancyZonesUtils::Rect rect{}; if (monitor) { @@ -733,7 +726,7 @@ void FancyZones::AddWorkArea(HMONITOR monitor, const FancyZonesDataTypes::WorkAr rect = FancyZonesUtils::GetAllMonitorsCombinedRect<&MONITORINFO::rcWork>(); } - auto workArea = WorkArea::Create(m_hinstance, id, parentId, rect); + auto workArea = WorkArea::Create(m_hinstance, id, m_workAreaHandler.GetParent(monitor), rect); if (workArea) { if (updateWindowsPositions) @@ -761,6 +754,7 @@ LRESULT CALLBACK FancyZones::s_WndProc(HWND window, UINT message, WPARAM wparam, void FancyZones::UpdateWorkAreas(bool updateWindowPositions) noexcept { + m_workAreaHandler.SaveParentIds(); m_workAreaHandler.Clear(); if (FancyZonesSettings::settings().spanZonesAcrossMonitors) diff --git a/src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.cpp b/src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.cpp index 089c28c9051..486e2739ea5 100644 --- a/src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.cpp +++ b/src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.cpp @@ -61,6 +61,28 @@ void MonitorWorkAreaMap::AddWorkArea(HMONITOR monitor, std::unique_ptr m_workAreaMap.insert({ monitor, std::move(workArea) }); } +FancyZonesDataTypes::WorkAreaId MonitorWorkAreaMap::GetParent(HMONITOR monitor) const +{ + if (m_workAreaParents.contains(monitor)) + { + return m_workAreaParents.at(monitor); + } + + return FancyZonesDataTypes::WorkAreaId{}; +} + +void MonitorWorkAreaMap::SaveParentIds() +{ + m_workAreaParents.clear(); + for (const auto& [monitor, workArea] : m_workAreaMap) + { + if (workArea) + { + m_workAreaParents.insert({ monitor, workArea->UniqueId() }); + } + } +} + void MonitorWorkAreaMap::Clear() noexcept { m_workAreaMap.clear(); diff --git a/src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.h b/src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.h index 10cb2dd0d6c..45fabda7091 100644 --- a/src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.h +++ b/src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.h @@ -1,6 +1,7 @@ #pragma once #include "GuidUtils.h" +#include class WorkArea; @@ -48,6 +49,13 @@ class MonitorWorkAreaMap */ void AddWorkArea(HMONITOR monitor, std::unique_ptr workArea); + FancyZonesDataTypes::WorkAreaId GetParent(HMONITOR monitor) const; + + /** + * Saving current work area IDs as parents for later use. + */ + void SaveParentIds(); + /** * Clear all persisted work area related data. */ @@ -55,4 +63,5 @@ class MonitorWorkAreaMap private: std::unordered_map> m_workAreaMap; + std::unordered_map m_workAreaParents{}; };