Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
English (US) release notes, mirroring CHANGELOG.md (Brazilian Portuguese). Before publishing a version, add a `## [VERSION]` section to **both** files: the workflow publishes the section matching the tag from each one and fails if either is missing.

## [Unreleased]
### Fixes
- FPS counter: the style saved in Settings now applies as soon as the session starts. Before, the counter only showed up after cycling the "FPS counter" row in the session menu. (#139)

## [1.6.0-beta.7]
### Heads-up: beta version, not the stable one
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
Notas em portugu锚s do Brasil; a vers茫o em ingl锚s (Estados Unidos) fica em `CHANGELOG.en-US.md`. Antes de publicar uma vers茫o, adicione uma se莽茫o `## [VERS脙O]` com o changelog daquela vers茫o **nos dois arquivos**. O workflow publica as duas se莽玫es correspondentes 脿 tag na mesma release e falha se faltar alguma.

## [Unreleased]
### Corre莽玫es
- Contador de FPS: o estilo salvo em Ajustes agora vale assim que a sess茫o come莽a. Antes, o contador s贸 aparecia depois de alternar a linha "Contador de FPS" no menu da sess茫o. (#139)

## [1.6.0-beta.7]
### Aten莽茫o: vers茫o beta, n茫o 茅 a est谩vel
Expand Down
1 change: 1 addition & 0 deletions docs/TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -393,3 +393,4 @@ Pr茅-requisito: RivaTuner Statistics Server instalado, com "Show On-Screen Displ
- [ ] Com o RTSS fechado, ligar Compacto abre o RTSS e o contador aparece.
- [ ] Voltar ao PC: o nosso some e o do Afterburner volta.
- [ ] A escolha e o layout ficam salvos para a pr贸xima sess茫o.
- [ ] Com Compacto (ou outro estilo nosso) j谩 salvo em Ajustes, iniciar a sess茫o: o contador aparece e o do Afterburner some sem precisar mexer na linha do menu.
13 changes: 13 additions & 0 deletions src/ConsoleMode/Models/Models.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,19 @@ public sealed class AppConfig
/// <summary>Turning the TV on / to the PC's input when console mode starts (issue #75).</summary>
public TvControlConfig Tv { get; set; } = new();

/// <summary>
/// A copy with other monitor fields and every other setting as it is here. A copy, not a field-by-field
/// rebuild: a setting added later is carried along without anyone having to remember it.
/// </summary>
public AppConfig WithMonitors(string focusMonitor, List<string> hideMonitors, Dictionary<string, SavedDisplayMode> monitorModes)
{
var copy = (AppConfig)MemberwiseClone();
copy.FocusMonitor = focusMonitor;
copy.HideMonitors = hideMonitors;
copy.MonitorModes = monitorModes;
return copy;
}

[JsonIgnore]
public string SetupKey =>
$"{FocusMonitor}|{(MonitorModes.TryGetValue(FocusMonitor, out var mode) ? mode.Key : "current")}";
Expand Down
35 changes: 1 addition & 34 deletions src/ConsoleMode/Services/ConsoleEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -407,40 +407,7 @@ private AppConfig ResolveMonitorNames(AppConfig config)
foreach (var (key, mode) in config.MonitorModes)
modes[Monitors.ResolveName(key)] = mode;

return new AppConfig
{
Version = config.Version,
AppLanguage = config.AppLanguage,
FocusMonitor = focus,
HideMonitors = hide,
HideStrategy = config.HideStrategy,
FullscreenMode = config.FullscreenMode,
PlaynitePath = config.PlaynitePath,
AudioDeviceId = config.AudioDeviceId,
AudioDeviceName = config.AudioDeviceName,
AudioAutoSwitch = config.AudioAutoSwitch,
FpsLimit = config.FpsLimit,
MonitorModes = modes,
HdrEnable = config.HdrEnable,
VrrEnable = config.VrrEnable,
UiMode = config.UiMode,
TourDone = config.TourDone,
ConfirmedSetup = config.ConfirmedSetup,
CheckUpdates = config.CheckUpdates,
BetaUpdates = config.BetaUpdates,
HomeShortcut = config.HomeShortcut,
MenuShortcut = config.MenuShortcut,
ExitShortcut = config.ExitShortcut,
ShortcutsOnboardingDone = config.ShortcutsOnboardingDone,
HomeButtonShortPress = config.HomeButtonShortPress,
CloseSteamOnRestore = config.CloseSteamOnRestore,
AutoStartOnController = config.AutoStartOnController,
InterfaceSounds = config.InterfaceSounds,
ConsoleBackground = config.ConsoleBackground,
ConsoleBackgroundImage = config.ConsoleBackgroundImage,
SkippedUpdateVersion = config.SkippedUpdateVersion,
Tv = config.Tv
};
return config.WithMonitors(focus, hide, modes);
}

private void MoveToFocus(string monitorName, nint[] handles, ScreenRect? rect)
Expand Down
61 changes: 61 additions & 0 deletions tests/ConsoleMode.Tests/AppConfigTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using System.Reflection;
using ConsoleMode.Models;
using ConsoleMode.Services;

namespace ConsoleMode.Tests;

public class AppConfigTests
{
[Fact]
public void Copy_for_a_session_swaps_only_the_monitor_fields()
{
var config = new AppConfig { FocusMonitor = "id-tv", HideMonitors = ["id-desk"] };
var hide = new List<string> { @"\\.\DISPLAY1" };
var modes = new Dictionary<string, SavedDisplayMode>();

var copy = config.WithMonitors(@"\\.\DISPLAY2", hide, modes);

Assert.Equal(@"\\.\DISPLAY2", copy.FocusMonitor);
Assert.Same(hide, copy.HideMonitors);
Assert.Same(modes, copy.MonitorModes);
Assert.Equal("id-tv", config.FocusMonitor);
Assert.Equal(["id-desk"], config.HideMonitors);
}

// The session used to get a field-by-field copy that forgot the FPS counter: the saved style
// was never applied when console mode started.
[Fact]
public void Copy_for_a_session_keeps_the_fps_counter()
{
var layout = new FpsOverlayLayout { SingleLine = true };
var config = new AppConfig { FpsOverlay = RtssOverlay.Compact, FpsOverlayLayout = layout };

var copy = config.WithMonitors("", [], []);

Assert.Equal(RtssOverlay.Compact, copy.FpsOverlay);
Assert.Same(layout, copy.FpsOverlayLayout);
}

[Fact]
public void Copy_for_a_session_keeps_every_other_setting()
{
string[] swapped = [nameof(AppConfig.FocusMonitor), nameof(AppConfig.HideMonitors), nameof(AppConfig.MonitorModes), nameof(AppConfig.SetupKey)];
var config = new AppConfig();
var properties = typeof(AppConfig).GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.CanWrite && !swapped.Contains(p.Name))
.ToList();
foreach (var property in properties)
{
// A value that differs from the default, so a property left behind shows up.
if (property.PropertyType == typeof(string)) property.SetValue(config, "changed-" + property.Name);
else if (property.PropertyType == typeof(bool)) property.SetValue(config, !(bool)property.GetValue(config)!);
else if (property.PropertyType == typeof(int)) property.SetValue(config, (int)property.GetValue(config)! + 7);
else property.SetValue(config, Activator.CreateInstance(property.PropertyType));
}

var copy = config.WithMonitors("", [], []);

foreach (var property in properties)
Assert.Equal(property.GetValue(config), property.GetValue(copy));
}
}
Loading