From adc8ed594a4ad9004299d1fec966f3a03cab2e0a Mon Sep 17 00:00:00 2001 From: BowedCascade Date: Thu, 26 Feb 2026 17:35:28 -0600 Subject: [PATCH] Add restart emulation command - Add RestartEmulation() method to MainWindowViewModel - Add 'Restart Emulation' menu item with Ctrl+R keybinding - Add locale translations for all supported languages - No confirmation dialog (faster restart experience) --- src/Ryujinx/Assets/Locales/en_US.json | 1 + .../UI/ViewModels/MainWindowViewModel.cs | 24 +++++++++++++++++++ .../UI/Views/Main/MainMenuBarView.axaml | 5 ++++ src/Ryujinx/UI/Windows/MainWindow.axaml | 1 + 4 files changed, 31 insertions(+) diff --git a/src/Ryujinx/Assets/Locales/en_US.json b/src/Ryujinx/Assets/Locales/en_US.json index 43f25e353..c806bbfc5 100644 --- a/src/Ryujinx/Assets/Locales/en_US.json +++ b/src/Ryujinx/Assets/Locales/en_US.json @@ -23,6 +23,7 @@ "MenuBarOptionsStartGamesInFullscreen": "Start Games in Fullscreen Mode", "MenuBarOptionsStartGamesWithoutUI": "Start Games with UI Hidden", "MenuBarOptionsStopEmulation": "Stop Emulation", + "MenuBarOptionsRestartEmulation": "Restart Emulation", "MenuBarOptionsSettings": "_Settings", "MenuBarOptionsManageUserProfiles": "_Manage User Profiles", "MenuBarActions": "_Actions", diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index e8b4c033a..6a98a934a 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -115,6 +115,7 @@ namespace Ryujinx.Ava.UI.ViewModels private string _screenshotKey = "F8"; private float _volume; private ApplicationData _currentApplicationData; + private bool _pendingRestart; private readonly AutoResetEvent _rendererWaitEvent; private int _customVSyncInterval; private int _customVSyncIntervalPercentageProxy; @@ -1092,6 +1093,14 @@ namespace Ryujinx.Ava.UI.ViewModels await LoadApplication(_currentApplicationData); } + else if (_pendingRestart) + { + _pendingRestart = false; + + Logger.Info?.Print(LogClass.Application, $"Restarting emulation for '{_currentApplicationData.Name}'"); + + await LoadApplication(_currentApplicationData); + } else { // Otherwise, clear state. @@ -1100,6 +1109,21 @@ namespace Ryujinx.Ava.UI.ViewModels } } + public void RestartEmulation() + { + if (AppHost is null || _currentApplicationData is null) + { + Logger.Warning?.Print(LogClass.Application, "RestartEmulation called but no application is running."); + + return; + } + + Logger.Info?.Print(LogClass.Application, $"Restart requested for '{_currentApplicationData.Name}'"); + + _pendingRestart = true; + AppHost.Stop(); + } + private void Update_StatusBar(object sender, StatusUpdatedEventArgs args) { if (ShowMenuAndStatusBar && !ShowLoadProgress && Application.Current != null) diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index 676f0ef07..f10459ff1 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -189,6 +189,11 @@ Click="StopEmulation_Click" Header="{locale:Locale MenuBarOptionsStopEmulation}" InputGesture="Escape" + IsEnabled="{Binding IsGameRunning}" /> + diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml b/src/Ryujinx/UI/Windows/MainWindow.axaml index 1f50b1cb3..fee2755d4 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml @@ -42,6 +42,7 @@ +