diff --git a/external/sciterui b/external/sciterui
index 10c9708a..1dc05d97 160000
--- a/external/sciterui
+++ b/external/sciterui
@@ -1 +1 @@
-Subproject commit 10c9708a7554d0e3fbe7d5dc995f1a58ae4cb953
+Subproject commit 1dc05d97e7b624548f29d8c4db7ea5433eef8a25
diff --git a/lang/english/html/system_config_audio.html b/lang/english/html/system_config_audio.html
index 211458c6..a69763db 100644
--- a/lang/english/html/system_config_audio.html
+++ b/lang/english/html/system_config_audio.html
@@ -23,7 +23,8 @@
100%
diff --git a/lang/english/html/system_config_general.html b/lang/english/html/system_config_general.html
index 5bda6289..db4ab375 100644
--- a/lang/english/html/system_config_general.html
+++ b/lang/english/html/system_config_general.html
@@ -18,16 +18,18 @@
-
@@ -51,7 +53,8 @@
diff --git a/lang/english/html/system_config_graphics.html b/lang/english/html/system_config_graphics.html
index 3dd6d533..e0a6d712 100644
--- a/lang/english/html/system_config_graphics.html
+++ b/lang/english/html/system_config_graphics.html
@@ -18,10 +18,12 @@
diff --git a/src/nxemu/settings/ui_identifiers.h b/src/nxemu/settings/ui_identifiers.h
index f64de80e..35b7e54f 100644
--- a/src/nxemu/settings/ui_identifiers.h
+++ b/src/nxemu/settings/ui_identifiers.h
@@ -6,5 +6,6 @@ constexpr const char * RecentFiles = "nxui:RecentFiles";
constexpr const char * GameDirectories = "nxui:GameDirectories";
constexpr const char * MyGameIconSize = "nxui:MyGameIconSize";
constexpr const char * Hotkeys = "nxui:Hotkeys";
+constexpr const char * ConfirmBeforeStopping = "nxui:ConfirmBeforeStopping";
} // namespace NXUISetting
\ No newline at end of file
diff --git a/src/nxemu/settings/ui_settings.cpp b/src/nxemu/settings/ui_settings.cpp
index cdbc3eea..d713245c 100644
--- a/src/nxemu/settings/ui_settings.cpp
+++ b/src/nxemu/settings/ui_settings.cpp
@@ -99,7 +99,8 @@ namespace
{nullptr, "PerformVulkanCheck", &uiSettings.performVulkanCheck, true},
{nullptr, nullptr, &uiSettings.hasBrokenVulkan, false},
{nullptr, nullptr, &uiSettings.enableAllControllers, false},
- {nullptr, "View\\StartGamesInFullscreen", &uiSettings.startGamesInFullscreen, false},
+ {nullptr, "StartGamesInFullscreen", &uiSettings.startGamesInFullscreen, false},
+ {NXUISetting::ConfirmBeforeStopping, "ConfirmBeforeStopping", &uiSettings.confirmBeforeStopping, true},
{NXUISetting::Hotkeys, "Hotkeys", &uiSettings.hotkeys, &g_defaultHotkeys},
};
diff --git a/src/nxemu/settings/ui_settings.h b/src/nxemu/settings/ui_settings.h
index 8d4d76a1..c69285a6 100644
--- a/src/nxemu/settings/ui_settings.h
+++ b/src/nxemu/settings/ui_settings.h
@@ -20,6 +20,7 @@ struct UISettings
bool hasBrokenVulkan;
bool enableAllControllers;
bool startGamesInFullscreen;
+ bool confirmBeforeStopping;
HotkeyMap hotkeys;
};
diff --git a/src/nxemu/user_interface/sciter_main_window.cpp b/src/nxemu/user_interface/sciter_main_window.cpp
index 67942b06..7c04373c 100644
--- a/src/nxemu/user_interface/sciter_main_window.cpp
+++ b/src/nxemu/user_interface/sciter_main_window.cpp
@@ -453,6 +453,7 @@ bool SciterMainWindow::Show()
m_rootElement = m_window->GetRootElement();
m_sciterUI.AttachHandler(m_rootElement, IID_IKEYSINK, (IKeySink *)this);
m_sciterUI.AttachHandler(m_rootElement, IID_EVENTSINK, (IEventSink *)this);
+ m_window->OnCloseSinkAdd(this);
m_window->OnDestroySinkAdd(this);
m_window->CenterWindow();
SetCaption(m_windowTitle);
@@ -1054,8 +1055,29 @@ void SciterMainWindow::FirmwareInstallTotalChanged(const char * /*setting*/, voi
}
}
+bool SciterMainWindow::ConfirmCloseEmulator()
+{
+ if (!m_emulationRunning || !uiSettings.confirmBeforeStopping)
+ {
+ return true;
+ }
+
+ const char * msg = "Are you sure you want to exit the emulator?\n\nAny unsaved progress will be lost.";
+ bool exitLocked = m_modules.IsValid() && m_modules.Modules().OperatingSystem().GetExitLocked();
+ if (exitLocked)
+ {
+ msg = "The currently running application has requested NxEmu to not exit.\n\nWould you like to bypass this and close the emulator anyway?";
+ }
+
+ return g_notify->Query(msg, "NxEmu - Exit Emulator?") == NotificationResponse::Yes;
+}
+
void SciterMainWindow::OnFileExit()
{
+ if (!ConfirmCloseEmulator())
+ {
+ return;
+ }
m_sciterUI.Stop();
}
@@ -1065,6 +1087,20 @@ void SciterMainWindow::OnStopGame()
{
return;
}
+ if (uiSettings.confirmBeforeStopping)
+ {
+ const char * msg = "Are you sure you want to stop the emulation?\n\nAny unsaved progress will be lost.";
+ bool exitLocked = m_modules.IsValid() && m_modules.Modules().OperatingSystem().GetExitLocked();
+ if (exitLocked)
+ {
+ msg = "The currently running application has requested NxEmu to not exit.\n\nWould you like to bypass this and stop emulation anyway?";
+ }
+
+ if (g_notify->Query(msg, "NxEmu - Stop Emulation") == NotificationResponse::No)
+ {
+ return;
+ }
+ }
AllowOSSleep();
SettingsStore & settings = SettingsStore::GetInstance();
settings.SetBool(NXCoreSetting::EmulationRunning, false);
@@ -1272,6 +1308,11 @@ void SciterMainWindow::OnWindowDestroy(HWINDOW /*hWnd*/)
m_sciterUI.Stop();
}
+bool SciterMainWindow::OnWindowCloseRequest(HWINDOW hWnd)
+{
+ return ConfirmCloseEmulator();
+}
+
void SciterMainWindow::OnMenuItem(int32_t id, SCITER_ELEMENT /*item*/)
{
OnGuiAction(static_cast(id));
diff --git a/src/nxemu/user_interface/sciter_main_window.h b/src/nxemu/user_interface/sciter_main_window.h
index e6ccecad..18ba682e 100644
--- a/src/nxemu/user_interface/sciter_main_window.h
+++ b/src/nxemu/user_interface/sciter_main_window.h
@@ -23,6 +23,7 @@ class InputConfig;
class SciterMainWindow :
public IWindowDestroySink,
+ public IWindowCloseSink,
public IMenuBarSink,
public IRenderWindow,
public IKeySink,
@@ -105,6 +106,7 @@ private:
void OnOpenFile();
void OnFileExit();
+ bool ConfirmCloseEmulator();
void OnStopGame();
void OnPauseContinueGame();
void OnSystemConfig();
@@ -146,6 +148,9 @@ private:
// IWindowDestroySink
void OnWindowDestroy(HWINDOW hWnd) override;
+ // IWindowCloseSink
+ bool OnWindowCloseRequest(HWINDOW hWnd);
+
// IMenuBarSink
void OnMenuItem(int32_t id, SCITER_ELEMENT item) override;
diff --git a/src/nxemu/user_interface/settings/system_config_game_browser.cpp b/src/nxemu/user_interface/settings/system_config_game_browser.cpp
index 6e40d21e..074e354b 100644
--- a/src/nxemu/user_interface/settings/system_config_game_browser.cpp
+++ b/src/nxemu/user_interface/settings/system_config_game_browser.cpp
@@ -11,6 +11,7 @@ namespace
{
static ConfigSetting gameBrowserSettings[] = {
ConfigSetting(ConfigSetting::Slider, "myGamesIconSize", true, NXUISetting::MyGameIconSize),
+ ConfigSetting(ConfigSetting::CheckBox, "ConfirmBeforeStopping", true, NXUISetting::ConfirmBeforeStopping),
ConfigSetting(ConfigSetting::ListBox, "gameDirectoryList", true, NXUISetting::GameDirectories),
};
}
diff --git a/src/nxemu/user_interface/settings/system_config_system.cpp b/src/nxemu/user_interface/settings/system_config_system.cpp
index 703ab5dd..a302a4e8 100644
--- a/src/nxemu/user_interface/settings/system_config_system.cpp
+++ b/src/nxemu/user_interface/settings/system_config_system.cpp
@@ -1,8 +1,9 @@
#include "system_config_system.h"
#include "config_setting.h"
+#include "settings/ui_identifiers.h"
#include "system_config.h"
-#include
#include
+#include
#include
namespace
@@ -10,6 +11,7 @@ namespace
static ConfigSetting systemSettings[] = {
ConfigSetting(ConfigSetting::ComboBox, "DockedMode", true, Settings::EnumMetadata::Index(), NXOsSetting::DockedMode),
ConfigSetting(ConfigSetting::CheckBox, "CheckForUpdatedFirmware", true, NXLoaderSetting::CheckForUpdatedFirmware),
+ ConfigSetting(ConfigSetting::CheckBox, "ConfirmBeforeStopping", true, NXUISetting::ConfirmBeforeStopping),
};
}