mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-06 19:26:39 +02:00
[FancyZones] Window switch shortcut fix (#21426)
* rename Layout -> LayoutData * simplify zone * split ZoneSet: Layout * refactoring * split ZoneSet: LayoutWindows * update trace * split ZoneSet: remove ZoneSet * fix initialization * split unit tests * remove unused * warning * nullptr check * use current rect * update work area tests * use current rect * simplify * more meaningful name * dismiss * safety checks * resolve conflicts * reassign windows after switching vd * avoid double-processing for window on switching vd * extend windows fix * check if window is on current desktop before cycling * separated extend * not reinit layout windows
This commit is contained in:
@@ -556,7 +556,7 @@ void AppZoneHistory::UpdateProcessIdToHandleMap(HWND window, const FancyZonesDat
|
||||
}
|
||||
}
|
||||
|
||||
ZoneIndexSet AppZoneHistory::GetAppLastZoneIndexSet(HWND window, const FancyZonesDataTypes::WorkAreaId& workAreaId, const std::wstring_view& zoneSetId) const
|
||||
ZoneIndexSet AppZoneHistory::GetAppLastZoneIndexSet(HWND window, const FancyZonesDataTypes::WorkAreaId& workAreaId, const std::wstring& zoneSetId) const
|
||||
{
|
||||
auto processPath = get_process_path_waiting_uwp(window);
|
||||
if (processPath.empty())
|
||||
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
|
||||
bool IsAnotherWindowOfApplicationInstanceZoned(HWND window, const FancyZonesDataTypes::WorkAreaId& workAreaId) const noexcept;
|
||||
void UpdateProcessIdToHandleMap(HWND window, const FancyZonesDataTypes::WorkAreaId& workAreaId);
|
||||
ZoneIndexSet GetAppLastZoneIndexSet(HWND window, const FancyZonesDataTypes::WorkAreaId& workAreaId, const std::wstring_view& zoneSetId) const;
|
||||
ZoneIndexSet GetAppLastZoneIndexSet(HWND window, const FancyZonesDataTypes::WorkAreaId& workAreaId, const std::wstring& zoneSetId) const;
|
||||
|
||||
void SyncVirtualDesktops();
|
||||
void RemoveDeletedVirtualDesktops(const std::vector<GUID>& activeDesktops);
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
namespace
|
||||
{
|
||||
// didn't use default constants since if they'll be changed later, it'll break this function
|
||||
bool isLayoutDefault(const Layout& layout)
|
||||
bool isLayoutDefault(const LayoutData& layout)
|
||||
{
|
||||
return layout.type == FancyZonesDataTypes::ZoneSetLayoutType::PriorityGrid &&
|
||||
layout.zoneCount == 3 &&
|
||||
@@ -31,11 +31,11 @@ namespace JsonUtils
|
||||
{
|
||||
struct LayoutJSON
|
||||
{
|
||||
static std::optional<Layout> FromJson(const json::JsonObject& json)
|
||||
static std::optional<LayoutData> FromJson(const json::JsonObject& json)
|
||||
{
|
||||
try
|
||||
{
|
||||
Layout data{};
|
||||
LayoutData data{};
|
||||
auto idStr = json.GetNamedString(NonLocalizable::AppliedLayoutsIds::UuidID);
|
||||
auto id = FancyZonesUtils::GuidFromString(idStr.c_str());
|
||||
if (!id.has_value())
|
||||
@@ -58,7 +58,7 @@ namespace JsonUtils
|
||||
}
|
||||
}
|
||||
|
||||
static json::JsonObject ToJson(const Layout& data)
|
||||
static json::JsonObject ToJson(const LayoutData& data)
|
||||
{
|
||||
json::JsonObject result{};
|
||||
result.SetNamedValue(NonLocalizable::AppliedLayoutsIds::UuidID, json::value(FancyZonesUtils::GuidToString(data.uuid).value()));
|
||||
@@ -141,7 +141,7 @@ namespace JsonUtils
|
||||
|
||||
public:
|
||||
FancyZonesDataTypes::WorkAreaId workAreaId;
|
||||
Layout data{};
|
||||
LayoutData data{};
|
||||
bool hasResolutionInId = false;
|
||||
|
||||
static std::optional<AppliedLayoutsJSON> FromJson(const json::JsonObject& json)
|
||||
@@ -427,7 +427,7 @@ void AppliedLayouts::RemoveDeletedVirtualDesktops(const std::vector<GUID>& activ
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<Layout> AppliedLayouts::GetDeviceLayout(const FancyZonesDataTypes::WorkAreaId& id) const noexcept
|
||||
std::optional<LayoutData> AppliedLayouts::GetDeviceLayout(const FancyZonesDataTypes::WorkAreaId& id) const noexcept
|
||||
{
|
||||
auto iter = m_layouts.find(id);
|
||||
if (iter != m_layouts.end())
|
||||
@@ -449,7 +449,7 @@ bool AppliedLayouts::IsLayoutApplied(const FancyZonesDataTypes::WorkAreaId& id)
|
||||
return iter != m_layouts.end();
|
||||
}
|
||||
|
||||
bool AppliedLayouts::ApplyLayout(const FancyZonesDataTypes::WorkAreaId& deviceId, Layout layout)
|
||||
bool AppliedLayouts::ApplyLayout(const FancyZonesDataTypes::WorkAreaId& deviceId, LayoutData layout)
|
||||
{
|
||||
m_layouts[deviceId] = std::move(layout);
|
||||
return true;
|
||||
@@ -467,8 +467,20 @@ bool AppliedLayouts::ApplyDefaultLayout(const FancyZonesDataTypes::WorkAreaId& d
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: vertical or horizontal
|
||||
m_layouts[deviceId] = DefaultLayouts::instance().GetDefaultLayout();
|
||||
MonitorConfiguraionType type = MonitorConfiguraionType::Horizontal;
|
||||
MONITORINFOEX monitorInfo;
|
||||
monitorInfo.cbSize = sizeof(monitorInfo);
|
||||
if (GetMonitorInfo(deviceId.monitorId.monitor, &monitorInfo))
|
||||
{
|
||||
LONG width = monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left;
|
||||
LONG height = monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top;
|
||||
if (height > width)
|
||||
{
|
||||
type = MonitorConfiguraionType::Vertical;
|
||||
}
|
||||
}
|
||||
|
||||
m_layouts[deviceId] = DefaultLayouts::instance().GetDefaultLayout(type);
|
||||
|
||||
// Saving default layout data doesn't make sense, since it's ignored on parsing.
|
||||
// Given that default layouts are ignored when parsing,
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
|
||||
#include <FancyZonesLib/FancyZonesData/Layout.h>
|
||||
#include <FancyZonesLib/FancyZonesData/LayoutData.h>
|
||||
#include <FancyZonesLib/ModuleConstants.h>
|
||||
|
||||
#include <common/SettingsAPI/FileWatcher.h>
|
||||
@@ -35,7 +35,7 @@ namespace NonLocalizable
|
||||
class AppliedLayouts
|
||||
{
|
||||
public:
|
||||
using TAppliedLayoutsMap = std::unordered_map<FancyZonesDataTypes::WorkAreaId, Layout>;
|
||||
using TAppliedLayoutsMap = std::unordered_map<FancyZonesDataTypes::WorkAreaId, LayoutData>;
|
||||
|
||||
static AppliedLayouts& instance();
|
||||
|
||||
@@ -55,12 +55,12 @@ public:
|
||||
void SyncVirtualDesktops();
|
||||
void RemoveDeletedVirtualDesktops(const std::vector<GUID>& activeDesktops);
|
||||
|
||||
std::optional<Layout> GetDeviceLayout(const FancyZonesDataTypes::WorkAreaId& id) const noexcept;
|
||||
std::optional<LayoutData> GetDeviceLayout(const FancyZonesDataTypes::WorkAreaId& id) const noexcept;
|
||||
const TAppliedLayoutsMap& GetAppliedLayoutMap() const noexcept;
|
||||
|
||||
bool IsLayoutApplied(const FancyZonesDataTypes::WorkAreaId& id) const noexcept;
|
||||
|
||||
bool ApplyLayout(const FancyZonesDataTypes::WorkAreaId& deviceId, Layout layout);
|
||||
bool ApplyLayout(const FancyZonesDataTypes::WorkAreaId& deviceId, LayoutData layout);
|
||||
bool ApplyDefaultLayout(const FancyZonesDataTypes::WorkAreaId& deviceId);
|
||||
bool CloneLayout(const FancyZonesDataTypes::WorkAreaId& srcId, const FancyZonesDataTypes::WorkAreaId& dstId);
|
||||
|
||||
|
||||
@@ -216,7 +216,7 @@ void CustomLayouts::LoadData()
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<Layout> CustomLayouts::GetLayout(const GUID& id) const noexcept
|
||||
std::optional<LayoutData> CustomLayouts::GetLayout(const GUID& id) const noexcept
|
||||
{
|
||||
auto iter = m_layouts.find(id);
|
||||
if (iter == m_layouts.end())
|
||||
@@ -225,7 +225,7 @@ std::optional<Layout> CustomLayouts::GetLayout(const GUID& id) const noexcept
|
||||
}
|
||||
|
||||
FancyZonesDataTypes::CustomLayoutData customLayout = iter->second;
|
||||
Layout layout{
|
||||
LayoutData layout{
|
||||
.uuid = id,
|
||||
.type = FancyZonesDataTypes::ZoneSetLayoutType::Custom
|
||||
};
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
|
||||
#include <FancyZonesLib/FancyZonesData/Layout.h>
|
||||
#include <FancyZonesLib/FancyZonesData/LayoutData.h>
|
||||
#include <FancyZonesLib/FancyZonesDataTypes.h>
|
||||
#include <FancyZonesLib/GuidUtils.h>
|
||||
#include <FancyZonesLib/ModuleConstants.h>
|
||||
@@ -64,7 +64,7 @@ public:
|
||||
|
||||
void LoadData();
|
||||
|
||||
std::optional<Layout> GetLayout(const GUID& id) const noexcept;
|
||||
std::optional<LayoutData> GetLayout(const GUID& id) const noexcept;
|
||||
std::optional<FancyZonesDataTypes::CustomLayoutData> GetCustomLayoutData(const GUID& id) const noexcept;
|
||||
const TCustomLayoutMap& GetAllLayouts() const noexcept;
|
||||
|
||||
|
||||
@@ -34,11 +34,11 @@ namespace DefaultLayoutsJsonUtils
|
||||
|
||||
struct LayoutJSON
|
||||
{
|
||||
static std::optional<Layout> FromJson(const json::JsonObject& json)
|
||||
static std::optional<LayoutData> FromJson(const json::JsonObject& json)
|
||||
{
|
||||
try
|
||||
{
|
||||
Layout data{};
|
||||
LayoutData data{};
|
||||
auto idStr = json.GetNamedString(NonLocalizable::DefaultLayoutsIds::UuidID, L"");
|
||||
if (!idStr.empty())
|
||||
{
|
||||
@@ -65,7 +65,7 @@ namespace DefaultLayoutsJsonUtils
|
||||
}
|
||||
}
|
||||
|
||||
static json::JsonObject ToJson(const Layout& data)
|
||||
static json::JsonObject ToJson(const LayoutData& data)
|
||||
{
|
||||
json::JsonObject result{};
|
||||
result.SetNamedValue(NonLocalizable::DefaultLayoutsIds::UuidID, json::value(FancyZonesUtils::GuidToString(data.uuid).value()));
|
||||
@@ -81,7 +81,7 @@ namespace DefaultLayoutsJsonUtils
|
||||
struct DefaultLayoutJSON
|
||||
{
|
||||
MonitorConfiguraionType monitorConfigurationType{ MonitorConfiguraionType::Horizontal };
|
||||
Layout layout{};
|
||||
LayoutData layout{};
|
||||
|
||||
static std::optional<DefaultLayoutJSON> FromJson(const json::JsonObject& json)
|
||||
{
|
||||
@@ -163,7 +163,7 @@ void DefaultLayouts::LoadData()
|
||||
}
|
||||
}
|
||||
|
||||
Layout DefaultLayouts::GetDefaultLayout(MonitorConfiguraionType type) const noexcept
|
||||
LayoutData DefaultLayouts::GetDefaultLayout(MonitorConfiguraionType type) const noexcept
|
||||
{
|
||||
auto iter = m_layouts.find(type);
|
||||
if (iter != m_layouts.end())
|
||||
@@ -171,5 +171,5 @@ Layout DefaultLayouts::GetDefaultLayout(MonitorConfiguraionType type) const noex
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
return Layout{};
|
||||
return LayoutData{};
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <FancyZonesLib/FancyZonesData/Layout.h>
|
||||
#include <FancyZonesLib/FancyZonesData/LayoutData.h>
|
||||
#include <FancyZonesLib/ModuleConstants.h>
|
||||
|
||||
#include <common/SettingsAPI/FileWatcher.h>
|
||||
@@ -31,7 +31,7 @@ enum class MonitorConfiguraionType
|
||||
class DefaultLayouts
|
||||
{
|
||||
public:
|
||||
using TDefaultLayoutsContainer = std::map<MonitorConfiguraionType, Layout>;
|
||||
using TDefaultLayoutsContainer = std::map<MonitorConfiguraionType, LayoutData>;
|
||||
|
||||
static DefaultLayouts& instance();
|
||||
|
||||
@@ -46,7 +46,7 @@ public:
|
||||
|
||||
void LoadData();
|
||||
|
||||
Layout GetDefaultLayout(MonitorConfiguraionType type = MonitorConfiguraionType::Horizontal) const noexcept;
|
||||
LayoutData GetDefaultLayout(MonitorConfiguraionType type = MonitorConfiguraionType::Horizontal) const noexcept;
|
||||
|
||||
private:
|
||||
DefaultLayouts();
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <FancyZonesLib/FancyZonesData/LayoutDefaults.h>
|
||||
#include <FancyZonesLib/FancyZonesDataTypes.h>
|
||||
|
||||
struct Layout
|
||||
struct LayoutData
|
||||
{
|
||||
GUID uuid = GUID_NULL;
|
||||
FancyZonesDataTypes::ZoneSetLayoutType type = FancyZonesDataTypes::ZoneSetLayoutType::PriorityGrid;
|
||||
@@ -15,7 +15,7 @@ struct Layout
|
||||
int sensitivityRadius = DefaultValues::SensitivityRadius;
|
||||
};
|
||||
|
||||
inline bool operator==(const Layout& lhs, const Layout& rhs)
|
||||
inline bool operator==(const LayoutData& lhs, const LayoutData& rhs)
|
||||
{
|
||||
return lhs.uuid == rhs.uuid &&
|
||||
lhs.type == rhs.type &&
|
||||
@@ -10,11 +10,11 @@ namespace JsonUtils
|
||||
{
|
||||
struct TemplateLayoutJSON
|
||||
{
|
||||
static std::optional<Layout> FromJson(const json::JsonObject& json)
|
||||
static std::optional<LayoutData> FromJson(const json::JsonObject& json)
|
||||
{
|
||||
try
|
||||
{
|
||||
Layout data;
|
||||
LayoutData data;
|
||||
|
||||
data.uuid = GUID_NULL;
|
||||
data.type = FancyZonesDataTypes::TypeFromString(std::wstring{ json.GetNamedString(NonLocalizable::LayoutTemplatesIds::TypeID) });
|
||||
@@ -32,9 +32,9 @@ namespace JsonUtils
|
||||
}
|
||||
};
|
||||
|
||||
std::vector<Layout> ParseJson(const json::JsonObject& json)
|
||||
std::vector<LayoutData> ParseJson(const json::JsonObject& json)
|
||||
{
|
||||
std::vector<Layout> vec{};
|
||||
std::vector<LayoutData> vec{};
|
||||
auto layouts = json.GetNamedArray(NonLocalizable::LayoutTemplatesIds::LayoutTemplatesArrayID);
|
||||
|
||||
for (uint32_t i = 0; i < layouts.Size(); ++i)
|
||||
@@ -85,7 +85,7 @@ void LayoutTemplates::LoadData()
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<Layout> LayoutTemplates::GetLayout(FancyZonesDataTypes::ZoneSetLayoutType type) const noexcept
|
||||
std::optional<LayoutData> LayoutTemplates::GetLayout(FancyZonesDataTypes::ZoneSetLayoutType type) const noexcept
|
||||
{
|
||||
for (const auto& layout : m_layouts)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <FancyZonesLib/FancyZonesData/Layout.h>
|
||||
#include <FancyZonesLib/FancyZonesData/LayoutData.h>
|
||||
#include <FancyZonesLib/ModuleConstants.h>
|
||||
|
||||
#include <common/SettingsAPI/FileWatcher.h>
|
||||
@@ -35,12 +35,12 @@ public:
|
||||
|
||||
void LoadData();
|
||||
|
||||
std::optional<Layout> GetLayout(FancyZonesDataTypes::ZoneSetLayoutType type) const noexcept;
|
||||
std::optional<LayoutData> GetLayout(FancyZonesDataTypes::ZoneSetLayoutType type) const noexcept;
|
||||
|
||||
private:
|
||||
LayoutTemplates();
|
||||
~LayoutTemplates() = default;
|
||||
|
||||
std::unique_ptr<FileWatcher> m_fileWatcher;
|
||||
std::vector<Layout> m_layouts;
|
||||
std::vector<LayoutData> m_layouts;
|
||||
};
|
||||
Reference in New Issue
Block a user