[Workspaces] re-implementing Monitor ID usage (#35427)

This commit is contained in:
Laszlo Nemeth 2024-10-23 11:33:35 +02:00 committed by GitHub
parent 04795c6d3a
commit f33855aaaa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 additions and 33 deletions

View File

@ -360,38 +360,7 @@ namespace WorkspacesEditor.Models
{
if (_monitorSetup == null)
{
_monitorSetup = Parent.Monitors.Where(x => x.MonitorNumber == MonitorNumber).FirstOrDefault();
if (_monitorSetup == null)
{
// monitors changed: try to determine monitor id based on middle point
int middleX = Position.X + (Position.Width / 2);
int middleY = Position.Y + (Position.Height / 2);
var monitorCandidate = Parent.Monitors.Where(x =>
(x.MonitorDpiUnawareBounds.Left < middleX) &&
(x.MonitorDpiUnawareBounds.Right > middleX) &&
(x.MonitorDpiUnawareBounds.Top < middleY) &&
(x.MonitorDpiUnawareBounds.Bottom > middleY)).FirstOrDefault();
if (monitorCandidate != null)
{
_monitorSetup = monitorCandidate;
MonitorNumber = monitorCandidate.MonitorNumber;
}
else
{
// monitors and even the app's area unknown, set the main monitor (which is closer to (0,0)) as the app's monitor
monitorCandidate = Parent.Monitors.OrderBy(x => Math.Abs(x.MonitorDpiUnawareBounds.Left) + Math.Abs(x.MonitorDpiUnawareBounds.Top)).FirstOrDefault();
if (monitorCandidate != null)
{
_monitorSetup = monitorCandidate;
MonitorNumber = monitorCandidate.MonitorNumber;
}
else
{
// no monitors defined at all.
Logger.LogError($"Wrong workspace setup. No monitors defined for the workspace: {Parent.Name}.");
}
}
}
_monitorSetup = Parent.GetMonitorForApp(this);
}
return _monitorSetup;

View File

@ -374,5 +374,44 @@ namespace WorkspacesEditor.Models
app.IsExpanded = false;
}
}
internal MonitorSetup GetMonitorForApp(Application app)
{
var monitorSetup = Monitors.Where(x => x.MonitorNumber == app.MonitorNumber).FirstOrDefault();
if (monitorSetup == null)
{
// monitors changed: try to determine monitor id based on middle point
int middleX = app.Position.X + (app.Position.Width / 2);
int middleY = app.Position.Y + (app.Position.Height / 2);
var monitorCandidate = Monitors.Where(x =>
(x.MonitorDpiUnawareBounds.Left < middleX) &&
(x.MonitorDpiUnawareBounds.Right > middleX) &&
(x.MonitorDpiUnawareBounds.Top < middleY) &&
(x.MonitorDpiUnawareBounds.Bottom > middleY)).FirstOrDefault();
if (monitorCandidate != null)
{
app.MonitorNumber = monitorCandidate.MonitorNumber;
return monitorCandidate;
}
else
{
// monitors and even the app's area unknown, set the main monitor (which is closer to (0,0)) as the app's monitor
monitorCandidate = Monitors.OrderBy(x => Math.Abs(x.MonitorDpiUnawareBounds.Left) + Math.Abs(x.MonitorDpiUnawareBounds.Top)).FirstOrDefault();
if (monitorCandidate != null)
{
app.MonitorNumber = monitorCandidate.MonitorNumber;
return monitorCandidate;
}
else
{
// no monitors defined at all.
Logger.LogError($"Wrong workspace setup. No monitors defined for the workspace: {Name}.");
return null;
}
}
}
return monitorSetup;
}
}
}

View File

@ -54,7 +54,13 @@ namespace WorkspacesEditor.Utils
if (app.Maximized)
{
Project project = app.Parent;
var monitor = project.Monitors.Where(x => x.MonitorNumber == app.MonitorNumber).FirstOrDefault();
var monitor = project.GetMonitorForApp(app);
if (monitor == null)
{
// unrealistic case, there are no monitors at all in the workspace, use original rect
return new Rectangle(TransformX(app.ScaledPosition.X), TransformY(app.ScaledPosition.Y), Scaled(app.ScaledPosition.Width), Scaled(app.ScaledPosition.Height));
}
return new Rectangle(TransformX(monitor.MonitorDpiAwareBounds.Left), TransformY(monitor.MonitorDpiAwareBounds.Top), Scaled(monitor.MonitorDpiAwareBounds.Width), Scaled(monitor.MonitorDpiAwareBounds.Height));
}
else