diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index 40c42fc31..cdc79f4e2 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -352,6 +352,10 @@ void GMainWindow::InitializeHotkeys() {
Qt::ApplicationShortcut);
hotkey_registry.RegisterHotkey("Main Window", "Decrease Speed Limit", QKeySequence("-"),
Qt::ApplicationShortcut);
+ hotkey_registry.RegisterHotkey("Main Window", "Toggle Frame Advancing", QKeySequence("CTRL+A"),
+ Qt::ApplicationShortcut);
+ hotkey_registry.RegisterHotkey("Main Window", "Advance Frame", QKeySequence(Qt::Key_Backslash),
+ Qt::ApplicationShortcut);
hotkey_registry.LoadHotkeys();
connect(hotkey_registry.GetHotkey("Main Window", "Load File", this), &QShortcut::activated,
@@ -409,6 +413,10 @@ void GMainWindow::InitializeHotkeys() {
UpdateStatusBar();
}
});
+ connect(hotkey_registry.GetHotkey("Main Window", "Toggle Frame Advancing", this),
+ &QShortcut::activated, ui.action_Enable_Frame_Advancing, &QAction::trigger);
+ connect(hotkey_registry.GetHotkey("Main Window", "Advance Frame", this), &QShortcut::activated,
+ ui.action_Advance_Frame, &QAction::trigger);
}
void GMainWindow::ShowUpdaterWidgets() {
@@ -540,6 +548,20 @@ void GMainWindow::ConnectMenuEvents() {
connect(ui.action_Play_Movie, &QAction::triggered, this, &GMainWindow::OnPlayMovie);
connect(ui.action_Stop_Recording_Playback, &QAction::triggered, this,
&GMainWindow::OnStopRecordingPlayback);
+ connect(ui.action_Enable_Frame_Advancing, &QAction::triggered, this, [this] {
+ if (emulation_running) {
+ Core::System::GetInstance().frame_limiter.SetFrameAdvancing(
+ ui.action_Enable_Frame_Advancing->isChecked());
+ ui.action_Advance_Frame->setEnabled(ui.action_Enable_Frame_Advancing->isChecked());
+ }
+ });
+ connect(ui.action_Advance_Frame, &QAction::triggered, this, [this] {
+ if (emulation_running) {
+ ui.action_Enable_Frame_Advancing->setChecked(true);
+ ui.action_Advance_Frame->setEnabled(true);
+ Core::System::GetInstance().frame_limiter.AdvanceFrame();
+ }
+ });
// Help
connect(ui.action_FAQ, &QAction::triggered,
@@ -803,6 +825,9 @@ void GMainWindow::ShutdownGame() {
// TODO(bunnei): This function is not thread safe, but it's being used as if it were
Pica::g_debug_context->ClearBreakpoints();
+ // Frame advancing must be cancelled in order to release the emu thread from waiting
+ Core::System::GetInstance().frame_limiter.SetFrameAdvancing(false);
+
emit EmulationStopping();
// Wait for emulation thread to complete and delete it
@@ -823,6 +848,9 @@ void GMainWindow::ShutdownGame() {
ui.action_Stop->setEnabled(false);
ui.action_Restart->setEnabled(false);
ui.action_Report_Compatibility->setEnabled(false);
+ ui.action_Enable_Frame_Advancing->setEnabled(false);
+ ui.action_Enable_Frame_Advancing->setChecked(false);
+ ui.action_Advance_Frame->setEnabled(false);
render_window->hide();
if (game_list->isEmpty())
game_list_placeholder->show();
@@ -1110,6 +1138,7 @@ void GMainWindow::OnStartGame() {
ui.action_Stop->setEnabled(true);
ui.action_Restart->setEnabled(true);
ui.action_Report_Compatibility->setEnabled(true);
+ ui.action_Enable_Frame_Advancing->setEnabled(true);
discord_rpc->Update();
}
diff --git a/src/citra_qt/main.ui b/src/citra_qt/main.ui
index ef0f1aae2..c2c58300d 100644
--- a/src/citra_qt/main.ui
+++ b/src/citra_qt/main.ui
@@ -114,6 +114,9 @@
+
+
+