internal PathTargetInfo(DisplayConfigPathInfoFlags pathFlags,
                                DisplayConfigPathTargetInfo targetInfo,
                                DisplayConfigTargetMode?targetMode,
                                DisplayConfigDesktopImageInfo?desktopImageMode)
        {
            IsPathActive = pathFlags.HasFlag(DisplayConfigPathInfoFlags.Active);
            IsVirtualModeSupportedByPath = pathFlags.HasFlag(DisplayConfigPathInfoFlags.SupportVirtualMode);

            DisplayTarget = new PathDisplayTarget(new PathDisplayAdapter(targetInfo.AdapterId), targetInfo.TargetId,
                                                  targetInfo.TargetAvailable);

            OutputTechnology         = targetInfo.OutputTechnology;
            Rotation                 = targetInfo.Rotation;
            Scaling                  = targetInfo.Scaling;
            ScanLineOrdering         = targetInfo.ScanLineOrdering;
            FrequencyInMillihertz    = targetInfo.RefreshRate.ToValue(1000);
            ForcedBootAvailability   = targetInfo.StatusFlags.HasFlag(DisplayConfigPathTargetInfoFlags.AvailabilityBoot);
            ForcedPathAvailability   = targetInfo.StatusFlags.HasFlag(DisplayConfigPathTargetInfoFlags.AvailabilityPath);
            ForcedSystemAvailability =
                targetInfo.StatusFlags.HasFlag(DisplayConfigPathTargetInfoFlags.AvailabilitySystem);
            IsCurrentlyInUse = targetInfo.StatusFlags.HasFlag(DisplayConfigPathTargetInfoFlags.InUse);
            IsForcible       = targetInfo.StatusFlags.HasFlag(DisplayConfigPathTargetInfoFlags.Forcible);

            IsSignalInformationAvailable = targetMode.HasValue;
            if (targetMode.HasValue)
            {
                _signalInfo = new PathTargetSignalInfo(targetMode.Value.TargetVideoSignalInfo);
            }

            IsDesktopImageInformationAvailable = desktopImageMode.HasValue;
            if (desktopImageMode.HasValue)
            {
                _desktopImage = new PathTargetDesktopImage(desktopImageMode.Value);
            }
        }
Esempio n. 2
0
        // 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());
        }