Skip to content

Commit 8556a06

Browse files
[FZ Editor] Serialize/deserialize settings fix (#8707)
1 parent fff8b3a commit 8556a06

3 files changed

Lines changed: 109 additions & 54 deletions

File tree

src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs

Lines changed: 61 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public class FancyZonesEditorIO
3838
PropertyNamingPolicy = new DashCaseNamingPolicy(),
3939
};
4040

41+
private List<DeviceWrapper> _unusedDevices = new List<DeviceWrapper>();
42+
4143
public string FancyZonesSettingsFile { get; private set; }
4244

4345
public string FancyZonesEditorParamsFile { get; private set; }
@@ -225,11 +227,11 @@ public static void ParseCommandLineArguments()
225227
// Span zones across monitors
226228
App.Overlay.SpanZonesAcrossMonitors = int.Parse(argsParts[(int)CmdArgs.SpanZones]) == 1;
227229

230+
// Target monitor id
231+
string targetMonitorName = argsParts[(int)CmdArgs.TargetMonitorId];
232+
228233
if (!App.Overlay.SpanZonesAcrossMonitors)
229234
{
230-
// Target monitor id
231-
string targetMonitorName = argsParts[(int)CmdArgs.TargetMonitorId];
232-
233235
// Test launch with custom monitors configuration
234236
bool isCustomMonitorConfigurationMode = targetMonitorName.StartsWith("Monitor#");
235237
if (isCustomMonitorConfigurationMode)
@@ -336,6 +338,10 @@ public static void ParseCommandLineArguments()
336338
}
337339
}
338340
}
341+
else
342+
{
343+
App.Overlay.Monitors[App.Overlay.CurrentDesktop].Device.Id = targetMonitorName;
344+
}
339345
}
340346
catch (Exception)
341347
{
@@ -435,6 +441,31 @@ public ParsingResult ParseParams()
435441
}
436442
}
437443
}
444+
else
445+
{
446+
// Update monitors data
447+
foreach (Monitor monitor in App.Overlay.Monitors)
448+
{
449+
bool matchFound = false;
450+
foreach (NativeMonitorData nativeData in editorParams.Monitors)
451+
{
452+
// Can't do an exact match since the rounding algorithm used by the framework is different from ours
453+
if (monitor.Device.UnscaledBounds.X >= (nativeData.LeftCoordinate - 1) && monitor.Device.UnscaledBounds.X <= (nativeData.LeftCoordinate + 1) &&
454+
monitor.Device.UnscaledBounds.Y >= (nativeData.TopCoordinate - 1) && monitor.Device.UnscaledBounds.Y <= (nativeData.TopCoordinate + 1))
455+
{
456+
monitor.Device.Id = nativeData.MonitorId;
457+
monitor.Device.Dpi = nativeData.Dpi;
458+
matchFound = true;
459+
break;
460+
}
461+
}
462+
463+
if (matchFound == false)
464+
{
465+
MessageBox.Show(string.Format(Properties.Resources.Error_Monitor_Match_Not_Found, monitor.Device.UnscaledBounds.ToString()));
466+
}
467+
}
468+
}
438469
}
439470
catch (Exception ex)
440471
{
@@ -451,6 +482,8 @@ public ParsingResult ParseParams()
451482

452483
public ParsingResult ParseZoneSettings()
453484
{
485+
_unusedDevices.Clear();
486+
454487
if (_fileSystem.File.Exists(FancyZonesSettingsFile))
455488
{
456489
ZoneSettingsWrapper zoneSettings;
@@ -491,7 +524,7 @@ public void SerializeZoneSettings()
491524
zoneSettings.Devices = new List<DeviceWrapper>();
492525
zoneSettings.CustomZoneSets = new List<CustomLayoutWrapper>();
493526

494-
// Serialize devices
527+
// Serialize used devices
495528
foreach (var monitor in App.Overlay.Monitors)
496529
{
497530
LayoutSettings zoneset = monitor.Settings;
@@ -515,6 +548,12 @@ public void SerializeZoneSettings()
515548
});
516549
}
517550

551+
// Serialize unused devices
552+
foreach (var device in _unusedDevices)
553+
{
554+
zoneSettings.Devices.Add(device);
555+
}
556+
518557
// Serialize custom zonesets
519558
foreach (LayoutModel layout in MainWindowSettingsModel.CustomModels)
520559
{
@@ -634,37 +673,30 @@ private bool SetDevices(List<DeviceWrapper> devices)
634673
continue;
635674
}
636675

637-
var settings = new LayoutSettings
638-
{
639-
ZonesetUuid = device.ActiveZoneset.Uuid,
640-
ShowSpacing = device.EditorShowSpacing,
641-
Spacing = device.EditorSpacing,
642-
Type = JsonTagToLayoutType(device.ActiveZoneset.Type),
643-
ZoneCount = device.EditorZoneCount,
644-
SensitivityRadius = device.EditorSensitivityRadius,
645-
};
646-
647-
if (!App.Overlay.SpanZonesAcrossMonitors)
676+
bool unused = true;
677+
foreach (Monitor monitor in monitors)
648678
{
649-
foreach (Monitor monitor in monitors)
679+
if (monitor.Device.Id == device.DeviceId)
650680
{
651-
if (monitor.Device.Id == device.DeviceId)
681+
var settings = new LayoutSettings
652682
{
653-
monitor.Settings = settings;
654-
break;
655-
}
683+
ZonesetUuid = device.ActiveZoneset.Uuid,
684+
ShowSpacing = device.EditorShowSpacing,
685+
Spacing = device.EditorSpacing,
686+
Type = JsonTagToLayoutType(device.ActiveZoneset.Type),
687+
ZoneCount = device.EditorZoneCount,
688+
SensitivityRadius = device.EditorSensitivityRadius,
689+
};
690+
691+
monitor.Settings = settings;
692+
unused = false;
693+
break;
656694
}
657695
}
658-
else
696+
697+
if (unused)
659698
{
660-
bool isLayoutMultiMonitor = device.DeviceId.StartsWith(MultiMonitorId);
661-
if (isLayoutMultiMonitor)
662-
{
663-
// one zoneset for all desktops
664-
App.Overlay.Monitors[App.Overlay.CurrentDesktop].Settings = settings;
665-
App.Overlay.Monitors[App.Overlay.CurrentDesktop].Device.Id = device.DeviceId;
666-
break;
667-
}
699+
_unusedDevices.Add(device);
668700
}
669701
}
670702

