mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 03:37:59 +01:00
Thread safety for FanncyZonesData (#1281)
* FancyZones: make FancyZonesData thread-safe * fixup: format affected sources * fixup: clang-format case-style and format FancyZones.cpp * fixup! add missing lock
This commit is contained in:
@@ -20,6 +20,7 @@ AlwaysBreakTemplateDeclarations: Yes
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
BraceWrapping:
|
||||
AfterCaseLabel: true
|
||||
AfterClass: true
|
||||
AfterControlStatement: true
|
||||
AfterEnum: true
|
||||
@@ -28,7 +29,7 @@ BraceWrapping:
|
||||
AfterObjCDeclaration: true
|
||||
AfterStruct: true
|
||||
AfterUnion: true
|
||||
AfterExternBlock: false
|
||||
AfterExternBlock: true
|
||||
BeforeCatch: true
|
||||
BeforeElse: true
|
||||
IndentBraces: false
|
||||
|
||||
@@ -47,28 +47,42 @@ public:
|
||||
}
|
||||
|
||||
// IFancyZones
|
||||
IFACEMETHODIMP_(void) Run() noexcept;
|
||||
IFACEMETHODIMP_(void) Destroy() noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
Run() noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
Destroy() noexcept;
|
||||
|
||||
// IFancyZonesCallback
|
||||
IFACEMETHODIMP_(bool) InMoveSize() noexcept
|
||||
IFACEMETHODIMP_(bool)
|
||||
InMoveSize() noexcept
|
||||
{
|
||||
std::shared_lock readLock(m_lock);
|
||||
return m_inMoveSize;
|
||||
}
|
||||
IFACEMETHODIMP_(void) MoveSizeStart(HWND window, HMONITOR monitor, POINT const& ptScreen) noexcept;
|
||||
IFACEMETHODIMP_(void) MoveSizeUpdate(HMONITOR monitor, POINT const& ptScreen) noexcept;
|
||||
IFACEMETHODIMP_(void) MoveSizeEnd(HWND window, POINT const& ptScreen) noexcept;
|
||||
IFACEMETHODIMP_(void) VirtualDesktopChanged() noexcept;
|
||||
IFACEMETHODIMP_(void) VirtualDesktopInitialize() noexcept;
|
||||
IFACEMETHODIMP_(void) WindowCreated(HWND window) noexcept;
|
||||
IFACEMETHODIMP_(bool) OnKeyDown(PKBDLLHOOKSTRUCT info) noexcept;
|
||||
IFACEMETHODIMP_(void) ToggleEditor() noexcept;
|
||||
IFACEMETHODIMP_(void) SettingsChanged() noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
MoveSizeStart(HWND window, HMONITOR monitor, POINT const& ptScreen) noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
MoveSizeUpdate(HMONITOR monitor, POINT const& ptScreen) noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
MoveSizeEnd(HWND window, POINT const& ptScreen) noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
VirtualDesktopChanged() noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
VirtualDesktopInitialize() noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
WindowCreated(HWND window) noexcept;
|
||||
IFACEMETHODIMP_(bool)
|
||||
OnKeyDown(PKBDLLHOOKSTRUCT info) noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
ToggleEditor() noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
SettingsChanged() noexcept;
|
||||
|
||||
// IZoneWindowHost
|
||||
IFACEMETHODIMP_(void) MoveWindowsOnActiveZoneSetChange() noexcept;
|
||||
IFACEMETHODIMP_(COLORREF) GetZoneHighlightColor() noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
MoveWindowsOnActiveZoneSetChange() noexcept;
|
||||
IFACEMETHODIMP_(COLORREF)
|
||||
GetZoneHighlightColor() noexcept
|
||||
{
|
||||
// Skip the leading # and convert to long
|
||||
const auto color = m_settings->GetSettings().zoneHightlightColor;
|
||||
@@ -78,7 +92,8 @@ public:
|
||||
const auto nB = (tmp & 0xFF);
|
||||
return RGB(nR, nG, nB);
|
||||
}
|
||||
IFACEMETHODIMP_(IZoneWindow*)GetParentZoneWindow(HMONITOR monitor) noexcept
|
||||
IFACEMETHODIMP_(IZoneWindow*)
|
||||
GetParentZoneWindow(HMONITOR monitor) noexcept
|
||||
{
|
||||
//NOTE: as public method it's unsafe without lock, but it's called from AddZoneWindow through making ZoneWindow that causes deadlock
|
||||
//TODO: needs refactoring
|
||||
@@ -89,7 +104,8 @@ public:
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
IFACEMETHODIMP_(int) GetZoneHighlightOpacity() noexcept
|
||||
IFACEMETHODIMP_(int)
|
||||
GetZoneHighlightOpacity() noexcept
|
||||
{
|
||||
return m_settings->GetSettings().zoneHighlightOpacity;
|
||||
}
|
||||
@@ -176,7 +192,8 @@ UINT FancyZones::WM_PRIV_VDINIT = RegisterWindowMessage(L"{469818a8-00fa-4069-b8
|
||||
UINT FancyZones::WM_PRIV_EDITOR = RegisterWindowMessage(L"{87543824-7080-4e91-9d9c-0404642fc7b6}");
|
||||
|
||||
// IFancyZones
|
||||
IFACEMETHODIMP_(void) FancyZones::Run() noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
FancyZones::Run() noexcept
|
||||
{
|
||||
std::unique_lock writeLock(m_lock);
|
||||
|
||||
@@ -212,7 +229,8 @@ IFACEMETHODIMP_(void) FancyZones::Run() noexcept
|
||||
}
|
||||
|
||||
// IFancyZones
|
||||
IFACEMETHODIMP_(void) FancyZones::Destroy() noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
FancyZones::Destroy() noexcept
|
||||
{
|
||||
std::unique_lock writeLock(m_lock);
|
||||
m_zoneWindowMap.clear();
|
||||
@@ -234,7 +252,8 @@ IFACEMETHODIMP_(void) FancyZones::Destroy() noexcept
|
||||
}
|
||||
|
||||
// IFancyZonesCallback
|
||||
IFACEMETHODIMP_(void) FancyZones::MoveSizeStart(HWND window, HMONITOR monitor, POINT const& ptScreen) noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
FancyZones::MoveSizeStart(HWND window, HMONITOR monitor, POINT const& ptScreen) noexcept
|
||||
{
|
||||
if (IsInterestingWindow(window))
|
||||
{
|
||||
@@ -244,14 +263,16 @@ IFACEMETHODIMP_(void) FancyZones::MoveSizeStart(HWND window, HMONITOR monitor, P
|
||||
}
|
||||
|
||||
// IFancyZonesCallback
|
||||
IFACEMETHODIMP_(void) FancyZones::MoveSizeUpdate(HMONITOR monitor, POINT const& ptScreen) noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
FancyZones::MoveSizeUpdate(HMONITOR monitor, POINT const& ptScreen) noexcept
|
||||
{
|
||||
std::unique_lock writeLock(m_lock);
|
||||
MoveSizeUpdateInternal(monitor, ptScreen, writeLock);
|
||||
}
|
||||
|
||||
// IFancyZonesCallback
|
||||
IFACEMETHODIMP_(void) FancyZones::MoveSizeEnd(HWND window, POINT const& ptScreen) noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
FancyZones::MoveSizeEnd(HWND window, POINT const& ptScreen) noexcept
|
||||
{
|
||||
if (window == m_windowMoveSize || IsInterestingWindow(window))
|
||||
{
|
||||
@@ -261,7 +282,8 @@ IFACEMETHODIMP_(void) FancyZones::MoveSizeEnd(HWND window, POINT const& ptScreen
|
||||
}
|
||||
|
||||
// IFancyZonesCallback
|
||||
IFACEMETHODIMP_(void) FancyZones::VirtualDesktopChanged() noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
FancyZones::VirtualDesktopChanged() noexcept
|
||||
{
|
||||
// VirtualDesktopChanged is called from another thread but results in new windows being created.
|
||||
// Jump over to the UI thread to handle it.
|
||||
@@ -270,13 +292,15 @@ IFACEMETHODIMP_(void) FancyZones::VirtualDesktopChanged() noexcept
|
||||
}
|
||||
|
||||
// IFancyZonesCallback
|
||||
IFACEMETHODIMP_(void) FancyZones::VirtualDesktopInitialize() noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
FancyZones::VirtualDesktopInitialize() noexcept
|
||||
{
|
||||
PostMessage(m_window, WM_PRIV_VDINIT, 0, 0);
|
||||
}
|
||||
|
||||
// IFancyZonesCallback
|
||||
IFACEMETHODIMP_(void) FancyZones::WindowCreated(HWND window) noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
FancyZones::WindowCreated(HWND window) noexcept
|
||||
{
|
||||
if (m_settings->GetSettings().appLastZone_moveWindows && IsInterestingWindow(window))
|
||||
{
|
||||
@@ -308,7 +332,8 @@ IFACEMETHODIMP_(void) FancyZones::WindowCreated(HWND window) noexcept
|
||||
}
|
||||
|
||||
// IFancyZonesCallback
|
||||
IFACEMETHODIMP_(bool) FancyZones::OnKeyDown(PKBDLLHOOKSTRUCT info) noexcept
|
||||
IFACEMETHODIMP_(bool)
|
||||
FancyZones::OnKeyDown(PKBDLLHOOKSTRUCT info) noexcept
|
||||
{
|
||||
// Return true to swallow the keyboard event
|
||||
bool const shift = GetAsyncKeyState(VK_SHIFT) & 0x8000;
|
||||
@@ -430,9 +455,13 @@ void FancyZones::ToggleEditor() noexcept
|
||||
std::to_wstring(width) + L"_" +
|
||||
std::to_wstring(height);
|
||||
|
||||
const auto& deviceInfo = fancyZonesData.GetDeviceInfoMap().at(zoneWindow->UniqueId());
|
||||
const auto deviceInfo = fancyZonesData.FindDeviceInfo(zoneWindow->UniqueId());
|
||||
if (!deviceInfo.has_value())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
JSONHelpers::DeviceInfoJSON deviceInfoJson{ zoneWindow->UniqueId(), deviceInfo };
|
||||
JSONHelpers::DeviceInfoJSON deviceInfoJson{ zoneWindow->UniqueId(), *deviceInfo };
|
||||
fancyZonesData.SerializeDeviceInfoToTmpFile(deviceInfoJson, ZoneWindowUtils::GetActiveZoneSetTmpPath());
|
||||
|
||||
const std::wstring params =
|
||||
@@ -484,7 +513,8 @@ void FancyZones::SettingsChanged() noexcept
|
||||
}
|
||||
|
||||
// IZoneWindowHost
|
||||
IFACEMETHODIMP_(void) FancyZones::MoveWindowsOnActiveZoneSetChange() noexcept
|
||||
IFACEMETHODIMP_(void)
|
||||
FancyZones::MoveWindowsOnActiveZoneSetChange() noexcept
|
||||
{
|
||||
if (m_settings->GetSettings().zoneSetChange_moveWindows)
|
||||
{
|
||||
|
||||
@@ -135,13 +135,10 @@ namespace JSONHelpers
|
||||
jsonFilePath = result + L"\\" + std::wstring(FANCY_ZONES_DATA_FILE);
|
||||
}
|
||||
|
||||
const std::wstring& FancyZonesData::GetPersistFancyZonesJSONPath() const
|
||||
{
|
||||
return jsonFilePath;
|
||||
}
|
||||
|
||||
json::JsonObject FancyZonesData::GetPersistFancyZonesJSON()
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
|
||||
std::wstring save_file_path = GetPersistFancyZonesJSONPath();
|
||||
|
||||
auto result = json::from_file(save_file_path);
|
||||
@@ -155,8 +152,23 @@ namespace JSONHelpers
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<DeviceInfoData> FancyZonesData::FindDeviceInfo(const std::wstring& zoneWindowId) const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
auto it = deviceInfoMap.find(zoneWindowId);
|
||||
return it != end(deviceInfoMap) ? std::optional{ it->second } : std::nullopt;
|
||||
}
|
||||
|
||||
std::optional<CustomZoneSetData> FancyZonesData::FindCustomZoneSet(const std::wstring& guuid) const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
auto it = customZoneSetsMap.find(guuid);
|
||||
return it != end(customZoneSetsMap) ? std::optional{ it->second } : std::nullopt;
|
||||
}
|
||||
|
||||
void FancyZonesData::AddDevice(const std::wstring& deviceId)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
if (!deviceInfoMap.contains(deviceId))
|
||||
{
|
||||
// Creates default entry in map when ZoneWindow is created
|
||||
@@ -168,6 +180,7 @@ namespace JSONHelpers
|
||||
|
||||
void FancyZonesData::CloneDeviceInfo(const std::wstring& source, const std::wstring& destination)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
// Clone information from source device if destination device is uninitialized (Blank).
|
||||
auto& destInfo = deviceInfoMap[destination];
|
||||
if (destInfo.activeZoneSet.type == ZoneSetLayoutType::Blank)
|
||||
@@ -178,6 +191,7 @@ namespace JSONHelpers
|
||||
|
||||
int FancyZonesData::GetAppLastZoneIndex(HWND window, const std::wstring_view& deviceId, const std::wstring_view& zoneSetId) const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
auto processPath = get_process_path(window);
|
||||
if (!processPath.empty())
|
||||
{
|
||||
@@ -197,6 +211,7 @@ namespace JSONHelpers
|
||||
|
||||
bool FancyZonesData::RemoveAppLastZone(HWND window, const std::wstring_view& deviceId, const std::wstring_view& zoneSetId)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
auto processPath = get_process_path(window);
|
||||
if (!processPath.empty())
|
||||
{
|
||||
@@ -218,6 +233,7 @@ namespace JSONHelpers
|
||||
|
||||
bool FancyZonesData::SetAppLastZone(HWND window, const std::wstring& deviceId, const std::wstring& zoneSetId, int zoneIndex)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
auto processPath = get_process_path(window);
|
||||
if (processPath.empty())
|
||||
{
|
||||
@@ -231,6 +247,7 @@ namespace JSONHelpers
|
||||
|
||||
void FancyZonesData::SetActiveZoneSet(const std::wstring& deviceId, const ZoneSetData& data)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
auto it = deviceInfoMap.find(deviceId);
|
||||
if (it != deviceInfoMap.end())
|
||||
{
|
||||
@@ -240,12 +257,14 @@ namespace JSONHelpers
|
||||
|
||||
void FancyZonesData::SerializeDeviceInfoToTmpFile(const DeviceInfoJSON& deviceInfo, std::wstring_view tmpFilePath) const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
json::JsonObject deviceInfoJson = DeviceInfoJSON::ToJson(deviceInfo);
|
||||
json::to_file(tmpFilePath, deviceInfoJson);
|
||||
}
|
||||
|
||||
void FancyZonesData::ParseDeviceInfoFromTmpFile(std::wstring_view tmpFilePath)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
if (std::filesystem::exists(tmpFilePath))
|
||||
{
|
||||
if (auto zoneSetJson = json::from_file(tmpFilePath); zoneSetJson.has_value())
|
||||
@@ -266,6 +285,7 @@ namespace JSONHelpers
|
||||
|
||||
bool FancyZonesData::ParseCustomZoneSetFromTmpFile(std::wstring_view tmpFilePath)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
bool res = true;
|
||||
if (std::filesystem::exists(tmpFilePath))
|
||||
{
|
||||
@@ -291,6 +311,7 @@ namespace JSONHelpers
|
||||
|
||||
bool FancyZonesData::ParseDeletedCustomZoneSetsFromTmpFile(std::wstring_view tmpFilePath)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
bool res = true;
|
||||
if (std::filesystem::exists(tmpFilePath))
|
||||
{
|
||||
@@ -317,6 +338,7 @@ namespace JSONHelpers
|
||||
|
||||
bool FancyZonesData::ParseAppZoneHistory(const json::JsonObject& fancyZonesDataJSON)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
try
|
||||
{
|
||||
auto appLastZones = fancyZonesDataJSON.GetNamedArray(L"app-zone-history");
|
||||
@@ -344,6 +366,7 @@ namespace JSONHelpers
|
||||
|
||||
json::JsonArray FancyZonesData::SerializeAppZoneHistory() const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
json::JsonArray appHistoryArray;
|
||||
|
||||
for (const auto& [appPath, appZoneHistoryData] : appZoneHistoryMap)
|
||||
@@ -356,6 +379,7 @@ namespace JSONHelpers
|
||||
|
||||
bool FancyZonesData::ParseDeviceInfos(const json::JsonObject& fancyZonesDataJSON)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
try
|
||||
{
|
||||
auto devices = fancyZonesDataJSON.GetNamedArray(L"devices");
|
||||
@@ -382,11 +406,13 @@ namespace JSONHelpers
|
||||
|
||||
json::JsonArray FancyZonesData::SerializeDeviceInfos() const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
json::JsonArray DeviceInfosJSON{};
|
||||
|
||||
for (const auto& [deviceID, deviceData] : deviceInfoMap)
|
||||
{
|
||||
if (deviceData.activeZoneSet.type != ZoneSetLayoutType::Blank) {
|
||||
if (deviceData.activeZoneSet.type != ZoneSetLayoutType::Blank)
|
||||
{
|
||||
DeviceInfosJSON.Append(DeviceInfoJSON::DeviceInfoJSON::ToJson(DeviceInfoJSON{ deviceID, deviceData }));
|
||||
}
|
||||
}
|
||||
@@ -396,6 +422,7 @@ namespace JSONHelpers
|
||||
|
||||
bool FancyZonesData::ParseCustomZoneSets(const json::JsonObject& fancyZonesDataJSON)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
try
|
||||
{
|
||||
auto customZoneSets = fancyZonesDataJSON.GetNamedArray(L"custom-zone-sets");
|
||||
@@ -418,6 +445,7 @@ namespace JSONHelpers
|
||||
|
||||
json::JsonArray FancyZonesData::SerializeCustomZoneSets() const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
json::JsonArray customZoneSetsJSON{};
|
||||
|
||||
for (const auto& [zoneSetId, zoneSetData] : customZoneSetsMap)
|
||||
@@ -430,6 +458,7 @@ namespace JSONHelpers
|
||||
|
||||
void FancyZonesData::CustomZoneSetsToJsonFile(std::wstring_view filePath) const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
const auto& customZoneSetsJson = SerializeCustomZoneSets();
|
||||
json::JsonObject root{};
|
||||
root.SetNamedValue(L"custom-zone-sets", customZoneSetsJson);
|
||||
@@ -438,6 +467,7 @@ namespace JSONHelpers
|
||||
|
||||
void FancyZonesData::LoadFancyZonesData()
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
std::wstring jsonFilePath = GetPersistFancyZonesJSONPath();
|
||||
|
||||
if (!std::filesystem::exists(jsonFilePath))
|
||||
@@ -461,6 +491,7 @@ namespace JSONHelpers
|
||||
|
||||
void FancyZonesData::SaveFancyZonesData() const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
json::JsonObject root{};
|
||||
|
||||
root.SetNamedValue(L"app-zone-history", SerializeAppZoneHistory());
|
||||
@@ -474,6 +505,7 @@ namespace JSONHelpers
|
||||
{
|
||||
std::wregex ex(L"^[0-9]{3,4}_[0-9]{3,4}$");
|
||||
|
||||
std::scoped_lock lock{ dataLock };
|
||||
wchar_t key[256];
|
||||
StringCchPrintf(key, ARRAYSIZE(key), L"%s", RegistryHelpers::REG_SETTINGS);
|
||||
HKEY hkey;
|
||||
@@ -521,6 +553,7 @@ namespace JSONHelpers
|
||||
|
||||
void FancyZonesData::MigrateDeviceInfoFromRegistry(const std::wstring& deviceId)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
wchar_t key[256];
|
||||
StringCchPrintf(key, ARRAYSIZE(key), L"%s\\%s", RegistryHelpers::REG_SETTINGS, deviceId.c_str());
|
||||
|
||||
@@ -546,6 +579,7 @@ namespace JSONHelpers
|
||||
|
||||
void FancyZonesData::MigrateCustomZoneSetsFromRegistry()
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
wchar_t key[256];
|
||||
StringCchPrintf(key, ARRAYSIZE(key), L"%s\\%s", RegistryHelpers::REG_SETTINGS, L"Layouts");
|
||||
HKEY hkey;
|
||||
@@ -574,8 +608,7 @@ namespace JSONHelpers
|
||||
}
|
||||
switch (zoneSetData.type)
|
||||
{
|
||||
case CustomLayoutType::Grid:
|
||||
{
|
||||
case CustomLayoutType::Grid: {
|
||||
int j = 5;
|
||||
GridLayoutInfo zoneSetInfo(GridLayoutInfo::Minimal{ .rows = data[j++], .columns = data[j++] });
|
||||
|
||||
@@ -599,8 +632,7 @@ namespace JSONHelpers
|
||||
zoneSetData.info = zoneSetInfo;
|
||||
break;
|
||||
}
|
||||
case CustomLayoutType::Canvas:
|
||||
{
|
||||
case CustomLayoutType::Canvas: {
|
||||
CanvasLayoutInfo info;
|
||||
|
||||
int j = 5;
|
||||
@@ -880,8 +912,7 @@ namespace JSONHelpers
|
||||
result.SetNamedValue(L"name", json::value(customZoneSet.data.name));
|
||||
switch (customZoneSet.data.type)
|
||||
{
|
||||
case CustomLayoutType::Canvas:
|
||||
{
|
||||
case CustomLayoutType::Canvas: {
|
||||
result.SetNamedValue(L"type", json::value(L"canvas"));
|
||||
|
||||
CanvasLayoutInfo info = std::get<CanvasLayoutInfo>(customZoneSet.data.info);
|
||||
@@ -889,8 +920,7 @@ namespace JSONHelpers
|
||||
|
||||
break;
|
||||
}
|
||||
case CustomLayoutType::Grid:
|
||||
{
|
||||
case CustomLayoutType::Grid: {
|
||||
result.SetNamedValue(L"type", json::value(L"grid"));
|
||||
|
||||
GridLayoutInfo gridInfo = std::get<GridLayoutInfo>(customZoneSet.data.info);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <common/settings_helpers.h>
|
||||
#include <common/json.h>
|
||||
#include <mutex>
|
||||
|
||||
#include <string>
|
||||
#include <strsafe.h>
|
||||
@@ -159,12 +160,28 @@ namespace JSONHelpers
|
||||
|
||||
class FancyZonesData
|
||||
{
|
||||
mutable std::recursive_mutex dataLock;
|
||||
|
||||
public:
|
||||
FancyZonesData();
|
||||
|
||||
const std::wstring& GetPersistFancyZonesJSONPath() const;
|
||||
inline const std::wstring& GetPersistFancyZonesJSONPath() const
|
||||
{
|
||||
return jsonFilePath;
|
||||
}
|
||||
json::JsonObject GetPersistFancyZonesJSON();
|
||||
|
||||
std::optional<DeviceInfoData> FindDeviceInfo(const std::wstring& zoneWindowId) const;
|
||||
|
||||
std::optional<CustomZoneSetData> FindCustomZoneSet(const std::wstring& guuid) const;
|
||||
|
||||
inline const std::wstring GetActiveDeviceId() const
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
return activeDeviceId;
|
||||
}
|
||||
|
||||
#if defined(UNIT_TESTS)
|
||||
inline const std::unordered_map<std::wstring, DeviceInfoData>& GetDeviceInfoMap() const
|
||||
{
|
||||
return deviceInfoMap;
|
||||
@@ -180,13 +197,19 @@ namespace JSONHelpers
|
||||
return appZoneHistoryMap;
|
||||
}
|
||||
|
||||
inline const std::wstring GetActiveDeviceId() const
|
||||
inline void clear_data()
|
||||
{
|
||||
return activeDeviceId;
|
||||
appliedZoneSetsMap.clear();
|
||||
appZoneHistoryMap.clear();
|
||||
deviceInfoMap.clear();
|
||||
customZoneSetsMap.clear();
|
||||
activeDeviceId.clear();
|
||||
}
|
||||
#endif
|
||||
|
||||
void SetActiveDeviceId(const std::wstring& deviceId)
|
||||
inline void SetActiveDeviceId(const std::wstring& deviceId)
|
||||
{
|
||||
std::scoped_lock lock{ dataLock };
|
||||
activeDeviceId = deviceId;
|
||||
}
|
||||
|
||||
|
||||
@@ -497,13 +497,15 @@ bool ZoneSet::CalculateCustomLayout(Rect workArea, int spacing) noexcept
|
||||
if (SUCCEEDED_LOG(StringFromCLSID(m_config.Id, &guuidStr)))
|
||||
{
|
||||
const std::wstring guuid = guuidStr.get();
|
||||
const auto& customZoneSets = JSONHelpers::FancyZonesDataInstance().GetCustomZoneSetsMap();
|
||||
if (!customZoneSets.contains(guuid))
|
||||
|
||||
const auto zoneSetSearchResult = JSONHelpers::FancyZonesDataInstance().FindCustomZoneSet(guuid);
|
||||
|
||||
if (!zoneSetSearchResult.has_value())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto& zoneSet = customZoneSets.at(guuid);
|
||||
const auto& zoneSet = *zoneSetSearchResult;
|
||||
if (zoneSet.type == JSONHelpers::CustomLayoutType::Canvas && std::holds_alternative<JSONHelpers::CanvasLayoutInfo>(zoneSet.info))
|
||||
{
|
||||
const auto& zoneSetInfo = std::get<JSONHelpers::CanvasLayoutInfo>(zoneSet.info);
|
||||
|
||||
@@ -280,14 +280,22 @@ public:
|
||||
IFACEMETHODIMP MoveSizeUpdate(POINT const& ptScreen, bool dragEnabled) noexcept;
|
||||
IFACEMETHODIMP MoveSizeEnd(HWND window, POINT const& ptScreen) noexcept;
|
||||
IFACEMETHODIMP MoveSizeCancel() noexcept;
|
||||
IFACEMETHODIMP_(bool) IsDragEnabled() noexcept { return m_dragEnabled; }
|
||||
IFACEMETHODIMP_(void) MoveWindowIntoZoneByIndex(HWND window, int index) noexcept;
|
||||
IFACEMETHODIMP_(void) MoveWindowIntoZoneByDirection(HWND window, DWORD vkCode) noexcept;
|
||||
IFACEMETHODIMP_(void) CycleActiveZoneSet(DWORD vkCode) noexcept;
|
||||
IFACEMETHODIMP_(std::wstring) UniqueId() noexcept { return { m_uniqueId }; }
|
||||
IFACEMETHODIMP_(std::wstring) WorkAreaKey() noexcept { return { m_workArea }; }
|
||||
IFACEMETHODIMP_(void) SaveWindowProcessToZoneIndex(HWND window) noexcept;
|
||||
IFACEMETHODIMP_(IZoneSet*) ActiveZoneSet() noexcept { return m_activeZoneSet.get(); }
|
||||
IFACEMETHODIMP_(bool)
|
||||
IsDragEnabled() noexcept { return m_dragEnabled; }
|
||||
IFACEMETHODIMP_(void)
|
||||
MoveWindowIntoZoneByIndex(HWND window, int index) noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
MoveWindowIntoZoneByDirection(HWND window, DWORD vkCode) noexcept;
|
||||
IFACEMETHODIMP_(void)
|
||||
CycleActiveZoneSet(DWORD vkCode) noexcept;
|
||||
IFACEMETHODIMP_(std::wstring)
|
||||
UniqueId() noexcept { return { m_uniqueId }; }
|
||||
IFACEMETHODIMP_(std::wstring)
|
||||
WorkAreaKey() noexcept { return { m_workArea }; }
|
||||
IFACEMETHODIMP_(void)
|
||||
SaveWindowProcessToZoneIndex(HWND window) noexcept;
|
||||
IFACEMETHODIMP_(IZoneSet*)
|
||||
ActiveZoneSet() noexcept { return m_activeZoneSet.get(); }
|
||||
|
||||
protected:
|
||||
static LRESULT CALLBACK s_WndProc(HWND window, UINT message, WPARAM wparam, LPARAM lparam) noexcept;
|
||||
@@ -559,15 +567,21 @@ void ZoneWindow::InitializeZoneSets(MONITORINFO const& mi) noexcept
|
||||
void ZoneWindow::CalculateZoneSet() noexcept
|
||||
{
|
||||
const auto& fancyZonesData = JSONHelpers::FancyZonesDataInstance();
|
||||
const auto& deviceInfoMap = fancyZonesData.GetDeviceInfoMap();
|
||||
const auto deviceInfoData = fancyZonesData.FindDeviceInfo(m_uniqueId);
|
||||
const auto& activeDeviceId = fancyZonesData.GetActiveDeviceId();
|
||||
const auto& activeZoneSet = deviceInfoMap.at(m_uniqueId).activeZoneSet;
|
||||
|
||||
if (!activeDeviceId.empty() && activeDeviceId != m_uniqueId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!deviceInfoData.has_value())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const auto& activeZoneSet = deviceInfoData->activeZoneSet;
|
||||
|
||||
if (activeZoneSet.uuid.empty() || activeZoneSet.type == JSONHelpers::ZoneSetLayoutType::Blank)
|
||||
{
|
||||
return;
|
||||
@@ -585,9 +599,9 @@ void ZoneWindow::CalculateZoneSet() noexcept
|
||||
monitorInfo.cbSize = sizeof(monitorInfo);
|
||||
if (GetMonitorInfoW(m_monitor, &monitorInfo))
|
||||
{
|
||||
bool showSpacing = deviceInfoMap.at(m_uniqueId).showSpacing;
|
||||
int spacing = showSpacing ? deviceInfoMap.at(m_uniqueId).spacing : 0;
|
||||
int zoneCount = deviceInfoMap.at(m_uniqueId).zoneCount;
|
||||
bool showSpacing = deviceInfoData->showSpacing;
|
||||
int spacing = showSpacing ? deviceInfoData->spacing : 0;
|
||||
int zoneCount = deviceInfoData->zoneCount;
|
||||
zoneSet->CalculateZones(monitorInfo, zoneCount, spacing);
|
||||
UpdateActiveZoneSet(zoneSet.get());
|
||||
}
|
||||
|
||||
@@ -290,7 +290,7 @@ namespace FancyZonesUnitTests
|
||||
m_fzCallback = fancyZones.as<IFancyZonesCallback>();
|
||||
Assert::IsTrue(m_fzCallback != nullptr);
|
||||
|
||||
m_fancyZonesData = JSONHelpers::FancyZonesData();
|
||||
m_fancyZonesData.clear_data();
|
||||
}
|
||||
|
||||
TEST_METHOD_CLEANUP(Cleanup)
|
||||
|
||||
@@ -51,8 +51,7 @@ namespace FancyZonesUnitTests
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CLASS(ZoneSetLayoutTypeUnitTest)
|
||||
{
|
||||
TEST_CLASS(ZoneSetLayoutTypeUnitTest){
|
||||
TEST_METHOD(ZoneSetLayoutTypeToString){
|
||||
std::map<int, std::wstring> expectedMap = {
|
||||
std::make_pair(-2, L"TypeToString_ERROR"),
|
||||
@@ -71,10 +70,10 @@ namespace FancyZonesUnitTests
|
||||
auto actual = JSONHelpers::TypeToString(static_cast<ZoneSetLayoutType>(expected.first));
|
||||
Assert::AreEqual(expected.second, actual);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(ZoneSetLayoutTypeFromString)
|
||||
{
|
||||
TEST_METHOD(ZoneSetLayoutTypeFromString)
|
||||
{
|
||||
std::map<ZoneSetLayoutType, std::wstring> expectedMap = {
|
||||
std::make_pair(ZoneSetLayoutType::Focus, L"focus"),
|
||||
std::make_pair(ZoneSetLayoutType::Columns, L"columns"),
|
||||
@@ -89,10 +88,10 @@ namespace FancyZonesUnitTests
|
||||
auto actual = JSONHelpers::TypeFromString(expected.second);
|
||||
Assert::AreEqual(static_cast<int>(expected.first), static_cast<int>(actual));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(ZoneSetLayoutTypeFromLayoutId)
|
||||
{
|
||||
TEST_METHOD(ZoneSetLayoutTypeFromLayoutId)
|
||||
{
|
||||
std::map<ZoneSetLayoutType, int> expectedMap = {
|
||||
std::make_pair(ZoneSetLayoutType::Focus, 0xFFFF),
|
||||
std::make_pair(ZoneSetLayoutType::Columns, 0xFFFD),
|
||||
@@ -110,11 +109,12 @@ namespace FancyZonesUnitTests
|
||||
auto actual = JSONHelpers::TypeFromLayoutId(expected.second);
|
||||
Assert::AreEqual(static_cast<int>(expected.first), static_cast<int>(actual));
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
TEST_CLASS(CanvasLayoutInfoUnitTests)
|
||||
{
|
||||
TEST_CLASS(CanvasLayoutInfoUnitTests)
|
||||
{
|
||||
json::JsonObject m_json = json::JsonObject::Parse(L"{\"ref-width\": 123, \"ref-height\": 321, \"zones\": [{\"X\": 11, \"Y\": 22, \"width\": 33, \"height\": 44}, {\"X\": 55, \"Y\": 66, \"width\": 77, \"height\": 88}]}");
|
||||
|
||||
TEST_METHOD(ToJson)
|
||||
@@ -167,11 +167,11 @@ namespace FancyZonesUnitTests
|
||||
iter.MoveNext();
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
TEST_CLASS(GridLayoutInfoUnitTests)
|
||||
{
|
||||
private:
|
||||
TEST_CLASS(GridLayoutInfoUnitTests)
|
||||
{
|
||||
private:
|
||||
GridLayoutInfo m_info = GridLayoutInfo(GridLayoutInfo::Minimal{ .rows = 3, .columns = 4 });
|
||||
json::JsonObject m_gridJson = json::JsonObject();
|
||||
json::JsonArray m_rowsArray, m_columnsArray, m_cells;
|
||||
@@ -255,7 +255,7 @@ namespace FancyZonesUnitTests
|
||||
m_info = GridLayoutInfo(GridLayoutInfo::Minimal{ .rows = 3, .columns = 4 });
|
||||
}
|
||||
|
||||
public:
|
||||
public:
|
||||
TEST_METHOD(CreationZero)
|
||||
{
|
||||
const int expectedRows = 0, expectedColumns = 0;
|
||||
@@ -289,7 +289,7 @@ namespace FancyZonesUnitTests
|
||||
|
||||
GridLayoutInfo info(GridLayoutInfo::Full{
|
||||
.rows = expectedRows,
|
||||
.columns = expectedColumns ,
|
||||
.columns = expectedColumns,
|
||||
.rowsPercents = expectedRowsPercents,
|
||||
.columnsPercents = expectedColumnsPercents,
|
||||
.cellChildMap = expectedCells });
|
||||
@@ -435,23 +435,21 @@ namespace FancyZonesUnitTests
|
||||
iter.MoveNext();
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
TEST_CLASS(CustomZoneSetUnitTests)
|
||||
{
|
||||
TEST_METHOD(ToJsonGrid)
|
||||
{
|
||||
TEST_CLASS(CustomZoneSetUnitTests){
|
||||
TEST_METHOD(ToJsonGrid){
|
||||
CustomZoneSetJSON zoneSet{ L"uuid", CustomZoneSetData{ L"name", CustomLayoutType::Grid, GridLayoutInfo(GridLayoutInfo::Minimal{}) } };
|
||||
|
||||
json::JsonObject expected = json::JsonObject::Parse(L"{\"uuid\": \"uuid\", \"name\": \"name\", \"type\": \"grid\"}");
|
||||
expected.SetNamedValue(L"info", GridLayoutInfo::ToJson(std::get<GridLayoutInfo>(zoneSet.data.info)));
|
||||
json::JsonObject expected = json::JsonObject::Parse(L"{\"uuid\": \"uuid\", \"name\": \"name\", \"type\": \"grid\"}");
|
||||
expected.SetNamedValue(L"info", GridLayoutInfo::ToJson(std::get<GridLayoutInfo>(zoneSet.data.info)));
|
||||
|
||||
auto actual = CustomZoneSetJSON::ToJson(zoneSet);
|
||||
compareJsonObjects(expected, actual);
|
||||
}
|
||||
auto actual = CustomZoneSetJSON::ToJson(zoneSet);
|
||||
compareJsonObjects(expected, actual);
|
||||
}
|
||||
|
||||
TEST_METHOD(ToJsonCanvas)
|
||||
{
|
||||
TEST_METHOD(ToJsonCanvas)
|
||||
{
|
||||
CustomZoneSetJSON zoneSet{ L"uuid", CustomZoneSetData{ L"name", CustomLayoutType::Canvas, CanvasLayoutInfo{} } };
|
||||
|
||||
json::JsonObject expected = json::JsonObject::Parse(L"{\"uuid\": \"uuid\", \"name\": \"name\", \"type\": \"canvas\"}");
|
||||
@@ -459,10 +457,10 @@ namespace FancyZonesUnitTests
|
||||
|
||||
auto actual = CustomZoneSetJSON::ToJson(zoneSet);
|
||||
compareJsonObjects(expected, actual);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(FromJsonGrid)
|
||||
{
|
||||
TEST_METHOD(FromJsonGrid)
|
||||
{
|
||||
const auto grid = GridLayoutInfo(GridLayoutInfo::Full{ 1, 3, { 10000 }, { 2500, 5000, 2500 }, { { 0, 1, 2 } } });
|
||||
CustomZoneSetJSON expected{ L"uuid", CustomZoneSetData{ L"name", CustomLayoutType::Grid, grid } };
|
||||
|
||||
@@ -480,10 +478,10 @@ namespace FancyZonesUnitTests
|
||||
auto actualGrid = std::get<GridLayoutInfo>(actual->data.info);
|
||||
Assert::AreEqual(expectedGrid.rows(), actualGrid.rows());
|
||||
Assert::AreEqual(expectedGrid.columns(), actualGrid.columns());
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(FromJsonCanvas)
|
||||
{
|
||||
TEST_METHOD(FromJsonCanvas)
|
||||
{
|
||||
CustomZoneSetJSON expected{ L"uuid", CustomZoneSetData{ L"name", CustomLayoutType::Canvas, CanvasLayoutInfo{ 2, 1 } } };
|
||||
|
||||
json::JsonObject json = json::JsonObject::Parse(L"{\"uuid\": \"uuid\", \"name\": \"name\", \"type\": \"canvas\"}");
|
||||
@@ -500,10 +498,10 @@ namespace FancyZonesUnitTests
|
||||
auto actualGrid = std::get<CanvasLayoutInfo>(actual->data.info);
|
||||
Assert::AreEqual(expectedGrid.referenceWidth, actualGrid.referenceWidth);
|
||||
Assert::AreEqual(expectedGrid.referenceHeight, actualGrid.referenceHeight);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(FromJsonMissingKeys)
|
||||
{
|
||||
TEST_METHOD(FromJsonMissingKeys)
|
||||
{
|
||||
CustomZoneSetJSON zoneSet{ L"uuid", CustomZoneSetData{ L"name", CustomLayoutType::Canvas, CanvasLayoutInfo{ 2, 1 } } };
|
||||
const auto json = CustomZoneSetJSON::ToJson(zoneSet);
|
||||
|
||||
@@ -518,20 +516,20 @@ namespace FancyZonesUnitTests
|
||||
|
||||
iter.MoveNext();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
TEST_CLASS(ZoneSetDataUnitTest){
|
||||
TEST_METHOD(ToJsonGeneral)
|
||||
{
|
||||
TEST_CLASS(ZoneSetDataUnitTest){
|
||||
TEST_METHOD(ToJsonGeneral){
|
||||
json::JsonObject expected = json::JsonObject::Parse(L"{\"uuid\": \"uuid\", \"type\": \"rows\"}");
|
||||
ZoneSetData data{ L"uuid", ZoneSetLayoutType::Rows };
|
||||
const auto actual = ZoneSetData::ToJson(data);
|
||||
compareJsonObjects(expected, actual);
|
||||
}
|
||||
ZoneSetData data{ L"uuid", ZoneSetLayoutType::Rows };
|
||||
const auto actual = ZoneSetData::ToJson(data);
|
||||
compareJsonObjects(expected, actual);
|
||||
}
|
||||
|
||||
TEST_METHOD(FromJsonGeneral)
|
||||
{
|
||||
TEST_METHOD(FromJsonGeneral)
|
||||
{
|
||||
ZoneSetData expected{ L"uuid", ZoneSetLayoutType::Columns };
|
||||
|
||||
json::JsonObject json = json::JsonObject::Parse(L"{\"uuid\": \"uuid\", \"type\": \"columns\"}");
|
||||
@@ -540,10 +538,10 @@ namespace FancyZonesUnitTests
|
||||
|
||||
Assert::AreEqual(expected.uuid.c_str(), actual->uuid.c_str());
|
||||
Assert::AreEqual((int)expected.type, (int)actual->type);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(FromJsonTypeInvalid)
|
||||
{
|
||||
TEST_METHOD(FromJsonTypeInvalid)
|
||||
{
|
||||
ZoneSetData expected{ L"uuid", ZoneSetLayoutType::Blank };
|
||||
|
||||
json::JsonObject json = json::JsonObject::Parse(L"{\"uuid\": \"uuid\", \"type\": \"invalid_type\"}");
|
||||
@@ -552,10 +550,10 @@ namespace FancyZonesUnitTests
|
||||
|
||||
Assert::AreEqual(expected.uuid.c_str(), actual->uuid.c_str());
|
||||
Assert::AreEqual((int)expected.type, (int)actual->type);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(FromJsonMissingKeys)
|
||||
{
|
||||
TEST_METHOD(FromJsonMissingKeys)
|
||||
{
|
||||
ZoneSetData data{ L"uuid", ZoneSetLayoutType::Columns };
|
||||
const auto json = ZoneSetData::ToJson(data);
|
||||
|
||||
@@ -570,22 +568,21 @@ namespace FancyZonesUnitTests
|
||||
|
||||
iter.MoveNext();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
TEST_CLASS(AppZoneHistoryUnitTests)
|
||||
{
|
||||
TEST_METHOD(ToJson)
|
||||
{
|
||||
TEST_CLASS(AppZoneHistoryUnitTests){
|
||||
TEST_METHOD(ToJson){
|
||||
AppZoneHistoryJSON appZoneHistory{ L"appPath", AppZoneHistoryData{ .zoneSetUuid = L"zoneset-uuid", .deviceId = L"device-id", .zoneIndex = 54321 } };
|
||||
json::JsonObject expected = json::JsonObject::Parse(L"{\"app-path\": \"appPath\", \"device-id\": \"device-id\", \"zoneset-uuid\": \"zoneset-uuid\", \"zone-index\": 54321}");
|
||||
json::JsonObject expected = json::JsonObject::Parse(L"{\"app-path\": \"appPath\", \"device-id\": \"device-id\", \"zoneset-uuid\": \"zoneset-uuid\", \"zone-index\": 54321}");
|
||||
|
||||
auto actual = AppZoneHistoryJSON::ToJson(appZoneHistory);
|
||||
compareJsonObjects(expected, actual);
|
||||
}
|
||||
auto actual = AppZoneHistoryJSON::ToJson(appZoneHistory);
|
||||
compareJsonObjects(expected, actual);
|
||||
}
|
||||
|
||||
TEST_METHOD(FromJson)
|
||||
{
|
||||
TEST_METHOD(FromJson)
|
||||
{
|
||||
AppZoneHistoryJSON expected{ L"appPath", AppZoneHistoryData{ .zoneSetUuid = L"zoneset-uuid", .deviceId = L"device-id", .zoneIndex = 54321 } };
|
||||
json::JsonObject json = json::JsonObject::Parse(L"{\"app-path\": \"appPath\", \"device-id\": \"device-id\", \"zoneset-uuid\": \"zoneset-uuid\", \"zone-index\": 54321}");
|
||||
|
||||
@@ -596,10 +593,10 @@ namespace FancyZonesUnitTests
|
||||
Assert::AreEqual(expected.data.zoneIndex, actual->data.zoneIndex);
|
||||
Assert::AreEqual(expected.data.deviceId.c_str(), actual->data.deviceId.c_str());
|
||||
Assert::AreEqual(expected.data.zoneSetUuid.c_str(), actual->data.zoneSetUuid.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(FromJsonMissingKeys)
|
||||
{
|
||||
TEST_METHOD(FromJsonMissingKeys)
|
||||
{
|
||||
AppZoneHistoryJSON appZoneHistory{ L"appPath", AppZoneHistoryData{ .zoneSetUuid = L"zoneset-uuid", .deviceId = L"device-id", .zoneIndex = 54321 } };
|
||||
const auto json = AppZoneHistoryJSON::ToJson(appZoneHistory);
|
||||
|
||||
@@ -614,16 +611,17 @@ namespace FancyZonesUnitTests
|
||||
|
||||
iter.MoveNext();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
TEST_CLASS(DeviceInfoUnitTests)
|
||||
{
|
||||
private:
|
||||
TEST_CLASS(DeviceInfoUnitTests)
|
||||
{
|
||||
private:
|
||||
DeviceInfoJSON m_defaultDeviceInfo = DeviceInfoJSON{ L"default_device_id", DeviceInfoData{ ZoneSetData{ L"uuid", ZoneSetLayoutType::Custom }, true, 16, 3 } };
|
||||
json::JsonObject m_defaultJson = json::JsonObject::Parse(L"{\"device-id\": \"default_device_id\", \"active-zoneset\": {\"type\": \"custom\", \"uuid\": \"uuid\"}, \"editor-show-spacing\": true, \"editor-spacing\": 16, \"editor-zone-count\": 3}");
|
||||
|
||||
public:
|
||||
public:
|
||||
TEST_METHOD(ToJson)
|
||||
{
|
||||
DeviceInfoJSON deviceInfo = m_defaultDeviceInfo;
|
||||
@@ -701,11 +699,11 @@ namespace FancyZonesUnitTests
|
||||
iter.MoveNext();
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
TEST_CLASS(FancyZonesDataUnitTests)
|
||||
{
|
||||
private:
|
||||
TEST_CLASS(FancyZonesDataUnitTests)
|
||||
{
|
||||
private:
|
||||
const std::wstring m_defaultCustomDeviceStr = L"{\"device-id\": \"default_device_id\", \"active-zoneset\": {\"type\": \"custom\", \"uuid\": \"uuid\"}, \"editor-show-spacing\": true, \"editor-spacing\": 16, \"editor-zone-count\": 3}";
|
||||
const json::JsonValue m_defaultCustomDeviceValue = json::JsonValue::Parse(m_defaultCustomDeviceStr);
|
||||
const json::JsonObject m_defaultCustomDeviceObj = json::JsonObject::Parse(m_defaultCustomDeviceStr);
|
||||
@@ -725,10 +723,10 @@ namespace FancyZonesUnitTests
|
||||
TEST_METHOD_INITIALIZE(Init)
|
||||
{
|
||||
m_hInst = (HINSTANCE)GetModuleHandleW(nullptr);
|
||||
m_fzData = FancyZonesData();
|
||||
m_fzData.clear_data();
|
||||
}
|
||||
|
||||
public:
|
||||
public:
|
||||
TEST_METHOD(FancyZonesDataPath)
|
||||
{
|
||||
FancyZonesData data;
|
||||
@@ -1655,5 +1653,5 @@ namespace FancyZonesUnitTests
|
||||
|
||||
Assert::IsFalse(data.RemoveAppLastZone(nullptr, deviceId, zoneSetId));
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -60,7 +60,7 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>..\..\..\..\common\Telemetry;..\..\..\..\;..\..\..\..\..\deps\cpprestsdk\include;..\..\;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>UNIT_TESTS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UseFullPaths>true</UseFullPaths>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
<LanguageStandard>stdcpplatest</LanguageStandard>
|
||||
@@ -81,7 +81,7 @@
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>..\..\..\..\common\Telemetry;..\..\..\..\;..\..\..\..\..\deps\cpprestsdk\include;..\..\;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>UNIT_TESTS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<UseFullPaths>true</UseFullPaths>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
<LanguageStandard>stdcpplatest</LanguageStandard>
|
||||
|
||||
@@ -89,7 +89,7 @@ namespace FancyZonesUnitTests
|
||||
Assert::IsFalse(std::filesystem::exists(ZoneWindowUtils::GetAppliedZoneSetTmpPath()));
|
||||
Assert::IsFalse(std::filesystem::exists(ZoneWindowUtils::GetCustomZoneSetsTmpPath()));
|
||||
|
||||
m_fancyZonesData = JSONHelpers::FancyZonesData();
|
||||
m_fancyZonesData.clear_data();
|
||||
}
|
||||
|
||||
TEST_METHOD_CLEANUP(Cleanup)
|
||||
|
||||
Reference in New Issue
Block a user