diff --git a/src/modules/fancyzones/lib/FancyZonesData.cpp b/src/modules/fancyzones/lib/FancyZonesData.cpp index 77bc701daa..b4955c576b 100644 --- a/src/modules/fancyzones/lib/FancyZonesData.cpp +++ b/src/modules/fancyzones/lib/FancyZonesData.cpp @@ -95,11 +95,28 @@ std::optional FancyZonesData::FindCustom void FancyZonesData::AddDevice(const std::wstring& deviceId) { + using namespace FancyZonesDataTypes; + std::scoped_lock lock{ dataLock }; if (!deviceInfoMap.contains(deviceId)) { // Creates default entry in map when ZoneWindow is created - deviceInfoMap[deviceId] = FancyZonesDataTypes::DeviceInfoData{ FancyZonesDataTypes::ZoneSetData{ NonLocalizable::NullStr, FancyZonesDataTypes::ZoneSetLayoutType::Blank } }; + GUID guid; + auto result{ CoCreateGuid(&guid) }; + wil::unique_cotaskmem_string guidString; + if (result == S_OK && SUCCEEDED(StringFromCLSID(guid, &guidString))) + { + constexpr bool defaultShowSpacing{ true }; + constexpr int defaultSpacing{ 16 }; + constexpr int defaultZoneCount{ 3 }; + const ZoneSetData zoneSetData{ guidString.get(), ZoneSetLayoutType::PriorityGrid }; + DeviceInfoData defaultDeviceInfoData{ zoneSetData, defaultShowSpacing, defaultSpacing, defaultZoneCount }; + deviceInfoMap[deviceId] = std::move(defaultDeviceInfoData); + } + else + { + deviceInfoMap[deviceId] = DeviceInfoData{ ZoneSetData{ NonLocalizable::NullStr, ZoneSetLayoutType::Blank } }; + } } } @@ -118,11 +135,7 @@ void FancyZonesData::CloneDeviceInfo(const std::wstring& source, const std::wstr } // Clone information from source device if destination device is uninitialized (Blank). - auto& destInfo = deviceInfoMap[destination]; - if (destInfo.activeZoneSet.type == FancyZonesDataTypes::ZoneSetLayoutType::Blank) - { - destInfo = deviceInfoMap[source]; - } + deviceInfoMap[destination] = deviceInfoMap[source]; } void FancyZonesData::UpdatePrimaryDesktopData(const std::wstring& desktopId) diff --git a/src/modules/fancyzones/tests/UnitTests/Util.cpp b/src/modules/fancyzones/tests/UnitTests/Util.cpp index 4d302fdb8a..4f89409270 100644 --- a/src/modules/fancyzones/tests/UnitTests/Util.cpp +++ b/src/modules/fancyzones/tests/UnitTests/Util.cpp @@ -86,6 +86,7 @@ DWORD WINAPI ThreadProc(LPVOID lpParam) if (RegisterDLLWindowClass((LPCWSTR)creator->getWindowClassName().c_str(), creator) != 0) { auto hWnd = CreateWindowEx(0, (LPCWSTR)creator->getWindowClassName().c_str(), (LPCWSTR)creator->getTitle().c_str(), WS_EX_APPWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 10, 10, nullptr, nullptr, creator->getHInstance(), NULL); + SetWindowPos(hWnd, HWND_TOPMOST, 10, 10, 100, 100, SWP_SHOWWINDOW); creator->setHwnd(hWnd); creator->setCondition(true); diff --git a/src/modules/fancyzones/tests/UnitTests/ZoneWindow.Spec.cpp b/src/modules/fancyzones/tests/UnitTests/ZoneWindow.Spec.cpp index de0b8f0fa1..c9dac75cea 100644 --- a/src/modules/fancyzones/tests/UnitTests/ZoneWindow.Spec.cpp +++ b/src/modules/fancyzones/tests/UnitTests/ZoneWindow.Spec.cpp @@ -116,21 +116,33 @@ namespace FancyZonesUnitTests { auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); testZoneWindow(zoneWindow); - Assert::IsNull(zoneWindow->ActiveZoneSet()); + + auto* activeZoneSet{ zoneWindow->ActiveZoneSet() }; + Assert::IsNotNull(activeZoneSet); + Assert::AreEqual(static_cast(activeZoneSet->LayoutType()), static_cast(FancyZonesDataTypes::ZoneSetLayoutType::PriorityGrid)); + Assert::AreEqual(activeZoneSet->GetZones().size(), static_cast(3)); } TEST_METHOD(CreateZoneWindowNoHinst) { auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), {}, m_monitor, m_uniqueId.str(), {}, false); testZoneWindow(zoneWindow); - Assert::IsNull(zoneWindow->ActiveZoneSet()); + + auto* activeZoneSet{ zoneWindow->ActiveZoneSet() }; + Assert::IsNotNull(activeZoneSet); + Assert::AreEqual(static_cast(activeZoneSet->LayoutType()), static_cast(FancyZonesDataTypes::ZoneSetLayoutType::PriorityGrid)); + Assert::AreEqual(activeZoneSet->GetZones().size(), static_cast(3)); } TEST_METHOD(CreateZoneWindowNoHinstFlashZones) { auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), {}, m_monitor, m_uniqueId.str(), {}, false); testZoneWindow(zoneWindow); - Assert::IsNull(zoneWindow->ActiveZoneSet()); + + auto* activeZoneSet{ zoneWindow->ActiveZoneSet() }; + Assert::IsNotNull(activeZoneSet); + Assert::AreEqual(static_cast(activeZoneSet->LayoutType()), static_cast(FancyZonesDataTypes::ZoneSetLayoutType::PriorityGrid)); + Assert::AreEqual(activeZoneSet->GetZones().size(), static_cast(3)); } TEST_METHOD(CreateZoneWindowNoMonitor) @@ -156,7 +168,11 @@ namespace FancyZonesUnitTests Assert::IsNotNull(zoneWindow.get()); Assert::AreEqual(expectedUniqueId.c_str(), zoneWindow->UniqueId().c_str()); - Assert::IsNull(zoneWindow->ActiveZoneSet()); + + auto* activeZoneSet{ zoneWindow->ActiveZoneSet() }; + Assert::IsNotNull(activeZoneSet); + Assert::AreEqual(static_cast(activeZoneSet->LayoutType()), static_cast(FancyZonesDataTypes::ZoneSetLayoutType::PriorityGrid)); + Assert::AreEqual(activeZoneSet->GetZones().size(), static_cast(3)); } TEST_METHOD(CreateZoneWindowNoDesktopId) @@ -168,8 +184,11 @@ namespace FancyZonesUnitTests const std::wstring expectedWorkArea = std::to_wstring(m_monitorInfo.rcMonitor.right) + L"_" + std::to_wstring(m_monitorInfo.rcMonitor.bottom); Assert::IsNotNull(zoneWindow.get()); Assert::IsTrue(zoneWindow->UniqueId().empty()); - Assert::IsNull(zoneWindow->ActiveZoneSet()); - Assert::IsNull(zoneWindow->ActiveZoneSet()); + + auto* activeZoneSet{ zoneWindow->ActiveZoneSet() }; + Assert::IsNotNull(activeZoneSet); + Assert::AreEqual(static_cast(activeZoneSet->LayoutType()), static_cast(FancyZonesDataTypes::ZoneSetLayoutType::PriorityGrid)); + Assert::AreEqual(activeZoneSet->GetZones().size(), static_cast(3)); } TEST_METHOD(CreateZoneWindowWithActiveZoneTmpFile) @@ -401,16 +420,15 @@ namespace FancyZonesUnitTests // newWorkArea = false - zoneWindow won't be cloned from parent auto actualZoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); - Assert::IsNull(actualZoneWindow->ActiveZoneSet()); + Assert::IsNotNull(actualZoneWindow->ActiveZoneSet()); Assert::IsTrue(m_fancyZonesData.GetDeviceInfoMap().contains(m_uniqueId.str())); auto currentDeviceInfo = m_fancyZonesData.GetDeviceInfoMap().at(m_uniqueId.str()); // default values - Assert::AreEqual(false, currentDeviceInfo.showSpacing); - Assert::AreEqual(0, currentDeviceInfo.zoneCount); - Assert::AreEqual(0, currentDeviceInfo.spacing); - Assert::AreEqual(std::wstring{ L"null" }, currentDeviceInfo.activeZoneSet.uuid); - Assert::AreEqual(static_cast(ZoneSetLayoutType::Blank), static_cast(currentDeviceInfo.activeZoneSet.type)); + Assert::AreEqual(true, currentDeviceInfo.showSpacing); + Assert::AreEqual(3, currentDeviceInfo.zoneCount); + Assert::AreEqual(16, currentDeviceInfo.spacing); + Assert::AreEqual(static_cast(ZoneSetLayoutType::PriorityGrid), static_cast(currentDeviceInfo.activeZoneSet.type)); } }; @@ -454,22 +472,6 @@ namespace FancyZonesUnitTests std::filesystem::remove(m_fancyZonesData.deletedCustomZoneSetsTmpFileName); } - void PrepareFZData() - { - const auto activeZoneSetTempPath = m_fancyZonesData.activeZoneSetTmpFileName; - Assert::IsFalse(std::filesystem::exists(activeZoneSetTempPath)); - - const auto type = FancyZonesDataTypes::ZoneSetLayoutType::Columns; - const auto expectedZoneSet = FancyZonesDataTypes::ZoneSetData{ Helpers::CreateGuidString(), type }; - const auto data = FancyZonesDataTypes::DeviceInfoData{ expectedZoneSet, true, 16, 3 }; - const auto deviceInfo = JSONHelpers::DeviceInfoJSON{ m_uniqueId.str(), data }; - const auto json = JSONHelpers::DeviceInfoJSON::ToJson(deviceInfo); - json::to_file(activeZoneSetTempPath, json); - Assert::IsTrue(std::filesystem::exists(activeZoneSetTempPath)); - - m_fancyZonesData.ParseDeviceInfoFromTmpFile(activeZoneSetTempPath); - } - public: TEST_METHOD(MoveSizeEnter) { @@ -525,7 +527,6 @@ namespace FancyZonesUnitTests TEST_METHOD(MoveSizeEnd) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); const auto window = Mocks::Window(); @@ -543,7 +544,6 @@ namespace FancyZonesUnitTests TEST_METHOD(MoveSizeEndWindowNotAdded) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); const auto window = Mocks::Window(); @@ -583,7 +583,6 @@ namespace FancyZonesUnitTests TEST_METHOD(MoveSizeEndInvalidPoint) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); const auto window = Mocks::Window(); @@ -599,17 +598,8 @@ namespace FancyZonesUnitTests Assert::IsFalse(std::vector{} == actualZoneIndex); // with invalid point zone remains the same } - TEST_METHOD(MoveWindowIntoZoneByIndexNoActiveZoneSet) - { - auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); - Assert::IsNull(zoneWindow->ActiveZoneSet()); - - zoneWindow->MoveWindowIntoZoneByIndex(Mocks::Window(), 0); - } - TEST_METHOD(MoveWindowIntoZoneByIndex) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); Assert::IsNotNull(zoneWindow->ActiveZoneSet()); @@ -618,17 +608,8 @@ namespace FancyZonesUnitTests const auto actual = zoneWindow->ActiveZoneSet(); } - TEST_METHOD(MoveWindowIntoZoneByDirectionNoActiveZoneSet) - { - auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); - Assert::IsNull(zoneWindow->ActiveZoneSet()); - - zoneWindow->MoveWindowIntoZoneByIndex(Mocks::Window(), 0); - } - TEST_METHOD(MoveWindowIntoZoneByDirectionAndIndex) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); Assert::IsNotNull(zoneWindow->ActiveZoneSet()); @@ -644,7 +625,6 @@ namespace FancyZonesUnitTests TEST_METHOD(MoveWindowIntoZoneByDirectionManyTimes) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); Assert::IsNotNull(zoneWindow->ActiveZoneSet()); @@ -660,20 +640,8 @@ namespace FancyZonesUnitTests Assert::IsTrue(std::vector{ 2 } == appHistoryArray[0].zoneIndexSet); } - TEST_METHOD(SaveWindowProcessToZoneIndexNoActiveZoneSet) - { - auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); - Assert::IsNull(zoneWindow->ActiveZoneSet()); - - zoneWindow->SaveWindowProcessToZoneIndex(Mocks::Window()); - - const auto actualAppZoneHistory = m_fancyZonesData.GetAppZoneHistoryMap(); - Assert::IsTrue(actualAppZoneHistory.empty()); - } - TEST_METHOD(SaveWindowProcessToZoneIndexNullptrWindow) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); Assert::IsNotNull(zoneWindow->ActiveZoneSet()); @@ -685,7 +653,6 @@ namespace FancyZonesUnitTests TEST_METHOD(SaveWindowProcessToZoneIndexNoWindowAdded) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); Assert::IsNotNull(zoneWindow->ActiveZoneSet()); @@ -701,7 +668,6 @@ namespace FancyZonesUnitTests TEST_METHOD(SaveWindowProcessToZoneIndexNoWindowAddedWithFilledAppZoneHistory) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); Assert::IsNotNull(zoneWindow->ActiveZoneSet()); @@ -730,7 +696,6 @@ namespace FancyZonesUnitTests TEST_METHOD(SaveWindowProcessToZoneIndexWindowAdded) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); Assert::IsNotNull(zoneWindow->ActiveZoneSet()); @@ -761,7 +726,6 @@ namespace FancyZonesUnitTests TEST_METHOD(WhenWindowIsNotResizablePlacingItIntoTheZoneShouldNotResizeIt) { - PrepareFZData(); auto zoneWindow = MakeZoneWindow(winrt::make_self().get(), m_hInst, m_monitor, m_uniqueId.str(), {}, false); Assert::IsNotNull(zoneWindow->ActiveZoneSet());