Fixed potential bug with window taskbar location during screen generation

There is a possibility that there are two displays with the same UID. This happens with software created displays such as SpaceDesk and Superdisplay. This means that we need to try and figure out which screen is the right screen, and then when we know which screen we were really wanting to
This commit is contained in:
Terry MacDonald
2022-06-10 18:52:26 +12:00
parent d98730a9b2
commit cb43f74629
4 changed files with 61 additions and 7 deletions

View File

@ -26,8 +26,8 @@ using System.Resources;
[assembly: Guid("e4ceaf5e-ad01-4695-b179-31168eb74c48")] [assembly: Guid("e4ceaf5e-ad01-4695-b179-31168eb74c48")]
// Version information // Version information
[assembly: AssemblyVersion("2.4.0.26")] [assembly: AssemblyVersion("2.4.0.28")]
[assembly: AssemblyFileVersion("2.4.0.26")] [assembly: AssemblyFileVersion("2.4.0.28")]
[assembly: NeutralResourcesLanguageAttribute( "en" )] [assembly: NeutralResourcesLanguageAttribute( "en" )]
[assembly: CLSCompliant(true)] [assembly: CLSCompliant(true)]

View File

@ -1558,9 +1558,17 @@ namespace DisplayMagicianShared
// rather than the MMStuckRect reg keys // rather than the MMStuckRect reg keys
try try
{ {
screen.TaskBarEdge = _windowsDisplayConfig.TaskBarLayout.First(tb => tb.Value.RegKeyValue.Contains("Settings")).Value.Edge; if (_windowsDisplayConfig.TaskBarLayout.Count(tbr => tbr.Value.RegKeyValue.Contains("Settings")) > 0)
{
screen.TaskBarEdge = _windowsDisplayConfig.TaskBarLayout.First(tbr => tbr.Value.RegKeyValue.Contains("Settings")).Value.Edge;
SharedLogger.logger.Trace($"ProfileItem/GetWindowsScreenPositions: Position of the taskbar on the primary display {targetId} is on the {screen.TaskBarEdge } of the screen."); SharedLogger.logger.Trace($"ProfileItem/GetWindowsScreenPositions: Position of the taskbar on the primary display {targetId} is on the {screen.TaskBarEdge } of the screen.");
} }
else
{
SharedLogger.logger.Warn($"ProfileItem/GetWindowsScreenPositions: Problem trying to get the position of the taskbar on primary display {targetId}. Assuming it's on the bottom edge.");
screen.TaskBarEdge = TaskBarLayout.TaskBarEdge.Bottom;
}
}
catch (Exception ex) catch (Exception ex)
{ {
// Guess that it is at the bottom (90% correct) // Guess that it is at the bottom (90% correct)
@ -1572,10 +1580,53 @@ namespace DisplayMagicianShared
else else
{ {
try try
{
int numMatches = _windowsDisplayConfig.TaskBarLayout.Count(tbr => tbr.Value.RegKeyValue.Contains($"UID{targetId}"));
if (numMatches > 1)
{
var matchingTbls = (from tbl in _windowsDisplayConfig.TaskBarLayout where tbl.Value.RegKeyValue.Contains($"UID{targetId}") select tbl.Value).ToList();
bool foundIt = false;
foreach (var matchingTbl in matchingTbls)
{
// find display source that matches.
foreach (var displaySource in _windowsDisplayConfig.DisplaySources)
{
foreach (var displayDevice in displaySource.Value)
{
// We want to find the displaydevice that has the same adapter id
if (displayDevice.AdapterId.Value == adapterId && displayDevice.DevicePath.Contains(matchingTbl.RegKeyValue))
{
// This is the actual display we want!
foundIt = true;
screen.TaskBarEdge = matchingTbl.Edge;
SharedLogger.logger.Trace($"ProfileItem/GetWindowsScreenPositions: Position of the taskbar on display {targetId} is on the {screen.TaskBarEdge } of the screen.");
break;
}
}
// If we've found it already then stop looking
if (foundIt)
{
break;
}
}
}
if (!foundIt)
{
screen.TaskBarEdge = _windowsDisplayConfig.TaskBarLayout.First(tbr => tbr.Value.RegKeyValue.Contains($"UID{targetId}")).Value.Edge;
SharedLogger.logger.Trace($"ProfileItem/GetWindowsScreenPositions: Couldn't find the taskbar location for display {targetId} when it had multiple matching UIDs. Assuming the screen edge is at the bottom of the screen.");
}
}
else if (numMatches == 1)
{ {
screen.TaskBarEdge = _windowsDisplayConfig.TaskBarLayout.First(tbr => tbr.Value.RegKeyValue.Contains($"UID{targetId}")).Value.Edge; screen.TaskBarEdge = _windowsDisplayConfig.TaskBarLayout.First(tbr => tbr.Value.RegKeyValue.Contains($"UID{targetId}")).Value.Edge;
SharedLogger.logger.Trace($"ProfileItem/GetWindowsScreenPositions: Position of the taskbar on display {targetId} is on the {screen.TaskBarEdge } of the screen."); SharedLogger.logger.Trace($"ProfileItem/GetWindowsScreenPositions: Position of the taskbar on display {targetId} is on the {screen.TaskBarEdge } of the screen.");
} }
else
{
SharedLogger.logger.Warn($"ProfileItem/GetWindowsScreenPositions: Problem trying to get the position of the taskbar on display {targetId} as UID doesn't exist. Assuming it's on the bottom edge.");
screen.TaskBarEdge = TaskBarLayout.TaskBarEdge.Bottom;
}
}
catch (Exception ex) catch (Exception ex)
{ {
// Guess that it is at the bottom (90% correct) // Guess that it is at the bottom (90% correct)

View File

@ -356,6 +356,7 @@ namespace DisplayMagicianShared
{ {
SaveProfiles(); SaveProfiles();
IsPossibleRefresh(); IsPossibleRefresh();
UpdateActiveProfile();
return true; return true;
} }
else if (numRemoved == 0) else if (numRemoved == 0)
@ -438,6 +439,7 @@ namespace DisplayMagicianShared
{ {
SaveProfiles(); SaveProfiles();
IsPossibleRefresh(); IsPossibleRefresh();
UpdateActiveProfile();
return true; return true;
} }
else if (numRemoved == 0) else if (numRemoved == 0)
@ -519,6 +521,7 @@ namespace DisplayMagicianShared
{ {
SaveProfiles(); SaveProfiles();
IsPossibleRefresh(); IsPossibleRefresh();
UpdateActiveProfile();
return true; return true;
} }
else if (numRemoved == 0) else if (numRemoved == 0)

View File

@ -727,7 +727,7 @@ namespace DisplayMagicianShared.Windows
} }
else else
{ {
SharedLogger.logger.Error($"TaskBarLayout/GetAllCurrentTaskBarPositions: Skipping grabbing Taskbar position from a cloned display {monitorInfo.szDevice}"); SharedLogger.logger.Trace($"TaskBarLayout/GetAllCurrentTaskBarPositions: Skipping grabbing Taskbar position from a cloned display {monitorInfo.szDevice}");
} }
// Prep the next taskbar window so we continue through them // Prep the next taskbar window so we continue through them