示例#1
0
        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;
            }
        }
示例#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());
        }