LenovoLegionToolkit

Форк
0
135 строк · 4.4 Кб
1
using System;
2
using System.Linq;
3
using System.Threading.Tasks;
4
using LenovoLegionToolkit.Lib.Extensions;
5
using LenovoLegionToolkit.Lib.System;
6
using LenovoLegionToolkit.Lib.Utils;
7
using WindowsDisplayAPI;
8
using WindowsDisplayAPI.Native.DeviceContext;
9

10
namespace LenovoLegionToolkit.Lib.Features;
11

12
public class RefreshRateFeature : IFeature<RefreshRate>
13
{
14
    public Task<bool> IsSupportedAsync() => Task.FromResult(true);
15

16
    public Task<RefreshRate[]> GetAllStatesAsync()
17
    {
18
        if (Log.Instance.IsTraceEnabled)
19
            Log.Instance.Trace($"Getting all refresh rates...");
20

21
        var display = InternalDisplay.Get();
22
        if (display is null)
23
        {
24
            if (Log.Instance.IsTraceEnabled)
25
                Log.Instance.Trace($"Built in display not found");
26

27
            return Task.FromResult(Array.Empty<RefreshRate>());
28
        }
29

30
        if (Log.Instance.IsTraceEnabled)
31
            Log.Instance.Trace($"Built in display found: {display}");
32

33
        var currentSettings = display.CurrentSetting;
34

35
        if (Log.Instance.IsTraceEnabled)
36
            Log.Instance.Trace($"Current built in display settings: {currentSettings.ToExtendedString()}");
37

38
        var result = display.GetPossibleSettings()
39
            .Where(dps => Match(dps, currentSettings))
40
            .Select(dps => dps.Frequency)
41
            .Distinct()
42
            .OrderBy(freq => freq)
43
            .Select(freq => new RefreshRate(freq))
44
            .ToArray();
45

46
        if (Log.Instance.IsTraceEnabled)
47
            Log.Instance.Trace($"Possible refresh rates are {string.Join(", ", result)}");
48

49
        return Task.FromResult(result);
50
    }
51

52
    public Task<RefreshRate> GetStateAsync()
53
    {
54
        if (Log.Instance.IsTraceEnabled)
55
            Log.Instance.Trace($"Getting current refresh rate...");
56

57
        var display = InternalDisplay.Get();
58
        if (display is null)
59
        {
60
            if (Log.Instance.IsTraceEnabled)
61
                Log.Instance.Trace($"Built in display not found");
62

63
            return Task.FromResult(default(RefreshRate));
64
        }
65

66
        var currentSettings = display.CurrentSetting;
67
        var result = new RefreshRate(currentSettings.Frequency);
68

69
        if (Log.Instance.IsTraceEnabled)
70
            Log.Instance.Trace($"Current refresh rate is {result} [currentSettings={currentSettings.ToExtendedString()}]");
71

72
        return Task.FromResult(result);
73
    }
74

75
    public Task SetStateAsync(RefreshRate state)
76
    {
77
        var display = InternalDisplay.Get();
78
        if (display is null)
79
        {
80
            if (Log.Instance.IsTraceEnabled)
81
                Log.Instance.Trace($"Built in display not found");
82
            throw new InvalidOperationException("Built in display not found");
83
        }
84

85
        var currentSettings = display.CurrentSetting;
86

87
        if (Log.Instance.IsTraceEnabled)
88
            Log.Instance.Trace($"Current built in display settings: {currentSettings.ToExtendedString()}");
89

90
        if (currentSettings.Frequency == state.Frequency)
91
        {
92
            if (Log.Instance.IsTraceEnabled)
93
                Log.Instance.Trace($"Frequency already set to {state.Frequency}");
94

95
            return Task.CompletedTask;
96
        }
97

98
        var possibleSettings = display.GetPossibleSettings();
99
        var newSettings = possibleSettings
100
            .Where(dps => Match(dps, currentSettings))
101
            .Where(dps => dps.Frequency == state.Frequency)
102
            .Select(dps => new DisplaySetting(dps, currentSettings.Position, currentSettings.Orientation, DisplayFixedOutput.Default))
103
            .FirstOrDefault();
104

105
        if (newSettings is not null)
106
        {
107
            if (Log.Instance.IsTraceEnabled)
108
                Log.Instance.Trace($"Setting display to {newSettings.ToExtendedString()}...");
109

110
            display.SetSettings(newSettings, true);
111

112
            if (Log.Instance.IsTraceEnabled)
113
                Log.Instance.Trace($"Display set to {newSettings.ToExtendedString()}");
114
        }
115
        else
116
        {
117
            if (Log.Instance.IsTraceEnabled)
118
                Log.Instance.Trace($"Could not find matching settings for frequency {state}");
119
        }
120

121
        return Task.CompletedTask;
122
    }
123

124
    private static bool Match(DisplayPossibleSetting dps, DisplayPossibleSetting ds)
125
    {
126
        if (dps.IsTooSmall())
127
            return false;
128

129
        var result = true;
130
        result &= dps.Resolution == ds.Resolution;
131
        result &= dps.ColorDepth == ds.ColorDepth;
132
        result &= dps.IsInterlaced == ds.IsInterlaced;
133
        return result;
134
    }
135
}
136

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.