diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp b/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp index 599f96b3424..cf2c569a8fd 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp +++ b/src/modules/fancyzones/FancyZonesLib/FancyZones.cpp @@ -733,7 +733,17 @@ void FancyZones::AddWorkArea(HMONITOR monitor, const FancyZonesDataTypes::WorkAr parentId = parentArea->UniqueId(); } - auto workArea = MakeWorkArea(m_hinstance, monitor, id, parentId); + FancyZonesUtils::Rect rect{}; + if (monitor) + { + rect = MonitorUtils::GetWorkAreaRect(monitor); + } + else + { + rect = FancyZonesUtils::GetAllMonitorsCombinedRect<&MONITORINFO::rcWork>(); + } + + auto workArea = MakeWorkArea(m_hinstance, id, parentId, rect); if (workArea) { m_workAreaHandler.AddWorkArea(VirtualDesktop::instance().GetCurrentVirtualDesktopId(), monitor, workArea); diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj b/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj index c26b30d52e9..224779b0fa3 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj +++ b/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj @@ -75,6 +75,7 @@ + @@ -124,6 +125,7 @@ + diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj.filters b/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj.filters index 29ed814973b..d14e7a6a4a5 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj.filters +++ b/src/modules/fancyzones/FancyZonesLib/FancyZonesLib.vcxproj.filters @@ -153,6 +153,9 @@ Header Files\FancyZonesData + + Header Files + Header Files @@ -251,6 +254,9 @@ Source Files + + Source Files + diff --git a/src/modules/fancyzones/FancyZonesLib/HighlightedZones.cpp b/src/modules/fancyzones/FancyZonesLib/HighlightedZones.cpp new file mode 100644 index 00000000000..9c6e7d1cca0 --- /dev/null +++ b/src/modules/fancyzones/FancyZonesLib/HighlightedZones.cpp @@ -0,0 +1,55 @@ +#include "pch.h" +#include "HighlightedZones.h" + +#include + +HighlightedZones::HighlightedZones() +{ +} + +const ZoneIndexSet& HighlightedZones::Zones() const noexcept +{ + return m_highlightZone; +} + +bool HighlightedZones::Empty() const noexcept +{ + return m_highlightZone.empty(); +} + +bool HighlightedZones::Update(const Layout* layout, POINT const& point, bool selectManyZones) noexcept +{ + if (!layout) + { + return false; + } + + auto highlightZone = layout->ZonesFromPoint(point); + + if (selectManyZones) + { + if (m_initialHighlightZone.empty()) + { + // first time + m_initialHighlightZone = highlightZone; + } + else + { + highlightZone = layout->GetCombinedZoneRange(m_initialHighlightZone, highlightZone); + } + } + else + { + m_initialHighlightZone = {}; + } + + const bool updated = (highlightZone != m_highlightZone); + m_highlightZone = std::move(highlightZone); + return updated; +} + +void HighlightedZones::Reset() noexcept +{ + m_highlightZone = {}; + m_initialHighlightZone = {}; +} diff --git a/src/modules/fancyzones/FancyZonesLib/HighlightedZones.h b/src/modules/fancyzones/FancyZonesLib/HighlightedZones.h new file mode 100644 index 00000000000..e6a5b22909e --- /dev/null +++ b/src/modules/fancyzones/FancyZonesLib/HighlightedZones.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +class Layout; + +class HighlightedZones +{ +public: + HighlightedZones(); + ~HighlightedZones() = default; + + const ZoneIndexSet& Zones() const noexcept; + bool Empty() const noexcept; + + bool Update(const Layout* layout, POINT const& point, bool selectManyZones) noexcept; + void Reset() noexcept; + +private: + ZoneIndexSet m_initialHighlightZone; + ZoneIndexSet m_highlightZone; +}; diff --git a/src/modules/fancyzones/FancyZonesLib/MonitorUtils.cpp b/src/modules/fancyzones/FancyZonesLib/MonitorUtils.cpp index 70209a16c04..9f8281804bc 100644 --- a/src/modules/fancyzones/FancyZonesLib/MonitorUtils.cpp +++ b/src/modules/fancyzones/FancyZonesLib/MonitorUtils.cpp @@ -383,4 +383,19 @@ namespace MonitorUtils return displays; } + + FancyZonesUtils::Rect GetWorkAreaRect(HMONITOR monitor) + { + if (monitor) + { + MONITORINFO mi{}; + mi.cbSize = sizeof(mi); + if (GetMonitorInfoW(monitor, &mi)) + { + return FancyZonesUtils::Rect(mi.rcWork); + } + } + + return FancyZonesUtils::Rect{}; + } } \ No newline at end of file diff --git a/src/modules/fancyzones/FancyZonesLib/MonitorUtils.h b/src/modules/fancyzones/FancyZonesLib/MonitorUtils.h index a16822b340c..dec872f40bc 100644 --- a/src/modules/fancyzones/FancyZonesLib/MonitorUtils.h +++ b/src/modules/fancyzones/FancyZonesLib/MonitorUtils.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace MonitorUtils { @@ -19,4 +20,6 @@ namespace MonitorUtils std::vector IdentifyMonitors() noexcept; void OpenWindowOnActiveMonitor(HWND window, HMONITOR monitor) noexcept; + + FancyZonesUtils::Rect GetWorkAreaRect(HMONITOR monitor); }; diff --git a/src/modules/fancyzones/FancyZonesLib/WorkArea.cpp b/src/modules/fancyzones/FancyZonesLib/WorkArea.cpp index 6b83fee0e57..69e19cc5f9c 100644 --- a/src/modules/fancyzones/FancyZonesLib/WorkArea.cpp +++ b/src/modules/fancyzones/FancyZonesLib/WorkArea.cpp @@ -109,8 +109,9 @@ namespace WindowPool windowPool; } -WorkArea::WorkArea(HINSTANCE hinstance, const FancyZonesDataTypes::WorkAreaId& uniqueId) : - m_uniqueId(uniqueId) +WorkArea::WorkArea(HINSTANCE hinstance, const FancyZonesDataTypes::WorkAreaId& uniqueId, const FancyZonesUtils::Rect& workAreaRect) : + m_uniqueId(uniqueId), + m_workAreaRect(workAreaRect) { WNDCLASSEXW wcex{}; wcex.cbSize = sizeof(WNDCLASSEX); @@ -129,8 +130,7 @@ WorkArea::~WorkArea() HRESULT WorkArea::MoveSizeEnter(HWND window) noexcept { m_windowMoveSize = window; - m_highlightZone = {}; - m_initialHighlightZone = {}; + m_highlightedZones.Reset(); ShowZonesOverlay(); Trace::WorkArea::MoveOrResizeStarted(m_layout.get(), m_layoutWindows.get()); return S_OK; @@ -144,42 +144,23 @@ HRESULT WorkArea::MoveSizeUpdate(POINT const& ptScreen, bool dragEnabled, bool s } bool redraw = false; - POINT ptClient = ptScreen; - MapWindowPoints(nullptr, m_window, &ptClient, 1); if (dragEnabled) { - auto highlightZone = ZonesFromPoint(ptClient); + POINT ptClient = ptScreen; + MapWindowPoints(nullptr, m_window, &ptClient, 1); - if (selectManyZones) - { - if (m_initialHighlightZone.empty()) - { - // first time - m_initialHighlightZone = highlightZone; - } - else - { - highlightZone = m_layout->GetCombinedZoneRange(m_initialHighlightZone, highlightZone); - } - } - else - { - m_initialHighlightZone = {}; - } - - redraw = (highlightZone != m_highlightZone); - m_highlightZone = std::move(highlightZone); + redraw = m_highlightedZones.Update(m_layout.get(), ptClient, selectManyZones); } - else if (m_highlightZone.size()) + else if (!m_highlightedZones.Empty()) { - m_highlightZone = {}; + m_highlightedZones.Reset(); redraw = true; } if (redraw && m_zonesOverlay) { - m_zonesOverlay->DrawActiveZoneSet(m_layout->Zones(), m_highlightZone, Colors::GetZoneColors(), FancyZonesSettings::settings().showZoneNumber); + m_zonesOverlay->DrawActiveZoneSet(m_layout->Zones(), m_highlightedZones.Zones(), Colors::GetZoneColors(), FancyZonesSettings::settings().showZoneNumber); } return S_OK; @@ -192,7 +173,8 @@ HRESULT WorkArea::MoveSizeEnd(HWND window) noexcept return E_INVALIDARG; } - MoveWindowIntoZoneByIndexSet(window, m_highlightZone); + MoveWindowIntoZoneByIndexSet(window, m_highlightedZones.Zones()); + m_highlightedZones.Reset(); Trace::WorkArea::MoveOrResizeEnd(m_layout.get(), m_layoutWindows.get()); @@ -505,7 +487,7 @@ void WorkArea::ShowZonesOverlay() noexcept if (m_window && m_layout) { SetAsTopmostWindow(); - m_zonesOverlay->DrawActiveZoneSet(m_layout->Zones(), m_highlightZone, Colors::GetZoneColors(), FancyZonesSettings::settings().showZoneNumber); + m_zonesOverlay->DrawActiveZoneSet(m_layout->Zones(), m_highlightedZones.Zones(), Colors::GetZoneColors(), FancyZonesSettings::settings().showZoneNumber); m_zonesOverlay->Show(); } } @@ -515,9 +497,7 @@ void WorkArea::HideZonesOverlay() noexcept if (m_window) { m_zonesOverlay->Hide(); - m_keyLast = 0; m_windowMoveSize = nullptr; - m_highlightZone = {}; } } @@ -532,8 +512,7 @@ void WorkArea::UpdateActiveZoneSet() noexcept CalculateZoneSet(); if (m_window && m_layout) { - m_highlightZone.clear(); - m_zonesOverlay->DrawActiveZoneSet(m_layout->Zones(), m_highlightZone, Colors::GetZoneColors(), FancyZonesSettings::settings().showZoneNumber); + m_zonesOverlay->DrawActiveZoneSet(m_layout->Zones(), {}, Colors::GetZoneColors(), FancyZonesSettings::settings().showZoneNumber); } } @@ -547,10 +526,10 @@ void WorkArea::CycleWindows(HWND window, bool reverse) noexcept void WorkArea::ClearSelectedZones() noexcept { - if (m_highlightZone.size() && m_layout) + if (!m_highlightedZones.Empty() && m_layout) { - m_highlightZone.clear(); - m_zonesOverlay->DrawActiveZoneSet(m_layout->Zones(), m_highlightZone, Colors::GetZoneColors(), FancyZonesSettings::settings().showZoneNumber); + m_highlightedZones.Reset(); + m_zonesOverlay->DrawActiveZoneSet(m_layout->Zones(), {}, Colors::GetZoneColors(), FancyZonesSettings::settings().showZoneNumber); } } @@ -609,7 +588,7 @@ void WorkArea::CalculateZoneSet() noexcept } m_layout = std::make_unique(appliedLayout.value()); - m_layout->Init(m_workAreaRect, m_monitor); + m_layout->Init(m_workAreaRect, m_uniqueId.monitorId.monitor); if (!m_layoutWindows) { @@ -639,16 +618,6 @@ LRESULT WorkArea::WndProc(UINT message, WPARAM wparam, LPARAM lparam) noexcept return 0; } -ZoneIndexSet WorkArea::ZonesFromPoint(POINT pt) noexcept -{ - if (m_layout) - { - return m_layout->ZonesFromPoint(pt); - } - - return {}; -} - void WorkArea::SetAsTopmostWindow() noexcept { if (!m_window) @@ -667,11 +636,6 @@ void WorkArea::SetAsTopmostWindow() noexcept SetWindowPos(m_window, windowInsertAfter, 0, 0, 0, 0, flags); } -void WorkArea::LogInitializationError() -{ - Logger::error(L"Unable to get monitor info, {}", get_last_error_or_default(GetLastError())); -} - #pragma endregion LRESULT CALLBACK WorkArea::s_WndProc(HWND window, UINT message, WPARAM wparam, LPARAM lparam) noexcept diff --git a/src/modules/fancyzones/FancyZonesLib/WorkArea.h b/src/modules/fancyzones/FancyZonesLib/WorkArea.h index 61458f71791..27181dd4dd0 100644 --- a/src/modules/fancyzones/FancyZonesLib/WorkArea.h +++ b/src/modules/fancyzones/FancyZonesLib/WorkArea.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -10,7 +11,7 @@ class ZonesOverlay; class WorkArea { public: - WorkArea(HINSTANCE hinstance, const FancyZonesDataTypes::WorkAreaId& uniqueId); + WorkArea(HINSTANCE hinstance, const FancyZonesDataTypes::WorkAreaId& uniqueId, const FancyZonesUtils::Rect& workAreaRect); ~WorkArea(); public: @@ -26,34 +27,6 @@ class WorkArea return true; } - inline bool InitWorkAreaRect(HMONITOR monitor) - { - m_monitor = monitor; - -#if defined(UNIT_TESTS) - m_workAreaRect = FancyZonesUtils::Rect({ 0, 0, 1920, 1080 }); -#else - - if (monitor) - { - MONITORINFO mi{}; - mi.cbSize = sizeof(mi); - if (!GetMonitorInfoW(monitor, &mi)) - { - return false; - } - - m_workAreaRect = FancyZonesUtils::Rect(mi.rcWork); - } - else - { - m_workAreaRect = FancyZonesUtils::GetAllMonitorsCombinedRect<&MONITORINFO::rcWork>(); - } -#endif - - return true; - } - FancyZonesDataTypes::WorkAreaId UniqueId() const noexcept { return { m_uniqueId }; } const std::unique_ptr& GetLayout() const noexcept { return m_layout; } const std::unique_ptr& GetLayoutWindows() const noexcept { return m_layoutWindows; } @@ -79,8 +52,6 @@ class WorkArea void ClearSelectedZones() noexcept; void CycleWindows(HWND window, bool reverse) noexcept; - - void LogInitializationError(); protected: static LRESULT CALLBACK s_WndProc(HWND window, UINT message, WPARAM wparam, LPARAM lparam) noexcept; @@ -90,32 +61,22 @@ class WorkArea void InitLayout(const FancyZonesDataTypes::WorkAreaId& parentUniqueId) noexcept; void CalculateZoneSet() noexcept; LRESULT WndProc(UINT message, WPARAM wparam, LPARAM lparam) noexcept; - ZoneIndexSet ZonesFromPoint(POINT pt) noexcept; void SetAsTopmostWindow() noexcept; - HMONITOR m_monitor{}; - FancyZonesUtils::Rect m_workAreaRect{}; + const FancyZonesUtils::Rect m_workAreaRect{}; const FancyZonesDataTypes::WorkAreaId m_uniqueId; HWND m_window{}; // Hidden tool window used to represent current monitor desktop work area. - HWND m_windowMoveSize{}; std::unique_ptr m_layout; std::unique_ptr m_layoutWindows; - ZoneIndexSet m_initialHighlightZone; - ZoneIndexSet m_highlightZone; - WPARAM m_keyLast{}; - size_t m_keyCycle{}; std::unique_ptr m_zonesOverlay; + HighlightedZones m_highlightedZones; + + HWND m_windowMoveSize{}; }; -inline std::shared_ptr MakeWorkArea(HINSTANCE hinstance, HMONITOR monitor, const FancyZonesDataTypes::WorkAreaId& uniqueId, const FancyZonesDataTypes::WorkAreaId& parentUniqueId) noexcept +inline std::shared_ptr MakeWorkArea(HINSTANCE hinstance, const FancyZonesDataTypes::WorkAreaId& uniqueId, const FancyZonesDataTypes::WorkAreaId& parentUniqueId, const FancyZonesUtils::Rect& workAreaRect) { - auto self = std::make_shared(hinstance, uniqueId); - if (!self->InitWorkAreaRect(monitor)) - { - self->LogInitializationError(); - return nullptr; - } - + auto self = std::make_shared(hinstance, uniqueId, workAreaRect); if (!self->Init(hinstance, parentUniqueId)) { return nullptr; diff --git a/src/modules/fancyzones/FancyZonesTests/UnitTests/WorkArea.Spec.cpp b/src/modules/fancyzones/FancyZonesTests/UnitTests/WorkArea.Spec.cpp index edfeaf80f4b..69791124029 100644 --- a/src/modules/fancyzones/FancyZonesTests/UnitTests/WorkArea.Spec.cpp +++ b/src/modules/fancyzones/FancyZonesTests/UnitTests/WorkArea.Spec.cpp @@ -22,11 +22,12 @@ namespace FancyZonesUnitTests { FancyZonesDataTypes::WorkAreaId m_uniqueId; FancyZonesDataTypes::WorkAreaId m_emptyUniqueId; + FancyZonesUtils::Rect m_workAreaRect{ RECT(0,0,1920,1080) }; HINSTANCE m_hInst{}; HMONITOR m_monitor{}; - TEST_METHOD_INITIALIZE(Init) + TEST_METHOD_INITIALIZE(Init) noexcept { m_uniqueId.monitorId.deviceId.id = L"DELA026"; m_uniqueId.monitorId.deviceId.instanceId = L"5&10a58c63&0&UID16777488"; @@ -38,7 +39,7 @@ namespace FancyZonesUnitTests DefaultLayouts::instance().LoadData(); } - TEST_METHOD_CLEANUP(CleanUp) + TEST_METHOD_CLEANUP(CleanUp) noexcept { std::filesystem::remove(AppliedLayouts::AppliedLayoutsFileName()); std::filesystem::remove(AppZoneHistory::AppZoneHistoryFileName()); @@ -50,7 +51,7 @@ namespace FancyZonesUnitTests { const auto defaultLayout = DefaultLayouts::instance().GetDefaultLayout(); - auto workArea = MakeWorkArea({}, Mocks::Monitor(), m_uniqueId, m_emptyUniqueId); + auto workArea = MakeWorkArea({}, m_uniqueId, m_emptyUniqueId, m_workAreaRect); Assert::IsFalse(workArea == nullptr); Assert::IsTrue(m_uniqueId == workArea->UniqueId()); @@ -65,7 +66,7 @@ namespace FancyZonesUnitTests { const auto defaultLayout = DefaultLayouts::instance().GetDefaultLayout(); - auto workArea = MakeWorkArea({}, {}, m_uniqueId, m_emptyUniqueId); + auto workArea = MakeWorkArea({}, m_uniqueId, m_emptyUniqueId, m_workAreaRect); Assert::IsFalse(workArea == nullptr); Assert::IsTrue(m_uniqueId == workArea->UniqueId()); @@ -95,10 +96,10 @@ namespace FancyZonesUnitTests .sensitivityRadius = 20, }; - auto parentWorkArea = MakeWorkArea(m_hInst, m_monitor, parentUniqueId, m_emptyUniqueId); + auto parentWorkArea = MakeWorkArea(m_hInst, parentUniqueId, m_emptyUniqueId, m_workAreaRect); AppliedLayouts::instance().ApplyLayout(parentUniqueId, layout); - auto actualWorkArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, parentUniqueId); + auto actualWorkArea = MakeWorkArea(m_hInst, m_uniqueId, parentUniqueId, m_workAreaRect); Assert::IsNotNull(actualWorkArea->GetLayout().get()); Assert::IsNotNull(actualWorkArea->GetLayoutWindows().get()); @@ -131,7 +132,7 @@ namespace FancyZonesUnitTests DefaultLayouts::instance().LoadData(); // test - auto workArea = MakeWorkArea({}, Mocks::Monitor(), m_uniqueId, m_emptyUniqueId); + auto workArea = MakeWorkArea({}, m_uniqueId, m_emptyUniqueId, m_workAreaRect); Assert::IsFalse(workArea == nullptr); Assert::IsTrue(m_uniqueId == workArea->UniqueId()); @@ -164,7 +165,7 @@ namespace FancyZonesUnitTests DefaultLayouts::instance().LoadData(); // test - auto workArea = MakeWorkArea({}, Mocks::Monitor(), m_uniqueId, m_emptyUniqueId); + auto workArea = MakeWorkArea({}, m_uniqueId, m_emptyUniqueId, m_workAreaRect); Assert::IsFalse(workArea == nullptr); Assert::IsTrue(m_uniqueId == workArea->UniqueId()); @@ -181,11 +182,11 @@ namespace FancyZonesUnitTests { FancyZonesDataTypes::WorkAreaId m_uniqueId; FancyZonesDataTypes::WorkAreaId m_parentUniqueId; // default empty + FancyZonesUtils::Rect m_workAreaRect{ RECT(0, 0, 1920, 1080) }; HINSTANCE m_hInst{}; - HMONITOR m_monitor{}; - TEST_METHOD_INITIALIZE(Init) + TEST_METHOD_INITIALIZE(Init) noexcept { m_uniqueId.monitorId.deviceId.id = L"DELA026"; m_uniqueId.monitorId.deviceId.instanceId = L"5&10a58c63&0&UID16777488"; @@ -196,7 +197,7 @@ namespace FancyZonesUnitTests AppliedLayouts::instance().LoadData(); } - TEST_METHOD_CLEANUP(CleanUp) + TEST_METHOD_CLEANUP(CleanUp) noexcept { std::filesystem::remove(AppZoneHistory::AppZoneHistoryFileName()); std::filesystem::remove(AppliedLayouts::AppliedLayoutsFileName()); @@ -205,9 +206,9 @@ namespace FancyZonesUnitTests public: TEST_METHOD (MoveSizeEnter) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); - const auto expected = S_OK; + constexpr auto expected = S_OK; const auto actual = workArea->MoveSizeEnter(Mocks::Window()); Assert::AreEqual(expected, actual); @@ -215,9 +216,9 @@ namespace FancyZonesUnitTests TEST_METHOD (MoveSizeEnterTwice) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); - const auto expected = S_OK; + constexpr auto expected = S_OK; workArea->MoveSizeEnter(Mocks::Window()); const auto actual = workArea->MoveSizeEnter(Mocks::Window()); @@ -227,9 +228,9 @@ namespace FancyZonesUnitTests TEST_METHOD (MoveSizeUpdate) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); - const auto expected = S_OK; + constexpr auto expected = S_OK; const auto actual = workArea->MoveSizeUpdate(POINT{ 0, 0 }, true, false); Assert::AreEqual(expected, actual); @@ -237,9 +238,9 @@ namespace FancyZonesUnitTests TEST_METHOD (MoveSizeUpdatePointNegativeCoordinates) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); - const auto expected = S_OK; + constexpr auto expected = S_OK; const auto actual = workArea->MoveSizeUpdate(POINT{ -10, -10 }, true, false); Assert::AreEqual(expected, actual); @@ -247,9 +248,9 @@ namespace FancyZonesUnitTests TEST_METHOD (MoveSizeUpdatePointBigCoordinates) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); - const auto expected = S_OK; + constexpr auto expected = S_OK; const auto actual = workArea->MoveSizeUpdate(POINT{ LONG_MAX, LONG_MAX }, true, false); Assert::AreEqual(expected, actual); @@ -257,13 +258,13 @@ namespace FancyZonesUnitTests TEST_METHOD (MoveSizeEnd) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::Window(); workArea->MoveSizeEnter(window); workArea->MoveSizeUpdate({ 20, 20 }, true, true); - const auto expected = S_OK; + constexpr auto expected = S_OK; const auto actual = workArea->MoveSizeEnd(window); Assert::AreEqual(expected, actual); @@ -274,12 +275,12 @@ namespace FancyZonesUnitTests TEST_METHOD (MoveSizeEndDifferentWindows) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::Window(); workArea->MoveSizeEnter(window); - const auto expected = E_INVALIDARG; + constexpr auto expected = E_INVALIDARG; const auto actual = workArea->MoveSizeEnd(Mocks::Window()); Assert::AreEqual(expected, actual); @@ -287,9 +288,9 @@ namespace FancyZonesUnitTests TEST_METHOD (MoveSizeEndWindowNotSet) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); - const auto expected = E_INVALIDARG; + constexpr auto expected = E_INVALIDARG; const auto actual = workArea->MoveSizeEnd(Mocks::Window()); Assert::AreEqual(expected, actual); @@ -297,7 +298,7 @@ namespace FancyZonesUnitTests TEST_METHOD (SaveWindowProcessToZoneIndexNullptrWindow) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); workArea->SaveWindowProcessToZoneIndex(nullptr); @@ -307,7 +308,7 @@ namespace FancyZonesUnitTests TEST_METHOD (SaveWindowProcessToZoneIndexNoWindowAdded) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); auto window = Mocks::WindowCreate(m_hInst); workArea->GetLayout()->Init(RECT{ 0, 0, 1920, 1080 }, Mocks::Monitor()); @@ -320,7 +321,7 @@ namespace FancyZonesUnitTests TEST_METHOD (SaveWindowProcessToZoneIndexNoWindowAddedWithFilledAppZoneHistory) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); const auto processPath = get_process_path(window); @@ -332,7 +333,7 @@ namespace FancyZonesUnitTests Assert::AreEqual((size_t)1, AppZoneHistory::instance().GetFullAppZoneHistory().size()); const auto& appHistoryArray1 = AppZoneHistory::instance().GetFullAppZoneHistory().at(processPath); Assert::AreEqual((size_t)1, appHistoryArray1.size()); - Assert::IsTrue(std::vector{ 0 } == appHistoryArray1[0].zoneIndexSet); + Assert::IsTrue(std::vector{ 0 } == appHistoryArray1.at(0).zoneIndexSet); // add zone without window workArea->GetLayout()->Init(RECT{ 0, 0, 1920, 1080 }, Mocks::Monitor()); @@ -341,12 +342,12 @@ namespace FancyZonesUnitTests Assert::AreEqual((size_t)1, AppZoneHistory::instance().GetFullAppZoneHistory().size()); const auto& appHistoryArray2 = AppZoneHistory::instance().GetFullAppZoneHistory().at(processPath); Assert::AreEqual((size_t)1, appHistoryArray2.size()); - Assert::IsTrue(std::vector{ 0 } == appHistoryArray2[0].zoneIndexSet); + Assert::IsTrue(std::vector{ 0 } == appHistoryArray2.at(0).zoneIndexSet); } TEST_METHOD (SaveWindowProcessToZoneIndexWindowAdded) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); auto window = Mocks::WindowCreate(m_hInst); const auto processPath = get_process_path(window); @@ -360,25 +361,25 @@ namespace FancyZonesUnitTests Assert::AreEqual((size_t)1, AppZoneHistory::instance().GetFullAppZoneHistory().size()); const auto& appHistoryArray = AppZoneHistory::instance().GetFullAppZoneHistory().at(processPath); Assert::AreEqual((size_t)1, appHistoryArray.size()); - Assert::IsTrue(std::vector{ 2 } == appHistoryArray[0].zoneIndexSet); + Assert::IsTrue(std::vector{ 2 } == appHistoryArray.at(0).zoneIndexSet); workArea->SaveWindowProcessToZoneIndex(window); const auto& actualAppZoneHistory = AppZoneHistory::instance().GetFullAppZoneHistory(); Assert::AreEqual((size_t)1, actualAppZoneHistory.size()); const auto& expected = workArea->GetLayoutWindows()->GetZoneIndexSetFromWindow(window); - const auto& actual = appHistoryArray[0].zoneIndexSet; + const auto& actual = appHistoryArray.at(0).zoneIndexSet; Assert::IsTrue(expected == actual); } TEST_METHOD (WhenWindowIsNotResizablePlacingItIntoTheZoneShouldNotResizeIt) { - auto workArea = MakeWorkArea(m_hInst, m_monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); auto window = Mocks::WindowCreate(m_hInst); - int originalWidth = 450; - int originalHeight = 550; + const int originalWidth = 450; + const int originalHeight = 550; SetWindowPos(window, nullptr, 150, 150, originalWidth, originalHeight, SWP_SHOWWINDOW); SetWindowLong(window, GWL_STYLE, GetWindowLong(window, GWL_STYLE) & ~WS_SIZEBOX); @@ -412,7 +413,7 @@ namespace FancyZonesUnitTests FancyZonesDataTypes::WorkAreaId m_parentUniqueId; // default empty HINSTANCE m_hInst{}; - HMONITOR m_monitor{}; + FancyZonesUtils::Rect m_workAreaRect{ RECT(0, 0, 1920, 1080) }; void PrepareEmptyLayout() { @@ -482,13 +483,13 @@ namespace FancyZonesUnitTests AppliedLayouts::instance().LoadData(); } - TEST_METHOD_INITIALIZE(Init) + TEST_METHOD_INITIALIZE(Init) noexcept { AppZoneHistory::instance().LoadData(); AppliedLayouts::instance().LoadData(); } - TEST_METHOD_CLEANUP(CleanUp) + TEST_METHOD_CLEANUP(CleanUp) noexcept { std::filesystem::remove(AppZoneHistory::AppZoneHistoryFileName()); std::filesystem::remove(AppliedLayouts::AppliedLayoutsFileName()); @@ -498,7 +499,7 @@ namespace FancyZonesUnitTests { // prepare PrepareEmptyLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); // test @@ -515,7 +516,7 @@ namespace FancyZonesUnitTests { // prepare PrepareEmptyLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); // test @@ -532,7 +533,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); // test @@ -549,7 +550,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); // test @@ -566,7 +567,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); const auto& layoutWindows = workArea->GetLayoutWindows(); @@ -585,7 +586,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone @@ -596,14 +597,14 @@ namespace FancyZonesUnitTests Assert::AreEqual((size_t)1, actualAppZoneHistory.size()); const auto& layoutWindows = workArea->GetLayoutWindows(); - Assert::IsTrue(ZoneIndexSet{ (ZoneIndex)workArea->GetLayout()->Zones().size() - 1 } == layoutWindows->GetZoneIndexSetFromWindow(window)); + Assert::IsTrue(ZoneIndexSet{ static_cast(workArea->GetLayout()->Zones().size()) - 1 } == layoutWindows->GetZoneIndexSetFromWindow(window)); } TEST_METHOD (MoveAppliedWindowByIndexNoCycle) { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone @@ -621,7 +622,7 @@ namespace FancyZonesUnitTests { // prepare PrepareEmptyLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); // test @@ -638,7 +639,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); // test @@ -655,7 +656,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); // test @@ -672,7 +673,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone @@ -690,7 +691,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone @@ -708,7 +709,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone @@ -726,7 +727,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone @@ -744,7 +745,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); const auto& layoutWindows = workArea->GetLayoutWindows(); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone @@ -763,7 +764,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone @@ -781,7 +782,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone @@ -799,7 +800,7 @@ namespace FancyZonesUnitTests { // prepare PrepareGridLayout(); - auto workArea = MakeWorkArea(m_hInst, m_uniqueId.monitorId.monitor, m_uniqueId, m_parentUniqueId); + auto workArea = MakeWorkArea(m_hInst, m_uniqueId, m_parentUniqueId, m_workAreaRect); const auto window = Mocks::WindowCreate(m_hInst); workArea->MoveWindowIntoZoneByDirectionAndIndex(window, VK_RIGHT, true); // apply to 1st zone