-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOverlayManager.cs
More file actions
120 lines (100 loc) · 3.5 KB
/
Copy pathOverlayManager.cs
File metadata and controls
120 lines (100 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using Microsoft.Win32;
namespace Rounder.Windows;
public sealed class OverlayManager : IDisposable
{
private readonly List<CornerOverlayForm> overlays = [];
private readonly List<GamingGlowForm> glowOverlays = [];
private readonly Control invoker = new();
private AppSettings settings;
public OverlayManager(AppSettings settings)
{
this.settings = settings;
_ = invoker.Handle;
SystemEvents.DisplaySettingsChanged += HandleDisplaySettingsChanged;
}
public event EventHandler? DisplaySettingsChanged;
public void Apply(AppSettings newSettings)
{
settings = newSettings;
Recreate();
}
public void Recreate()
{
if (invoker.IsHandleCreated && invoker.InvokeRequired)
{
invoker.BeginInvoke((MethodInvoker)Recreate);
return;
}
Clear();
if (!settings.IsEnabled || settings.CornerRadius <= 0)
{
return;
}
var monitors = DisplayMonitor.GetAll();
var selected = settings.DisplaySelectionInitialized
? settings.SelectedDisplays.ToHashSet(StringComparer.OrdinalIgnoreCase)
: monitors.Select(screen => screen.DeviceName).ToHashSet(StringComparer.OrdinalIgnoreCase);
foreach (var screen in monitors.Where(screen => selected.Contains(screen.DeviceName)))
{
AddScreenOverlays(screen);
if (settings.SuperGamingMode)
{
AddGlowOverlays(screen);
}
}
}
private void AddScreenOverlays(DisplayMonitor screen)
{
var bounds = screen.Bounds;
var radius = (int)Math.Round(Math.Clamp(settings.CornerRadius, 0, 200) * Math.Max(0.5, screen.Scale));
if (settings.TopLeftEnabled)
{
overlays.Add(new CornerOverlayForm(CornerKind.TopLeft, bounds, radius, 0.0, settings));
}
if (settings.TopRightEnabled)
{
overlays.Add(new CornerOverlayForm(CornerKind.TopRight, bounds, radius, 0.25, settings));
}
if (settings.BottomLeftEnabled)
{
overlays.Add(new CornerOverlayForm(CornerKind.BottomLeft, bounds, radius, 0.75, settings));
}
if (settings.BottomRightEnabled)
{
overlays.Add(new CornerOverlayForm(CornerKind.BottomRight, bounds, radius, 0.5, settings));
}
}
private void AddGlowOverlays(DisplayMonitor screen)
{
glowOverlays.Add(new GamingGlowForm(screen.Bounds, ScreenEdge.Top, screen.Scale, settings));
glowOverlays.Add(new GamingGlowForm(screen.Bounds, ScreenEdge.Right, screen.Scale, settings));
glowOverlays.Add(new GamingGlowForm(screen.Bounds, ScreenEdge.Bottom, screen.Scale, settings));
glowOverlays.Add(new GamingGlowForm(screen.Bounds, ScreenEdge.Left, screen.Scale, settings));
}
private void HandleDisplaySettingsChanged(object? sender, EventArgs e)
{
DisplaySettingsChanged?.Invoke(this, EventArgs.Empty);
Recreate();
}
private void Clear()
{
foreach (var overlay in overlays)
{
overlay.Close();
overlay.Dispose();
}
overlays.Clear();
foreach (var overlay in glowOverlays)
{
overlay.Close();
overlay.Dispose();
}
glowOverlays.Clear();
}
public void Dispose()
{
SystemEvents.DisplaySettingsChanged -= HandleDisplaySettingsChanged;
Clear();
invoker.Dispose();
}
}