mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-08 12:18:50 +02:00
[FancyZones] Fix blank layout error (#26828)
This commit is contained in:
@@ -1236,7 +1236,7 @@ bool FancyZones::ShouldProcessSnapHotkey(DWORD vkCode) noexcept
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layout->Type() != FancyZonesDataTypes::ZoneSetLayoutType::Blank)
|
if (layout->Zones().size() > 0)
|
||||||
{
|
{
|
||||||
if (vkCode == VK_UP || vkCode == VK_DOWN)
|
if (vkCode == VK_UP || vkCode == VK_DOWN)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ namespace FancyZonesDataTypes
|
|||||||
{
|
{
|
||||||
enum class ZoneSetLayoutType : int
|
enum class ZoneSetLayoutType : int
|
||||||
{
|
{
|
||||||
Blank = -1,
|
Blank,
|
||||||
Focus,
|
Focus,
|
||||||
Columns,
|
Columns,
|
||||||
Rows,
|
Rows,
|
||||||
|
|||||||
@@ -108,15 +108,20 @@ Layout::Layout(const LayoutData& data) :
|
|||||||
|
|
||||||
bool Layout::Init(const FancyZonesUtils::Rect& workArea, HMONITOR monitor) noexcept
|
bool Layout::Init(const FancyZonesUtils::Rect& workArea, HMONITOR monitor) noexcept
|
||||||
{
|
{
|
||||||
//invalid work area
|
// invalid work area
|
||||||
if (workArea.width() == 0 || workArea.height() == 0)
|
if (workArea.width() == 0 || workArea.height() == 0)
|
||||||
{
|
{
|
||||||
Logger::error(L"Layout initialization: invalid work area");
|
Logger::error(L"Layout initialization: invalid work area");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//invalid zoneCount, may cause division by zero
|
// invalid zoneCount, may cause division by zero
|
||||||
if (m_data.zoneCount <= 0 && m_data.type != FancyZonesDataTypes::ZoneSetLayoutType::Custom)
|
bool isGridType = m_data.type == FancyZonesDataTypes::ZoneSetLayoutType::Columns
|
||||||
|
|| m_data.type == FancyZonesDataTypes::ZoneSetLayoutType::Rows
|
||||||
|
|| m_data.type == FancyZonesDataTypes::ZoneSetLayoutType::Grid
|
||||||
|
|| m_data.type == FancyZonesDataTypes::ZoneSetLayoutType::PriorityGrid;
|
||||||
|
|
||||||
|
if (m_data.zoneCount < 0 || (m_data.zoneCount == 0 && isGridType))
|
||||||
{
|
{
|
||||||
Logger::error(L"Layout initialization: invalid zone count");
|
Logger::error(L"Layout initialization: invalid zone count");
|
||||||
return false;
|
return false;
|
||||||
@@ -126,6 +131,9 @@ bool Layout::Init(const FancyZonesUtils::Rect& workArea, HMONITOR monitor) noexc
|
|||||||
|
|
||||||
switch (m_data.type)
|
switch (m_data.type)
|
||||||
{
|
{
|
||||||
|
case FancyZonesDataTypes::ZoneSetLayoutType::Blank:
|
||||||
|
m_zones = {};
|
||||||
|
break;
|
||||||
case FancyZonesDataTypes::ZoneSetLayoutType::Focus:
|
case FancyZonesDataTypes::ZoneSetLayoutType::Focus:
|
||||||
m_zones = LayoutConfigurator::Focus(workArea, m_data.zoneCount);
|
m_zones = LayoutConfigurator::Focus(workArea, m_data.zoneCount);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -234,6 +234,11 @@ ZonesMap LayoutConfigurator::Focus(FancyZonesUtils::Rect workArea, int zoneCount
|
|||||||
|
|
||||||
ZonesMap LayoutConfigurator::Rows(FancyZonesUtils::Rect workArea, int zoneCount, int spacing) noexcept
|
ZonesMap LayoutConfigurator::Rows(FancyZonesUtils::Rect workArea, int zoneCount, int spacing) noexcept
|
||||||
{
|
{
|
||||||
|
if (zoneCount == 0)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
ZonesMap zones;
|
ZonesMap zones;
|
||||||
|
|
||||||
long totalWidth = workArea.width() - (spacing * 2);
|
long totalWidth = workArea.width() - (spacing * 2);
|
||||||
@@ -275,6 +280,11 @@ ZonesMap LayoutConfigurator::Rows(FancyZonesUtils::Rect workArea, int zoneCount,
|
|||||||
|
|
||||||
ZonesMap LayoutConfigurator::Columns(FancyZonesUtils::Rect workArea, int zoneCount, int spacing) noexcept
|
ZonesMap LayoutConfigurator::Columns(FancyZonesUtils::Rect workArea, int zoneCount, int spacing) noexcept
|
||||||
{
|
{
|
||||||
|
if (zoneCount == 0)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
ZonesMap zones;
|
ZonesMap zones;
|
||||||
|
|
||||||
long totalWidth = workArea.width() - (spacing * (zoneCount + 1));
|
long totalWidth = workArea.width() - (spacing * (zoneCount + 1));
|
||||||
@@ -316,6 +326,11 @@ ZonesMap LayoutConfigurator::Columns(FancyZonesUtils::Rect workArea, int zoneCou
|
|||||||
|
|
||||||
ZonesMap LayoutConfigurator::Grid(FancyZonesUtils::Rect workArea, int zoneCount, int spacing) noexcept
|
ZonesMap LayoutConfigurator::Grid(FancyZonesUtils::Rect workArea, int zoneCount, int spacing) noexcept
|
||||||
{
|
{
|
||||||
|
if (zoneCount == 0)
|
||||||
|
{
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
int rows = 1, columns = 1;
|
int rows = 1, columns = 1;
|
||||||
while (zoneCount / rows >= rows)
|
while (zoneCount / rows >= rows)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -112,15 +112,15 @@ namespace FancyZonesUnitTests
|
|||||||
TEST_METHOD (ZoneSetLayoutTypeToString)
|
TEST_METHOD (ZoneSetLayoutTypeToString)
|
||||||
{
|
{
|
||||||
std::map<int, std::wstring> expectedMap = {
|
std::map<int, std::wstring> expectedMap = {
|
||||||
std::make_pair(-2, L"TypeToString_ERROR"),
|
std::make_pair(-1, L"TypeToString_ERROR"),
|
||||||
std::make_pair(-1, L"blank"),
|
std::make_pair(0, L"blank"),
|
||||||
std::make_pair(0, L"focus"),
|
std::make_pair(1, L"focus"),
|
||||||
std::make_pair(1, L"columns"),
|
std::make_pair(2, L"columns"),
|
||||||
std::make_pair(2, L"rows"),
|
std::make_pair(3, L"rows"),
|
||||||
std::make_pair(3, L"grid"),
|
std::make_pair(4, L"grid"),
|
||||||
std::make_pair(4, L"priority-grid"),
|
std::make_pair(5, L"priority-grid"),
|
||||||
std::make_pair(5, L"custom"),
|
std::make_pair(6, L"custom"),
|
||||||
std::make_pair(6, L"TypeToString_ERROR"),
|
std::make_pair(7, L"TypeToString_ERROR"),
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const auto& expected : expectedMap)
|
for (const auto& expected : expectedMap)
|
||||||
|
|||||||
@@ -382,7 +382,7 @@ namespace FancyZonesUnitTests
|
|||||||
|
|
||||||
TEST_METHOD (ZeroZoneCount)
|
TEST_METHOD (ZeroZoneCount)
|
||||||
{
|
{
|
||||||
for (int type = static_cast<int>(ZoneSetLayoutType::Focus); type < static_cast<int>(ZoneSetLayoutType::Custom); type++)
|
for (int type = static_cast<int>(ZoneSetLayoutType::Columns); type < static_cast<int>(ZoneSetLayoutType::Custom); type++)
|
||||||
{
|
{
|
||||||
LayoutData data = m_data;
|
LayoutData data = m_data;
|
||||||
data.type = static_cast<ZoneSetLayoutType>(type);
|
data.type = static_cast<ZoneSetLayoutType>(type);
|
||||||
@@ -395,6 +395,32 @@ namespace FancyZonesUnitTests
|
|||||||
Assert::IsFalse(result);
|
Assert::IsFalse(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
LayoutData data = m_data;
|
||||||
|
data.type = static_cast<ZoneSetLayoutType>(ZoneSetLayoutType::Blank);
|
||||||
|
data.zoneCount = 0;
|
||||||
|
auto layout = std::make_unique<Layout>(data);
|
||||||
|
|
||||||
|
for (const auto& rect : m_workAreaRects)
|
||||||
|
{
|
||||||
|
auto result = layout->Init(rect, Mocks::Monitor());
|
||||||
|
Assert::IsTrue(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
LayoutData data = m_data;
|
||||||
|
data.type = static_cast<ZoneSetLayoutType>(ZoneSetLayoutType::Focus);
|
||||||
|
data.zoneCount = 0;
|
||||||
|
auto layout = std::make_unique<Layout>(data);
|
||||||
|
|
||||||
|
for (const auto& rect : m_workAreaRects)
|
||||||
|
{
|
||||||
|
auto result = layout->Init(rect, Mocks::Monitor());
|
||||||
|
Assert::IsTrue(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_METHOD (BigZoneCount)
|
TEST_METHOD (BigZoneCount)
|
||||||
|
|||||||
Reference in New Issue
Block a user