[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());
}
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)

View File

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

View File

@ -1,6 +1,7 @@
#pragma once
#include "GuidUtils.h"
#include <FancyZonesLib/FancyZonesDataTypes.h>
class WorkArea;
@ -48,6 +49,13 @@ public:
*/
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.
*/
@ -55,4 +63,5 @@ public:
private:
std::unordered_map<HMONITOR, std::unique_ptr<WorkArea>> m_workAreaMap;
std::unordered_map<HMONITOR, FancyZonesDataTypes::WorkAreaId> m_workAreaParents{};
};