mirror of
https://github.com/terrymacdonald/DisplayMagician.git
synced 2024-08-30 18:32:20 +00:00
Updated WinLibrary to latest version
Now supports cloned displays. Also modified a log entry from error to trace.
This commit is contained in:
parent
ecba306732
commit
816e1a701f
@ -56,10 +56,19 @@ namespace DisplayMagician.UIForms
|
|||||||
// Apply the Profile
|
// Apply the Profile
|
||||||
if (ProfileRepository.ApplyProfile(_selectedProfile) == ApplyProfileResult.Successful)
|
if (ProfileRepository.ApplyProfile(_selectedProfile) == ApplyProfileResult.Successful)
|
||||||
{
|
{
|
||||||
logger.Error($"DisplayProfileForm/Apply_Click: Waiting 0.5 sec for the display to apply");
|
logger.Trace($"DisplayProfileForm/Apply_Click: The Profile {_selectedProfile.Name} was successfully applied. Waiting 0.5 sec for the display to settle after the change.");
|
||||||
System.Threading.Thread.Sleep(500);
|
System.Threading.Thread.Sleep(500);
|
||||||
|
logger.Trace($"DisplayProfileForm/Apply_Click: Changing the selected profile in the imagelistview to Profile {_selectedProfile.Name}.");
|
||||||
ChangeSelectedProfile(_selectedProfile);
|
ChangeSelectedProfile(_selectedProfile);
|
||||||
}
|
}
|
||||||
|
else if (ProfileRepository.ApplyProfile(_selectedProfile) == ApplyProfileResult.Cancelled)
|
||||||
|
{
|
||||||
|
logger.Warn($"DisplayProfileForm/Apply_Click: The user cancelled changing to Profile {_selectedProfile.Name}.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.Warn($"DisplayProfileForm/Apply_Click: Error applying the Profile {_selectedProfile.Name}. Unable to change the display layout.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
public enum DISPLAYCONFIG_TOPOLOGY_ID : uint
|
public enum DISPLAYCONFIG_TOPOLOGY_ID : uint
|
||||||
{
|
{
|
||||||
Zero = 0x0,
|
Zero = 0x0,
|
||||||
DISPLAYCONFIG_TOPOLOGY_public = 0x00000001,
|
DISPLAYCONFIG_TOPOLOGY_INTERNAL = 0x00000001,
|
||||||
DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002,
|
DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002,
|
||||||
DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004,
|
DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004,
|
||||||
DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008,
|
DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008,
|
||||||
@ -106,7 +106,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
public enum DISPLAYCONFIG_PATH : uint
|
public enum DISPLAYCONFIG_PATH_FLAGS : uint
|
||||||
{
|
{
|
||||||
Zero = 0x0,
|
Zero = 0x0,
|
||||||
DISPLAYCONFIG_PATH_ACTIVE = 0x00000001,
|
DISPLAYCONFIG_PATH_ACTIVE = 0x00000001,
|
||||||
@ -566,7 +566,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
|
|
||||||
public bool Equals(DISPLAYCONFIG_PATH_TARGET_INFO other)
|
public bool Equals(DISPLAYCONFIG_PATH_TARGET_INFO other)
|
||||||
=> // AdapterId.Equals(other.AdapterId) && // Removed the AdapterId from the Equals, as it changes after reboot.
|
=> // AdapterId.Equals(other.AdapterId) && // Removed the AdapterId from the Equals, as it changes after reboot.
|
||||||
Id == other.Id &&
|
// Id == other.Id && // Removed as ID changes after reboot when the display is a cloned copy :(
|
||||||
ModeInfoIdx == other.ModeInfoIdx &&
|
ModeInfoIdx == other.ModeInfoIdx &&
|
||||||
OutputTechnology.Equals(other.OutputTechnology) &&
|
OutputTechnology.Equals(other.OutputTechnology) &&
|
||||||
Rotation.Equals(other.Rotation) &&
|
Rotation.Equals(other.Rotation) &&
|
||||||
@ -591,7 +591,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
{
|
{
|
||||||
public DISPLAYCONFIG_PATH_SOURCE_INFO SourceInfo;
|
public DISPLAYCONFIG_PATH_SOURCE_INFO SourceInfo;
|
||||||
public DISPLAYCONFIG_PATH_TARGET_INFO TargetInfo;
|
public DISPLAYCONFIG_PATH_TARGET_INFO TargetInfo;
|
||||||
public uint Flags;
|
public DISPLAYCONFIG_PATH_FLAGS Flags;
|
||||||
|
|
||||||
public override bool Equals(object obj) => obj is DISPLAYCONFIG_PATH_INFO other && this.Equals(other);
|
public override bool Equals(object obj) => obj is DISPLAYCONFIG_PATH_INFO other && this.Equals(other);
|
||||||
public bool Equals(DISPLAYCONFIG_PATH_INFO other)
|
public bool Equals(DISPLAYCONFIG_PATH_INFO other)
|
||||||
@ -988,6 +988,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
{
|
{
|
||||||
// Set some useful constants
|
// Set some useful constants
|
||||||
public const SDC SDC_CCD_TEST_IF_VALID = (SDC.SDC_VALIDATE | SDC.SDC_USE_SUPPLIED_DISPLAY_CONFIG);
|
public const SDC SDC_CCD_TEST_IF_VALID = (SDC.SDC_VALIDATE | SDC.SDC_USE_SUPPLIED_DISPLAY_CONFIG);
|
||||||
|
public const uint DISPLAYCONFIG_PATH_MODE_IDX_INVALID = 0xffffffff;
|
||||||
|
|
||||||
|
|
||||||
// GetDisplayConfigBufferSizes
|
// GetDisplayConfigBufferSizes
|
||||||
|
@ -421,7 +421,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
|
|
||||||
public bool Equals(DISPLAY_DEVICE other)
|
public bool Equals(DISPLAY_DEVICE other)
|
||||||
=> Size == other.Size &&
|
=> Size == other.Size &&
|
||||||
DeviceName == other.DeviceName &&
|
// DeviceName == other.DeviceName && // Had to remove this as the device name often changes after a reboot!
|
||||||
DeviceString == other.DeviceString &&
|
DeviceString == other.DeviceString &&
|
||||||
StateFlags == other.StateFlags &&
|
StateFlags == other.StateFlags &&
|
||||||
DeviceId == other.DeviceId &&
|
DeviceId == other.DeviceId &&
|
||||||
|
@ -22,7 +22,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
public override bool Equals(object obj) => obj is ADVANCED_HDR_INFO_PER_PATH other && this.Equals(other);
|
public override bool Equals(object obj) => obj is ADVANCED_HDR_INFO_PER_PATH other && this.Equals(other);
|
||||||
public bool Equals(ADVANCED_HDR_INFO_PER_PATH other)
|
public bool Equals(ADVANCED_HDR_INFO_PER_PATH other)
|
||||||
=> // AdapterId.Equals(other.AdapterId) && // Removed the AdapterId from the Equals, as it changes after reboot.
|
=> // AdapterId.Equals(other.AdapterId) && // Removed the AdapterId from the Equals, as it changes after reboot.
|
||||||
Id == other.Id &&
|
//Id == other.Id && // Removed the ID too, as that changes if the user has a Clone!
|
||||||
AdvancedColorInfo.Equals(other.AdvancedColorInfo) &&
|
AdvancedColorInfo.Equals(other.AdvancedColorInfo) &&
|
||||||
SDRWhiteLevel.Equals(other.SDRWhiteLevel);
|
SDRWhiteLevel.Equals(other.SDRWhiteLevel);
|
||||||
public override int GetHashCode()
|
public override int GetHashCode()
|
||||||
@ -43,6 +43,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
public DISPLAYCONFIG_MODE_INFO[] DisplayConfigModes;
|
public DISPLAYCONFIG_MODE_INFO[] DisplayConfigModes;
|
||||||
public ADVANCED_HDR_INFO_PER_PATH[] DisplayHDRStates;
|
public ADVANCED_HDR_INFO_PER_PATH[] DisplayHDRStates;
|
||||||
public Dictionary<string, GDI_DISPLAY_SETTING> GdiDisplaySettings;
|
public Dictionary<string, GDI_DISPLAY_SETTING> GdiDisplaySettings;
|
||||||
|
public bool IsCloned;
|
||||||
// Note: We purposely have left out the DisplaySources from the Equals as it's order keeps changing after each reboot and after each profile swap
|
// Note: We purposely have left out the DisplaySources from the Equals as it's order keeps changing after each reboot and after each profile swap
|
||||||
// and it is informational only and doesn't contribute to the configuration (it's used for generating the Screens structure, and therefore for
|
// and it is informational only and doesn't contribute to the configuration (it's used for generating the Screens structure, and therefore for
|
||||||
// generating the profile icon.
|
// generating the profile icon.
|
||||||
@ -51,7 +52,8 @@ namespace DisplayMagicianShared.Windows
|
|||||||
|
|
||||||
public override bool Equals(object obj) => obj is WINDOWS_DISPLAY_CONFIG other && this.Equals(other);
|
public override bool Equals(object obj) => obj is WINDOWS_DISPLAY_CONFIG other && this.Equals(other);
|
||||||
public bool Equals(WINDOWS_DISPLAY_CONFIG other)
|
public bool Equals(WINDOWS_DISPLAY_CONFIG other)
|
||||||
=> DisplayConfigPaths.SequenceEqual(other.DisplayConfigPaths) &&
|
=> IsCloned == other.IsCloned &&
|
||||||
|
DisplayConfigPaths.SequenceEqual(other.DisplayConfigPaths) &&
|
||||||
DisplayConfigModes.SequenceEqual(other.DisplayConfigModes) &&
|
DisplayConfigModes.SequenceEqual(other.DisplayConfigModes) &&
|
||||||
DisplayHDRStates.SequenceEqual(other.DisplayHDRStates) &&
|
DisplayHDRStates.SequenceEqual(other.DisplayHDRStates) &&
|
||||||
GdiDisplaySettings.SequenceEqual(other.GdiDisplaySettings) &&
|
GdiDisplaySettings.SequenceEqual(other.GdiDisplaySettings) &&
|
||||||
@ -59,7 +61,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
|
|
||||||
public override int GetHashCode()
|
public override int GetHashCode()
|
||||||
{
|
{
|
||||||
return (DisplayConfigPaths, DisplayConfigModes, DisplayHDRStates, GdiDisplaySettings, DisplayIdentifiers).GetHashCode();
|
return (DisplayConfigPaths, DisplayConfigModes, DisplayHDRStates, GdiDisplaySettings, IsCloned, DisplayIdentifiers).GetHashCode();
|
||||||
}
|
}
|
||||||
public static bool operator ==(WINDOWS_DISPLAY_CONFIG lhs, WINDOWS_DISPLAY_CONFIG rhs) => lhs.Equals(rhs);
|
public static bool operator ==(WINDOWS_DISPLAY_CONFIG lhs, WINDOWS_DISPLAY_CONFIG rhs) => lhs.Equals(rhs);
|
||||||
|
|
||||||
@ -144,6 +146,7 @@ namespace DisplayMagicianShared.Windows
|
|||||||
myDefaultConfig.DisplayHDRStates = new ADVANCED_HDR_INFO_PER_PATH[0];
|
myDefaultConfig.DisplayHDRStates = new ADVANCED_HDR_INFO_PER_PATH[0];
|
||||||
myDefaultConfig.DisplayIdentifiers = new List<string>();
|
myDefaultConfig.DisplayIdentifiers = new List<string>();
|
||||||
myDefaultConfig.DisplaySources = new Dictionary<string, List<uint>>();
|
myDefaultConfig.DisplaySources = new Dictionary<string, List<uint>>();
|
||||||
|
myDefaultConfig.IsCloned = false;
|
||||||
myDefaultConfig.GdiDisplaySettings = new Dictionary<string, GDI_DISPLAY_SETTING>();
|
myDefaultConfig.GdiDisplaySettings = new Dictionary<string, GDI_DISPLAY_SETTING>();
|
||||||
|
|
||||||
return myDefaultConfig;
|
return myDefaultConfig;
|
||||||
@ -305,19 +308,24 @@ namespace DisplayMagicianShared.Windows
|
|||||||
windowsDisplayConfig.DisplayAdapters = new Dictionary<ulong, string>();
|
windowsDisplayConfig.DisplayAdapters = new Dictionary<ulong, string>();
|
||||||
windowsDisplayConfig.DisplayHDRStates = new ADVANCED_HDR_INFO_PER_PATH[pathCount];
|
windowsDisplayConfig.DisplayHDRStates = new ADVANCED_HDR_INFO_PER_PATH[pathCount];
|
||||||
windowsDisplayConfig.DisplaySources = new Dictionary<string, List<uint>>();
|
windowsDisplayConfig.DisplaySources = new Dictionary<string, List<uint>>();
|
||||||
|
windowsDisplayConfig.IsCloned = false;
|
||||||
|
|
||||||
// Now cycle through the paths and grab the HDR state information
|
// Now cycle through the paths and grab the HDR state information
|
||||||
// and map the adapter name to adapter id
|
// and map the adapter name to adapter id
|
||||||
var hdrInfos = new ADVANCED_HDR_INFO_PER_PATH[pathCount];
|
var hdrInfos = new ADVANCED_HDR_INFO_PER_PATH[pathCount];
|
||||||
int hdrInfoCount = 0;
|
int hdrInfoCount = 0;
|
||||||
foreach (var path in paths)
|
for (int i = 0; i < paths.Length; i++)
|
||||||
{
|
{
|
||||||
|
//DISPLAYCONFIG_PATH_INFO path = paths[i];
|
||||||
|
|
||||||
|
// Track if this display is a cloned path
|
||||||
|
bool isClonedPath = false;
|
||||||
// get display source name
|
// get display source name
|
||||||
var sourceInfo = new DISPLAYCONFIG_SOURCE_DEVICE_NAME();
|
var sourceInfo = new DISPLAYCONFIG_SOURCE_DEVICE_NAME();
|
||||||
sourceInfo.Header.Type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
|
sourceInfo.Header.Type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
|
||||||
sourceInfo.Header.Size = (uint)Marshal.SizeOf<DISPLAYCONFIG_SOURCE_DEVICE_NAME>();
|
sourceInfo.Header.Size = (uint)Marshal.SizeOf<DISPLAYCONFIG_SOURCE_DEVICE_NAME>();
|
||||||
sourceInfo.Header.AdapterId = path.SourceInfo.AdapterId;
|
sourceInfo.Header.AdapterId = paths[i].SourceInfo.AdapterId;
|
||||||
sourceInfo.Header.Id = path.SourceInfo.Id;
|
sourceInfo.Header.Id = paths[i].SourceInfo.Id;
|
||||||
err = CCDImport.DisplayConfigGetDeviceInfo(ref sourceInfo);
|
err = CCDImport.DisplayConfigGetDeviceInfo(ref sourceInfo);
|
||||||
if (err == WIN32STATUS.ERROR_SUCCESS)
|
if (err == WIN32STATUS.ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
@ -325,98 +333,111 @@ namespace DisplayMagicianShared.Windows
|
|||||||
if (windowsDisplayConfig.DisplaySources.ContainsKey(sourceInfo.ViewGdiDeviceName))
|
if (windowsDisplayConfig.DisplaySources.ContainsKey(sourceInfo.ViewGdiDeviceName))
|
||||||
{
|
{
|
||||||
// We already have at least one display using this source, so we need to add the other cloned display to the existing list
|
// We already have at least one display using this source, so we need to add the other cloned display to the existing list
|
||||||
windowsDisplayConfig.DisplaySources[sourceInfo.ViewGdiDeviceName].Add(path.SourceInfo.Id);
|
windowsDisplayConfig.DisplaySources[sourceInfo.ViewGdiDeviceName].Add(paths[i].SourceInfo.Id);
|
||||||
|
isClonedPath = true;
|
||||||
|
windowsDisplayConfig.IsCloned = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// This is the first display to use this source
|
// This is the first display to use this source
|
||||||
List<uint> sourceIds = new List<uint>();
|
List<uint> sourceIds = new List<uint>();
|
||||||
sourceIds.Add(path.SourceInfo.Id);
|
sourceIds.Add(paths[i].SourceInfo.Id);
|
||||||
windowsDisplayConfig.DisplaySources.Add(sourceInfo.ViewGdiDeviceName, sourceIds);
|
windowsDisplayConfig.DisplaySources.Add(sourceInfo.ViewGdiDeviceName, sourceIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Found Display Source {sourceInfo.ViewGdiDeviceName} for source {path.SourceInfo.Id}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Found Display Source {sourceInfo.ViewGdiDeviceName} for source {paths[i].SourceInfo.Id}.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Warn($"WinLibrary/PrintActiveConfig: WARNING - DisplayConfigGetDeviceInfo returned WIN32STATUS {err} when trying to get the source info for source adapter #{path.SourceInfo.AdapterId}");
|
SharedLogger.logger.Warn($"WinLibrary/PrintActiveConfig: WARNING - DisplayConfigGetDeviceInfo returned WIN32STATUS {err} when trying to get the source info for source adapter #{paths[i].SourceInfo.AdapterId}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if this path is a cloned display path, and if so make some changes
|
||||||
|
// so that the cloned display will be applied properly
|
||||||
|
if (isClonedPath)
|
||||||
|
{
|
||||||
|
// We need to make some modifications to this path so that we store as ready for being applied
|
||||||
|
// https://docs.microsoft.com/en-us/windows-hardware/drivers/display/ccd-example-code
|
||||||
|
paths[i].Flags |= DISPLAYCONFIG_PATH_FLAGS.DISPLAYCONFIG_PATH_ACTIVE;
|
||||||
|
paths[i].SourceInfo.ModeInfoIdx = CCDImport.DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
|
||||||
|
paths[i].TargetInfo.ModeInfoIdx = CCDImport.DISPLAYCONFIG_PATH_MODE_IDX_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get adapter ID for later
|
// Get adapter ID for later
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Attempting to get adapter name for adapter {path.TargetInfo.AdapterId.Value}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Attempting to get adapter name for adapter {paths[i].TargetInfo.AdapterId.Value}.");
|
||||||
if (!windowsDisplayConfig.DisplayAdapters.ContainsKey(path.TargetInfo.AdapterId.Value))
|
if (!windowsDisplayConfig.DisplayAdapters.ContainsKey(paths[i].TargetInfo.AdapterId.Value))
|
||||||
{
|
{
|
||||||
var adapterInfo = new DISPLAYCONFIG_ADAPTER_NAME();
|
var adapterInfo = new DISPLAYCONFIG_ADAPTER_NAME();
|
||||||
adapterInfo.Header.Type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME;
|
adapterInfo.Header.Type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME;
|
||||||
adapterInfo.Header.Size = (uint)Marshal.SizeOf<DISPLAYCONFIG_ADAPTER_NAME>();
|
adapterInfo.Header.Size = (uint)Marshal.SizeOf<DISPLAYCONFIG_ADAPTER_NAME>();
|
||||||
adapterInfo.Header.AdapterId = path.TargetInfo.AdapterId;
|
adapterInfo.Header.AdapterId = paths[i].TargetInfo.AdapterId;
|
||||||
adapterInfo.Header.Id = path.TargetInfo.Id;
|
adapterInfo.Header.Id = paths[i].TargetInfo.Id;
|
||||||
err = CCDImport.DisplayConfigGetDeviceInfo(ref adapterInfo);
|
err = CCDImport.DisplayConfigGetDeviceInfo(ref adapterInfo);
|
||||||
if (err == WIN32STATUS.ERROR_SUCCESS)
|
if (err == WIN32STATUS.ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
// Store it for later
|
// Store it for later
|
||||||
windowsDisplayConfig.DisplayAdapters.Add(path.TargetInfo.AdapterId.Value, adapterInfo.AdapterDevicePath);
|
windowsDisplayConfig.DisplayAdapters.Add(paths[i].TargetInfo.AdapterId.Value, adapterInfo.AdapterDevicePath);
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Found adapter name {adapterInfo.AdapterDevicePath} for adapter {path.TargetInfo.AdapterId.Value}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Found adapter name {adapterInfo.AdapterDevicePath} for adapter {paths[i].TargetInfo.AdapterId.Value}.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Error($"WinLibrary/GetWindowsDisplayConfig: ERROR - DisplayConfigGetDeviceInfo returned WIN32STATUS {err} when trying to query the adapter name for adapter {path.TargetInfo.AdapterId.Value}.");
|
SharedLogger.logger.Error($"WinLibrary/GetWindowsDisplayConfig: ERROR - DisplayConfigGetDeviceInfo returned WIN32STATUS {err} when trying to query the adapter name for adapter {paths[i].TargetInfo.AdapterId.Value}.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get advanced color info
|
// Get advanced color info
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Attempting to get advanced color info for display {path.TargetInfo.Id}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Attempting to get advanced color info for display {paths[i].TargetInfo.Id}.");
|
||||||
var colorInfo = new DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO();
|
var colorInfo = new DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO();
|
||||||
colorInfo.Header.Type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO;
|
colorInfo.Header.Type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO;
|
||||||
colorInfo.Header.Size = (uint)Marshal.SizeOf<DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO>();
|
colorInfo.Header.Size = (uint)Marshal.SizeOf<DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO>();
|
||||||
colorInfo.Header.AdapterId = path.TargetInfo.AdapterId;
|
colorInfo.Header.AdapterId = paths[i].TargetInfo.AdapterId;
|
||||||
colorInfo.Header.Id = path.TargetInfo.Id;
|
colorInfo.Header.Id = paths[i].TargetInfo.Id;
|
||||||
err = CCDImport.DisplayConfigGetDeviceInfo(ref colorInfo);
|
err = CCDImport.DisplayConfigGetDeviceInfo(ref colorInfo);
|
||||||
if (err == WIN32STATUS.ERROR_SUCCESS)
|
if (err == WIN32STATUS.ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Found color info for display {path.TargetInfo.Id}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Found color info for display {paths[i].TargetInfo.Id}.");
|
||||||
if (colorInfo.AdvancedColorSupported)
|
if (colorInfo.AdvancedColorSupported)
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: HDR is supported for display {path.TargetInfo.Id}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: HDR is supported for display {paths[i].TargetInfo.Id}.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: HDR is NOT supported for display {path.TargetInfo.Id}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: HDR is NOT supported for display {paths[i].TargetInfo.Id}.");
|
||||||
}
|
}
|
||||||
if (colorInfo.AdvancedColorEnabled)
|
if (colorInfo.AdvancedColorEnabled)
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: HDR is enabled for display {path.TargetInfo.Id}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: HDR is enabled for display {paths[i].TargetInfo.Id}.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: HDR is NOT enabled for display {path.TargetInfo.Id}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: HDR is NOT enabled for display {paths[i].TargetInfo.Id}.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Warn($"WinLibrary/GetWindowsDisplayConfig: WARNING - Unabled to get advanced color settings for display {path.TargetInfo.Id}.");
|
SharedLogger.logger.Warn($"WinLibrary/GetWindowsDisplayConfig: WARNING - Unabled to get advanced color settings for display {paths[i].TargetInfo.Id}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// get SDR white levels
|
// get SDR white levels
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Attempting to get SDR white levels for adapter {path.TargetInfo.AdapterId.Value}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Attempting to get SDR white levels for adapter {paths[i].TargetInfo.AdapterId.Value}.");
|
||||||
var whiteLevelInfo = new DISPLAYCONFIG_SDR_WHITE_LEVEL();
|
var whiteLevelInfo = new DISPLAYCONFIG_SDR_WHITE_LEVEL();
|
||||||
whiteLevelInfo.Header.Type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_SDR_WHITE_LEVEL;
|
whiteLevelInfo.Header.Type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_SDR_WHITE_LEVEL;
|
||||||
whiteLevelInfo.Header.Size = (uint)Marshal.SizeOf<DISPLAYCONFIG_SDR_WHITE_LEVEL>();
|
whiteLevelInfo.Header.Size = (uint)Marshal.SizeOf<DISPLAYCONFIG_SDR_WHITE_LEVEL>();
|
||||||
whiteLevelInfo.Header.AdapterId = path.TargetInfo.AdapterId;
|
whiteLevelInfo.Header.AdapterId = paths[i].TargetInfo.AdapterId;
|
||||||
whiteLevelInfo.Header.Id = path.TargetInfo.Id;
|
whiteLevelInfo.Header.Id = paths[i].TargetInfo.Id;
|
||||||
err = CCDImport.DisplayConfigGetDeviceInfo(ref whiteLevelInfo);
|
err = CCDImport.DisplayConfigGetDeviceInfo(ref whiteLevelInfo);
|
||||||
if (err == WIN32STATUS.ERROR_SUCCESS)
|
if (err == WIN32STATUS.ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Found SDR White levels for display {path.TargetInfo.Id}.");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Found SDR White levels for display {paths[i].TargetInfo.Id}.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Warn($"WinLibrary/GetWindowsDisplayConfig: WARNING - Unabled to get SDR White levels for display {path.TargetInfo.Id}.");
|
SharedLogger.logger.Warn($"WinLibrary/GetWindowsDisplayConfig: WARNING - Unabled to get SDR White levels for display {paths[i].TargetInfo.Id}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
hdrInfos[hdrInfoCount] = new ADVANCED_HDR_INFO_PER_PATH();
|
hdrInfos[hdrInfoCount] = new ADVANCED_HDR_INFO_PER_PATH();
|
||||||
hdrInfos[hdrInfoCount].AdapterId = path.TargetInfo.AdapterId;
|
hdrInfos[hdrInfoCount].AdapterId = paths[i].TargetInfo.AdapterId;
|
||||||
hdrInfos[hdrInfoCount].Id = path.TargetInfo.Id;
|
hdrInfos[hdrInfoCount].Id = paths[i].TargetInfo.Id;
|
||||||
hdrInfos[hdrInfoCount].AdvancedColorInfo = colorInfo;
|
hdrInfos[hdrInfoCount].AdvancedColorInfo = colorInfo;
|
||||||
hdrInfos[hdrInfoCount].SDRWhiteLevel = whiteLevelInfo;
|
hdrInfos[hdrInfoCount].SDRWhiteLevel = whiteLevelInfo;
|
||||||
hdrInfoCount++;
|
hdrInfoCount++;
|
||||||
@ -581,55 +602,20 @@ namespace DisplayMagicianShared.Windows
|
|||||||
public string PrintActiveConfig()
|
public string PrintActiveConfig()
|
||||||
{
|
{
|
||||||
string stringToReturn = "";
|
string stringToReturn = "";
|
||||||
|
|
||||||
|
// Get the current config
|
||||||
|
WINDOWS_DISPLAY_CONFIG displayConfig = GetActiveConfig();
|
||||||
|
|
||||||
|
WIN32STATUS err = WIN32STATUS.ERROR_GEN_FAILURE;
|
||||||
stringToReturn += $"****** WINDOWS CCD CONFIGURATION *******\n";
|
stringToReturn += $"****** WINDOWS CCD CONFIGURATION *******\n";
|
||||||
|
stringToReturn += $"Display profile contains cloned screens: {displayConfig.IsCloned}\n";
|
||||||
|
stringToReturn += $"\n";
|
||||||
|
|
||||||
// Get the size of the largest Active Paths and Modes arrays
|
// Get the size of the largest Active Paths and Modes arrays
|
||||||
int pathCount = 0;
|
int pathCount = 0;
|
||||||
int modeCount = 0;
|
int modeCount = 0;
|
||||||
WIN32STATUS err = CCDImport.GetDisplayConfigBufferSizes(QDC.QDC_ONLY_ACTIVE_PATHS, out pathCount, out modeCount);
|
|
||||||
if (err != WIN32STATUS.ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SharedLogger.logger.Error($"WinLibrary/PrintActiveConfig: ERROR - GetDisplayConfigBufferSizes returned WIN32STATUS {err} when trying to get the maximum path and mode sizes");
|
|
||||||
throw new WinLibraryException($"GetDisplayConfigBufferSizes returned WIN32STATUS {err} when trying to get the maximum path and mode sizes");
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedLogger.logger.Trace($"WinLibrary/PrintActiveConfig: Getting the current Display Config path and mode arrays");
|
foreach (var path in displayConfig.DisplayConfigPaths)
|
||||||
var paths = new DISPLAYCONFIG_PATH_INFO[pathCount];
|
|
||||||
var modes = new DISPLAYCONFIG_MODE_INFO[modeCount];
|
|
||||||
err = CCDImport.QueryDisplayConfig(QDC.QDC_ONLY_ACTIVE_PATHS, ref pathCount, paths, ref modeCount, modes, IntPtr.Zero);
|
|
||||||
if (err == WIN32STATUS.ERROR_INSUFFICIENT_BUFFER)
|
|
||||||
{
|
|
||||||
SharedLogger.logger.Warn($"WinLibrary/PrintActiveConfig: The displays were modified between GetDisplayConfigBufferSizes and QueryDisplayConfig so we need to get the buffer sizes again.");
|
|
||||||
SharedLogger.logger.Trace($"WinLibrary/PrintActiveConfig: Getting the size of the largest Active Paths and Modes arrays");
|
|
||||||
// Screen changed in between GetDisplayConfigBufferSizes and QueryDisplayConfig, so we need to get buffer sizes again
|
|
||||||
// as per https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-querydisplayconfig
|
|
||||||
err = CCDImport.GetDisplayConfigBufferSizes(QDC.QDC_ONLY_ACTIVE_PATHS, out pathCount, out modeCount);
|
|
||||||
if (err != WIN32STATUS.ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SharedLogger.logger.Error($"WinLibrary/PrintActiveConfig: ERROR - GetDisplayConfigBufferSizes returned WIN32STATUS {err} when trying to get the maximum path and mode sizes again");
|
|
||||||
throw new WinLibraryException($"GetDisplayConfigBufferSizes returned WIN32STATUS {err} when trying to get the maximum path and mode sizes again");
|
|
||||||
}
|
|
||||||
SharedLogger.logger.Trace($"WinLibrary/PrintActiveConfig: Getting the current Display Config path and mode arrays");
|
|
||||||
paths = new DISPLAYCONFIG_PATH_INFO[pathCount];
|
|
||||||
modes = new DISPLAYCONFIG_MODE_INFO[modeCount];
|
|
||||||
err = CCDImport.QueryDisplayConfig(QDC.QDC_ONLY_ACTIVE_PATHS, ref pathCount, paths, ref modeCount, modes, IntPtr.Zero);
|
|
||||||
if (err == WIN32STATUS.ERROR_INSUFFICIENT_BUFFER)
|
|
||||||
{
|
|
||||||
SharedLogger.logger.Error($"WinLibrary/PrintActiveConfig: ERROR - The displays were still modified between GetDisplayConfigBufferSizes and QueryDisplayConfig, even though we tried twice. Something is wrong.");
|
|
||||||
throw new WinLibraryException($"The displays were still modified between GetDisplayConfigBufferSizes and QueryDisplayConfig, even though we tried twice. Something is wrong.");
|
|
||||||
}
|
|
||||||
else if (err != WIN32STATUS.ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SharedLogger.logger.Error($"WinLibrary/PrintActiveConfig: ERROR - QueryDisplayConfig returned WIN32STATUS {err} when trying to query all available displays again");
|
|
||||||
throw new WinLibraryException($"QueryDisplayConfig returned WIN32STATUS {err} when trying to query all available displays again.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (err != WIN32STATUS.ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
SharedLogger.logger.Error($"WinLibrary/PrintActiveConfig: ERROR - QueryDisplayConfig returned WIN32STATUS {err} when trying to query all available displays");
|
|
||||||
throw new WinLibraryException($"QueryDisplayConfig returned WIN32STATUS {err} when trying to query all available displays.");
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var path in paths)
|
|
||||||
{
|
{
|
||||||
stringToReturn += $"----++++==== Path ====++++----\n";
|
stringToReturn += $"----++++==== Path ====++++----\n";
|
||||||
|
|
||||||
@ -645,6 +631,17 @@ namespace DisplayMagicianShared.Windows
|
|||||||
SharedLogger.logger.Trace($"WinLibrary/PrintActiveConfig: Found Display Source {sourceInfo.ViewGdiDeviceName} for source {path.SourceInfo.Id}.");
|
SharedLogger.logger.Trace($"WinLibrary/PrintActiveConfig: Found Display Source {sourceInfo.ViewGdiDeviceName} for source {path.SourceInfo.Id}.");
|
||||||
stringToReturn += $"****** Interrogating Display Source {path.SourceInfo.Id} *******\n";
|
stringToReturn += $"****** Interrogating Display Source {path.SourceInfo.Id} *******\n";
|
||||||
stringToReturn += $"Found Display Source {sourceInfo.ViewGdiDeviceName}\n";
|
stringToReturn += $"Found Display Source {sourceInfo.ViewGdiDeviceName}\n";
|
||||||
|
if (displayConfig.DisplaySources[sourceInfo.ViewGdiDeviceName].Count > 1)
|
||||||
|
{
|
||||||
|
stringToReturn += $"Display Source is Cloned: true\n";
|
||||||
|
stringToReturn += $"Number of Display Source clones: {displayConfig.DisplaySources[sourceInfo.ViewGdiDeviceName].Count - 1}\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stringToReturn += $"Display Source is Cloned: false\n";
|
||||||
|
stringToReturn += $"Number of Display Source clones: 0\n";
|
||||||
|
|
||||||
|
}
|
||||||
stringToReturn += $"\n";
|
stringToReturn += $"\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -915,6 +912,17 @@ namespace DisplayMagicianShared.Windows
|
|||||||
SharedLogger.logger.Trace($"WinLibrary/SetActiveConfig: Generating a list of all the current display configs");
|
SharedLogger.logger.Trace($"WinLibrary/SetActiveConfig: Generating a list of all the current display configs");
|
||||||
WINDOWS_DISPLAY_CONFIG allWindowsDisplayConfig = GetWindowsDisplayConfig(QDC.QDC_ALL_PATHS);
|
WINDOWS_DISPLAY_CONFIG allWindowsDisplayConfig = GetWindowsDisplayConfig(QDC.QDC_ALL_PATHS);
|
||||||
|
|
||||||
|
if (displayConfig.IsCloned)
|
||||||
|
{
|
||||||
|
SharedLogger.logger.Trace($"WinLibrary/SetActiveConfig: We have a cloned display in this display profile, so using the Windows GDI to set the layout");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SharedLogger.logger.Trace($"WinLibrary/SetActiveConfig: We have no cloned displays in thus display profile, so using the Windows CCD to set the layout");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Now we go through the Paths to update the LUIDs as per Soroush's suggestion
|
// Now we go through the Paths to update the LUIDs as per Soroush's suggestion
|
||||||
SharedLogger.logger.Trace($"WinLibrary/SetActiveConfig: Patching the adapter IDs to make the saved config valid");
|
SharedLogger.logger.Trace($"WinLibrary/SetActiveConfig: Patching the adapter IDs to make the saved config valid");
|
||||||
PatchAdapterIDs(ref displayConfig, allWindowsDisplayConfig.DisplayAdapters);
|
PatchAdapterIDs(ref displayConfig, allWindowsDisplayConfig.DisplayAdapters);
|
||||||
@ -1007,7 +1015,8 @@ namespace DisplayMagicianShared.Windows
|
|||||||
GDI_DISPLAY_SETTING displayDeviceSettings = myGdiDisplaySettings.Value;
|
GDI_DISPLAY_SETTING displayDeviceSettings = myGdiDisplaySettings.Value;
|
||||||
SharedLogger.logger.Trace($"WinLibrary/SetActiveConfig: Trying to change Device Mode for Display {displayDeviceName}.");
|
SharedLogger.logger.Trace($"WinLibrary/SetActiveConfig: Trying to change Device Mode for Display {displayDeviceName}.");
|
||||||
DEVICE_MODE modeToUse = displayDeviceSettings.DeviceMode;
|
DEVICE_MODE modeToUse = displayDeviceSettings.DeviceMode;
|
||||||
CHANGE_DISPLAY_RESULTS result = GDIImport.ChangeDisplaySettingsEx(displayDeviceName, ref modeToUse, IntPtr.Zero, CHANGE_DISPLAY_SETTINGS_FLAGS.CDS_UPDATEREGISTRY, IntPtr.Zero);
|
//CHANGE_DISPLAY_RESULTS result = GDIImport.ChangeDisplaySettingsEx(displayDeviceName, ref modeToUse, IntPtr.Zero, CHANGE_DISPLAY_SETTINGS_FLAGS.CDS_UPDATEREGISTRY, IntPtr.Zero);
|
||||||
|
CHANGE_DISPLAY_RESULTS result = GDIImport.ChangeDisplaySettingsEx(null, ref modeToUse, IntPtr.Zero, CHANGE_DISPLAY_SETTINGS_FLAGS.CDS_UPDATEREGISTRY, IntPtr.Zero);
|
||||||
if (result == CHANGE_DISPLAY_RESULTS.Successful)
|
if (result == CHANGE_DISPLAY_RESULTS.Successful)
|
||||||
{
|
{
|
||||||
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Successfully changed display {displayDeviceName} to use the new mode!");
|
SharedLogger.logger.Trace($"WinLibrary/GetWindowsDisplayConfig: Successfully changed display {displayDeviceName} to use the new mode!");
|
||||||
|
Loading…
Reference in New Issue
Block a user