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
3 changes: 2 additions & 1 deletion CHANGELOG.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ English (US) release notes, mirroring CHANGELOG.md (Brazilian Portuguese). Befor

## [1.7.0-alpha.1]
### What's new
- A Console interface that looks like a home console: Home shows your launchers in a row at the top, over your games' art (A picks what opens, a pill-shaped Play now right below, with the screen, audio, resolution and HDR on one line), the tabs sit on the left, and the System tab is now a list of categories on the left with only that category's options on the right. Tiles without hairlines, rounder corners and less repetition: the setup summary left Home (it is in Session). (#162)
- A Console interface that looks like a home console: Home shows your launchers in a row at the top, over your games' art (a pill-shaped Play now right below, with the screen, audio, resolution and HDR on one line), the tabs sit on the left, and the System tab is now a list of categories on the left with only that category's options on the right. Tiles without hairlines, rounder corners and less repetition: the setup summary left Home (it is in Session). (#162)
- Console interface: a new font, Inter (shipped with the app), with the title and Play now in bold, easier to read from the couch. On Home, moving along the launcher row already picks what opens, like on a PS5: the picked one gets a ✓ badge and a green bar, the others fade back, and A on a tile opens it right away. (#164)
- **Custom app** mode: in Settings → When entering console mode, pick any `.exe` (RetroArch, another launcher…) with optional arguments. Console Mode sets up the TV, opens the app on the game screen and restores the desk by itself when it closes. For launchers that only start another program and exit, type the real program's process name in **Process to watch**. If it never shows up, the session stays until you end it (hold Start + Select). (#161)
- Controller battery: the session menu header and the Console interface top bar (next to the clock) show the controller's battery level, with the charging icon when it is on the cable. Works with wireless Xbox controllers, DualSense and DualShock 4 (USB and Bluetooth); when Windows only gives a rough level, the number gets a "~". With several controllers it shows the emptiest one, and wired controllers with no battery show nothing. During a session, a notice in the corner of the TV warns when the battery reaches 15 % and again at 5 %, without repeating. (#160)
- Diagnostics in Settings: a new card shows, read-only, the app's version and channel, Windows, the screens (resolution, HDR, which one is the game screen and which ones get hidden), the audio outputs, the connected controllers, whether Steam, Playnite, RTSS and ControlFS were found, and the end of the log. **Copy report** copies it all as text to paste into an issue, without your user name in paths and without keys. (#159)
Expand Down
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ Notas em português do Brasil; a versão em inglês (Estados Unidos) fica em `CH

## [1.7.0-alpha.1]
### Novidades
- Interface Console com cara de console de mesa: o Início mostra os iniciadores numa fileira no topo, sobre a arte dos seus jogos (A escolhe o que abre, Jogar agora em formato de pílula logo abaixo, com a tela, o áudio, a resolução e o HDR numa linha só), as abas ficam à esquerda e a aba Sistema virou uma lista de categorias à esquerda com só as opções daquela categoria à direita. Blocos sem borda fina, cantos mais arredondados e menos repetição: o resumo do setup saiu do Início (está na Sessão). (#162)
- Interface Console com cara de console de mesa: o Início mostra os iniciadores numa fileira no topo, sobre a arte dos seus jogos (Jogar agora em formato de pílula logo abaixo, com a tela, o áudio, a resolução e o HDR numa linha só), as abas ficam à esquerda e a aba Sistema virou uma lista de categorias à esquerda com só as opções daquela categoria à direita. Blocos sem borda fina, cantos mais arredondados e menos repetição: o resumo do setup saiu do Início (está na Sessão). (#162)
- Interface Console: fonte nova, a Inter (embutida no app), com o título e o Jogar agora em negrito, mais legível de longe na TV. No Início, andar pela fileira de iniciadores já escolhe o que abre, como no PS5: o escolhido ganha um selo ✓ e uma barra verde, os outros ficam mais apagados, e A no bloco abre direto. (#164)
- Modo **Aplicativo personalizado**: em Ajustes → Ao entrar no modo console, escolha qualquer `.exe` (RetroArch, outro launcher…) com argumentos opcionais. O Console Mode prepara a TV, abre o app na tela de jogo e restaura a mesa sozinho quando ele fecha. Para launchers que só abrem outro programa e fecham, informe em **Processo a acompanhar** o nome do processo do programa de verdade. Se ele nunca aparecer, a sessão continua até você encerrá-la (segurar Start + Select). (#161)
- Bateria do controle: o cabeçalho do menu da sessão e a barra de cima da interface Console (ao lado do relógio) mostram o nível da bateria do controle, com o ícone de carregando quando ele está no cabo. Funciona com controles Xbox sem fio, DualSense e DualShock 4 (por USB e Bluetooth); quando o Windows só dá um nível aproximado, o número vem com "~". Com vários controles, aparece o mais descarregado, e controles com fio sem bateria não mostram nada. Durante a sessão, um aviso no canto da TV avisa quando a bateria chega a 15 % e de novo a 5 %, sem repetir. (#160)
- Diagnóstico em Ajustes: um card novo mostra, só para leitura, a versão e o canal do app, o Windows, as telas (resolução, HDR, qual é a de jogo e quais são ocultadas), as saídas de áudio, os controles conectados, se Steam, Playnite, RTSS e ControlFS foram encontrados e o fim do log. **Copiar relatório** copia tudo em texto para colar numa issue, sem o seu nome de usuário nos caminhos e sem chaves. (#159)
Expand Down
6 changes: 6 additions & 0 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ O **Console Mode** usa as ferramentas abaixo. Algumas são baixadas automaticame

Até a versão 1.5, o Console Mode embutia o [MultiMonitorTool](https://www.nirsoft.net/utils/multi_monitor_tool.html) e o [SoundVolumeView](https://www.nirsoft.net/utils/sound_volume_view.html), da NirSoft, para controlar monitores e áudio. A partir da 1.6 isso é feito com as APIs do próprio Windows e nenhuma ferramenta da NirSoft é distribuída (issue #91).

## Fonte

| Fonte | Site | Uso no projeto |
|-------|------|----------------|
| [Inter](https://rsms.me/inter/) 4.1 | GitHub (SIL Open Font License 1.1) | Embarcada (`src/ConsoleMode/Assets/Fonts/InterVariable.ttf`) como fonte da interface Console. A licença vai junto, em `Inter-OFL.txt` |

## Limite de FPS (opcional)

| Ferramenta | Site | Uso no projeto |
Expand Down
7 changes: 5 additions & 2 deletions docs/TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -496,9 +496,12 @@ Pré-requisito: RivaTuner Statistics Server instalado, com "Show On-Screen Displ
## Interface Console no estilo console (1.7.0)

### Início
- [ ] Os iniciadores aparecem numa fileira no topo (Steam Big Picture, Playnite se instalado, modo Xbox), cada um com sua cor e ícone; o que abre hoje tem um ponto verde em cima.
- [ ] Os iniciadores aparecem numa fileira no topo (Steam Big Picture, Playnite se instalado, modo Xbox), cada um com sua cor e ícone; o que abre hoje tem o selo ✓ verde no canto e uma barra verde embaixo, e os outros ficam mais apagados.
- [ ] Com o controle, subir do Jogar agora chega na fileira; o bloco focado cresce e ganha o contorno branco, sem cortar nos vizinhos nem no topo.
- [ ] A num iniciador muda o ponto para ele, o título grande embaixo passa a ser o nome dele e a escolha aparece igual em Sistema → Ao entrar no modo console → Abrir e no modo PC.
- [ ] Andar pela fileira já troca o iniciador, sem apertar A: o selo, a barra e o título grande embaixo seguem o foco, e a escolha aparece igual em Sistema → Ao entrar no modo console → Abrir e no modo PC.
- [ ] A num iniciador (ou um clique) abre direto aquele iniciador, como o Jogar agora. Sem tela de jogo escolhida, A só escolhe e não abre nada.
- [ ] Fonte Inter: os textos da interface Console e do menu da sessão usam a Inter (o "a" e o "g" de dois andares mudam de cara em relação à Segoe), em negrito de verdade no título e no Jogar agora, sem aparência borrada de negrito sintético. Conferir também no **portátil**: se a fonte não carregar, o app cai na Segoe UI sem quebrar. O modo PC continua com a Segoe UI.
- [ ] Russo: o cirílico aparece na Inter, sem misturar fontes no meio da palavra.
- [ ] A linha embaixo do título mostra a resolução da tela de jogo e depois áudio, FPS, HDR e VRR quando ligados, separados por "·", e atualiza ao mudar cada um.
- [ ] Sem tela de jogo escolhida, o texto pede para escolher a tela e Jogar agora fica desativado.
- [ ] O botão redondo ao lado de Jogar agora abre a aba Sessão.
Expand Down
5 changes: 5 additions & 0 deletions src/ConsoleMode/App.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@

<x:Double x:Key="PageMaxWidth">880</x:Double>

<!-- Font of the console interface (Inter, variable, shipped in Assets\Fonts). Windows falls back to
Segoe UI if the file can't be loaded. The console views also set it as ContentControlThemeFontFamily,
so buttons and other controls pick it up too. -->
<FontFamily x:Key="ConsoleFontFamily">ms-appx:///Assets/Fonts/InterVariable.ttf#Inter Variable</FontFamily>

<!-- Screen tile in the layout map; colors come from the row's role (MonitorRowViewModel). -->
<Style x:Key="MonitorTileButton" TargetType="Button">
<Setter Property="Padding" Value="10,8"/>
Expand Down
92 changes: 92 additions & 0 deletions src/ConsoleMode/Assets/Fonts/Inter-OFL.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter)

This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL

-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------

PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.

The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.

DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.

"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).

"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).

"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.

"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.

PERMISSION AND CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:

1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.

2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.

3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.

4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.

5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.

TERMINATION
This license becomes null and void if any of the above conditions are
not met.

DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file added src/ConsoleMode/Assets/Fonts/InterVariable.ttf
Binary file not shown.
5 changes: 5 additions & 0 deletions src/ConsoleMode/ConsoleMode.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@
<EmbeddedResource Include="Resources\Strings.ru-RU.json" WithCulture="false" LogicalName="ConsoleMode.Localization.Strings.ru-RU.json" />
</ItemGroup>

<!-- The console interface's font (Inter, OFL) and its licence, next to the exe so ms-appx:/// finds them. -->
<ItemGroup>
<Content Include="Assets\Fonts\InterVariable.ttf;Assets\Fonts\Inter-OFL.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.Segmented" Version="8.2.251219" />
Expand Down
14 changes: 10 additions & 4 deletions src/ConsoleMode/SessionMenuWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,18 @@
<SolidColorBrush x:Key="MenuTourVeil" Color="{ThemeResource SystemColorWindowColor}"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
<Style x:Key="RowLabel" TargetType="TextBlock">
<!-- The console font (App.xaml): controls read it from ContentControlThemeFontFamily, loose text from MenuText. -->
<StaticResource x:Key="ContentControlThemeFontFamily" ResourceKey="ConsoleFontFamily"/>
<Style x:Key="MenuText" TargetType="TextBlock">
<Setter Property="FontFamily" Value="{StaticResource ConsoleFontFamily}"/>
</Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource MenuText}"/>
<Style x:Key="RowLabel" TargetType="TextBlock" BasedOn="{StaticResource MenuText}">
<Setter Property="FontSize" Value="20"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
</Style>
<Style x:Key="RowValue" TargetType="TextBlock">
<Style x:Key="RowValue" TargetType="TextBlock" BasedOn="{StaticResource MenuText}">
<Setter Property="FontSize" Value="20"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="VerticalAlignment" Value="Center"/>
Expand Down Expand Up @@ -85,13 +91,13 @@
<Setter Property="Background" Value="{ThemeResource MenuIconFill}"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style x:Key="TileLabel" TargetType="TextBlock">
<Style x:Key="TileLabel" TargetType="TextBlock" BasedOn="{StaticResource MenuText}">
<Setter Property="FontSize" Value="16"/>
<Setter Property="Foreground" Value="{ThemeResource MenuTextSecondary}"/>
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
<Setter Property="MaxLines" Value="1"/>
</Style>
<Style x:Key="TileValue" TargetType="TextBlock">
<Style x:Key="TileValue" TargetType="TextBlock" BasedOn="{StaticResource MenuText}">
<Setter Property="FontSize" Value="19"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
Expand Down
16 changes: 13 additions & 3 deletions src/ConsoleMode/ViewModels/MainViewModel.LaunchTiles.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@
public string Text => Option.Text;
public string Glyph { get; init; } = "";
public Brush Background { get; init; } = null!;
[ObservableProperty] private bool _isSelected;
[ObservableProperty, NotifyPropertyChangedFor(nameof(Opacity))] private bool _isSelected;

Check warning on line 17 in src/ConsoleMode/ViewModels/MainViewModel.LaunchTiles.cs

View workflow job for this annotation

GitHub Actions / Build and test

The field ConsoleMode.ViewModels.LaunchTile._isSelected using
/// <summary>The other launchers fade back, so the one that opens stands out.</summary>
public double Opacity => IsSelected ? 1 : 0.6;
}

// The console Home is a row of launchers over the game art, like a console's game row:
// A on a tile picks what opens, and the big button below plays it.
// moving the focus onto a tile picks what opens (see ConsoleHomeView), and A on it plays it.
public partial class MainViewModel
{
public ObservableCollection<LaunchTile> LaunchTiles { get; } = [];
Expand Down Expand Up @@ -50,7 +52,15 @@
[RelayCommand]
private void SelectLaunchTile(LaunchTile? tile)
{
if (tile is not null) SelectedLaunch = tile.Option;
if (tile is not null && !ReferenceEquals(SelectedLaunch, tile.Option)) SelectedLaunch = tile.Option;
}

/// <summary>A (or a click) on a tile: that launcher, and play it if the setup allows.</summary>
[RelayCommand]
private async Task PlayLaunchTile(LaunchTile? tile)
{
SelectLaunchTile(tile);
if (CanStart) await StartAsync();
}

private void UpdateHomeMeta()
Expand Down
Loading
Loading