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 @@
-
Docked Mode
-
-
Firmware
-
+
+
+
+
+
+
@@ -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 @@
Graphics Settings
-
+
+
-
+
+
@@ -77,28 +79,36 @@
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
-
+
+
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), }; }