summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/frontend/applets/applet.h14
-rw-r--r--src/core/frontend/applets/cabinet.cpp2
-rw-r--r--src/core/frontend/applets/cabinet.h4
-rw-r--r--src/core/frontend/applets/controller.cpp2
-rw-r--r--src/core/frontend/applets/controller.h4
-rw-r--r--src/core/frontend/applets/error.cpp2
-rw-r--r--src/core/frontend/applets/error.h4
-rw-r--r--src/core/frontend/applets/general_frontend.cpp4
-rw-r--r--src/core/frontend/applets/general_frontend.h8
-rw-r--r--src/core/frontend/applets/mii_edit.cpp2
-rw-r--r--src/core/frontend/applets/mii_edit.h5
-rw-r--r--src/core/frontend/applets/profile_select.cpp2
-rw-r--r--src/core/frontend/applets/profile_select.h5
-rw-r--r--src/core/frontend/applets/software_keyboard.cpp2
-rw-r--r--src/core/frontend/applets/software_keyboard.h5
-rw-r--r--src/core/frontend/applets/web_browser.cpp2
-rw-r--r--src/core/frontend/applets/web_browser.h5
-rw-r--r--src/core/hle/service/am/am.cpp11
-rw-r--r--src/core/hle/service/am/applets/applet_cabinet.cpp5
-rw-r--r--src/core/hle/service/am/applets/applet_cabinet.h1
-rw-r--r--src/core/hle/service/am/applets/applet_controller.cpp5
-rw-r--r--src/core/hle/service/am/applets/applet_controller.h1
-rw-r--r--src/core/hle/service/am/applets/applet_error.cpp5
-rw-r--r--src/core/hle/service/am/applets/applet_error.h1
-rw-r--r--src/core/hle/service/am/applets/applet_general_backend.cpp15
-rw-r--r--src/core/hle/service/am/applets/applet_general_backend.h3
-rw-r--r--src/core/hle/service/am/applets/applet_mii_edit.cpp5
-rw-r--r--src/core/hle/service/am/applets/applet_mii_edit.h1
-rw-r--r--src/core/hle/service/am/applets/applet_profile_select.cpp5
-rw-r--r--src/core/hle/service/am/applets/applet_profile_select.h1
-rw-r--r--src/core/hle/service/am/applets/applet_software_keyboard.cpp5
-rw-r--r--src/core/hle/service/am/applets/applet_software_keyboard.h1
-rw-r--r--src/core/hle/service/am/applets/applet_web_browser.cpp5
-rw-r--r--src/core/hle/service/am/applets/applet_web_browser.h1
-rw-r--r--src/core/hle/service/am/applets/applets.h1
-rw-r--r--src/yuzu/applets/qt_amiibo_settings.cpp11
-rw-r--r--src/yuzu/applets/qt_amiibo_settings.h2
-rw-r--r--src/yuzu/applets/qt_controller.cpp11
-rw-r--r--src/yuzu/applets/qt_controller.h2
-rw-r--r--src/yuzu/applets/qt_error.cpp11
-rw-r--r--src/yuzu/applets/qt_error.h2
-rw-r--r--src/yuzu/applets/qt_profile_select.cpp11
-rw-r--r--src/yuzu/applets/qt_profile_select.h2
-rw-r--r--src/yuzu/applets/qt_software_keyboard.h4
-rw-r--r--src/yuzu/applets/qt_web_browser.cpp11
-rw-r--r--src/yuzu/applets/qt_web_browser.h2
-rw-r--r--src/yuzu/main.cpp146
-rw-r--r--src/yuzu/main.h14
48 files changed, 312 insertions, 61 deletions
diff --git a/src/core/frontend/applets/applet.h b/src/core/frontend/applets/applet.h
new file mode 100644
index 000000000..77fffe306
--- /dev/null
+++ b/src/core/frontend/applets/applet.h
@@ -0,0 +1,14 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6namespace Core::Frontend {
7
8class Applet {
9public:
10 virtual ~Applet() = default;
11 virtual void Close() const = 0;
12};
13
14} // namespace Core::Frontend
diff --git a/src/core/frontend/applets/cabinet.cpp b/src/core/frontend/applets/cabinet.cpp
index 26c7fefe3..2d501eeae 100644
--- a/src/core/frontend/applets/cabinet.cpp
+++ b/src/core/frontend/applets/cabinet.cpp
@@ -10,6 +10,8 @@ namespace Core::Frontend {
10 10
11CabinetApplet::~CabinetApplet() = default; 11CabinetApplet::~CabinetApplet() = default;
12 12
13void DefaultCabinetApplet::Close() const {}
14
13void DefaultCabinetApplet::ShowCabinetApplet( 15void DefaultCabinetApplet::ShowCabinetApplet(
14 const CabinetCallback& callback, const CabinetParameters& parameters, 16 const CabinetCallback& callback, const CabinetParameters& parameters,
15 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const { 17 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const {
diff --git a/src/core/frontend/applets/cabinet.h b/src/core/frontend/applets/cabinet.h
index c28a235c1..74dc5a4f6 100644
--- a/src/core/frontend/applets/cabinet.h
+++ b/src/core/frontend/applets/cabinet.h
@@ -4,6 +4,7 @@
4#pragma once 4#pragma once
5 5
6#include <functional> 6#include <functional>
7#include "core/frontend/applets/applet.h"
7#include "core/hle/service/nfp/nfp_types.h" 8#include "core/hle/service/nfp/nfp_types.h"
8 9
9namespace Service::NFP { 10namespace Service::NFP {
@@ -20,7 +21,7 @@ struct CabinetParameters {
20 21
21using CabinetCallback = std::function<void(bool, const std::string&)>; 22using CabinetCallback = std::function<void(bool, const std::string&)>;
22 23
23class CabinetApplet { 24class CabinetApplet : public Applet {
24public: 25public:
25 virtual ~CabinetApplet(); 26 virtual ~CabinetApplet();
26 virtual void ShowCabinetApplet(const CabinetCallback& callback, 27 virtual void ShowCabinetApplet(const CabinetCallback& callback,
@@ -30,6 +31,7 @@ public:
30 31
31class DefaultCabinetApplet final : public CabinetApplet { 32class DefaultCabinetApplet final : public CabinetApplet {
32public: 33public:
34 void Close() const override;
33 void ShowCabinetApplet(const CabinetCallback& callback, const CabinetParameters& parameters, 35 void ShowCabinetApplet(const CabinetCallback& callback, const CabinetParameters& parameters,
34 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override; 36 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override;
35}; 37};
diff --git a/src/core/frontend/applets/controller.cpp b/src/core/frontend/applets/controller.cpp
index 52919484e..8e586e938 100644
--- a/src/core/frontend/applets/controller.cpp
+++ b/src/core/frontend/applets/controller.cpp
@@ -16,6 +16,8 @@ DefaultControllerApplet::DefaultControllerApplet(HID::HIDCore& hid_core_) : hid_
16 16
17DefaultControllerApplet::~DefaultControllerApplet() = default; 17DefaultControllerApplet::~DefaultControllerApplet() = default;
18 18
19void DefaultControllerApplet::Close() const {}
20
19void DefaultControllerApplet::ReconfigureControllers(ReconfigureCallback callback, 21void DefaultControllerApplet::ReconfigureControllers(ReconfigureCallback callback,
20 const ControllerParameters& parameters) const { 22 const ControllerParameters& parameters) const {
21 LOG_INFO(Service_HID, "called, deducing the best configuration based on the given parameters!"); 23 LOG_INFO(Service_HID, "called, deducing the best configuration based on the given parameters!");
diff --git a/src/core/frontend/applets/controller.h b/src/core/frontend/applets/controller.h
index adb2feefd..5c488387d 100644
--- a/src/core/frontend/applets/controller.h
+++ b/src/core/frontend/applets/controller.h
@@ -7,6 +7,7 @@
7#include <vector> 7#include <vector>
8 8
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "core/frontend/applets/applet.h"
10 11
11namespace Core::HID { 12namespace Core::HID {
12class HIDCore; 13class HIDCore;
@@ -34,7 +35,7 @@ struct ControllerParameters {
34 bool allow_gamecube_controller{}; 35 bool allow_gamecube_controller{};
35}; 36};
36 37
37class ControllerApplet { 38class ControllerApplet : public Applet {
38public: 39public:
39 using ReconfigureCallback = std::function<void()>; 40 using ReconfigureCallback = std::function<void()>;
40 41
@@ -49,6 +50,7 @@ public:
49 explicit DefaultControllerApplet(HID::HIDCore& hid_core_); 50 explicit DefaultControllerApplet(HID::HIDCore& hid_core_);
50 ~DefaultControllerApplet() override; 51 ~DefaultControllerApplet() override;
51 52
53 void Close() const override;
52 void ReconfigureControllers(ReconfigureCallback callback, 54 void ReconfigureControllers(ReconfigureCallback callback,
53 const ControllerParameters& parameters) const override; 55 const ControllerParameters& parameters) const override;
54 56
diff --git a/src/core/frontend/applets/error.cpp b/src/core/frontend/applets/error.cpp
index 69c2b2b4d..2e6f7a3d9 100644
--- a/src/core/frontend/applets/error.cpp
+++ b/src/core/frontend/applets/error.cpp
@@ -8,6 +8,8 @@ namespace Core::Frontend {
8 8
9ErrorApplet::~ErrorApplet() = default; 9ErrorApplet::~ErrorApplet() = default;
10 10
11void DefaultErrorApplet::Close() const {}
12
11void DefaultErrorApplet::ShowError(Result error, FinishedCallback finished) const { 13void DefaultErrorApplet::ShowError(Result error, FinishedCallback finished) const {
12 LOG_CRITICAL(Service_Fatal, "Application requested error display: {:04}-{:04} (raw={:08X})", 14 LOG_CRITICAL(Service_Fatal, "Application requested error display: {:04}-{:04} (raw={:08X})",
13 error.module.Value(), error.description.Value(), error.raw); 15 error.module.Value(), error.description.Value(), error.raw);
diff --git a/src/core/frontend/applets/error.h b/src/core/frontend/applets/error.h
index 884f2f653..3a12196ce 100644
--- a/src/core/frontend/applets/error.h
+++ b/src/core/frontend/applets/error.h
@@ -6,11 +6,12 @@
6#include <chrono> 6#include <chrono>
7#include <functional> 7#include <functional>
8 8
9#include "core/frontend/applets/applet.h"
9#include "core/hle/result.h" 10#include "core/hle/result.h"
10 11
11namespace Core::Frontend { 12namespace Core::Frontend {
12 13
13class ErrorApplet { 14class ErrorApplet : public Applet {
14public: 15public:
15 using FinishedCallback = std::function<void()>; 16 using FinishedCallback = std::function<void()>;
16 17
@@ -28,6 +29,7 @@ public:
28 29
29class DefaultErrorApplet final : public ErrorApplet { 30class DefaultErrorApplet final : public ErrorApplet {
30public: 31public:
32 void Close() const override;
31 void ShowError(Result error, FinishedCallback finished) const override; 33 void ShowError(Result error, FinishedCallback finished) const override;
32 void ShowErrorWithTimestamp(Result error, std::chrono::seconds time, 34 void ShowErrorWithTimestamp(Result error, std::chrono::seconds time,
33 FinishedCallback finished) const override; 35 FinishedCallback finished) const override;
diff --git a/src/core/frontend/applets/general_frontend.cpp b/src/core/frontend/applets/general_frontend.cpp
index 29a00fb6f..b4b213a31 100644
--- a/src/core/frontend/applets/general_frontend.cpp
+++ b/src/core/frontend/applets/general_frontend.cpp
@@ -10,6 +10,8 @@ ParentalControlsApplet::~ParentalControlsApplet() = default;
10 10
11DefaultParentalControlsApplet::~DefaultParentalControlsApplet() = default; 11DefaultParentalControlsApplet::~DefaultParentalControlsApplet() = default;
12 12
13void DefaultParentalControlsApplet::Close() const {}
14
13void DefaultParentalControlsApplet::VerifyPIN(std::function<void(bool)> finished, 15void DefaultParentalControlsApplet::VerifyPIN(std::function<void(bool)> finished,
14 bool suspend_future_verification_temporarily) { 16 bool suspend_future_verification_temporarily) {
15 LOG_INFO(Service_AM, 17 LOG_INFO(Service_AM,
@@ -39,6 +41,8 @@ PhotoViewerApplet::~PhotoViewerApplet() = default;
39 41
40DefaultPhotoViewerApplet::~DefaultPhotoViewerApplet() = default; 42DefaultPhotoViewerApplet::~DefaultPhotoViewerApplet() = default;
41 43
44void DefaultPhotoViewerApplet::Close() const {}
45
42void DefaultPhotoViewerApplet::ShowPhotosForApplication(u64 title_id, 46void DefaultPhotoViewerApplet::ShowPhotosForApplication(u64 title_id,
43 std::function<void()> finished) const { 47 std::function<void()> finished) const {
44 LOG_INFO(Service_AM, 48 LOG_INFO(Service_AM,
diff --git a/src/core/frontend/applets/general_frontend.h b/src/core/frontend/applets/general_frontend.h
index cbec8b4ad..319838ac7 100644
--- a/src/core/frontend/applets/general_frontend.h
+++ b/src/core/frontend/applets/general_frontend.h
@@ -6,9 +6,11 @@
6#include <functional> 6#include <functional>
7#include "common/common_types.h" 7#include "common/common_types.h"
8 8
9#include "core/frontend/applets/applet.h"
10
9namespace Core::Frontend { 11namespace Core::Frontend {
10 12
11class ParentalControlsApplet { 13class ParentalControlsApplet : public Applet {
12public: 14public:
13 virtual ~ParentalControlsApplet(); 15 virtual ~ParentalControlsApplet();
14 16
@@ -33,6 +35,7 @@ class DefaultParentalControlsApplet final : public ParentalControlsApplet {
33public: 35public:
34 ~DefaultParentalControlsApplet() override; 36 ~DefaultParentalControlsApplet() override;
35 37
38 void Close() const override;
36 void VerifyPIN(std::function<void(bool)> finished, 39 void VerifyPIN(std::function<void(bool)> finished,
37 bool suspend_future_verification_temporarily) override; 40 bool suspend_future_verification_temporarily) override;
38 void VerifyPINForSettings(std::function<void(bool)> finished) override; 41 void VerifyPINForSettings(std::function<void(bool)> finished) override;
@@ -40,7 +43,7 @@ public:
40 void ChangePIN(std::function<void()> finished) override; 43 void ChangePIN(std::function<void()> finished) override;
41}; 44};
42 45
43class PhotoViewerApplet { 46class PhotoViewerApplet : public Applet {
44public: 47public:
45 virtual ~PhotoViewerApplet(); 48 virtual ~PhotoViewerApplet();
46 49
@@ -52,6 +55,7 @@ class DefaultPhotoViewerApplet final : public PhotoViewerApplet {
52public: 55public:
53 ~DefaultPhotoViewerApplet() override; 56 ~DefaultPhotoViewerApplet() override;
54 57
58 void Close() const override;
55 void ShowPhotosForApplication(u64 title_id, std::function<void()> finished) const override; 59 void ShowPhotosForApplication(u64 title_id, std::function<void()> finished) const override;
56 void ShowAllPhotos(std::function<void()> finished) const override; 60 void ShowAllPhotos(std::function<void()> finished) const override;
57}; 61};
diff --git a/src/core/frontend/applets/mii_edit.cpp b/src/core/frontend/applets/mii_edit.cpp
index bc8c57067..2988c3e72 100644
--- a/src/core/frontend/applets/mii_edit.cpp
+++ b/src/core/frontend/applets/mii_edit.cpp
@@ -8,6 +8,8 @@ namespace Core::Frontend {
8 8
9MiiEditApplet::~MiiEditApplet() = default; 9MiiEditApplet::~MiiEditApplet() = default;
10 10
11void DefaultMiiEditApplet::Close() const {}
12
11void DefaultMiiEditApplet::ShowMiiEdit(const MiiEditCallback& callback) const { 13void DefaultMiiEditApplet::ShowMiiEdit(const MiiEditCallback& callback) const {
12 LOG_WARNING(Service_AM, "(STUBBED) called"); 14 LOG_WARNING(Service_AM, "(STUBBED) called");
13 15
diff --git a/src/core/frontend/applets/mii_edit.h b/src/core/frontend/applets/mii_edit.h
index d828f06ec..9d86ee658 100644
--- a/src/core/frontend/applets/mii_edit.h
+++ b/src/core/frontend/applets/mii_edit.h
@@ -5,9 +5,11 @@
5 5
6#include <functional> 6#include <functional>
7 7
8#include "core/frontend/applets/applet.h"
9
8namespace Core::Frontend { 10namespace Core::Frontend {
9 11
10class MiiEditApplet { 12class MiiEditApplet : public Applet {
11public: 13public:
12 using MiiEditCallback = std::function<void()>; 14 using MiiEditCallback = std::function<void()>;
13 15
@@ -18,6 +20,7 @@ public:
18 20
19class DefaultMiiEditApplet final : public MiiEditApplet { 21class DefaultMiiEditApplet final : public MiiEditApplet {
20public: 22public:
23 void Close() const override;
21 void ShowMiiEdit(const MiiEditCallback& callback) const override; 24 void ShowMiiEdit(const MiiEditCallback& callback) const override;
22}; 25};
23 26
diff --git a/src/core/frontend/applets/profile_select.cpp b/src/core/frontend/applets/profile_select.cpp
index da4cfbf87..910d20c0d 100644
--- a/src/core/frontend/applets/profile_select.cpp
+++ b/src/core/frontend/applets/profile_select.cpp
@@ -9,6 +9,8 @@ namespace Core::Frontend {
9 9
10ProfileSelectApplet::~ProfileSelectApplet() = default; 10ProfileSelectApplet::~ProfileSelectApplet() = default;
11 11
12void DefaultProfileSelectApplet::Close() const {}
13
12void DefaultProfileSelectApplet::SelectProfile(SelectProfileCallback callback) const { 14void DefaultProfileSelectApplet::SelectProfile(SelectProfileCallback callback) const {
13 Service::Account::ProfileManager manager; 15 Service::Account::ProfileManager manager;
14 callback(manager.GetUser(Settings::values.current_user.GetValue()).value_or(Common::UUID{})); 16 callback(manager.GetUser(Settings::values.current_user.GetValue()).value_or(Common::UUID{}));
diff --git a/src/core/frontend/applets/profile_select.h b/src/core/frontend/applets/profile_select.h
index 138429533..76e963535 100644
--- a/src/core/frontend/applets/profile_select.h
+++ b/src/core/frontend/applets/profile_select.h
@@ -7,9 +7,11 @@
7#include <optional> 7#include <optional>
8#include "common/uuid.h" 8#include "common/uuid.h"
9 9
10#include "core/frontend/applets/applet.h"
11
10namespace Core::Frontend { 12namespace Core::Frontend {
11 13
12class ProfileSelectApplet { 14class ProfileSelectApplet : public Applet {
13public: 15public:
14 using SelectProfileCallback = std::function<void(std::optional<Common::UUID>)>; 16 using SelectProfileCallback = std::function<void(std::optional<Common::UUID>)>;
15 17
@@ -20,6 +22,7 @@ public:
20 22
21class DefaultProfileSelectApplet final : public ProfileSelectApplet { 23class DefaultProfileSelectApplet final : public ProfileSelectApplet {
22public: 24public:
25 void Close() const override;
23 void SelectProfile(SelectProfileCallback callback) const override; 26 void SelectProfile(SelectProfileCallback callback) const override;
24}; 27};
25 28
diff --git a/src/core/frontend/applets/software_keyboard.cpp b/src/core/frontend/applets/software_keyboard.cpp
index a3720f4d7..7655d215b 100644
--- a/src/core/frontend/applets/software_keyboard.cpp
+++ b/src/core/frontend/applets/software_keyboard.cpp
@@ -13,6 +13,8 @@ SoftwareKeyboardApplet::~SoftwareKeyboardApplet() = default;
13 13
14DefaultSoftwareKeyboardApplet::~DefaultSoftwareKeyboardApplet() = default; 14DefaultSoftwareKeyboardApplet::~DefaultSoftwareKeyboardApplet() = default;
15 15
16void DefaultSoftwareKeyboardApplet::Close() const {}
17
16void DefaultSoftwareKeyboardApplet::InitializeKeyboard( 18void DefaultSoftwareKeyboardApplet::InitializeKeyboard(
17 bool is_inline, KeyboardInitializeParameters initialize_parameters, 19 bool is_inline, KeyboardInitializeParameters initialize_parameters,
18 SubmitNormalCallback submit_normal_callback_, SubmitInlineCallback submit_inline_callback_) { 20 SubmitNormalCallback submit_normal_callback_, SubmitInlineCallback submit_inline_callback_) {
diff --git a/src/core/frontend/applets/software_keyboard.h b/src/core/frontend/applets/software_keyboard.h
index 8aef103d3..8ed96da24 100644
--- a/src/core/frontend/applets/software_keyboard.h
+++ b/src/core/frontend/applets/software_keyboard.h
@@ -7,6 +7,7 @@
7 7
8#include "common/common_types.h" 8#include "common/common_types.h"
9 9
10#include "core/frontend/applets/applet.h"
10#include "core/hle/service/am/applets/applet_software_keyboard_types.h" 11#include "core/hle/service/am/applets/applet_software_keyboard_types.h"
11 12
12namespace Core::Frontend { 13namespace Core::Frontend {
@@ -52,7 +53,7 @@ struct InlineTextParameters {
52 s32 cursor_position; 53 s32 cursor_position;
53}; 54};
54 55
55class SoftwareKeyboardApplet { 56class SoftwareKeyboardApplet : public Applet {
56public: 57public:
57 using SubmitInlineCallback = 58 using SubmitInlineCallback =
58 std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>; 59 std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)>;
@@ -84,6 +85,8 @@ class DefaultSoftwareKeyboardApplet final : public SoftwareKeyboardApplet {
84public: 85public:
85 ~DefaultSoftwareKeyboardApplet() override; 86 ~DefaultSoftwareKeyboardApplet() override;
86 87
88 void Close() const override;
89
87 void InitializeKeyboard(bool is_inline, KeyboardInitializeParameters initialize_parameters, 90 void InitializeKeyboard(bool is_inline, KeyboardInitializeParameters initialize_parameters,
88 SubmitNormalCallback submit_normal_callback_, 91 SubmitNormalCallback submit_normal_callback_,
89 SubmitInlineCallback submit_inline_callback_) override; 92 SubmitInlineCallback submit_inline_callback_) override;
diff --git a/src/core/frontend/applets/web_browser.cpp b/src/core/frontend/applets/web_browser.cpp
index b09cb7102..6e703ef06 100644
--- a/src/core/frontend/applets/web_browser.cpp
+++ b/src/core/frontend/applets/web_browser.cpp
@@ -10,6 +10,8 @@ WebBrowserApplet::~WebBrowserApplet() = default;
10 10
11DefaultWebBrowserApplet::~DefaultWebBrowserApplet() = default; 11DefaultWebBrowserApplet::~DefaultWebBrowserApplet() = default;
12 12
13void DefaultWebBrowserApplet::Close() const {}
14
13void DefaultWebBrowserApplet::OpenLocalWebPage(const std::string& local_url, 15void DefaultWebBrowserApplet::OpenLocalWebPage(const std::string& local_url,
14 ExtractROMFSCallback extract_romfs_callback, 16 ExtractROMFSCallback extract_romfs_callback,
15 OpenWebPageCallback callback) const { 17 OpenWebPageCallback callback) const {
diff --git a/src/core/frontend/applets/web_browser.h b/src/core/frontend/applets/web_browser.h
index 4f72284ad..178bbdd3f 100644
--- a/src/core/frontend/applets/web_browser.h
+++ b/src/core/frontend/applets/web_browser.h
@@ -5,11 +5,12 @@
5 5
6#include <functional> 6#include <functional>
7 7
8#include "core/frontend/applets/applet.h"
8#include "core/hle/service/am/applets/applet_web_browser_types.h" 9#include "core/hle/service/am/applets/applet_web_browser_types.h"
9 10
10namespace Core::Frontend { 11namespace Core::Frontend {
11 12
12class WebBrowserApplet { 13class WebBrowserApplet : public Applet {
13public: 14public:
14 using ExtractROMFSCallback = std::function<void()>; 15 using ExtractROMFSCallback = std::function<void()>;
15 using OpenWebPageCallback = 16 using OpenWebPageCallback =
@@ -29,6 +30,8 @@ class DefaultWebBrowserApplet final : public WebBrowserApplet {
29public: 30public:
30 ~DefaultWebBrowserApplet() override; 31 ~DefaultWebBrowserApplet() override;
31 32
33 void Close() const override;
34
32 void OpenLocalWebPage(const std::string& local_url, ExtractROMFSCallback extract_romfs_callback, 35 void OpenLocalWebPage(const std::string& local_url, ExtractROMFSCallback extract_romfs_callback,
33 OpenWebPageCallback callback) const override; 36 OpenWebPageCallback callback) const override;
34 37
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index 8ab179cc8..a17c46121 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -945,7 +945,7 @@ public:
945 {0, &ILibraryAppletAccessor::GetAppletStateChangedEvent, "GetAppletStateChangedEvent"}, 945 {0, &ILibraryAppletAccessor::GetAppletStateChangedEvent, "GetAppletStateChangedEvent"},
946 {1, &ILibraryAppletAccessor::IsCompleted, "IsCompleted"}, 946 {1, &ILibraryAppletAccessor::IsCompleted, "IsCompleted"},
947 {10, &ILibraryAppletAccessor::Start, "Start"}, 947 {10, &ILibraryAppletAccessor::Start, "Start"},
948 {20, nullptr, "RequestExit"}, 948 {20, &ILibraryAppletAccessor::RequestExit, "RequestExit"},
949 {25, nullptr, "Terminate"}, 949 {25, nullptr, "Terminate"},
950 {30, &ILibraryAppletAccessor::GetResult, "GetResult"}, 950 {30, &ILibraryAppletAccessor::GetResult, "GetResult"},
951 {50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"}, 951 {50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"},
@@ -1010,6 +1010,15 @@ private:
1010 rb.Push(ResultSuccess); 1010 rb.Push(ResultSuccess);
1011 } 1011 }
1012 1012
1013 void RequestExit(HLERequestContext& ctx) {
1014 LOG_DEBUG(Service_AM, "called");
1015
1016 ASSERT(applet != nullptr);
1017
1018 IPC::ResponseBuilder rb{ctx, 2};
1019 rb.Push(applet->RequestExit());
1020 }
1021
1013 void PushInData(HLERequestContext& ctx) { 1022 void PushInData(HLERequestContext& ctx) {
1014 LOG_DEBUG(Service_AM, "called"); 1023 LOG_DEBUG(Service_AM, "called");
1015 1024
diff --git a/src/core/hle/service/am/applets/applet_cabinet.cpp b/src/core/hle/service/am/applets/applet_cabinet.cpp
index 162687b29..93c9f2a55 100644
--- a/src/core/hle/service/am/applets/applet_cabinet.cpp
+++ b/src/core/hle/service/am/applets/applet_cabinet.cpp
@@ -174,4 +174,9 @@ void Cabinet::Cancel() {
174 broker.SignalStateChanged(); 174 broker.SignalStateChanged();
175} 175}
176 176
177Result Cabinet::RequestExit() {
178 frontend.Close();
179 R_SUCCEED();
180}
181
177} // namespace Service::AM::Applets 182} // namespace Service::AM::Applets
diff --git a/src/core/hle/service/am/applets/applet_cabinet.h b/src/core/hle/service/am/applets/applet_cabinet.h
index 84197a807..edd295a27 100644
--- a/src/core/hle/service/am/applets/applet_cabinet.h
+++ b/src/core/hle/service/am/applets/applet_cabinet.h
@@ -89,6 +89,7 @@ public:
89 void Execute() override; 89 void Execute() override;
90 void DisplayCompleted(bool apply_changes, std::string_view amiibo_name); 90 void DisplayCompleted(bool apply_changes, std::string_view amiibo_name);
91 void Cancel(); 91 void Cancel();
92 Result RequestExit() override;
92 93
93private: 94private:
94 const Core::Frontend::CabinetApplet& frontend; 95 const Core::Frontend::CabinetApplet& frontend;
diff --git a/src/core/hle/service/am/applets/applet_controller.cpp b/src/core/hle/service/am/applets/applet_controller.cpp
index 58484519b..2d1d115d7 100644
--- a/src/core/hle/service/am/applets/applet_controller.cpp
+++ b/src/core/hle/service/am/applets/applet_controller.cpp
@@ -262,4 +262,9 @@ void Controller::ConfigurationComplete() {
262 broker.SignalStateChanged(); 262 broker.SignalStateChanged();
263} 263}
264 264
265Result Controller::RequestExit() {
266 frontend.Close();
267 R_SUCCEED();
268}
269
265} // namespace Service::AM::Applets 270} // namespace Service::AM::Applets
diff --git a/src/core/hle/service/am/applets/applet_controller.h b/src/core/hle/service/am/applets/applet_controller.h
index 1f9adec65..1fbabee11 100644
--- a/src/core/hle/service/am/applets/applet_controller.h
+++ b/src/core/hle/service/am/applets/applet_controller.h
@@ -129,6 +129,7 @@ public:
129 Result GetStatus() const override; 129 Result GetStatus() const override;
130 void ExecuteInteractive() override; 130 void ExecuteInteractive() override;
131 void Execute() override; 131 void Execute() override;
132 Result RequestExit() override;
132 133
133 void ConfigurationComplete(); 134 void ConfigurationComplete();
134 135
diff --git a/src/core/hle/service/am/applets/applet_error.cpp b/src/core/hle/service/am/applets/applet_error.cpp
index b013896b4..b46ea840c 100644
--- a/src/core/hle/service/am/applets/applet_error.cpp
+++ b/src/core/hle/service/am/applets/applet_error.cpp
@@ -209,4 +209,9 @@ void Error::DisplayCompleted() {
209 broker.SignalStateChanged(); 209 broker.SignalStateChanged();
210} 210}
211 211
212Result Error::RequestExit() {
213 frontend.Close();
214 R_SUCCEED();
215}
216
212} // namespace Service::AM::Applets 217} // namespace Service::AM::Applets
diff --git a/src/core/hle/service/am/applets/applet_error.h b/src/core/hle/service/am/applets/applet_error.h
index d78d6f1d1..d822a32bb 100644
--- a/src/core/hle/service/am/applets/applet_error.h
+++ b/src/core/hle/service/am/applets/applet_error.h
@@ -34,6 +34,7 @@ public:
34 Result GetStatus() const override; 34 Result GetStatus() const override;
35 void ExecuteInteractive() override; 35 void ExecuteInteractive() override;
36 void Execute() override; 36 void Execute() override;
37 Result RequestExit() override;
37 38
38 void DisplayCompleted(); 39 void DisplayCompleted();
39 40
diff --git a/src/core/hle/service/am/applets/applet_general_backend.cpp b/src/core/hle/service/am/applets/applet_general_backend.cpp
index 1eefa85e3..8b352020e 100644
--- a/src/core/hle/service/am/applets/applet_general_backend.cpp
+++ b/src/core/hle/service/am/applets/applet_general_backend.cpp
@@ -150,6 +150,11 @@ void Auth::AuthFinished(bool is_successful) {
150 broker.SignalStateChanged(); 150 broker.SignalStateChanged();
151} 151}
152 152
153Result Auth::RequestExit() {
154 frontend.Close();
155 R_SUCCEED();
156}
157
153PhotoViewer::PhotoViewer(Core::System& system_, LibraryAppletMode applet_mode_, 158PhotoViewer::PhotoViewer(Core::System& system_, LibraryAppletMode applet_mode_,
154 const Core::Frontend::PhotoViewerApplet& frontend_) 159 const Core::Frontend::PhotoViewerApplet& frontend_)
155 : Applet{system_, applet_mode_}, frontend{frontend_}, system{system_} {} 160 : Applet{system_, applet_mode_}, frontend{frontend_}, system{system_} {}
@@ -202,6 +207,11 @@ void PhotoViewer::ViewFinished() {
202 broker.SignalStateChanged(); 207 broker.SignalStateChanged();
203} 208}
204 209
210Result PhotoViewer::RequestExit() {
211 frontend.Close();
212 R_SUCCEED();
213}
214
205StubApplet::StubApplet(Core::System& system_, AppletId id_, LibraryAppletMode applet_mode_) 215StubApplet::StubApplet(Core::System& system_, AppletId id_, LibraryAppletMode applet_mode_)
206 : Applet{system_, applet_mode_}, id{id_}, system{system_} {} 216 : Applet{system_, applet_mode_}, id{id_}, system{system_} {}
207 217
@@ -250,4 +260,9 @@ void StubApplet::Execute() {
250 broker.SignalStateChanged(); 260 broker.SignalStateChanged();
251} 261}
252 262
263Result StubApplet::RequestExit() {
264 // Nothing to do.
265 R_SUCCEED();
266}
267
253} // namespace Service::AM::Applets 268} // namespace Service::AM::Applets
diff --git a/src/core/hle/service/am/applets/applet_general_backend.h b/src/core/hle/service/am/applets/applet_general_backend.h
index a9f2535a2..34ecaebb9 100644
--- a/src/core/hle/service/am/applets/applet_general_backend.h
+++ b/src/core/hle/service/am/applets/applet_general_backend.h
@@ -28,6 +28,7 @@ public:
28 Result GetStatus() const override; 28 Result GetStatus() const override;
29 void ExecuteInteractive() override; 29 void ExecuteInteractive() override;
30 void Execute() override; 30 void Execute() override;
31 Result RequestExit() override;
31 32
32 void AuthFinished(bool is_successful = true); 33 void AuthFinished(bool is_successful = true);
33 34
@@ -59,6 +60,7 @@ public:
59 Result GetStatus() const override; 60 Result GetStatus() const override;
60 void ExecuteInteractive() override; 61 void ExecuteInteractive() override;
61 void Execute() override; 62 void Execute() override;
63 Result RequestExit() override;
62 64
63 void ViewFinished(); 65 void ViewFinished();
64 66
@@ -80,6 +82,7 @@ public:
80 Result GetStatus() const override; 82 Result GetStatus() const override;
81 void ExecuteInteractive() override; 83 void ExecuteInteractive() override;
82 void Execute() override; 84 void Execute() override;
85 Result RequestExit() override;
83 86
84private: 87private:
85 AppletId id; 88 AppletId id;
diff --git a/src/core/hle/service/am/applets/applet_mii_edit.cpp b/src/core/hle/service/am/applets/applet_mii_edit.cpp
index ae80ef506..d1f652c09 100644
--- a/src/core/hle/service/am/applets/applet_mii_edit.cpp
+++ b/src/core/hle/service/am/applets/applet_mii_edit.cpp
@@ -135,4 +135,9 @@ void MiiEdit::MiiEditOutputForCharInfoEditing(MiiEditResult result,
135 broker.SignalStateChanged(); 135 broker.SignalStateChanged();
136} 136}
137 137
138Result MiiEdit::RequestExit() {
139 frontend.Close();
140 R_SUCCEED();
141}
142
138} // namespace Service::AM::Applets 143} // namespace Service::AM::Applets
diff --git a/src/core/hle/service/am/applets/applet_mii_edit.h b/src/core/hle/service/am/applets/applet_mii_edit.h
index d18dd3cf5..3f46fae1b 100644
--- a/src/core/hle/service/am/applets/applet_mii_edit.h
+++ b/src/core/hle/service/am/applets/applet_mii_edit.h
@@ -25,6 +25,7 @@ public:
25 Result GetStatus() const override; 25 Result GetStatus() const override;
26 void ExecuteInteractive() override; 26 void ExecuteInteractive() override;
27 void Execute() override; 27 void Execute() override;
28 Result RequestExit() override;
28 29
29 void MiiEditOutput(MiiEditResult result, s32 index); 30 void MiiEditOutput(MiiEditResult result, s32 index);
30 31
diff --git a/src/core/hle/service/am/applets/applet_profile_select.cpp b/src/core/hle/service/am/applets/applet_profile_select.cpp
index 1d69f5447..07abc2563 100644
--- a/src/core/hle/service/am/applets/applet_profile_select.cpp
+++ b/src/core/hle/service/am/applets/applet_profile_select.cpp
@@ -73,4 +73,9 @@ void ProfileSelect::SelectionComplete(std::optional<Common::UUID> uuid) {
73 broker.SignalStateChanged(); 73 broker.SignalStateChanged();
74} 74}
75 75
76Result ProfileSelect::RequestExit() {
77 frontend.Close();
78 R_SUCCEED();
79}
80
76} // namespace Service::AM::Applets 81} // namespace Service::AM::Applets
diff --git a/src/core/hle/service/am/applets/applet_profile_select.h b/src/core/hle/service/am/applets/applet_profile_select.h
index b77f1d205..85705c216 100644
--- a/src/core/hle/service/am/applets/applet_profile_select.h
+++ b/src/core/hle/service/am/applets/applet_profile_select.h
@@ -42,6 +42,7 @@ public:
42 Result GetStatus() const override; 42 Result GetStatus() const override;
43 void ExecuteInteractive() override; 43 void ExecuteInteractive() override;
44 void Execute() override; 44 void Execute() override;
45 Result RequestExit() override;
45 46
46 void SelectionComplete(std::optional<Common::UUID> uuid); 47 void SelectionComplete(std::optional<Common::UUID> uuid);
47 48
diff --git a/src/core/hle/service/am/applets/applet_software_keyboard.cpp b/src/core/hle/service/am/applets/applet_software_keyboard.cpp
index c18236045..4145bb84f 100644
--- a/src/core/hle/service/am/applets/applet_software_keyboard.cpp
+++ b/src/core/hle/service/am/applets/applet_software_keyboard.cpp
@@ -770,6 +770,11 @@ void SoftwareKeyboard::ExitKeyboard() {
770 broker.SignalStateChanged(); 770 broker.SignalStateChanged();
771} 771}
772 772
773Result SoftwareKeyboard::RequestExit() {
774 frontend.Close();
775 R_SUCCEED();
776}
777
773// Inline Software Keyboard Requests 778// Inline Software Keyboard Requests
774 779
775void SoftwareKeyboard::RequestFinalize(const std::vector<u8>& request_data) { 780void SoftwareKeyboard::RequestFinalize(const std::vector<u8>& request_data) {
diff --git a/src/core/hle/service/am/applets/applet_software_keyboard.h b/src/core/hle/service/am/applets/applet_software_keyboard.h
index b01b31c98..2e919811b 100644
--- a/src/core/hle/service/am/applets/applet_software_keyboard.h
+++ b/src/core/hle/service/am/applets/applet_software_keyboard.h
@@ -31,6 +31,7 @@ public:
31 Result GetStatus() const override; 31 Result GetStatus() const override;
32 void ExecuteInteractive() override; 32 void ExecuteInteractive() override;
33 void Execute() override; 33 void Execute() override;
34 Result RequestExit() override;
34 35
35 /** 36 /**
36 * Submits the input text to the application. 37 * Submits the input text to the application.
diff --git a/src/core/hle/service/am/applets/applet_web_browser.cpp b/src/core/hle/service/am/applets/applet_web_browser.cpp
index f061bae80..2accf7898 100644
--- a/src/core/hle/service/am/applets/applet_web_browser.cpp
+++ b/src/core/hle/service/am/applets/applet_web_browser.cpp
@@ -363,6 +363,11 @@ void WebBrowser::WebBrowserExit(WebExitReason exit_reason, std::string last_url)
363 broker.SignalStateChanged(); 363 broker.SignalStateChanged();
364} 364}
365 365
366Result WebBrowser::RequestExit() {
367 frontend.Close();
368 R_SUCCEED();
369}
370
366bool WebBrowser::InputTLVExistsInMap(WebArgInputTLVType input_tlv_type) const { 371bool WebBrowser::InputTLVExistsInMap(WebArgInputTLVType input_tlv_type) const {
367 return web_arg_input_tlv_map.find(input_tlv_type) != web_arg_input_tlv_map.end(); 372 return web_arg_input_tlv_map.find(input_tlv_type) != web_arg_input_tlv_map.end();
368} 373}
diff --git a/src/core/hle/service/am/applets/applet_web_browser.h b/src/core/hle/service/am/applets/applet_web_browser.h
index fd727fac8..99fe18659 100644
--- a/src/core/hle/service/am/applets/applet_web_browser.h
+++ b/src/core/hle/service/am/applets/applet_web_browser.h
@@ -35,6 +35,7 @@ public:
35 Result GetStatus() const override; 35 Result GetStatus() const override;
36 void ExecuteInteractive() override; 36 void ExecuteInteractive() override;
37 void Execute() override; 37 void Execute() override;
38 Result RequestExit() override;
38 39
39 void ExtractOfflineRomFS(); 40 void ExtractOfflineRomFS();
40 41
diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h
index a22eb62a8..12f374199 100644
--- a/src/core/hle/service/am/applets/applets.h
+++ b/src/core/hle/service/am/applets/applets.h
@@ -142,6 +142,7 @@ public:
142 virtual Result GetStatus() const = 0; 142 virtual Result GetStatus() const = 0;
143 virtual void ExecuteInteractive() = 0; 143 virtual void ExecuteInteractive() = 0;
144 virtual void Execute() = 0; 144 virtual void Execute() = 0;
145 virtual Result RequestExit() = 0;
145 146
146 AppletDataBroker& GetBroker() { 147 AppletDataBroker& GetBroker() {
147 return broker; 148 return broker;
diff --git a/src/yuzu/applets/qt_amiibo_settings.cpp b/src/yuzu/applets/qt_amiibo_settings.cpp
index 93ad4b4f9..4559df5b1 100644
--- a/src/yuzu/applets/qt_amiibo_settings.cpp
+++ b/src/yuzu/applets/qt_amiibo_settings.cpp
@@ -245,12 +245,19 @@ void QtAmiiboSettingsDialog::SetSettingsDescription() {
245QtAmiiboSettings::QtAmiiboSettings(GMainWindow& parent) { 245QtAmiiboSettings::QtAmiiboSettings(GMainWindow& parent) {
246 connect(this, &QtAmiiboSettings::MainWindowShowAmiiboSettings, &parent, 246 connect(this, &QtAmiiboSettings::MainWindowShowAmiiboSettings, &parent,
247 &GMainWindow::AmiiboSettingsShowDialog, Qt::QueuedConnection); 247 &GMainWindow::AmiiboSettingsShowDialog, Qt::QueuedConnection);
248 connect(this, &QtAmiiboSettings::MainWindowRequestExit, &parent,
249 &GMainWindow::AmiiboSettingsRequestExit, Qt::QueuedConnection);
248 connect(&parent, &GMainWindow::AmiiboSettingsFinished, this, 250 connect(&parent, &GMainWindow::AmiiboSettingsFinished, this,
249 &QtAmiiboSettings::MainWindowFinished, Qt::QueuedConnection); 251 &QtAmiiboSettings::MainWindowFinished, Qt::QueuedConnection);
250} 252}
251 253
252QtAmiiboSettings::~QtAmiiboSettings() = default; 254QtAmiiboSettings::~QtAmiiboSettings() = default;
253 255
256void QtAmiiboSettings::Close() const {
257 callback = {};
258 emit MainWindowRequestExit();
259}
260
254void QtAmiiboSettings::ShowCabinetApplet( 261void QtAmiiboSettings::ShowCabinetApplet(
255 const Core::Frontend::CabinetCallback& callback_, 262 const Core::Frontend::CabinetCallback& callback_,
256 const Core::Frontend::CabinetParameters& parameters, 263 const Core::Frontend::CabinetParameters& parameters,
@@ -260,5 +267,7 @@ void QtAmiiboSettings::ShowCabinetApplet(
260} 267}
261 268
262void QtAmiiboSettings::MainWindowFinished(bool is_success, const std::string& name) { 269void QtAmiiboSettings::MainWindowFinished(bool is_success, const std::string& name) {
263 callback(is_success, name); 270 if (callback) {
271 callback(is_success, name);
272 }
264} 273}
diff --git a/src/yuzu/applets/qt_amiibo_settings.h b/src/yuzu/applets/qt_amiibo_settings.h
index 930c96739..bc389a33f 100644
--- a/src/yuzu/applets/qt_amiibo_settings.h
+++ b/src/yuzu/applets/qt_amiibo_settings.h
@@ -68,6 +68,7 @@ public:
68 explicit QtAmiiboSettings(GMainWindow& parent); 68 explicit QtAmiiboSettings(GMainWindow& parent);
69 ~QtAmiiboSettings() override; 69 ~QtAmiiboSettings() override;
70 70
71 void Close() const override;
71 void ShowCabinetApplet(const Core::Frontend::CabinetCallback& callback_, 72 void ShowCabinetApplet(const Core::Frontend::CabinetCallback& callback_,
72 const Core::Frontend::CabinetParameters& parameters, 73 const Core::Frontend::CabinetParameters& parameters,
73 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override; 74 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override;
@@ -75,6 +76,7 @@ public:
75signals: 76signals:
76 void MainWindowShowAmiiboSettings(const Core::Frontend::CabinetParameters& parameters, 77 void MainWindowShowAmiiboSettings(const Core::Frontend::CabinetParameters& parameters,
77 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const; 78 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const;
79 void MainWindowRequestExit() const;
78 80
79private: 81private:
80 void MainWindowFinished(bool is_success, const std::string& name); 82 void MainWindowFinished(bool is_success, const std::string& name);
diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp
index c30b54499..79018a7f6 100644
--- a/src/yuzu/applets/qt_controller.cpp
+++ b/src/yuzu/applets/qt_controller.cpp
@@ -678,12 +678,19 @@ void QtControllerSelectorDialog::DisableUnsupportedPlayers() {
678QtControllerSelector::QtControllerSelector(GMainWindow& parent) { 678QtControllerSelector::QtControllerSelector(GMainWindow& parent) {
679 connect(this, &QtControllerSelector::MainWindowReconfigureControllers, &parent, 679 connect(this, &QtControllerSelector::MainWindowReconfigureControllers, &parent,
680 &GMainWindow::ControllerSelectorReconfigureControllers, Qt::QueuedConnection); 680 &GMainWindow::ControllerSelectorReconfigureControllers, Qt::QueuedConnection);
681 connect(this, &QtControllerSelector::MainWindowRequestExit, &parent,
682 &GMainWindow::ControllerSelectorRequestExit, Qt::QueuedConnection);
681 connect(&parent, &GMainWindow::ControllerSelectorReconfigureFinished, this, 683 connect(&parent, &GMainWindow::ControllerSelectorReconfigureFinished, this,
682 &QtControllerSelector::MainWindowReconfigureFinished, Qt::QueuedConnection); 684 &QtControllerSelector::MainWindowReconfigureFinished, Qt::QueuedConnection);
683} 685}
684 686
685QtControllerSelector::~QtControllerSelector() = default; 687QtControllerSelector::~QtControllerSelector() = default;
686 688
689void QtControllerSelector::Close() const {
690 callback = {};
691 emit MainWindowRequestExit();
692}
693
687void QtControllerSelector::ReconfigureControllers( 694void QtControllerSelector::ReconfigureControllers(
688 ReconfigureCallback callback_, const Core::Frontend::ControllerParameters& parameters) const { 695 ReconfigureCallback callback_, const Core::Frontend::ControllerParameters& parameters) const {
689 callback = std::move(callback_); 696 callback = std::move(callback_);
@@ -691,5 +698,7 @@ void QtControllerSelector::ReconfigureControllers(
691} 698}
692 699
693void QtControllerSelector::MainWindowReconfigureFinished() { 700void QtControllerSelector::MainWindowReconfigureFinished() {
694 callback(); 701 if (callback) {
702 callback();
703 }
695} 704}
diff --git a/src/yuzu/applets/qt_controller.h b/src/yuzu/applets/qt_controller.h
index 16e99f507..2ef7e488f 100644
--- a/src/yuzu/applets/qt_controller.h
+++ b/src/yuzu/applets/qt_controller.h
@@ -156,6 +156,7 @@ public:
156 explicit QtControllerSelector(GMainWindow& parent); 156 explicit QtControllerSelector(GMainWindow& parent);
157 ~QtControllerSelector() override; 157 ~QtControllerSelector() override;
158 158
159 void Close() const override;
159 void ReconfigureControllers( 160 void ReconfigureControllers(
160 ReconfigureCallback callback_, 161 ReconfigureCallback callback_,
161 const Core::Frontend::ControllerParameters& parameters) const override; 162 const Core::Frontend::ControllerParameters& parameters) const override;
@@ -163,6 +164,7 @@ public:
163signals: 164signals:
164 void MainWindowReconfigureControllers( 165 void MainWindowReconfigureControllers(
165 const Core::Frontend::ControllerParameters& parameters) const; 166 const Core::Frontend::ControllerParameters& parameters) const;
167 void MainWindowRequestExit() const;
166 168
167private: 169private:
168 void MainWindowReconfigureFinished(); 170 void MainWindowReconfigureFinished();
diff --git a/src/yuzu/applets/qt_error.cpp b/src/yuzu/applets/qt_error.cpp
index e0190a979..1dc4f0383 100644
--- a/src/yuzu/applets/qt_error.cpp
+++ b/src/yuzu/applets/qt_error.cpp
@@ -8,12 +8,19 @@
8QtErrorDisplay::QtErrorDisplay(GMainWindow& parent) { 8QtErrorDisplay::QtErrorDisplay(GMainWindow& parent) {
9 connect(this, &QtErrorDisplay::MainWindowDisplayError, &parent, 9 connect(this, &QtErrorDisplay::MainWindowDisplayError, &parent,
10 &GMainWindow::ErrorDisplayDisplayError, Qt::QueuedConnection); 10 &GMainWindow::ErrorDisplayDisplayError, Qt::QueuedConnection);
11 connect(this, &QtErrorDisplay::MainWindowRequestExit, &parent,
12 &GMainWindow::ErrorDisplayRequestExit, Qt::QueuedConnection);
11 connect(&parent, &GMainWindow::ErrorDisplayFinished, this, 13 connect(&parent, &GMainWindow::ErrorDisplayFinished, this,
12 &QtErrorDisplay::MainWindowFinishedError, Qt::DirectConnection); 14 &QtErrorDisplay::MainWindowFinishedError, Qt::DirectConnection);
13} 15}
14 16
15QtErrorDisplay::~QtErrorDisplay() = default; 17QtErrorDisplay::~QtErrorDisplay() = default;
16 18
19void QtErrorDisplay::Close() const {
20 callback = {};
21 emit MainWindowRequestExit();
22}
23
17void QtErrorDisplay::ShowError(Result error, FinishedCallback finished) const { 24void QtErrorDisplay::ShowError(Result error, FinishedCallback finished) const {
18 callback = std::move(finished); 25 callback = std::move(finished);
19 emit MainWindowDisplayError( 26 emit MainWindowDisplayError(
@@ -55,5 +62,7 @@ void QtErrorDisplay::ShowCustomErrorText(Result error, std::string dialog_text,
55} 62}
56 63
57void QtErrorDisplay::MainWindowFinishedError() { 64void QtErrorDisplay::MainWindowFinishedError() {
58 callback(); 65 if (callback) {
66 callback();
67 }
59} 68}
diff --git a/src/yuzu/applets/qt_error.h b/src/yuzu/applets/qt_error.h
index e4e174721..957f170ad 100644
--- a/src/yuzu/applets/qt_error.h
+++ b/src/yuzu/applets/qt_error.h
@@ -16,6 +16,7 @@ public:
16 explicit QtErrorDisplay(GMainWindow& parent); 16 explicit QtErrorDisplay(GMainWindow& parent);
17 ~QtErrorDisplay() override; 17 ~QtErrorDisplay() override;
18 18
19 void Close() const override;
19 void ShowError(Result error, FinishedCallback finished) const override; 20 void ShowError(Result error, FinishedCallback finished) const override;
20 void ShowErrorWithTimestamp(Result error, std::chrono::seconds time, 21 void ShowErrorWithTimestamp(Result error, std::chrono::seconds time,
21 FinishedCallback finished) const override; 22 FinishedCallback finished) const override;
@@ -24,6 +25,7 @@ public:
24 25
25signals: 26signals:
26 void MainWindowDisplayError(QString error_code, QString error_text) const; 27 void MainWindowDisplayError(QString error_code, QString error_text) const;
28 void MainWindowRequestExit() const;
27 29
28private: 30private:
29 void MainWindowFinishedError(); 31 void MainWindowFinishedError();
diff --git a/src/yuzu/applets/qt_profile_select.cpp b/src/yuzu/applets/qt_profile_select.cpp
index 4145c5299..c0a1d5ab7 100644
--- a/src/yuzu/applets/qt_profile_select.cpp
+++ b/src/yuzu/applets/qt_profile_select.cpp
@@ -157,17 +157,26 @@ void QtProfileSelectionDialog::SelectUser(const QModelIndex& index) {
157QtProfileSelector::QtProfileSelector(GMainWindow& parent) { 157QtProfileSelector::QtProfileSelector(GMainWindow& parent) {
158 connect(this, &QtProfileSelector::MainWindowSelectProfile, &parent, 158 connect(this, &QtProfileSelector::MainWindowSelectProfile, &parent,
159 &GMainWindow::ProfileSelectorSelectProfile, Qt::QueuedConnection); 159 &GMainWindow::ProfileSelectorSelectProfile, Qt::QueuedConnection);
160 connect(this, &QtProfileSelector::MainWindowRequestExit, &parent,
161 &GMainWindow::ProfileSelectorRequestExit, Qt::QueuedConnection);
160 connect(&parent, &GMainWindow::ProfileSelectorFinishedSelection, this, 162 connect(&parent, &GMainWindow::ProfileSelectorFinishedSelection, this,
161 &QtProfileSelector::MainWindowFinishedSelection, Qt::DirectConnection); 163 &QtProfileSelector::MainWindowFinishedSelection, Qt::DirectConnection);
162} 164}
163 165
164QtProfileSelector::~QtProfileSelector() = default; 166QtProfileSelector::~QtProfileSelector() = default;
165 167
168void QtProfileSelector::Close() const {
169 callback = {};
170 emit MainWindowRequestExit();
171}
172
166void QtProfileSelector::SelectProfile(SelectProfileCallback callback_) const { 173void QtProfileSelector::SelectProfile(SelectProfileCallback callback_) const {
167 callback = std::move(callback_); 174 callback = std::move(callback_);
168 emit MainWindowSelectProfile(); 175 emit MainWindowSelectProfile();
169} 176}
170 177
171void QtProfileSelector::MainWindowFinishedSelection(std::optional<Common::UUID> uuid) { 178void QtProfileSelector::MainWindowFinishedSelection(std::optional<Common::UUID> uuid) {
172 callback(uuid); 179 if (callback) {
180 callback(uuid);
181 }
173} 182}
diff --git a/src/yuzu/applets/qt_profile_select.h b/src/yuzu/applets/qt_profile_select.h
index 637a3bda2..9f214d071 100644
--- a/src/yuzu/applets/qt_profile_select.h
+++ b/src/yuzu/applets/qt_profile_select.h
@@ -65,10 +65,12 @@ public:
65 explicit QtProfileSelector(GMainWindow& parent); 65 explicit QtProfileSelector(GMainWindow& parent);
66 ~QtProfileSelector() override; 66 ~QtProfileSelector() override;
67 67
68 void Close() const override;
68 void SelectProfile(SelectProfileCallback callback_) const override; 69 void SelectProfile(SelectProfileCallback callback_) const override;
69 70
70signals: 71signals:
71 void MainWindowSelectProfile() const; 72 void MainWindowSelectProfile() const;
73 void MainWindowRequestExit() const;
72 74
73private: 75private:
74 void MainWindowFinishedSelection(std::optional<Common::UUID> uuid); 76 void MainWindowFinishedSelection(std::optional<Common::UUID> uuid);
diff --git a/src/yuzu/applets/qt_software_keyboard.h b/src/yuzu/applets/qt_software_keyboard.h
index 30ac8ecf6..ac23ce047 100644
--- a/src/yuzu/applets/qt_software_keyboard.h
+++ b/src/yuzu/applets/qt_software_keyboard.h
@@ -233,6 +233,10 @@ public:
233 explicit QtSoftwareKeyboard(GMainWindow& parent); 233 explicit QtSoftwareKeyboard(GMainWindow& parent);
234 ~QtSoftwareKeyboard() override; 234 ~QtSoftwareKeyboard() override;
235 235
236 void Close() const override {
237 ExitKeyboard();
238 }
239
236 void InitializeKeyboard(bool is_inline, 240 void InitializeKeyboard(bool is_inline,
237 Core::Frontend::KeyboardInitializeParameters initialize_parameters, 241 Core::Frontend::KeyboardInitializeParameters initialize_parameters,
238 SubmitNormalCallback submit_normal_callback_, 242 SubmitNormalCallback submit_normal_callback_,
diff --git a/src/yuzu/applets/qt_web_browser.cpp b/src/yuzu/applets/qt_web_browser.cpp
index 0a5912326..28acc0ff8 100644
--- a/src/yuzu/applets/qt_web_browser.cpp
+++ b/src/yuzu/applets/qt_web_browser.cpp
@@ -393,6 +393,8 @@ void QtNXWebEngineView::FocusFirstLinkElement() {
393QtWebBrowser::QtWebBrowser(GMainWindow& main_window) { 393QtWebBrowser::QtWebBrowser(GMainWindow& main_window) {
394 connect(this, &QtWebBrowser::MainWindowOpenWebPage, &main_window, 394 connect(this, &QtWebBrowser::MainWindowOpenWebPage, &main_window,
395 &GMainWindow::WebBrowserOpenWebPage, Qt::QueuedConnection); 395 &GMainWindow::WebBrowserOpenWebPage, Qt::QueuedConnection);
396 connect(this, &QtWebBrowser::MainWindowRequestExit, &main_window,
397 &GMainWindow::WebBrowserRequestExit, Qt::QueuedConnection);
396 connect(&main_window, &GMainWindow::WebBrowserExtractOfflineRomFS, this, 398 connect(&main_window, &GMainWindow::WebBrowserExtractOfflineRomFS, this,
397 &QtWebBrowser::MainWindowExtractOfflineRomFS, Qt::QueuedConnection); 399 &QtWebBrowser::MainWindowExtractOfflineRomFS, Qt::QueuedConnection);
398 connect(&main_window, &GMainWindow::WebBrowserClosed, this, 400 connect(&main_window, &GMainWindow::WebBrowserClosed, this,
@@ -401,6 +403,11 @@ QtWebBrowser::QtWebBrowser(GMainWindow& main_window) {
401 403
402QtWebBrowser::~QtWebBrowser() = default; 404QtWebBrowser::~QtWebBrowser() = default;
403 405
406void QtWebBrowser::Close() const {
407 callback = {};
408 emit MainWindowRequestExit();
409}
410
404void QtWebBrowser::OpenLocalWebPage(const std::string& local_url, 411void QtWebBrowser::OpenLocalWebPage(const std::string& local_url,
405 ExtractROMFSCallback extract_romfs_callback_, 412 ExtractROMFSCallback extract_romfs_callback_,
406 OpenWebPageCallback callback_) const { 413 OpenWebPageCallback callback_) const {
@@ -436,5 +443,7 @@ void QtWebBrowser::MainWindowExtractOfflineRomFS() {
436 443
437void QtWebBrowser::MainWindowWebBrowserClosed(Service::AM::Applets::WebExitReason exit_reason, 444void QtWebBrowser::MainWindowWebBrowserClosed(Service::AM::Applets::WebExitReason exit_reason,
438 std::string last_url) { 445 std::string last_url) {
439 callback(exit_reason, last_url); 446 if (callback) {
447 callback(exit_reason, last_url);
448 }
440} 449}
diff --git a/src/yuzu/applets/qt_web_browser.h b/src/yuzu/applets/qt_web_browser.h
index ceae7926e..1234108ae 100644
--- a/src/yuzu/applets/qt_web_browser.h
+++ b/src/yuzu/applets/qt_web_browser.h
@@ -196,6 +196,7 @@ public:
196 explicit QtWebBrowser(GMainWindow& parent); 196 explicit QtWebBrowser(GMainWindow& parent);
197 ~QtWebBrowser() override; 197 ~QtWebBrowser() override;
198 198
199 void Close() const override;
199 void OpenLocalWebPage(const std::string& local_url, 200 void OpenLocalWebPage(const std::string& local_url,
200 ExtractROMFSCallback extract_romfs_callback_, 201 ExtractROMFSCallback extract_romfs_callback_,
201 OpenWebPageCallback callback_) const override; 202 OpenWebPageCallback callback_) const override;
@@ -206,6 +207,7 @@ public:
206signals: 207signals:
207 void MainWindowOpenWebPage(const std::string& main_url, const std::string& additional_args, 208 void MainWindowOpenWebPage(const std::string& main_url, const std::string& additional_args,
208 bool is_local) const; 209 bool is_local) const;
210 void MainWindowRequestExit() const;
209 211
210private: 212private:
211 void MainWindowExtractOfflineRomFS(); 213 void MainWindowExtractOfflineRomFS();
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index e65a36e2e..0c60a90cb 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -596,27 +596,45 @@ void GMainWindow::RegisterMetaTypes() {
596 596
597void GMainWindow::AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters, 597void GMainWindow::AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters,
598 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) { 598 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) {
599 QtAmiiboSettingsDialog dialog(this, parameters, input_subsystem.get(), nfp_device); 599 cabinet_applet =
600 new QtAmiiboSettingsDialog(this, parameters, input_subsystem.get(), nfp_device);
601 SCOPE_EXIT({
602 cabinet_applet->deleteLater();
603 cabinet_applet = nullptr;
604 });
600 605
601 dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | 606 cabinet_applet->setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |
602 Qt::WindowTitleHint | Qt::WindowSystemMenuHint); 607 Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
603 dialog.setWindowModality(Qt::WindowModal); 608 cabinet_applet->setWindowModality(Qt::WindowModal);
604 if (dialog.exec() == QDialog::Rejected) { 609
610 if (cabinet_applet->exec() == QDialog::Rejected) {
605 emit AmiiboSettingsFinished(false, {}); 611 emit AmiiboSettingsFinished(false, {});
606 return; 612 return;
607 } 613 }
608 614
609 emit AmiiboSettingsFinished(true, dialog.GetName()); 615 emit AmiiboSettingsFinished(true, cabinet_applet->GetName());
616}
617
618void GMainWindow::AmiiboSettingsRequestExit() {
619 if (cabinet_applet) {
620 cabinet_applet->reject();
621 }
610} 622}
611 623
612void GMainWindow::ControllerSelectorReconfigureControllers( 624void GMainWindow::ControllerSelectorReconfigureControllers(
613 const Core::Frontend::ControllerParameters& parameters) { 625 const Core::Frontend::ControllerParameters& parameters) {
614 QtControllerSelectorDialog dialog(this, parameters, input_subsystem.get(), *system); 626 controller_applet =
627 new QtControllerSelectorDialog(this, parameters, input_subsystem.get(), *system);
628 SCOPE_EXIT({
629 controller_applet->deleteLater();
630 controller_applet = nullptr;
631 });
615 632
616 dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | 633 controller_applet->setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint |
617 Qt::WindowTitleHint | Qt::WindowSystemMenuHint); 634 Qt::WindowStaysOnTopHint | Qt::WindowTitleHint |
618 dialog.setWindowModality(Qt::WindowModal); 635 Qt::WindowSystemMenuHint);
619 dialog.exec(); 636 controller_applet->setWindowModality(Qt::WindowModal);
637 controller_applet->exec();
620 638
621 emit ControllerSelectorReconfigureFinished(); 639 emit ControllerSelectorReconfigureFinished();
622 640
@@ -627,19 +645,30 @@ void GMainWindow::ControllerSelectorReconfigureControllers(
627 UpdateStatusButtons(); 645 UpdateStatusButtons();
628} 646}
629 647
648void GMainWindow::ControllerSelectorRequestExit() {
649 if (controller_applet) {
650 controller_applet->reject();
651 }
652}
653
630void GMainWindow::ProfileSelectorSelectProfile() { 654void GMainWindow::ProfileSelectorSelectProfile() {
631 QtProfileSelectionDialog dialog(system->HIDCore(), this); 655 profile_select_applet = new QtProfileSelectionDialog(system->HIDCore(), this);
632 dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | 656 SCOPE_EXIT({
633 Qt::WindowTitleHint | Qt::WindowSystemMenuHint | 657 profile_select_applet->deleteLater();
634 Qt::WindowCloseButtonHint); 658 profile_select_applet = nullptr;
635 dialog.setWindowModality(Qt::WindowModal); 659 });
636 if (dialog.exec() == QDialog::Rejected) { 660
661 profile_select_applet->setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint |
662 Qt::WindowStaysOnTopHint | Qt::WindowTitleHint |
663 Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint);
664 profile_select_applet->setWindowModality(Qt::WindowModal);
665 if (profile_select_applet->exec() == QDialog::Rejected) {
637 emit ProfileSelectorFinishedSelection(std::nullopt); 666 emit ProfileSelectorFinishedSelection(std::nullopt);
638 return; 667 return;
639 } 668 }
640 669
641 const Service::Account::ProfileManager manager; 670 const Service::Account::ProfileManager manager;
642 const auto uuid = manager.GetUser(static_cast<std::size_t>(dialog.GetIndex())); 671 const auto uuid = manager.GetUser(static_cast<std::size_t>(profile_select_applet->GetIndex()));
643 if (!uuid.has_value()) { 672 if (!uuid.has_value()) {
644 emit ProfileSelectorFinishedSelection(std::nullopt); 673 emit ProfileSelectorFinishedSelection(std::nullopt);
645 return; 674 return;
@@ -648,6 +677,12 @@ void GMainWindow::ProfileSelectorSelectProfile() {
648 emit ProfileSelectorFinishedSelection(uuid); 677 emit ProfileSelectorFinishedSelection(uuid);
649} 678}
650 679
680void GMainWindow::ProfileSelectorRequestExit() {
681 if (profile_select_applet) {
682 profile_select_applet->reject();
683 }
684}
685
651void GMainWindow::SoftwareKeyboardInitialize( 686void GMainWindow::SoftwareKeyboardInitialize(
652 bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters) { 687 bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters) {
653 if (software_keyboard) { 688 if (software_keyboard) {
@@ -772,7 +807,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
772 return; 807 return;
773 } 808 }
774 809
775 QtNXWebEngineView web_browser_view(this, *system, input_subsystem.get()); 810 web_applet = new QtNXWebEngineView(this, *system, input_subsystem.get());
776 811
777 ui->action_Pause->setEnabled(false); 812 ui->action_Pause->setEnabled(false);
778 ui->action_Restart->setEnabled(false); 813 ui->action_Restart->setEnabled(false);
@@ -799,9 +834,9 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
799 loading_progress.setValue(1); 834 loading_progress.setValue(1);
800 835
801 if (is_local) { 836 if (is_local) {
802 web_browser_view.LoadLocalWebPage(main_url, additional_args); 837 web_applet->LoadLocalWebPage(main_url, additional_args);
803 } else { 838 } else {
804 web_browser_view.LoadExternalWebPage(main_url, additional_args); 839 web_applet->LoadExternalWebPage(main_url, additional_args);
805 } 840 }
806 841
807 if (render_window->IsLoadingComplete()) { 842 if (render_window->IsLoadingComplete()) {
@@ -810,15 +845,15 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
810 845
811 const auto& layout = render_window->GetFramebufferLayout(); 846 const auto& layout = render_window->GetFramebufferLayout();
812 const auto scale_ratio = devicePixelRatioF(); 847 const auto scale_ratio = devicePixelRatioF();
813 web_browser_view.resize(layout.screen.GetWidth() / scale_ratio, 848 web_applet->resize(layout.screen.GetWidth() / scale_ratio,
814 layout.screen.GetHeight() / scale_ratio); 849 layout.screen.GetHeight() / scale_ratio);
815 web_browser_view.move(layout.screen.left / scale_ratio, 850 web_applet->move(layout.screen.left / scale_ratio,
816 (layout.screen.top / scale_ratio) + menuBar()->height()); 851 (layout.screen.top / scale_ratio) + menuBar()->height());
817 web_browser_view.setZoomFactor(static_cast<qreal>(layout.screen.GetWidth() / scale_ratio) / 852 web_applet->setZoomFactor(static_cast<qreal>(layout.screen.GetWidth() / scale_ratio) /
818 static_cast<qreal>(Layout::ScreenUndocked::Width)); 853 static_cast<qreal>(Layout::ScreenUndocked::Width));
819 854
820 web_browser_view.setFocus(); 855 web_applet->setFocus();
821 web_browser_view.show(); 856 web_applet->show();
822 857
823 loading_progress.setValue(2); 858 loading_progress.setValue(2);
824 859
@@ -831,7 +866,7 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
831 866
832 // TODO (Morph): Remove this 867 // TODO (Morph): Remove this
833 QAction* exit_action = new QAction(tr("Disable Web Applet"), this); 868 QAction* exit_action = new QAction(tr("Disable Web Applet"), this);
834 connect(exit_action, &QAction::triggered, this, [this, &web_browser_view] { 869 connect(exit_action, &QAction::triggered, this, [this] {
835 const auto result = QMessageBox::warning( 870 const auto result = QMessageBox::warning(
836 this, tr("Disable Web Applet"), 871 this, tr("Disable Web Applet"),
837 tr("Disabling the web applet can lead to undefined behavior and should only be used " 872 tr("Disabling the web applet can lead to undefined behavior and should only be used "
@@ -840,21 +875,21 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
840 QMessageBox::Yes | QMessageBox::No); 875 QMessageBox::Yes | QMessageBox::No);
841 if (result == QMessageBox::Yes) { 876 if (result == QMessageBox::Yes) {
842 UISettings::values.disable_web_applet = true; 877 UISettings::values.disable_web_applet = true;
843 web_browser_view.SetFinished(true); 878 web_applet->SetFinished(true);
844 } 879 }
845 }); 880 });
846 ui->menubar->addAction(exit_action); 881 ui->menubar->addAction(exit_action);
847 882
848 while (!web_browser_view.IsFinished()) { 883 while (!web_applet->IsFinished()) {
849 QCoreApplication::processEvents(); 884 QCoreApplication::processEvents();
850 885
851 if (!exit_check) { 886 if (!exit_check) {
852 web_browser_view.page()->runJavaScript( 887 web_applet->page()->runJavaScript(
853 QStringLiteral("end_applet;"), [&](const QVariant& variant) { 888 QStringLiteral("end_applet;"), [&](const QVariant& variant) {
854 exit_check = false; 889 exit_check = false;
855 if (variant.toBool()) { 890 if (variant.toBool()) {
856 web_browser_view.SetFinished(true); 891 web_applet->SetFinished(true);
857 web_browser_view.SetExitReason( 892 web_applet->SetExitReason(
858 Service::AM::Applets::WebExitReason::EndButtonPressed); 893 Service::AM::Applets::WebExitReason::EndButtonPressed);
859 } 894 }
860 }); 895 });
@@ -862,22 +897,22 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
862 exit_check = true; 897 exit_check = true;
863 } 898 }
864 899
865 if (web_browser_view.GetCurrentURL().contains(QStringLiteral("localhost"))) { 900 if (web_applet->GetCurrentURL().contains(QStringLiteral("localhost"))) {
866 if (!web_browser_view.IsFinished()) { 901 if (!web_applet->IsFinished()) {
867 web_browser_view.SetFinished(true); 902 web_applet->SetFinished(true);
868 web_browser_view.SetExitReason(Service::AM::Applets::WebExitReason::CallbackURL); 903 web_applet->SetExitReason(Service::AM::Applets::WebExitReason::CallbackURL);
869 } 904 }
870 905
871 web_browser_view.SetLastURL(web_browser_view.GetCurrentURL().toStdString()); 906 web_applet->SetLastURL(web_applet->GetCurrentURL().toStdString());
872 } 907 }
873 908
874 std::this_thread::sleep_for(std::chrono::milliseconds(1)); 909 std::this_thread::sleep_for(std::chrono::milliseconds(1));
875 } 910 }
876 911
877 const auto exit_reason = web_browser_view.GetExitReason(); 912 const auto exit_reason = web_applet->GetExitReason();
878 const auto last_url = web_browser_view.GetLastURL(); 913 const auto last_url = web_applet->GetLastURL();
879 914
880 web_browser_view.hide(); 915 web_applet->hide();
881 916
882 render_window->setFocus(); 917 render_window->setFocus();
883 918
@@ -903,6 +938,15 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
903#endif 938#endif
904} 939}
905 940
941void GMainWindow::WebBrowserRequestExit() {
942#ifdef YUZU_USE_QT_WEB_ENGINE
943 if (web_applet) {
944 web_applet->SetExitReason(Service::AM::Applets::WebExitReason::ExitRequested);
945 web_applet->SetFinished(true);
946 }
947#endif
948}
949
906void GMainWindow::InitializeWidgets() { 950void GMainWindow::InitializeWidgets() {
907#ifdef YUZU_ENABLE_COMPATIBILITY_REPORTING 951#ifdef YUZU_ENABLE_COMPATIBILITY_REPORTING
908 ui->action_Report_Compatibility->setVisible(true); 952 ui->action_Report_Compatibility->setVisible(true);
@@ -3089,13 +3133,23 @@ void GMainWindow::OnSaveConfig() {
3089} 3133}
3090 3134
3091void GMainWindow::ErrorDisplayDisplayError(QString error_code, QString error_text) { 3135void GMainWindow::ErrorDisplayDisplayError(QString error_code, QString error_text) {
3092 OverlayDialog dialog(render_window, *system, error_code, error_text, QString{}, tr("OK"), 3136 error_applet = new OverlayDialog(render_window, *system, error_code, error_text, QString{},
3093 Qt::AlignLeft | Qt::AlignVCenter); 3137 tr("OK"), Qt::AlignLeft | Qt::AlignVCenter);
3094 dialog.exec(); 3138 SCOPE_EXIT({
3139 error_applet->deleteLater();
3140 error_applet = nullptr;
3141 });
3142 error_applet->exec();
3095 3143
3096 emit ErrorDisplayFinished(); 3144 emit ErrorDisplayFinished();
3097} 3145}
3098 3146
3147void GMainWindow::ErrorDisplayRequestExit() {
3148 if (error_applet) {
3149 error_applet->reject();
3150 }
3151}
3152
3099void GMainWindow::OnMenuReportCompatibility() { 3153void GMainWindow::OnMenuReportCompatibility() {
3100#if defined(ARCHITECTURE_x86_64) && !defined(__APPLE__) 3154#if defined(ARCHITECTURE_x86_64) && !defined(__APPLE__)
3101 const auto& caps = Common::GetCPUCaps(); 3155 const auto& caps = Common::GetCPUCaps();
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index a23b373a5..a99938eaa 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -47,7 +47,11 @@ enum class DumpRomFSTarget;
47enum class InstalledEntryType; 47enum class InstalledEntryType;
48class GameListPlaceholder; 48class GameListPlaceholder;
49 49
50class QtAmiiboSettingsDialog;
51class QtControllerSelectorDialog;
52class QtProfileSelectionDialog;
50class QtSoftwareKeyboardDialog; 53class QtSoftwareKeyboardDialog;
54class QtNXWebEngineView;
51 55
52enum class StartGameType { 56enum class StartGameType {
53 Normal, // Can use custom configuration 57 Normal, // Can use custom configuration
@@ -184,8 +188,10 @@ public slots:
184 void OnSaveConfig(); 188 void OnSaveConfig();
185 void AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters, 189 void AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters,
186 std::shared_ptr<Service::NFP::NfpDevice> nfp_device); 190 std::shared_ptr<Service::NFP::NfpDevice> nfp_device);
191 void AmiiboSettingsRequestExit();
187 void ControllerSelectorReconfigureControllers( 192 void ControllerSelectorReconfigureControllers(
188 const Core::Frontend::ControllerParameters& parameters); 193 const Core::Frontend::ControllerParameters& parameters);
194 void ControllerSelectorRequestExit();
189 void SoftwareKeyboardInitialize( 195 void SoftwareKeyboardInitialize(
190 bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters); 196 bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters);
191 void SoftwareKeyboardShowNormal(); 197 void SoftwareKeyboardShowNormal();
@@ -196,9 +202,12 @@ public slots:
196 void SoftwareKeyboardInlineTextChanged(Core::Frontend::InlineTextParameters text_parameters); 202 void SoftwareKeyboardInlineTextChanged(Core::Frontend::InlineTextParameters text_parameters);
197 void SoftwareKeyboardExit(); 203 void SoftwareKeyboardExit();
198 void ErrorDisplayDisplayError(QString error_code, QString error_text); 204 void ErrorDisplayDisplayError(QString error_code, QString error_text);
205 void ErrorDisplayRequestExit();
199 void ProfileSelectorSelectProfile(); 206 void ProfileSelectorSelectProfile();
207 void ProfileSelectorRequestExit();
200 void WebBrowserOpenWebPage(const std::string& main_url, const std::string& additional_args, 208 void WebBrowserOpenWebPage(const std::string& main_url, const std::string& additional_args,
201 bool is_local); 209 bool is_local);
210 void WebBrowserRequestExit();
202 void OnAppFocusStateChanged(Qt::ApplicationState state); 211 void OnAppFocusStateChanged(Qt::ApplicationState state);
203 void OnTasStateChanged(); 212 void OnTasStateChanged();
204 213
@@ -466,7 +475,12 @@ private:
466 QString last_filename_booted; 475 QString last_filename_booted;
467 476
468 // Applets 477 // Applets
478 QtAmiiboSettingsDialog* cabinet_applet = nullptr;
479 QtControllerSelectorDialog* controller_applet = nullptr;
480 QtProfileSelectionDialog* profile_select_applet = nullptr;
481 QDialog* error_applet = nullptr;
469 QtSoftwareKeyboardDialog* software_keyboard = nullptr; 482 QtSoftwareKeyboardDialog* software_keyboard = nullptr;
483 QtNXWebEngineView* web_applet = nullptr;
470 484
471 // True if amiibo file select is visible 485 // True if amiibo file select is visible
472 bool is_amiibo_file_select_active{}; 486 bool is_amiibo_file_select_active{};