[FancyZones] Keep the same layouts on the new virtual desktops. (#23927)

This commit is contained in:
Seraphima Zykova 2023-02-07 13:02:22 +01:00 committed by GitHub
parent a6e0396290
commit c180150d54
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 8 deletions

View File

@ -716,13 +716,6 @@ void FancyZones::AddWorkArea(HMONITOR monitor, const FancyZonesDataTypes::WorkAr
Logger::debug(L"Add new work area on virtual desktop {}", virtualDesktopIdStr.get()); 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{}; FancyZonesUtils::Rect rect{};
if (monitor) if (monitor)
{ {
@ -733,7 +726,7 @@ void FancyZones::AddWorkArea(HMONITOR monitor, const FancyZonesDataTypes::WorkAr
rect = FancyZonesUtils::GetAllMonitorsCombinedRect<&MONITORINFO::rcWork>(); 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 (workArea)
{ {
if (updateWindowsPositions) if (updateWindowsPositions)
@ -761,6 +754,7 @@ LRESULT CALLBACK FancyZones::s_WndProc(HWND window, UINT message, WPARAM wparam,
void FancyZones::UpdateWorkAreas(bool updateWindowPositions) noexcept void FancyZones::UpdateWorkAreas(bool updateWindowPositions) noexcept
{ {
m_workAreaHandler.SaveParentIds();
m_workAreaHandler.Clear(); m_workAreaHandler.Clear();
if (FancyZonesSettings::settings().spanZonesAcrossMonitors) if (FancyZonesSettings::settings().spanZonesAcrossMonitors)

View File

@ -61,6 +61,28 @@ void MonitorWorkAreaMap::AddWorkArea(HMONITOR monitor, std::unique_ptr<WorkArea>
m_workAreaMap.insert({ monitor, std::move(workArea) }); 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 void MonitorWorkAreaMap::Clear() noexcept
{ {
m_workAreaMap.clear(); m_workAreaMap.clear();

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "GuidUtils.h" #include "GuidUtils.h"
#include <FancyZonesLib/FancyZonesDataTypes.h>
class WorkArea; class WorkArea;
@ -48,6 +49,13 @@ public:
*/ */
void AddWorkArea(HMONITOR monitor, std::unique_ptr<WorkArea> workArea); void AddWorkArea(HMONITOR monitor, std::unique_ptr<WorkArea> 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. * Clear all persisted work area related data.
*/ */
@ -55,4 +63,5 @@ public:
private: private:
std::unordered_map<HMONITOR, std::unique_ptr<WorkArea>> m_workAreaMap; std::unordered_map<HMONITOR, std::unique_ptr<WorkArea>> m_workAreaMap;
std::unordered_map<HMONITOR, FancyZonesDataTypes::WorkAreaId> m_workAreaParents{};
}; };