private PathInfo( DisplayConfigPathSourceInfo sourceInfo, DisplayConfigSourceMode?sourceMode, IEnumerable < Tuple < DisplayConfigPathInfoFlags, DisplayConfigPathTargetInfo, DisplayConfigTargetMode?, DisplayConfigDesktopImageInfo? > > targets ) { DisplaySource = new PathDisplaySource(new PathDisplayAdapter(sourceInfo.AdapterId), sourceInfo.SourceId); IsInUse = sourceInfo.StatusFlags.HasFlag(DisplayConfigPathSourceInfoFlags.InUse); IsModeInformationAvailable = sourceMode.HasValue; if (sourceMode.HasValue) { _resolution = new Size((int)sourceMode.Value.Width, (int)sourceMode.Value.Height); _pixelFormat = sourceMode.Value.PixelFormat; _position = new Point(sourceMode.Value.Position.X, sourceMode.Value.Position.Y); } TargetsInfo = targets.Select(t => new PathTargetInfo(t.Item1, t.Item2, t.Item3, t.Item4)).ToArray(); if (TargetsInfo.Any(info => info.IsVirtualModeSupportedByPath) && sourceInfo.CloneGroupId != DisplayConfigPathSourceInfo.InvalidCloneGroupId ) { _cloneGroupId = sourceInfo.CloneGroupId; IsCloneMember = true; } }
// ReSharper disable once CyclomaticComplexity private static DisplayConfigPathInfo[] GetDisplayConfigPathInfos(IEnumerable <PathInfo> pathInfos, out DisplayConfigModeInfo[] modeInfos) { var displayConfigPathInfos = new List <DisplayConfigPathInfo>(); var displayConfigModeInfos = new List <DisplayConfigModeInfo>(); foreach (var pathInfo in pathInfos) { var sourceMode = pathInfo.GetDisplayConfigSourceMode(); var sourceModeIndex = sourceMode.HasValue ? AddMode(ref displayConfigModeInfos, new DisplayConfigModeInfo(pathInfo.DisplaySource.Adapter.AdapterId, pathInfo.DisplaySource.SourceId, sourceMode.Value)) : 0u; var sourceInfo = pathInfo.IsCloneMember ? new DisplayConfigPathSourceInfo(pathInfo.DisplaySource.Adapter.AdapterId, pathInfo.DisplaySource.SourceId, sourceMode.HasValue ? (ushort)sourceModeIndex : DisplayConfigSourceMode.InvalidSourceModeIndex, (ushort)pathInfo.CloneGroupId) : new DisplayConfigPathSourceInfo(pathInfo.DisplaySource.Adapter.AdapterId, pathInfo.DisplaySource.SourceId, sourceMode.HasValue ? sourceModeIndex : DisplayConfigModeInfo.InvalidModeIndex); if ((pathInfo.TargetsInfo == null) || (pathInfo.TargetsInfo.Length == 0)) { displayConfigPathInfos.Add(new DisplayConfigPathInfo(sourceInfo, DisplayConfigPathInfoFlags.Active)); } else { foreach (var target in pathInfo.TargetsInfo) { var flags = DisplayConfigPathInfoFlags.None; if (target.IsPathActive) { flags |= DisplayConfigPathInfoFlags.Active; } if (target.IsVirtualModeSupportedByPath) { flags |= DisplayConfigPathInfoFlags.SupportVirtualMode; } var targetMode = target.GetDisplayConfigTargetMode(); var targetModeIndex = targetMode.HasValue ? AddMode(ref displayConfigModeInfos, new DisplayConfigModeInfo(target.DisplayTarget.Adapter.AdapterId, target.DisplayTarget.TargetId, targetMode.Value)) : 0u; DisplayConfigPathTargetInfo targetInfo; if (target.IsVirtualModeSupportedByPath) { sourceInfo = new DisplayConfigPathSourceInfo(pathInfo.DisplaySource.Adapter.AdapterId, pathInfo.DisplaySource.SourceId, sourceMode.HasValue ? (ushort)sourceModeIndex : DisplayConfigSourceMode.InvalidSourceModeIndex, pathInfo.IsCloneMember ? (ushort)pathInfo.CloneGroupId : DisplayConfigPathSourceInfo.InvalidCloneGroupId); var desktopMode = target.GetDisplayConfigDesktopImageInfo(); var desktopModeIndex = desktopMode.HasValue ? AddMode(ref displayConfigModeInfos, new DisplayConfigModeInfo(target.DisplayTarget.Adapter.AdapterId, target.DisplayTarget.TargetId, desktopMode.Value)) : 0u; targetInfo = new DisplayConfigPathTargetInfo( target.DisplayTarget.Adapter.AdapterId, target.DisplayTarget.TargetId, targetMode.HasValue ? (ushort)targetModeIndex : DisplayConfigTargetMode.InvalidTargetModeIndex, desktopMode.HasValue ? (ushort)desktopModeIndex : DisplayConfigDesktopImageInfo.InvalidDesktopImageModeIndex, target.OutputTechnology, target.Rotation, target.Scaling, target.ScanLineOrdering == DisplayConfigScanLineOrdering.NotSpecified ? new DisplayConfigRational() : new DisplayConfigRational(target.FrequencyInMillihertz, 1000, true), target.ScanLineOrdering, true); } else { targetInfo = new DisplayConfigPathTargetInfo( target.DisplayTarget.Adapter.AdapterId, target.DisplayTarget.TargetId, targetMode.HasValue ? targetModeIndex : DisplayConfigModeInfo.InvalidModeIndex, target.OutputTechnology, target.Rotation, target.Scaling, target.ScanLineOrdering == DisplayConfigScanLineOrdering.NotSpecified ? new DisplayConfigRational() : new DisplayConfigRational(target.FrequencyInMillihertz, 1000, true), target.ScanLineOrdering, true); } displayConfigPathInfos.Add(new DisplayConfigPathInfo(sourceInfo, targetInfo, flags)); } } } modeInfos = displayConfigModeInfos.ToArray(); return(displayConfigPathInfos.ToArray()); }