src/modules/fancyzones/lib/FancyZones.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,11 @@ void FancyZones::ToggleEditor() noexcept
650650
std::vector<std::pair<HMONITOR, MONITORINFOEX>> allMonitors;
651651
allMonitors = FancyZonesUtils::GetAllMonitorInfo<&MONITORINFOEX::rcWork>();
652652

653+
if (spanZonesAcrossMonitors)
654+
{
655+
params += FancyZonesUtils::GenerateUniqueIdAllMonitorsArea(virtualDesktopId.get()) + divider; /* Monitor id where the Editor should be opened */
656+
}
657+
653658
// device id map
654659
std::unordered_map<std::wstring, DWORD> displayDeviceIdxMap;
655660

@@ -664,7 +669,7 @@ void FancyZones::ToggleEditor() noexcept
664669
std::wstring deviceId = FancyZonesUtils::GetDisplayDeviceId(monitorInfo.szDevice, displayDeviceIdxMap);
665670
std::wstring monitorId = FancyZonesUtils::GenerateUniqueId(monitor, deviceId, virtualDesktopId.get());
666671

667-
if (monitor == targetMonitor)
672+
if (monitor == targetMonitor && !spanZonesAcrossMonitors)
668673
{
669674
params += monitorId + divider; /* Monitor id where the Editor should be opened */
670675
}

