Skip to content

Commit 1e6ef62

Browse files
committed
Fullscreen with fixed resolution
1 parent ca25f3d commit 1e6ef62

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-2
lines changed

src/SimulationFramework/FixedResolutionInterceptor.cs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public sealed class FixedResolutionInterceptor : ISimulationComponent
5050

5151
private FixedResolutionMouseProvider? mouseProvider;
5252
private FixedResolutionWindowProvider? windowProvider;
53+
private FixedResolutionFullscreenProvider? fullscreenProvider;
5354

5455

5556
/// <summary>
@@ -63,7 +64,22 @@ public FixedResolutionInterceptor(int width, int height, Color backgroundColor,
6364

6465
Resize(width, height);
6566
Application.InterceptComponent<IMouseProvider>(mouseProvider => this.mouseProvider = new FixedResolutionMouseProvider(mouseProvider, subpixelInput));
66-
Application.InterceptComponent<IWindowProvider>(windowProvider => this.windowProvider = new FixedResolutionWindowProvider(windowProvider, new(width, height)));
67+
Application.InterceptComponent<IWindowProvider>(windowProvider =>
68+
{
69+
if (windowProvider is IFullscreenProvider fs)
70+
{
71+
this.fullscreenProvider = new(fs);
72+
Application.RegisterComponent(this.fullscreenProvider);
73+
}
74+
75+
return this.windowProvider = new FixedResolutionWindowProvider(windowProvider, new(width, height));
76+
}
77+
);
78+
79+
if (fullscreenProvider is null && Application.HasComponent<IFullscreenProvider>())
80+
{
81+
Application.InterceptComponent<IFullscreenProvider>(fs => this.fullscreenProvider = new FixedResolutionFullscreenProvider(fs));
82+
}
6783
}
6884

6985
internal void BeforeRender()
@@ -293,4 +309,31 @@ public void SetPosition(Vector2 position)
293309
baseProvider.SetPosition(position);
294310
}
295311
}
312+
313+
private class FixedResolutionFullscreenProvider(IFullscreenProvider baseProvider) : ISimulationComponent, IFullscreenProvider
314+
{
315+
public int SwapInterval { get => baseProvider.SwapInterval; set => baseProvider.SwapInterval = value; }
316+
public bool PreferExclusive { get => baseProvider.PreferExclusive; set => baseProvider.PreferExclusive = value; }
317+
public bool IsFullscreen { get => baseProvider.IsFullscreen; }
318+
319+
public void Dispose()
320+
{
321+
baseProvider.Dispose();
322+
}
323+
324+
public void EnterFullscreen(IDisplay? display)
325+
{
326+
baseProvider.EnterFullscreen(display);
327+
}
328+
329+
public void ExitFullscreen()
330+
{
331+
baseProvider.ExitFullscreen();
332+
}
333+
334+
public void Initialize(MessageDispatcher dispatcher)
335+
{
336+
baseProvider.Initialize(dispatcher);
337+
}
338+
}
296339
}

src/SimulationFramework/Window.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,34 @@ public static class Window
8282
/// </summary>
8383
public static bool IsFullscreen => FullscreenProvider.IsFullscreen;
8484

85+
/// <summary>
86+
/// If the window is in fullscreen mode, this method calls <see cref="ExitFullscreen"/>; otherwise, this method calls <see cref="EnterFullscreen(IDisplay?)"/>.
87+
/// <para>
88+
/// This method does not have any immediate effects, as any window state changes are made
89+
/// after the current frame.
90+
/// </para>
91+
/// </summary>
92+
/// <param name="display">The display to enter fullscreen on. <see cref="Display"/> is used if this value is <see langword="null"/>.</param>
93+
public static void ToggleFullscreen(IDisplay? display = null)
94+
{
95+
if (IsFullscreen)
96+
{
97+
ExitFullscreen();
98+
}
99+
else
100+
{
101+
EnterFullscreen(display);
102+
}
103+
}
104+
85105
/// <summary>
86106
/// Attempts to enter fullscreen mode. This method does not have any immediate effects, as any window state changes are made
87107
/// after the current frame. To check if the transition succeeded, use <see cref="IsFullscreen"/> during the next frame.
88108
/// <para>
89109
/// If the window is already in requested fullscreen state, this method has no effect.
90110
/// </para>
91111
/// </summary>
92-
/// <param name="display">The monitor to enter fullscreen on. <see cref="Display"/> is used if this value is <see langword="null"/>.</param>
112+
/// <param name="display">The display to enter fullscreen on. <see cref="Display"/> is used if this value is <see langword="null"/>.</param>
93113
/// <returns><see langword="true"/> if the window successfully transitioned to fullscreen; otherwise <see langword="false"/>.</returns>
94114
public static void EnterFullscreen(IDisplay? display = null)
95115
{

0 commit comments

Comments
 (0)