diff --git a/src/modules/fancyzones/FancyZonesLib/EditorParameters.cpp b/src/modules/fancyzones/FancyZonesLib/EditorParameters.cpp index 1c2cc7168b..92eb1d7da4 100644 --- a/src/modules/fancyzones/FancyZonesLib/EditorParameters.cpp +++ b/src/modules/fancyzones/FancyZonesLib/EditorParameters.cpp @@ -25,6 +25,7 @@ namespace JsonUtils std::wstring monitorName; std::wstring monitorInstanceId; std::wstring monitorSerialNumber; + int monitorNumber; std::wstring virtualDesktop; int dpi; int top; @@ -42,6 +43,7 @@ namespace JsonUtils result.SetNamedValue(NonLocalizable::EditorParametersIds::MonitorNameId, json::value(monitor.monitorName)); result.SetNamedValue(NonLocalizable::EditorParametersIds::MonitorInstanceId, json::value(monitor.monitorInstanceId)); result.SetNamedValue(NonLocalizable::EditorParametersIds::MonitorSerialNumberId, json::value(monitor.monitorSerialNumber)); + result.SetNamedValue(NonLocalizable::EditorParametersIds::MonitorNumberId, json::value(monitor.monitorNumber)); result.SetNamedValue(NonLocalizable::EditorParametersIds::VirtualDesktopId, json::value(monitor.virtualDesktop)); result.SetNamedValue(NonLocalizable::EditorParametersIds::Dpi, json::value(monitor.dpi)); result.SetNamedValue(NonLocalizable::EditorParametersIds::TopCoordinate, json::value(monitor.top)); @@ -116,6 +118,7 @@ bool EditorParameters::Save() noexcept JsonUtils::MonitorInfo monitorJson; monitorJson.monitorName = ZonedWindowProperties::MultiMonitorName; monitorJson.monitorInstanceId = ZonedWindowProperties::MultiMonitorInstance; + monitorJson.monitorNumber = 0; monitorJson.virtualDesktop = virtualDesktopIdStr.value(); monitorJson.top = combinedWorkArea.top; monitorJson.left = combinedWorkArea.left; @@ -172,6 +175,7 @@ bool EditorParameters::Save() noexcept monitorJson.monitorName = monitorData.deviceId.id; monitorJson.monitorInstanceId = monitorData.deviceId.instanceId; + monitorJson.monitorNumber = monitorData.deviceId.number; monitorJson.monitorSerialNumber = monitorData.serialNumber; monitorJson.virtualDesktop = virtualDesktopIdStr.value(); diff --git a/src/modules/fancyzones/FancyZonesLib/EditorParameters.h b/src/modules/fancyzones/FancyZonesLib/EditorParameters.h index 671708929c..70124613d6 100644 --- a/src/modules/fancyzones/FancyZonesLib/EditorParameters.h +++ b/src/modules/fancyzones/FancyZonesLib/EditorParameters.h @@ -8,6 +8,7 @@ namespace NonLocalizable const static wchar_t* MonitorNameId = L"monitor"; const static wchar_t* MonitorInstanceId = L"monitor-instance-id"; const static wchar_t* MonitorSerialNumberId = L"monitor-serial-number"; + const static wchar_t* MonitorNumberId = L"monitor-number"; const static wchar_t* VirtualDesktopId = L"virtual-desktop"; const static wchar_t* TopCoordinate = L"top-coordinate"; const static wchar_t* LeftCoordinate = L"left-coordinate"; diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppZoneHistory.cpp b/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppZoneHistory.cpp index e1b13003f6..386f9d080a 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppZoneHistory.cpp +++ b/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppZoneHistory.cpp @@ -27,6 +27,7 @@ namespace JsonUtils std::wstring monitor = device.GetNamedString(NonLocalizable::AppZoneHistoryIds::MonitorID).c_str(); std::wstring monitorInstance = device.GetNamedString(NonLocalizable::AppZoneHistoryIds::MonitorInstanceID, L"").c_str(); std::wstring monitorSerialNumber = device.GetNamedString(NonLocalizable::AppZoneHistoryIds::MonitorSerialNumberID, L"").c_str(); + int monitorNumber = static_cast(device.GetNamedNumber(NonLocalizable::AppZoneHistoryIds::MonitorNumberID, 0)); std::wstring virtualDesktop = device.GetNamedString(NonLocalizable::AppZoneHistoryIds::VirtualDesktopID).c_str(); auto virtualDesktopGuid = FancyZonesUtils::GuidFromString(virtualDesktop); @@ -45,6 +46,7 @@ namespace JsonUtils { deviceId.id = monitor; deviceId.instanceId = monitorInstance; + deviceId.number = monitorNumber; } FancyZonesDataTypes::MonitorId monitorId{ @@ -175,6 +177,7 @@ namespace JsonUtils device.SetNamedValue(NonLocalizable::AppZoneHistoryIds::MonitorID, json::value(data.workAreaId.monitorId.deviceId.id)); device.SetNamedValue(NonLocalizable::AppZoneHistoryIds::MonitorInstanceID, json::value(data.workAreaId.monitorId.deviceId.instanceId)); device.SetNamedValue(NonLocalizable::AppZoneHistoryIds::MonitorSerialNumberID, json::value(data.workAreaId.monitorId.serialNumber)); + device.SetNamedValue(NonLocalizable::AppZoneHistoryIds::MonitorNumberID, json::value(data.workAreaId.monitorId.deviceId.number)); auto virtualDesktopStr = FancyZonesUtils::GuidToString(data.workAreaId.virtualDesktopId); if (virtualDesktopStr) @@ -308,13 +311,16 @@ void AppZoneHistory::AdjustWorkAreaIds(const std::vectorworkAreaId.monitorId; - if (dataMonitorId.serialNumber.empty() && !dataMonitorId.deviceId.isDefault()) + bool serialNumberNotSet = dataMonitorId.serialNumber.empty() && !dataMonitorId.deviceId.isDefault(); + bool monitorNumberNotSet = dataMonitorId.deviceId.number == 0; + if (serialNumberNotSet || monitorNumberNotSet) { for (const auto& monitorId : ids) { if (dataMonitorId.deviceId.id == monitorId.deviceId.id && dataMonitorId.deviceId.instanceId == monitorId.deviceId.instanceId) { dataMonitorId.serialNumber = monitorId.serialNumber; + dataMonitorId.deviceId.number = monitorId.deviceId.number; dirtyFlag = true; break; } diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppZoneHistory.h b/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppZoneHistory.h index 83dfc18596..569bc8cf48 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppZoneHistory.h +++ b/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppZoneHistory.h @@ -19,6 +19,7 @@ namespace NonLocalizable const static wchar_t* MonitorID = L"monitor"; const static wchar_t* MonitorInstanceID = L"monitor-instance"; const static wchar_t* MonitorSerialNumberID = L"serial-number"; + const static wchar_t* MonitorNumberID = L"monitor-number"; const static wchar_t* VirtualDesktopID = L"virtual-desktop"; } } diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppliedLayouts.cpp b/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppliedLayouts.cpp index 2d19dac6de..e0eab3a254 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppliedLayouts.cpp +++ b/src/modules/fancyzones/FancyZonesLib/FancyZonesData/AppliedLayouts.cpp @@ -83,6 +83,7 @@ namespace JsonUtils std::wstring monitor = device.GetNamedString(NonLocalizable::AppliedLayoutsIds::MonitorID).c_str(); std::wstring monitorInstance = device.GetNamedString(NonLocalizable::AppliedLayoutsIds::MonitorInstanceID, L"").c_str(); std::wstring monitorSerialNumber = device.GetNamedString(NonLocalizable::AppliedLayoutsIds::MonitorSerialNumberID, L"").c_str(); + int monitorNumber = static_cast(device.GetNamedNumber(NonLocalizable::AppliedLayoutsIds::MonitorNumberID, 0)); std::wstring virtualDesktop = device.GetNamedString(NonLocalizable::AppliedLayoutsIds::VirtualDesktopID).c_str(); auto virtualDesktopGuid = FancyZonesUtils::GuidFromString(virtualDesktop); @@ -101,6 +102,7 @@ namespace JsonUtils { deviceId.id = monitor; deviceId.instanceId = monitorInstance; + deviceId.number = monitorNumber; } FancyZonesDataTypes::MonitorId monitorId{ @@ -172,6 +174,7 @@ namespace JsonUtils device.SetNamedValue(NonLocalizable::AppliedLayoutsIds::MonitorID, json::value(value.workAreaId.monitorId.deviceId.id)); device.SetNamedValue(NonLocalizable::AppliedLayoutsIds::MonitorInstanceID, json::value(value.workAreaId.monitorId.deviceId.instanceId)); device.SetNamedValue(NonLocalizable::AppliedLayoutsIds::MonitorSerialNumberID, json::value(value.workAreaId.monitorId.serialNumber)); + device.SetNamedValue(NonLocalizable::AppliedLayoutsIds::MonitorNumberID, json::value(value.workAreaId.monitorId.deviceId.number)); auto virtualDesktopStr = FancyZonesUtils::GuidToString(value.workAreaId.virtualDesktopId); if (virtualDesktopStr) @@ -294,17 +297,22 @@ void AppliedLayouts::AdjustWorkAreaIds(const std::vector> replaceWithSerialNumber{}; + std::vector> replaceWithSerialNumber{}; for (auto iter = m_layouts.begin(); iter != m_layouts.end(); ++iter) { const auto& [id, layout] = *iter; - if (id.monitorId.serialNumber.empty() && !id.monitorId.deviceId.isDefault()) + bool serialNumberNotSet = id.monitorId.serialNumber.empty() && !id.monitorId.deviceId.isDefault(); + bool monitorNumberNotSet = id.monitorId.deviceId.number == 0; + if (serialNumberNotSet || monitorNumberNotSet) { for (const auto& monitorId : ids) { if (id.monitorId.deviceId.id == monitorId.deviceId.id && id.monitorId.deviceId.instanceId == monitorId.deviceId.instanceId) { - replaceWithSerialNumber.push_back({ id, monitorId.serialNumber }); + FancyZonesDataTypes::WorkAreaId updatedId = id; + updatedId.monitorId.serialNumber = monitorId.serialNumber; + updatedId.monitorId.deviceId.number = monitorId.deviceId.number; + replaceWithSerialNumber.push_back({ id, updatedId }); dirtyFlag = true; break; } @@ -315,7 +323,7 @@ void AppliedLayouts::AdjustWorkAreaIds(const std::vector GetDisplays() { auto allMonitors = FancyZonesUtils::GetAllMonitorInfo<&MONITORINFOEX::rcWork>(); @@ -226,9 +238,24 @@ namespace MonitorUtils Logger::error(L"EnumDisplayDevicesW error: {}", get_last_error_or_default(GetLastError())); continue; } + + Logger::info(L"Display: {}, number: {}", displayDevice.DeviceID); + FancyZonesDataTypes::MonitorId id{ .monitor = monitorData.first, .deviceId = SplitDisplayDeviceId(displayDevice.DeviceID) }; - Logger::info(L"Display: {}", displayDevice.DeviceID); - result.push_back({ .monitor = monitorData.first, .deviceId = SplitDisplayDeviceId(displayDevice.DeviceID) }); + try + { + std::wstring numberStr = displayDevice.DeviceName; // \\.\DISPLAY1\Monitor0 + numberStr = numberStr.substr(0, numberStr.find_last_of('\\')); // \\.\DISPLAY1 + numberStr = remove_non_digits(numberStr); + id.deviceId.number = std::stoi(numberStr); + } + catch (...) + { + Logger::error(L"Failed to get monitor number from {}", displayDevice.DeviceName); + } + + result.push_back(std::move(id)); + } return result; diff --git a/src/modules/fancyzones/FancyZonesTests/UnitTests/WorkAreaIdTests.Spec.cpp b/src/modules/fancyzones/FancyZonesTests/UnitTests/WorkAreaIdTests.Spec.cpp index bce28234ad..db5c660db0 100644 --- a/src/modules/fancyzones/FancyZonesTests/UnitTests/WorkAreaIdTests.Spec.cpp +++ b/src/modules/fancyzones/FancyZonesTests/UnitTests/WorkAreaIdTests.Spec.cpp @@ -73,36 +73,6 @@ namespace FancyZonesUnitTests Assert::IsFalse(id1 == id2); } - TEST_METHOD (NoSerialNumber) - { - FancyZonesDataTypes::WorkAreaId id1{ - .monitorId = { .deviceId = { .id = L"device", .instanceId = L"instance-id" }, .serialNumber = L"serial-number" }, - .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() - }; - - FancyZonesDataTypes::WorkAreaId id2{ - .monitorId = { .deviceId = { .id = L"device", .instanceId = L"instance-id" }, .serialNumber = L"" }, - .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() - }; - - Assert::IsFalse(id1 == id2); - } - - TEST_METHOD (NoSerialNumber2) - { - FancyZonesDataTypes::WorkAreaId id1{ - .monitorId = { .deviceId = { .id = L"device", .instanceId = L"instance-id" }, .serialNumber = L"" }, - .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() - }; - - FancyZonesDataTypes::WorkAreaId id2{ - .monitorId = { .deviceId = { .id = L"device", .instanceId = L"instance-id" }, .serialNumber = L"serial-number" }, - .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() - }; - - Assert::IsFalse(id1 == id2); - } - TEST_METHOD (DifferentSerialNumber) { FancyZonesDataTypes::WorkAreaId id1{ @@ -118,15 +88,30 @@ namespace FancyZonesUnitTests Assert::IsFalse(id1 == id2); } - TEST_METHOD (DefaultMonitorIdDifferentInstanceId) + TEST_METHOD (DefaultMonitorIdDifferentInstanceIdSameNumber) { FancyZonesDataTypes::WorkAreaId id1{ - .monitorId = { .deviceId = { .id = L"Default_Monitor", .instanceId = L"instance-id" }, .serialNumber = L"" }, + .monitorId = { .deviceId = { .id = L"Default_Monitor", .instanceId = L"instance-id", .number = 1 }, .serialNumber = L"" }, .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() }; FancyZonesDataTypes::WorkAreaId id2{ - .monitorId = { .deviceId = { .id = L"Default_Monitor", .instanceId = L"another-instance-id" }, .serialNumber = L"" }, + .monitorId = { .deviceId = { .id = L"Default_Monitor", .instanceId = L"another-instance-id", .number = 1 }, .serialNumber = L"" }, + .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() + }; + + Assert::IsTrue(id1 == id2); + } + + TEST_METHOD (DefaultMonitorIdDifferentInstanceIdDifferentNumber) + { + FancyZonesDataTypes::WorkAreaId id1{ + .monitorId = { .deviceId = { .id = L"Default_Monitor", .instanceId = L"instance-id", .number = 1 }, .serialNumber = L"" }, + .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() + }; + + FancyZonesDataTypes::WorkAreaId id2{ + .monitorId = { .deviceId = { .id = L"Default_Monitor", .instanceId = L"another-instance-id", .number = 2 }, .serialNumber = L"" }, .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() }; @@ -163,21 +148,6 @@ namespace FancyZonesUnitTests Assert::IsFalse(id1 == id2); } - TEST_METHOD (SameIdDifferentInstance) - { - FancyZonesDataTypes::WorkAreaId id1{ - .monitorId = { .deviceId = { .id = L"device", .instanceId = L"instance-id-1" }, .serialNumber = L"" }, - .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() - }; - - FancyZonesDataTypes::WorkAreaId id2{ - .monitorId = { .deviceId = { .id = L"device", .instanceId = L"instance-id-2" }, .serialNumber = L"" }, - .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() - }; - - Assert::IsTrue(id1 == id2); - } - TEST_METHOD (SameIdDifferentSerialNumbers) { FancyZonesDataTypes::WorkAreaId id1{ @@ -207,6 +177,59 @@ namespace FancyZonesUnitTests Assert::IsFalse(id1 == id2); } + + TEST_METHOD (MonitorReconnect) + { + // same: id, serial number and monitor number + // different: instance id + + FancyZonesDataTypes::WorkAreaId id1{ + .monitorId = { .deviceId = { .id = L"device", .instanceId = L"4&125707d6&0&UID1", .number = 1 }, .serialNumber = L"serial-number" }, + .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() + }; + + FancyZonesDataTypes::WorkAreaId id2{ + .monitorId = { .deviceId = { .id = L"device", .instanceId = L"4&125707d6&0&UID2", .number = 1 }, .serialNumber = L"serial-number" }, + .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() + }; + + Assert::IsTrue(id1 == id2); + } + + TEST_METHOD (SameMonitorModels) + { + // same: id, serial number + // different: monitor number, instance id + + FancyZonesDataTypes::WorkAreaId id1{ + .monitorId = { .deviceId = { .id = L"device", .instanceId = L"4&125707d6&0&UID1", .number = 1 }, .serialNumber = L"serial-number" }, + .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() + }; + + FancyZonesDataTypes::WorkAreaId id2{ + .monitorId = { .deviceId = { .id = L"device", .instanceId = L"4&125707d6&0&UID2", .number = 2 }, .serialNumber = L"serial-number" }, + .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() + }; + + Assert::IsFalse(id1 == id2); + } + + TEST_METHOD(SerialNumberNotFoundError) + { + // serial number is empty, other values are the same + + FancyZonesDataTypes::WorkAreaId id1{ + .monitorId = { .deviceId = { .id = L"device", .instanceId = L"instance-id", .number = 1 }, .serialNumber = L"serial-number" }, + .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() + }; + + FancyZonesDataTypes::WorkAreaId id2{ + .monitorId = { .deviceId = { .id = L"device", .instanceId = L"instance-id", .number = 1 }, .serialNumber = L"" }, + .virtualDesktopId = FancyZonesUtils::GuidFromString(L"{E21F6F29-76FD-4FC1-8970-17AB8AD64847}").value() + }; + + Assert::IsTrue(id1 == id2); + } }; } diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/Device.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/Device.cs index 1d9ed810d6..26f0430f69 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/Device.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Models/Device.cs @@ -17,6 +17,8 @@ namespace FancyZonesEditor.Utils public string MonitorSerialNumber { get; set; } + public int MonitorNumber { get; set; } + public Size MonitorSize { get; set; } public string VirtualDesktopId { get; set; } diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs index c68ae70568..4932eb2154 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs @@ -81,6 +81,8 @@ namespace FancyZonesEditor.Utils public string MonitorSerialNumber { get; set; } + public int MonitorNumber { get; set; } + public string VirtualDesktop { get; set; } public int Dpi { get; set; } @@ -134,6 +136,8 @@ namespace FancyZonesEditor.Utils public string MonitorInstance { get; set; } + public int MonitorNumber { get; set; } + public string SerialNumber { get; set; } public string VirtualDesktop { get; set; } @@ -319,6 +323,7 @@ namespace FancyZonesEditor.Utils string targetMonitorId = string.Empty; string targetMonitorSerialNumber = string.Empty; string targetVirtualDesktop = string.Empty; + int targetMonitorNumber = 0; foreach (NativeMonitorData nativeData in editorParams.Monitors) { @@ -327,6 +332,7 @@ namespace FancyZonesEditor.Utils { targetMonitorId = nativeData.Monitor; targetMonitorSerialNumber = nativeData.MonitorSerialNumber; + targetMonitorNumber = nativeData.MonitorNumber; targetVirtualDesktop = nativeData.VirtualDesktop; } @@ -336,6 +342,7 @@ namespace FancyZonesEditor.Utils monitor.Device.MonitorName = nativeData.Monitor; monitor.Device.MonitorInstanceId = nativeData.MonitorInstanceId; monitor.Device.MonitorSerialNumber = nativeData.MonitorSerialNumber; + monitor.Device.MonitorNumber = nativeData.MonitorNumber; monitor.Device.VirtualDesktopId = nativeData.VirtualDesktop; monitor.Device.Dpi = nativeData.Dpi; @@ -349,6 +356,7 @@ namespace FancyZonesEditor.Utils var monitor = monitors[i]; if (monitor.Device.MonitorName == targetMonitorId && monitor.Device.MonitorSerialNumber == targetMonitorSerialNumber && + monitor.Device.MonitorNumber == targetMonitorNumber && monitor.Device.VirtualDesktopId == targetVirtualDesktop) { App.Overlay.CurrentDesktop = i; @@ -371,6 +379,7 @@ namespace FancyZonesEditor.Utils monitor.Device.MonitorName = nativeData.Monitor; monitor.Device.MonitorInstanceId = nativeData.MonitorInstanceId; monitor.Device.MonitorSerialNumber = nativeData.MonitorSerialNumber; + monitor.Device.MonitorNumber = nativeData.MonitorNumber; monitor.Device.VirtualDesktopId = nativeData.VirtualDesktop; App.Overlay.AddMonitor(monitor); @@ -571,6 +580,7 @@ namespace FancyZonesEditor.Utils { Monitor = monitor.Device.MonitorName, MonitorInstance = monitor.Device.MonitorInstanceId, + MonitorNumber = monitor.Device.MonitorNumber, SerialNumber = monitor.Device.MonitorSerialNumber, VirtualDesktop = monitor.Device.VirtualDesktopId, }, @@ -838,6 +848,7 @@ namespace FancyZonesEditor.Utils { if (monitor.Device.MonitorName == layout.Device.Monitor && monitor.Device.MonitorSerialNumber == layout.Device.SerialNumber && + monitor.Device.MonitorNumber == layout.Device.MonitorNumber && (monitor.Device.VirtualDesktopId == layout.Device.VirtualDesktop || layout.Device.VirtualDesktop == DefaultVirtualDesktopGuid)) {