src/modules/fancyzones/lib/FancyZonesData.cpp

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -513,41 +513,59 @@ void FancyZonesData::SaveFancyZonesEditorParameters(bool spanZonesAcrossMonitors
513513
argsJson.processId = GetCurrentProcessId(); /* Process id */
514514
argsJson.spanZonesAcrossMonitors = spanZonesAcrossMonitors; /* Span zones */
515515

516-
std::vector<std::pair<HMONITOR, MONITORINFOEX>> allMonitors;
517-
allMonitors = FancyZonesUtils::GetAllMonitorInfo<&MONITORINFOEX::rcWork>();
516+
if (spanZonesAcrossMonitors)
517+
{
518+
auto monitorRect = FancyZonesUtils::GetAllMonitorsCombinedRect<&MONITORINFOEX::rcWork>();
519+
std::wstring monitorId = FancyZonesUtils::GenerateUniqueIdAllMonitorsArea(virtualDesktopId);
518520

519-
// device id map for correct device ids
520-
std::unordered_map<std::wstring, DWORD> displayDeviceIdxMap;
521+
JSONHelpers::MonitorInfo monitorJson;
522+
monitorJson.id = monitorId;
523+
monitorJson.top = monitorRect.top;
524+
monitorJson.left = monitorRect.left;
525+
monitorJson.isSelected = true;
526+
monitorJson.dpi = 0; // unused
521527

522-
for (auto& monitorData : allMonitors)
528+
argsJson.monitors.emplace_back(std::move(monitorJson)); /* add monitor data */
529+
}
530+
else
523531
{
524-
HMONITOR monitor = monitorData.first;
525-
auto monitorInfo = monitorData.second;
532+
std::vector<std::pair<HMONITOR, MONITORINFOEX>> allMonitors;
533+
allMonitors = FancyZonesUtils::GetAllMonitorInfo<&MONITORINFOEX::rcWork>();
526534

527-
JSONHelpers::MonitorInfo monitorJson;
535+
// device id map for correct device ids
536+
std::unordered_map<std::wstring, DWORD> displayDeviceIdxMap;
528537

529-
std::wstring deviceId = FancyZonesUtils::GetDisplayDeviceId(monitorInfo.szDevice, displayDeviceIdxMap);
530-
std::wstring monitorId = FancyZonesUtils::GenerateUniqueId(monitor, deviceId, virtualDesktopId);
531-
532-
if (monitor == targetMonitor)
538+
for (auto& monitorData : allMonitors)
533539
{
534-
monitorJson.isSelected = true; /* Is monitor selected for the main editor window opening */
535-
}
540+
HMONITOR monitor = monitorData.first;
541+
auto monitorInfo = monitorData.second;
536542

537-
monitorJson.id = monitorId; /* Monitor id */
543+
JSONHelpers::MonitorInfo monitorJson;
538544

539-
UINT dpiX = 0;
540-
UINT dpiY = 0;
541-
if (GetDpiForMonitor(monitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY) == S_OK)
542-
{
543-
monitorJson.dpi = dpiX; /* DPI */
544-
}
545+
std::wstring deviceId = FancyZonesUtils::GetDisplayDeviceId(monitorInfo.szDevice, displayDeviceIdxMap);
546+
std::wstring monitorId = FancyZonesUtils::GenerateUniqueId(monitor, deviceId, virtualDesktopId);
545547

546-
monitorJson.top = monitorInfo.rcMonitor.top; /* Top coordinate */
547-
monitorJson.left = monitorInfo.rcMonitor.left; /* Left coordinate */
548+
if (monitor == targetMonitor)
549+
{
550+
monitorJson.isSelected = true; /* Is monitor selected for the main editor window opening */
551+
}
548552

549-
argsJson.monitors.emplace_back(std::move(monitorJson)); /* add monitor data */
553+
monitorJson.id = monitorId; /* Monitor id */
554+
555+
UINT dpiX = 0;
556+
UINT dpiY = 0;
557+
if (GetDpiForMonitor(monitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY) == S_OK)
558+
{
559+
monitorJson.dpi = dpiX; /* DPI */
560+
}
561+
562+
monitorJson.top = monitorInfo.rcMonitor.top; /* Top coordinate */
563+
monitorJson.left = monitorInfo.rcMonitor.left; /* Left coordinate */
564+
565+
argsJson.monitors.emplace_back(std::move(monitorJson)); /* add monitor data */
566+
}
550567
}
568+
551569

552570
json::to_file(editorParametersFileName, JSONHelpers::EditorArgs::ToJson(argsJson));
553571
}

0 commit comments

Comments
 (0)