Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ public class FancyZonesEditorIO
PropertyNamingPolicy = new DashCaseNamingPolicy(),
};

private List<DeviceWrapper> _unusedDevices = new List<DeviceWrapper>();

public string FancyZonesSettingsFile { get; private set; }

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

// Target monitor id
string targetMonitorName = argsParts[(int)CmdArgs.TargetMonitorId];

if (!App.Overlay.SpanZonesAcrossMonitors)
{
// Target monitor id
string targetMonitorName = argsParts[(int)CmdArgs.TargetMonitorId];

// Test launch with custom monitors configuration
bool isCustomMonitorConfigurationMode = targetMonitorName.StartsWith("Monitor#");
if (isCustomMonitorConfigurationMode)
Expand Down Expand Up @@ -336,6 +338,10 @@ public static void ParseCommandLineArguments()
}
}
}
else
{
App.Overlay.Monitors[App.Overlay.CurrentDesktop].Device.Id = targetMonitorName;
}
}
catch (Exception)
{
Expand Down Expand Up @@ -435,6 +441,31 @@ public ParsingResult ParseParams()
}
}
}
else
{
// Update monitors data
foreach (Monitor monitor in App.Overlay.Monitors)
{
bool matchFound = false;
foreach (NativeMonitorData nativeData in editorParams.Monitors)
{
// Can't do an exact match since the rounding algorithm used by the framework is different from ours
if (monitor.Device.UnscaledBounds.X >= (nativeData.LeftCoordinate - 1) && monitor.Device.UnscaledBounds.X <= (nativeData.LeftCoordinate + 1) &&
monitor.Device.UnscaledBounds.Y >= (nativeData.TopCoordinate - 1) && monitor.Device.UnscaledBounds.Y <= (nativeData.TopCoordinate + 1))
{
monitor.Device.Id = nativeData.MonitorId;
monitor.Device.Dpi = nativeData.Dpi;
matchFound = true;
break;
}
}

if (matchFound == false)
{
MessageBox.Show(string.Format(Properties.Resources.Error_Monitor_Match_Not_Found, monitor.Device.UnscaledBounds.ToString()));
}
}
}
}
catch (Exception ex)
{
Expand All @@ -451,6 +482,8 @@ public ParsingResult ParseParams()

public ParsingResult ParseZoneSettings()
{
_unusedDevices.Clear();

if (_fileSystem.File.Exists(FancyZonesSettingsFile))
{
ZoneSettingsWrapper zoneSettings;
Expand Down Expand Up @@ -491,7 +524,7 @@ public void SerializeZoneSettings()
zoneSettings.Devices = new List<DeviceWrapper>();
zoneSettings.CustomZoneSets = new List<CustomLayoutWrapper>();

// Serialize devices
// Serialize used devices
foreach (var monitor in App.Overlay.Monitors)
{
LayoutSettings zoneset = monitor.Settings;
Expand All @@ -515,6 +548,12 @@ public void SerializeZoneSettings()
});
}

// Serialize unused devices
foreach (var device in _unusedDevices)
{
zoneSettings.Devices.Add(device);
}

// Serialize custom zonesets
foreach (LayoutModel layout in MainWindowSettingsModel.CustomModels)
{
Expand Down Expand Up @@ -634,37 +673,30 @@ private bool SetDevices(List<DeviceWrapper> devices)
continue;
}

var settings = new LayoutSettings
{
ZonesetUuid = device.ActiveZoneset.Uuid,
ShowSpacing = device.EditorShowSpacing,
Spacing = device.EditorSpacing,
Type = JsonTagToLayoutType(device.ActiveZoneset.Type),
ZoneCount = device.EditorZoneCount,
SensitivityRadius = device.EditorSensitivityRadius,
};

if (!App.Overlay.SpanZonesAcrossMonitors)
bool unused = true;
foreach (Monitor monitor in monitors)
{
foreach (Monitor monitor in monitors)
if (monitor.Device.Id == device.DeviceId)
{
if (monitor.Device.Id == device.DeviceId)
var settings = new LayoutSettings
{
monitor.Settings = settings;
break;
}
ZonesetUuid = device.ActiveZoneset.Uuid,
ShowSpacing = device.EditorShowSpacing,
Spacing = device.EditorSpacing,
Type = JsonTagToLayoutType(device.ActiveZoneset.Type),
ZoneCount = device.EditorZoneCount,
SensitivityRadius = device.EditorSensitivityRadius,
};

monitor.Settings = settings;
unused = false;
break;
}
}
else

