Skip to content

Commit

Permalink
[FancyZones] Keep the same layouts on the new virtual desktops. (#23927)
Browse files Browse the repository at this point in the history
  • Loading branch information
SeraphimaZykova authored and jaimecbernardo committed Feb 7, 2023
1 parent 9ffaa03 commit 5e30d1e
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 8 deletions.
10 changes: 2 additions & 8 deletions src/modules/fancyzones/FancyZonesLib/FancyZones.cpp
Expand Up @@ -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)
{
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
22 changes: 22 additions & 0 deletions src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.cpp
Expand Up @@ -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();
Expand Down
9 changes: 9 additions & 0 deletions src/modules/fancyzones/FancyZonesLib/MonitorWorkAreaMap.h
@@ -1,6 +1,7 @@
#pragma once

#include "GuidUtils.h"
#include <FancyZonesLib/FancyZonesDataTypes.h>

class WorkArea;

Expand Down Expand Up @@ -48,11 +49,19 @@ class MonitorWorkAreaMap
*/
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.
*/
void Clear() noexcept;

private:
std::unordered_map<HMONITOR, std::unique_ptr<WorkArea>> m_workAreaMap;
std::unordered_map<HMONITOR, FancyZonesDataTypes::WorkAreaId> m_workAreaParents{};
};

0 comments on commit 5e30d1e

Please sign in to comment.