Implement a "Pause Emulation" option & hotkey (#2428)

* Add a "Pause Emulation" option and hotkey

Closes Ryujinx#1604

* Refactoring how pause is handled

* Applied suggested changes from review

* Applied suggested fixes

* Pass correct suspend type to threads for suspend/resume

* Fix NRE after stoping emulation

* Removing SimulateWakeUpMessage call after resuming emulation

* Skip suspending non game process

* Pause the tickCounter in the ExecutionContext

* Refactoring tickCounter pause/resume as suggested

* Fix Config migration to add pause hotkey

* Fixed pausing only application threads

* Fix exiting emulator while paused

* Avoid pause/resume while already paused/resumed

* Cleanup unused code

* Avoid restarting audio if stopping emulation while in pause.

* Added suggested changes

* Fix ConfigurationState
This commit is contained in:
mpnico 2021-09-11 22:08:25 +02:00 committed by GitHub
parent b0e410a828
commit 117e32a6ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 311 additions and 54 deletions

View file

@ -99,6 +99,8 @@ namespace Ryujinx.Ui
[GUI] MenuItem _loadApplicationFolder;
[GUI] MenuItem _appletMenu;
[GUI] MenuItem _actionMenu;
[GUI] MenuItem _pauseEmulation;
[GUI] MenuItem _resumeEmulation;
[GUI] MenuItem _stopEmulation;
[GUI] MenuItem _simulateWakeUpMessage;
[GUI] MenuItem _scanAmiibo;
@ -211,6 +213,7 @@ namespace Ryujinx.Ui
}
_actionMenu.Sensitive = false;
_pauseEmulation.Sensitive = false;
if (ConfigurationState.Instance.Ui.GuiColumns.FavColumn) _favToggle.Active = true;
if (ConfigurationState.Instance.Ui.GuiColumns.IconColumn) _iconToggle.Active = true;
@ -1281,9 +1284,38 @@ namespace Ryujinx.Ui
UpdateGameMetadata(_emulationContext.Application.TitleIdText);
}
_pauseEmulation.Visible = true;
_pauseEmulation.Sensitive = false;
_resumeEmulation.Visible = false;
RendererWidget?.Exit();
}
private void PauseEmulation_Pressed(object sender, EventArgs args)
{
_pauseEmulation.Visible = false;
_resumeEmulation.Visible = true;
_emulationContext.System.TogglePauseEmulation(true);
}
private void ResumeEmulation_Pressed(object sender, EventArgs args)
{
_pauseEmulation.Visible = true;
_resumeEmulation.Visible = false;
_emulationContext.System.TogglePauseEmulation(false);
}
public void ActivatePauseMenu()
{
_pauseEmulation.Sensitive = true;
}
public void TogglePause()
{
_pauseEmulation.Visible ^= true;
_resumeEmulation.Visible ^= true;
_emulationContext.System.TogglePauseEmulation(_resumeEmulation.Visible);
}
private void Installer_File_Pressed(object o, EventArgs args)
{
FileChooserDialog fileChooser = new FileChooserDialog("Choose the firmware file to open", this, FileChooserAction.Open, "Cancel", ResponseType.Cancel, "Open", ResponseType.Accept);