if (unused)
{
bool isLayoutMultiMonitor = device.DeviceId.StartsWith(MultiMonitorId);
if (isLayoutMultiMonitor)
{
// one zoneset for all desktops
App.Overlay.Monitors[App.Overlay.CurrentDesktop].Settings = settings;
App.Overlay.Monitors[App.Overlay.CurrentDesktop].Device.Id = device.DeviceId;
break;
}
_unusedDevices.Add(device);
}
}

Expand Down
7 changes: 6 additions & 1 deletion src/modules/fancyzones/lib/FancyZones.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,11 @@ void FancyZones::ToggleEditor() noexcept
std::vector<std::pair<HMONITOR, MONITORINFOEX>> allMonitors;
allMonitors = FancyZonesUtils::GetAllMonitorInfo<&MONITORINFOEX::rcWork>();

if (spanZonesAcrossMonitors)
{
params += FancyZonesUtils::GenerateUniqueIdAllMonitorsArea(virtualDesktopId.get()) + divider; /* Monitor id where the Editor should be opened */
}

// device id map
std::unordered_map<std::wstring, DWORD> displayDeviceIdxMap;

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

if (monitor == targetMonitor)
if (monitor == targetMonitor && !spanZonesAcrossMonitors)
{
params += monitorId + divider; /* Monitor id where the Editor should be opened */
}
Expand Down
66 changes: 42 additions & 24 deletions src/modules/fancyzones/lib/FancyZonesData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -513,41 +513,59 @@ void FancyZonesData::SaveFancyZonesEditorParameters(bool spanZonesAcrossMonitors
argsJson.processId = GetCurrentProcessId(); /* Process id */
argsJson.spanZonesAcrossMonitors = spanZonesAcrossMonitors; /* Span zones */

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

// device id map for correct device ids
std::unordered_map<std::wstring, DWORD> displayDeviceIdxMap;
JSONHelpers::MonitorInfo monitorJson;
monitorJson.id = monitorId;
monitorJson.top = monitorRect.top;
monitorJson.left = monitorRect.left;
monitorJson.isSelected = true;
monitorJson.dpi = 0; // unused

for (auto& monitorData : allMonitors)
argsJson.monitors.emplace_back(std::move(monitorJson)); /* add monitor data */
}
else
{
HMONITOR monitor = monitorData.first;
auto monitorInfo = monitorData.second;
std::vector<std::pair<HMONITOR, MONITORINFOEX>> allMonitors;
allMonitors = FancyZonesUtils::GetAllMonitorInfo<&MONITORINFOEX::rcWork>();

JSONHelpers::MonitorInfo monitorJson;
// device id map for correct device ids
std::unordered_map<std::wstring, DWORD> displayDeviceIdxMap;

std::wstring deviceId = FancyZonesUtils::GetDisplayDeviceId(monitorInfo.szDevice, displayDeviceIdxMap);
std::wstring monitorId = FancyZonesUtils::GenerateUniqueId(monitor, deviceId, virtualDesktopId);

if (monitor == targetMonitor)
for (auto& monitorData : allMonitors)
{
monitorJson.isSelected = true; /* Is monitor selected for the main editor window opening */
}
HMONITOR monitor = monitorData.first;
auto monitorInfo = monitorData.second;

monitorJson.id = monitorId; /* Monitor id */
JSONHelpers::MonitorInfo monitorJson;

UINT dpiX = 0;
UINT dpiY = 0;
if (GetDpiForMonitor(monitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY) == S_OK)
{
monitorJson.dpi = dpiX; /* DPI */
}
std::wstring deviceId = FancyZonesUtils::GetDisplayDeviceId(monitorInfo.szDevice, displayDeviceIdxMap);
std::wstring monitorId = FancyZonesUtils::GenerateUniqueId(monitor, deviceId, virtualDesktopId);

monitorJson.top = monitorInfo.rcMonitor.top; /* Top coordinate */
monitorJson.left = monitorInfo.rcMonitor.left; /* Left coordinate */
if (monitor == targetMonitor)
{
monitorJson.isSelected = true; /* Is monitor selected for the main editor window opening */
}

argsJson.monitors.emplace_back(std::move(monitorJson)); /* add monitor data */
monitorJson.id = monitorId; /* Monitor id */

UINT dpiX = 0;
UINT dpiY = 0;
if (GetDpiForMonitor(monitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY) == S_OK)
{
monitorJson.dpi = dpiX; /* DPI */
}

monitorJson.top = monitorInfo.rcMonitor.top; /* Top coordinate */
monitorJson.left = monitorInfo.rcMonitor.left; /* Left coordinate */

argsJson.monitors.emplace_back(std::move(monitorJson)); /* add monitor data */
}
}


json::to_file(editorParametersFileName, JSONHelpers::EditorArgs::ToJson(argsJson));
}
Expand Down