From 94e8ffe338e373e13db19edb6e6ba6d8a6774908 Mon Sep 17 00:00:00 2001 From: Terry MacDonald Date: Fri, 17 Dec 2021 11:53:23 +1300 Subject: [PATCH] [WIP] Attempt to fix the GUI display for MST DisplayPort connections Displays daisy-chained via DIsplayPort MST devices aren't shown in the GUI properly. First attempt at a fix. --- DisplayMagician/Properties/AssemblyInfo.cs | 4 +- DisplayMagicianShared/ProfileItem.cs | 413 ++++++++++----------- 2 files changed, 193 insertions(+), 224 deletions(-) diff --git a/DisplayMagician/Properties/AssemblyInfo.cs b/DisplayMagician/Properties/AssemblyInfo.cs index d79bce4..be7313b 100644 --- a/DisplayMagician/Properties/AssemblyInfo.cs +++ b/DisplayMagician/Properties/AssemblyInfo.cs @@ -26,8 +26,8 @@ using System.Resources; [assembly: Guid("e4ceaf5e-ad01-4695-b179-31168eb74c48")] // Version information -[assembly: AssemblyVersion("2.1.1.40")] -[assembly: AssemblyFileVersion("2.1.1.40")] +[assembly: AssemblyVersion("2.1.1.42")] +[assembly: AssemblyFileVersion("2.1.1.42")] [assembly: NeutralResourcesLanguageAttribute( "en" )] [assembly: CLSCompliant(true)] diff --git a/DisplayMagicianShared/ProfileItem.cs b/DisplayMagicianShared/ProfileItem.cs index 324008d..53abb03 100644 --- a/DisplayMagicianShared/ProfileItem.cs +++ b/DisplayMagicianShared/ProfileItem.cs @@ -391,7 +391,7 @@ namespace DisplayMagicianShared { if (!NVIDIALibrary.GetLibrary().IsValidConfig(_nvidiaDisplayConfig)) { - SharedLogger.logger.Error($"ProfileRepository/IsValid: The profile {Name} has an invalid NVIDIA display config"); + SharedLogger.logger.Error($"ProfileItem/IsValid: The profile {Name} has an invalid NVIDIA display config"); return false; } } @@ -399,7 +399,7 @@ namespace DisplayMagicianShared { if (!AMDLibrary.GetLibrary().IsValidConfig(_amdDisplayConfig)) { - SharedLogger.logger.Error($"ProfileRepository/IsValid: The profile {Name} has an invalid AMD display config"); + SharedLogger.logger.Error($"ProfileItem/IsValid: The profile {Name} has an invalid AMD display config"); return false; } } @@ -407,13 +407,13 @@ namespace DisplayMagicianShared { if (!WinLibrary.GetLibrary().IsValidConfig(_windowsDisplayConfig)) { - SharedLogger.logger.Error($"ProfileRepository/IsValid: The profile {Name} has an invalid Windows CCD display config"); + SharedLogger.logger.Error($"ProfileItem/IsValid: The profile {Name} has an invalid Windows CCD display config"); return false; } } else { - SharedLogger.logger.Error($"ProfileRepository/IsValid: The profile {Name} has an unknown video mode!"); + SharedLogger.logger.Error($"ProfileItem/IsValid: The profile {Name} has an unknown video mode!"); } // The rest of the @@ -507,7 +507,7 @@ namespace DisplayMagicianShared } catch (Exception ex) { - SharedLogger.logger.Error(ex, $"ProfileRepository/CreateProfileFromCurrentDisplaySettings: Exception getting the config settings!"); + SharedLogger.logger.Error(ex, $"ProfileItem/CreateProfileFromCurrentDisplaySettings: Exception getting the config settings!"); return false; } } @@ -566,7 +566,7 @@ namespace DisplayMagicianShared } catch (Exception ex) { - SharedLogger.logger.Warn(ex, $"ShortcutItem/CreateShortcut: Execption while creating desktop shortcut!"); + SharedLogger.logger.Warn(ex, $"ProfileItem/CreateShortcut: Execption while creating desktop shortcut!"); // Clean up a failed attempt if (System.IO.File.Exists(shortcutFileName)) @@ -586,7 +586,7 @@ namespace DisplayMagicianShared // Check whether this profile is the same as the video mode, otherwise it's not possible if (ProfileRepository.CurrentVideoMode != VideoMode) { - SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The NVIDIA profile {Name} is NOT possible!"); + SharedLogger.logger.Debug($"ProfileItem/IsPossibleRefresh: The NVIDIA profile {Name} is NOT possible!"); _isPossible = false; return; } @@ -597,13 +597,13 @@ namespace DisplayMagicianShared if (NVIDIALibrary.GetLibrary().IsPossibleConfig(_nvidiaDisplayConfig)) { - SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The NVIDIA profile {Name} is possible!"); + SharedLogger.logger.Debug($"ProfileItem/IsPossibleRefresh: The NVIDIA profile {Name} is possible!"); _isPossible = true; } else { - SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The NVIDIA profile {Name} is NOT possible!"); + SharedLogger.logger.Debug($"ProfileItem/IsPossibleRefresh: The NVIDIA profile {Name} is NOT possible!"); _isPossible = false; } } @@ -612,13 +612,13 @@ namespace DisplayMagicianShared if (AMDLibrary.GetLibrary().IsPossibleConfig(_amdDisplayConfig)) { - SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The AMD profile {Name} is possible!"); + SharedLogger.logger.Debug($"ProfileItem/IsPossibleRefresh: The AMD profile {Name} is possible!"); _isPossible = true; } else { - SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The AMD profile {Name} is NOT possible!"); + SharedLogger.logger.Debug($"ProfileItem/IsPossibleRefresh: The AMD profile {Name} is NOT possible!"); _isPossible = false; } } @@ -627,19 +627,19 @@ namespace DisplayMagicianShared if (WinLibrary.GetLibrary().IsPossibleConfig(_windowsDisplayConfig)) { - SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The Windows CCD profile {Name} is possible!"); + SharedLogger.logger.Debug($"ProfileItem/IsPossibleRefresh: The Windows CCD profile {Name} is possible!"); _isPossible = true; } else { - SharedLogger.logger.Debug($"ProfileRepository/IsPossibleRefresh: The Windows CCD profile {Name} is NOT possible!"); + SharedLogger.logger.Debug($"ProfileItem/IsPossibleRefresh: The Windows CCD profile {Name} is NOT possible!"); _isPossible = false; } } else { - SharedLogger.logger.Warn($"ProfileRepository/IsPossibleRefresh: We have a current video mode we don't understand, or it's not installed! The current video mode is {ProfileRepository.CurrentVideoMode}. The profile {Name} has a {VideoMode.ToString("G")} video mode and NVIDIALibrary IsInstalled is {NVIDIALibrary.GetLibrary().IsInstalled}, AMDLibrary IsInstalled is {AMDLibrary.GetLibrary().IsInstalled} and WinLibrary IsInstalled is {WinLibrary.GetLibrary().IsInstalled} "); + SharedLogger.logger.Warn($"ProfileItem/IsPossibleRefresh: We have a current video mode we don't understand, or it's not installed! The current video mode is {ProfileRepository.CurrentVideoMode}. The profile {Name} has a {VideoMode.ToString("G")} video mode and NVIDIALibrary IsInstalled is {NVIDIALibrary.GetLibrary().IsInstalled}, AMDLibrary IsInstalled is {AMDLibrary.GetLibrary().IsInstalled} and WinLibrary IsInstalled is {WinLibrary.GetLibrary().IsInstalled} "); _isPossible = false; } } @@ -657,14 +657,14 @@ namespace DisplayMagicianShared { if (nvidiaLibrary.IsPossibleConfig(_nvidiaDisplayConfig)) { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The NVIDIA display settings within profile {Name} are possible to use right now, so we'll use attempt to use them."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The NVIDIA display settings within profile {Name} are possible to use right now, so we'll use attempt to use them."); bool itWorkedforNVIDIA = nvidiaLibrary.SetActiveConfig(_nvidiaDisplayConfig); if (itWorkedforNVIDIA) { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The NVIDIA display settings within profile {Name} were successfully applied."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The NVIDIA display settings within profile {Name} were successfully applied."); - /*SharedLogger.logger.Trace($"ProfileRepository/SetActive: Waiting 0.5 seconds to let the NVIDIA display change take place before setting the Windows CCD display settings"); + /*SharedLogger.logger.Trace($"ProfileItem/SetActive: Waiting 0.5 seconds to let the NVIDIA display change take place before setting the Windows CCD display settings"); System.Threading.Thread.Sleep(500);*/ // Lets update the screens so Windows knows whats happening @@ -682,34 +682,34 @@ namespace DisplayMagicianShared if (itWorkedforNVIDIAColor) { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The NVIDIA display settings that override windows within the profile {Name} were successfully applied."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The NVIDIA display settings that override windows within the profile {Name} were successfully applied."); return true; } else { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The NVIDIA display settings that override windows within the profile {Name} were NOT applied correctly."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The NVIDIA display settings that override windows within the profile {Name} were NOT applied correctly."); } } else { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The Windows CCD display settings within profile {Name} were NOT applied correctly."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The Windows CCD display settings within profile {Name} were NOT applied correctly."); } } else { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The NVIDIA display settings within profile {Name} were NOT applied correctly."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The NVIDIA display settings within profile {Name} were NOT applied correctly."); } } else { - SharedLogger.logger.Error($"ProfileRepository/SetActive: ERROR - Cannot apply the NVIDIA display config in profile {Name} as it is not currently possible to use it."); + SharedLogger.logger.Error($"ProfileItem/SetActive: ERROR - Cannot apply the NVIDIA display config in profile {Name} as it is not currently possible to use it."); } } else { - SharedLogger.logger.Info($"ProfileRepository/SetActive: The display settings in profile {Name} are already installed. No need to install them again. Exiting."); + SharedLogger.logger.Info($"ProfileItem/SetActive: The display settings in profile {Name} are already installed. No need to install them again. Exiting."); } } } @@ -723,14 +723,14 @@ namespace DisplayMagicianShared { if (amdLibrary.IsPossibleConfig(_amdDisplayConfig)) { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The AMD display settings within profile {Name} are possible to use right now, so we'll use attempt to use them."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The AMD display settings within profile {Name} are possible to use right now, so we'll use attempt to use them."); bool itWorkedforAMD = amdLibrary.SetActiveConfig(_amdDisplayConfig); if (itWorkedforAMD) { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The AMD display settings within profile {Name} were successfully applied."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The AMD display settings within profile {Name} were successfully applied."); - /*SharedLogger.logger.Trace($"ProfileRepository/SetActive: Waiting 0.5 seconds to let the AMD display change take place before setting the Windows CCD display settings"); + /*SharedLogger.logger.Trace($"ProfileItem/SetActive: Waiting 0.5 seconds to let the AMD display change take place before setting the Windows CCD display settings"); System.Threading.Thread.Sleep(500); */ // Lets update the screens so Windows knows whats happening @@ -747,34 +747,34 @@ namespace DisplayMagicianShared if (itWorkedforAMDColor) { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The AMD display settings that override windows within the profile {Name} were successfully applied."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The AMD display settings that override windows within the profile {Name} were successfully applied."); return true; } else { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The AMD display settings that override windows within the profile {Name} were NOT applied correctly."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The AMD display settings that override windows within the profile {Name} were NOT applied correctly."); } } else { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The Windows CCD display settings within profile {Name} were NOT applied correctly."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The Windows CCD display settings within profile {Name} were NOT applied correctly."); } } else { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The AMD display settings within profile {Name} were NOT applied correctly."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The AMD display settings within profile {Name} were NOT applied correctly."); } } else { - SharedLogger.logger.Error($"ProfileRepository/SetActive: ERROR - Cannot apply the AMD display config in profile {Name} as it is not currently possible to use it."); + SharedLogger.logger.Error($"ProfileItem/SetActive: ERROR - Cannot apply the AMD display config in profile {Name} as it is not currently possible to use it."); } } else { - SharedLogger.logger.Info($"ProfileRepository/SetActive: The display settings in profile {Name} are already installed. No need to install them again. Exiting."); + SharedLogger.logger.Info($"ProfileItem/SetActive: The display settings in profile {Name} are already installed. No need to install them again. Exiting."); } } } @@ -787,17 +787,17 @@ namespace DisplayMagicianShared { if (winLibrary.SetActiveConfig(_windowsDisplayConfig)) { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The Windows CCD display settings within profile {Name} were successfully applied."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The Windows CCD display settings within profile {Name} were successfully applied."); return true; } else { - SharedLogger.logger.Trace($"ProfileRepository/SetActive: The Windows CCD display settings within profile {Name} were NOT applied correctly."); + SharedLogger.logger.Trace($"ProfileItem/SetActive: The Windows CCD display settings within profile {Name} were NOT applied correctly."); } } else { - SharedLogger.logger.Info($"ProfileRepository/SetActive: The display settings in profile {Name} are already installed. No need to install them again. Exiting."); + SharedLogger.logger.Info($"ProfileItem/SetActive: The display settings in profile {Name} are already installed. No need to install them again. Exiting."); } } @@ -841,12 +841,10 @@ namespace DisplayMagicianShared // Return an empty screen if we have no Display Config Paths to use! return _screens; } - // Now we need to check for Spanned screens + + // Now we need to check for Spanned screens (Surround) if (_nvidiaDisplayConfig.MosaicConfig.IsMosaicEnabled) { - - // Create a dictionary of all the screen sizes we want - //Dictionary MosaicScreens = new Dictionary(); for (int i = 0; i < _nvidiaDisplayConfig.MosaicConfig.MosaicGridCount; i++) { ScreenPosition screen = new ScreenPosition(); @@ -921,6 +919,7 @@ namespace DisplayMagicianShared // Add the spanned screen to the screen screen.SpannedScreens.Add(spannedScreen); + } // Need to look for the Windows layout details now we know the size of this display @@ -985,150 +984,106 @@ namespace DisplayMagicianShared } } - else if (_nvidiaDisplayConfig.MosaicConfig.MosaicGridTopos[i].DisplayCount == 1) + + SharedLogger.logger.Trace($"ProfileItem/GetNVIDIAScreenPositions: Added a new NVIDIA Spanned Screen {screen.Name} ({screen.ScreenWidth}x{screen.ScreenHeight}) at position {screen.ScreenX},{screen.ScreenY}."); + + _screens.Add(screen); + } + } + + // Now we go through all the windows displays, and we skip the Windows one that matches the NVIDIA one (as we added it earlier) + foreach (var path in _windowsDisplayConfig.DisplayConfigPaths) + { + // For each path we go through and get the relevant info we need. + if (_windowsDisplayConfig.DisplayConfigPaths.Length > 0) + { + // Set some basics about the screen + ScreenPosition screen = new ScreenPosition(); + screen.Library = "NVIDIA"; + screen.IsSpanned = false; + screen.Colour = normalScreenColor; // this is the default unless overridden by the primary screen + + UInt32 sourceId = path.SourceInfo.Id; + UInt32 targetId = path.TargetInfo.Id; + + screen.IsClone = false; + screen.ClonedCopies = 0; + foreach (var displaySource in _windowsDisplayConfig.DisplaySources) { - // This is a single screen with an adjoining mosaic screen - // Set some basics about the screen - try + if (displaySource.Value.Contains(sourceId)) { - string displayId = _nvidiaDisplayConfig.MosaicConfig.MosaicGridTopos[i].Displays[0].DisplayId.ToString(); - string windowsDisplayName = _nvidiaDisplayConfig.DisplayNames[displayId]; - List sourceIndexes = _windowsDisplayConfig.DisplaySources[windowsDisplayName]; - for (int x = 0; x < _windowsDisplayConfig.DisplayConfigModes.Length; x++) + if (displaySource.Value.Count > 1) { - // Skip this if its not a source info config type - if (_windowsDisplayConfig.DisplayConfigModes[x].InfoType != DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE) - { - continue; - } - - // If the source index matches the index of the source info object we're looking at, then process it! - if (sourceIndexes.Contains(_windowsDisplayConfig.DisplayConfigModes[x].Id)) - { - screen.Name = displayId.ToString(); - - screen.ScreenX = (int)_windowsDisplayConfig.DisplayConfigModes[x].SourceMode.Position.X; - screen.ScreenY = (int)_windowsDisplayConfig.DisplayConfigModes[x].SourceMode.Position.Y; - screen.ScreenWidth = (int)_windowsDisplayConfig.DisplayConfigModes[x].SourceMode.Width; - screen.ScreenHeight = (int)_windowsDisplayConfig.DisplayConfigModes[x].SourceMode.Height; - break; - } + // We have a cloned display + screen.IsClone = true; + screen.ClonedCopies = displaySource.Value.Count; } + break; + } + } + + + // Go through the screens as Windows knows them, and then enhance the info with Mosaic data if it applies + foreach (DISPLAYCONFIG_MODE_INFO displayMode in _windowsDisplayConfig.DisplayConfigModes) + { + // Find the matching Display Config Source Mode + if (displayMode.InfoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE && displayMode.Id == sourceId) + { + screen.Name = targetId.ToString(); + //screen.DisplayConnector = displayMode.DisplayConnector; + screen.ScreenX = displayMode.SourceMode.Position.X; + screen.ScreenY = displayMode.SourceMode.Position.Y; + screen.ScreenWidth = (int)displayMode.SourceMode.Width; + screen.ScreenHeight = (int)displayMode.SourceMode.Height; + // If we're at the 0,0 coordinate then we're the primary monitor if (screen.ScreenX == 0 && screen.ScreenY == 0) { screen.IsPrimary = true; screen.Colour = primaryScreenColor; } - + break; } - catch (KeyNotFoundException ex) - { - // Thrown if the Windows display doesn't match the NVIDIA display. - // Typically happens during configuration of a new Mosaic mode. - // If we hit this issue, then we just want to skip over it, as we can update it later when the user pushes the button. - // This only happens due to the auto detection stuff functionality we have built in to try and update as quickly as we can. - // So its something that we can safely ignore if we hit this exception as it is part of the expect behaviour - continue; - } - catch (Exception ex) - { - // Some other exception has occurred and we need to report it. - SharedLogger.logger.Info(ex, $"ProfileRepository/GetNVIDIAScreenPositions: An exception happened when trying to create a screen from a single Mosaic desktop"); - continue; - } - } - _screens.Add(screen); - } - } - else - { - foreach (var path in _windowsDisplayConfig.DisplayConfigPaths) - { - // For each path we go through and get the relevant info we need. - if (_windowsDisplayConfig.DisplayConfigPaths.Length > 0) + // Decide if this screen is one we've had earlier, and if so, skip it + if (_screens.Any( s => s.ScreenX == screen.ScreenX && s.ScreenY == screen.ScreenY && s.ScreenWidth == screen.ScreenWidth && s.ScreenHeight == screen.ScreenHeight)) { - // Set some basics about the screen - ScreenPosition screen = new ScreenPosition(); - screen.Library = "NVIDIA"; - screen.IsSpanned = false; - screen.Colour = normalScreenColor; // this is the default unless overridden by the primary screen + SharedLogger.logger.Trace($"ProfileItem/GetNVIDIAScreenPositions: We've already got the {screen.Name} ({screen.ScreenWidth}x{screen.ScreenHeight}) screen from the NVIDIA driver, so skipping it from the Windows driver."); + continue; + } - UInt32 sourceId = path.SourceInfo.Id; - UInt32 targetId = path.TargetInfo.Id; - - screen.IsClone = false; - screen.ClonedCopies = 0; - foreach (var displaySource in _windowsDisplayConfig.DisplaySources) + foreach (ADVANCED_HDR_INFO_PER_PATH hdrInfo in _windowsDisplayConfig.DisplayHDRStates) + { + // Find the matching HDR information + if (hdrInfo.Id == targetId) { - if (displaySource.Value.Contains(sourceId)) + // HDR information + if (hdrInfo.AdvancedColorInfo.AdvancedColorSupported) { - if (displaySource.Value.Count > 1) + screen.HDRSupported = true; + if (hdrInfo.AdvancedColorInfo.AdvancedColorEnabled) { - // We have a cloned display - screen.IsClone = true; - screen.ClonedCopies = displaySource.Value.Count; - } - break; - } - } - - - // Go through the screens as Windows knows them, and then enhance the info with Mosaic data if it applies - foreach (DISPLAYCONFIG_MODE_INFO displayMode in _windowsDisplayConfig.DisplayConfigModes) - { - // Find the matching Display Config Source Mode - if (displayMode.InfoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE && displayMode.Id == sourceId) - { - screen.Name = targetId.ToString(); - //screen.DisplayConnector = displayMode.DisplayConnector; - screen.ScreenX = displayMode.SourceMode.Position.X; - screen.ScreenY = displayMode.SourceMode.Position.Y; - screen.ScreenWidth = (int)displayMode.SourceMode.Width; - screen.ScreenHeight = (int)displayMode.SourceMode.Height; - - // If we're at the 0,0 coordinate then we're the primary monitor - if (screen.ScreenX == 0 && screen.ScreenY == 0) - { - screen.IsPrimary = true; - screen.Colour = primaryScreenColor; - } - break; - } - } - - foreach (ADVANCED_HDR_INFO_PER_PATH hdrInfo in _windowsDisplayConfig.DisplayHDRStates) - { - // Find the matching HDR information - if (hdrInfo.Id == targetId) - { - // HDR information - if (hdrInfo.AdvancedColorInfo.AdvancedColorSupported) - { - screen.HDRSupported = true; - if (hdrInfo.AdvancedColorInfo.AdvancedColorEnabled) - { - screen.HDREnabled = true; - } - else - { - screen.HDREnabled = false; - } - + screen.HDREnabled = true; } else { - screen.HDRSupported = false; screen.HDREnabled = false; } - break; - } - } - _screens.Add(screen); + } + else + { + screen.HDRSupported = false; + screen.HDREnabled = false; + } + break; + } } + + SharedLogger.logger.Trace($"ProfileItem/GetNVIDIAScreenPositions: Added a new Screen {screen.Name} ({screen.ScreenWidth}x{screen.ScreenHeight}) at position {screen.ScreenX},{screen.ScreenY}."); + + _screens.Add(screen); } } @@ -1192,7 +1147,8 @@ namespace DisplayMagicianShared // Return an empty screen if we have no Display Config Paths to use! return _screens; } - // Now we need to check for Spanned screens + + // Go through the AMD Eyefinity screens if (_amdDisplayConfig.SlsConfig.IsSlsEnabled) { for (int i = 0; i < _amdDisplayConfig.DisplayMaps.Count; i++) @@ -1284,96 +1240,107 @@ namespace DisplayMagicianShared { screen.Colour = primaryScreenColor; } - } + } + + SharedLogger.logger.Trace($"ProfileItem/GetAMDScreenPositions: Added a new AMD Spanned Screen {screen.Name} ({screen.ScreenWidth}x{screen.ScreenHeight}) at position {screen.ScreenX},{screen.ScreenY}."); _screens.Add(screen); } } - else + + // Next, go through the screens as Windows knows them, and then enhance the info with Eyefinity data if it applies + foreach (var path in _windowsDisplayConfig.DisplayConfigPaths) { - foreach (var path in _windowsDisplayConfig.DisplayConfigPaths) + // For each path we go through and get the relevant info we need. + if (_windowsDisplayConfig.DisplayConfigPaths.Length > 0) { - // For each path we go through and get the relevant info we need. - if (_windowsDisplayConfig.DisplayConfigPaths.Length > 0) + // Set some basics about the screen + ScreenPosition screen = new ScreenPosition(); + screen.Library = "AMD"; + screen.IsSpanned = false; + screen.Colour = normalScreenColor; // this is the default unless overridden by the primary screen + + UInt32 sourceId = path.SourceInfo.Id; + UInt32 targetId = path.TargetInfo.Id; + + screen.IsClone = false; + screen.ClonedCopies = 0; + foreach (var displaySource in _windowsDisplayConfig.DisplaySources) { - // Set some basics about the screen - ScreenPosition screen = new ScreenPosition(); - screen.Library = "AMD"; - screen.IsSpanned = false; - screen.Colour = normalScreenColor; // this is the default unless overridden by the primary screen - - UInt32 sourceId = path.SourceInfo.Id; - UInt32 targetId = path.TargetInfo.Id; - - screen.IsClone = false; - screen.ClonedCopies = 0; - foreach (var displaySource in _windowsDisplayConfig.DisplaySources) + if (displaySource.Value.Contains(sourceId)) { - if (displaySource.Value.Contains(sourceId)) + if (displaySource.Value.Count > 1) { - if (displaySource.Value.Count > 1) - { - // We have a cloned display - screen.IsClone = true; - screen.ClonedCopies = displaySource.Value.Count; - } - break; + // We have a cloned display + screen.IsClone = true; + screen.ClonedCopies = displaySource.Value.Count; } + break; } + } - // Go through the screens as Windows knows them, and then enhance the info with Mosaic data if it applies - foreach (DISPLAYCONFIG_MODE_INFO displayMode in _windowsDisplayConfig.DisplayConfigModes) + // Go through the screens as Windows knows them, and then enhance the info with Mosaic data if it applies + foreach (DISPLAYCONFIG_MODE_INFO displayMode in _windowsDisplayConfig.DisplayConfigModes) + { + // Find the matching Display Config Source Mode + if (displayMode.InfoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE && displayMode.Id == sourceId) { - // Find the matching Display Config Source Mode - if (displayMode.InfoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE && displayMode.Id == sourceId) - { - screen.Name = targetId.ToString(); - //screen.DisplayConnector = displayMode.DisplayConnector; - screen.ScreenX = displayMode.SourceMode.Position.X; - screen.ScreenY = displayMode.SourceMode.Position.Y; - screen.ScreenWidth = (int)displayMode.SourceMode.Width; - screen.ScreenHeight = (int)displayMode.SourceMode.Height; + screen.Name = targetId.ToString(); + //screen.DisplayConnector = displayMode.DisplayConnector; + screen.ScreenX = displayMode.SourceMode.Position.X; + screen.ScreenY = displayMode.SourceMode.Position.Y; + screen.ScreenWidth = (int)displayMode.SourceMode.Width; + screen.ScreenHeight = (int)displayMode.SourceMode.Height; - // If we're at the 0,0 coordinate then we're the primary monitor - if (screen.ScreenX == 0 && screen.ScreenY == 0) - { - screen.IsPrimary = true; - screen.Colour = primaryScreenColor; - } - break; + // If we're at the 0,0 coordinate then we're the primary monitor + if (screen.ScreenX == 0 && screen.ScreenY == 0) + { + screen.IsPrimary = true; + screen.Colour = primaryScreenColor; } + break; } + } - foreach (ADVANCED_HDR_INFO_PER_PATH hdrInfo in _windowsDisplayConfig.DisplayHDRStates) + // Decide if this screen is one we've had earlier, and if so, skip it + if (_screens.Any(s => s.ScreenX == screen.ScreenX && s.ScreenY == screen.ScreenY && s.ScreenWidth == screen.ScreenWidth && s.ScreenHeight == screen.ScreenHeight)) + { + SharedLogger.logger.Trace($"ProfileItem/GetAMDScreenPositions: We've already got the {screen.Name} ({screen.ScreenWidth}x{screen.ScreenHeight}) screen from the AMD driver, so skipping it from the Windows driver."); + continue; + } + + + foreach (ADVANCED_HDR_INFO_PER_PATH hdrInfo in _windowsDisplayConfig.DisplayHDRStates) + { + // Find the matching HDR information + if (hdrInfo.Id == targetId) { - // Find the matching HDR information - if (hdrInfo.Id == targetId) + // HDR information + if (hdrInfo.AdvancedColorInfo.AdvancedColorSupported) { - // HDR information - if (hdrInfo.AdvancedColorInfo.AdvancedColorSupported) + screen.HDRSupported = true; + if (hdrInfo.AdvancedColorInfo.AdvancedColorEnabled) { - screen.HDRSupported = true; - if (hdrInfo.AdvancedColorInfo.AdvancedColorEnabled) - { - screen.HDREnabled = true; - } - else - { - screen.HDREnabled = false; - } - + screen.HDREnabled = true; } else { - screen.HDRSupported = false; screen.HDREnabled = false; } - break; - } - } - _screens.Add(screen); + } + else + { + screen.HDRSupported = false; + screen.HDREnabled = false; + } + break; + } } + + SharedLogger.logger.Trace($"ProfileItem/GetAMDScreenPositions: Added a new Screen {screen.Name} ({screen.ScreenWidth}x{screen.ScreenHeight}) at position {screen.ScreenX},{screen.ScreenY}."); + + _screens.Add(screen); } } @@ -1478,6 +1445,8 @@ namespace DisplayMagicianShared } } + SharedLogger.logger.Trace($"ProfileItem/GetWindowsScreenPositions: Added a new Screen {screen.Name} ({screen.ScreenWidth}x{screen.ScreenHeight}) at position {screen.ScreenX},{screen.ScreenY}."); + _screens.Add(screen); } }