summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/CMakeLists.txt4
-rw-r--r--src/core/frontend/applets/mii.cpp19
-rw-r--r--src/core/frontend/applets/mii.h35
-rw-r--r--src/core/hle/service/am/applets/applet_mii.cpp101
-rw-r--r--src/core/hle/service/am/applets/applet_mii.h90
-rw-r--r--src/core/hle/service/am/applets/applets.cpp17
-rw-r--r--src/core/hle/service/am/applets/applets.h9
-rw-r--r--src/yuzu/main.cpp2
8 files changed, 272 insertions, 5 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 6a83d5ceb..1f234c822 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -122,6 +122,8 @@ add_library(core STATIC
122 frontend/applets/error.h 122 frontend/applets/error.h
123 frontend/applets/general_frontend.cpp 123 frontend/applets/general_frontend.cpp
124 frontend/applets/general_frontend.h 124 frontend/applets/general_frontend.h
125 frontend/applets/mii.cpp
126 frontend/applets/mii.h
125 frontend/applets/profile_select.cpp 127 frontend/applets/profile_select.cpp
126 frontend/applets/profile_select.h 128 frontend/applets/profile_select.h
127 frontend/applets/software_keyboard.cpp 129 frontend/applets/software_keyboard.cpp
@@ -303,6 +305,8 @@ add_library(core STATIC
303 hle/service/am/applets/applet_error.h 305 hle/service/am/applets/applet_error.h
304 hle/service/am/applets/applet_general_backend.cpp 306 hle/service/am/applets/applet_general_backend.cpp
305 hle/service/am/applets/applet_general_backend.h 307 hle/service/am/applets/applet_general_backend.h
308 hle/service/am/applets/applet_mii.cpp
309 hle/service/am/applets/applet_mii.h
306 hle/service/am/applets/applet_profile_select.cpp 310 hle/service/am/applets/applet_profile_select.cpp
307 hle/service/am/applets/applet_profile_select.h 311 hle/service/am/applets/applet_profile_select.h
308 hle/service/am/applets/applet_software_keyboard.cpp 312 hle/service/am/applets/applet_software_keyboard.cpp
diff --git a/src/core/frontend/applets/mii.cpp b/src/core/frontend/applets/mii.cpp
new file mode 100644
index 000000000..1c05ff412
--- /dev/null
+++ b/src/core/frontend/applets/mii.cpp
@@ -0,0 +1,19 @@
1// Copyright 2022 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/logging/log.h"
6#include "core/frontend/applets/mii.h"
7
8namespace Core::Frontend {
9
10MiiApplet::~MiiApplet() = default;
11
12void DefaultMiiApplet::ShowMii(
13 const MiiParameters& parameters,
14 const std::function<void(const Core::Frontend::MiiParameters& parameters)> callback) const {
15 LOG_INFO(Service_HID, "(STUBBED) called");
16 callback(parameters);
17}
18
19} // namespace Core::Frontend
diff --git a/src/core/frontend/applets/mii.h b/src/core/frontend/applets/mii.h
new file mode 100644
index 000000000..1fc40a9c6
--- /dev/null
+++ b/src/core/frontend/applets/mii.h
@@ -0,0 +1,35 @@
1// Copyright 2022 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <functional>
8
9#include "core/hle/result.h"
10#include "core/hle/service/mii/mii_manager.h"
11
12namespace Core::Frontend {
13
14struct MiiParameters {
15 bool is_editable;
16 Service::Mii::MiiInfo mii_data{};
17};
18
19class MiiApplet {
20public:
21 virtual ~MiiApplet();
22
23 virtual void ShowMii(const MiiParameters& parameters,
24 const std::function<void(const Core::Frontend::MiiParameters& parameters)>
25 callback) const = 0;
26};
27
28class DefaultMiiApplet final : public MiiApplet {
29public:
30 void ShowMii(const MiiParameters& parameters,
31 const std::function<void(const Core::Frontend::MiiParameters& parameters)>
32 callback) const override;
33};
34
35} // namespace Core::Frontend
diff --git a/src/core/hle/service/am/applets/applet_mii.cpp b/src/core/hle/service/am/applets/applet_mii.cpp
new file mode 100644
index 000000000..8c4173737
--- /dev/null
+++ b/src/core/hle/service/am/applets/applet_mii.cpp
@@ -0,0 +1,101 @@
1// Copyright 2022 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/assert.h"
6#include "common/logging/log.h"
7#include "core/core.h"
8#include "core/frontend/applets/mii.h"
9#include "core/hle/service/am/am.h"
10#include "core/hle/service/am/applets/applet_mii.h"
11#include "core/reporter.h"
12
13namespace Service::AM::Applets {
14
15Mii::Mii(Core::System& system_, LibraryAppletMode applet_mode_,
16 const Core::Frontend::MiiApplet& frontend_)
17 : Applet{system_, applet_mode_}, frontend{frontend_}, system{system_} {}
18
19Mii::~Mii() = default;
20
21void Mii::Initialize() {
22 is_complete = false;
23
24 const auto storage = broker.PopNormalDataToApplet();
25 ASSERT(storage != nullptr);
26
27 const auto data = storage->GetData();
28 ASSERT(data.size() == sizeof(MiiAppletInput));
29
30 std::memcpy(&input_data, data.data(), sizeof(MiiAppletInput));
31}
32
33bool Mii::TransactionComplete() const {
34 return is_complete;
35}
36
37ResultCode Mii::GetStatus() const {
38 return ResultSuccess;
39}
40
41void Mii::ExecuteInteractive() {
42 UNREACHABLE_MSG("Unexpected interactive applet data!");
43}
44
45void Mii::Execute() {
46 if (is_complete) {
47 return;
48 }
49
50 const auto callback = [this](const Core::Frontend::MiiParameters& parameters) {
51 DisplayCompleted(parameters);
52 };
53
54 switch (input_data.applet_mode) {
55 case MiiAppletMode::ShowMiiEdit: {
56 Service::Mii::MiiManager manager;
57 Core::Frontend::MiiParameters params{
58 .is_editable = false,
59 .mii_data = input_data.mii_char_info.mii_data,
60 };
61 frontend.ShowMii(params, callback);
62 break;
63 }
64 case MiiAppletMode::EditMii: {
65 Service::Mii::MiiManager manager;
66 Core::Frontend::MiiParameters params{
67 .is_editable = true,
68 .mii_data = input_data.mii_char_info.mii_data,
69 };
70 frontend.ShowMii(params, callback);
71 break;
72 }
73 case MiiAppletMode::CreateMii: {
74 Service::Mii::MiiManager manager;
75 Core::Frontend::MiiParameters params{
76 .is_editable = true,
77 .mii_data = manager.BuildDefault(0),
78 };
79 frontend.ShowMii(params, callback);
80 break;
81 }
82 default:
83 UNIMPLEMENTED_MSG("Unimplemented LibAppletMiiEdit mode={:02X}!", input_data.applet_mode);
84 }
85}
86
87void Mii::DisplayCompleted(const Core::Frontend::MiiParameters& parameters) {
88 is_complete = true;
89
90 std::vector<u8> reply(sizeof(AppletOutputForCharInfoEditing));
91 output_data = {
92 .result = ResultSuccess,
93 .mii_data = parameters.mii_data,
94 };
95
96 std::memcpy(reply.data(), &output_data, sizeof(AppletOutputForCharInfoEditing));
97 broker.PushNormalDataFromApplet(std::make_shared<IStorage>(system, std::move(reply)));
98 broker.SignalStateChanged();
99}
100
101} // namespace Service::AM::Applets
diff --git a/src/core/hle/service/am/applets/applet_mii.h b/src/core/hle/service/am/applets/applet_mii.h
new file mode 100644
index 000000000..42326bfc2
--- /dev/null
+++ b/src/core/hle/service/am/applets/applet_mii.h
@@ -0,0 +1,90 @@
1// Copyright 2022 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <array>
8
9#include "core/hle/result.h"
10#include "core/hle/service/am/applets/applets.h"
11#include "core/hle/service/mii/mii_manager.h"
12
13namespace Core {
14class System;
15}
16
17namespace Service::AM::Applets {
18
19// This is nn::mii::AppletMode
20enum class MiiAppletMode : u32 {
21 ShowMiiEdit = 0,
22 AppendMii = 1,
23 AppendMiiImage = 2,
24 UpdateMiiImage = 3,
25 CreateMii = 4,
26 EditMii = 5,
27};
28
29struct MiiCharInfo {
30 Service::Mii::MiiInfo mii_data{};
31 INSERT_PADDING_BYTES(0x28);
32};
33static_assert(sizeof(MiiCharInfo) == 0x80, "MiiCharInfo has incorrect size.");
34
35// This is nn::mii::AppletInput
36struct MiiAppletInput {
37 s32 version{};
38 MiiAppletMode applet_mode{};
39 u32 special_mii_key_code{};
40 union {
41 std::array<Common::UUID, 8> valid_uuid;
42 MiiCharInfo mii_char_info;
43 };
44 Common::UUID used_uuid;
45 INSERT_PADDING_BYTES(0x64);
46};
47static_assert(sizeof(MiiAppletInput) == 0x100, "MiiAppletInput has incorrect size.");
48
49// This is nn::mii::AppletOutput
50struct MiiAppletOutput {
51 ResultCode result{ResultSuccess};
52 s32 index{};
53 INSERT_PADDING_BYTES(0x18);
54};
55static_assert(sizeof(MiiAppletOutput) == 0x20, "MiiAppletOutput has incorrect size.");
56
57// This is nn::mii::AppletOutputForCharInfoEditing
58struct AppletOutputForCharInfoEditing {
59 ResultCode result{ResultSuccess};
60 Service::Mii::MiiInfo mii_data{};
61 INSERT_PADDING_BYTES(0x24);
62};
63static_assert(sizeof(AppletOutputForCharInfoEditing) == 0x80,
64 "AppletOutputForCharInfoEditing has incorrect size.");
65
66class Mii final : public Applet {
67public:
68 explicit Mii(Core::System& system_, LibraryAppletMode applet_mode_,
69 const Core::Frontend::MiiApplet& frontend_);
70 ~Mii() override;
71
72 void Initialize() override;
73
74 bool TransactionComplete() const override;
75 ResultCode GetStatus() const override;
76 void ExecuteInteractive() override;
77 void Execute() override;
78
79 void DisplayCompleted(const Core::Frontend::MiiParameters& parameters);
80
81private:
82 const Core::Frontend::MiiApplet& frontend;
83 MiiAppletInput input_data{};
84 AppletOutputForCharInfoEditing output_data{};
85
86 bool is_complete = false;
87 Core::System& system;
88};
89
90} // namespace Service::AM::Applets
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp
index 134ac1ee2..79e62679d 100644
--- a/src/core/hle/service/am/applets/applets.cpp
+++ b/src/core/hle/service/am/applets/applets.cpp
@@ -9,6 +9,7 @@
9#include "core/frontend/applets/controller.h" 9#include "core/frontend/applets/controller.h"
10#include "core/frontend/applets/error.h" 10#include "core/frontend/applets/error.h"
11#include "core/frontend/applets/general_frontend.h" 11#include "core/frontend/applets/general_frontend.h"
12#include "core/frontend/applets/mii.h"
12#include "core/frontend/applets/profile_select.h" 13#include "core/frontend/applets/profile_select.h"
13#include "core/frontend/applets/software_keyboard.h" 14#include "core/frontend/applets/software_keyboard.h"
14#include "core/frontend/applets/web_browser.h" 15#include "core/frontend/applets/web_browser.h"
@@ -19,6 +20,7 @@
19#include "core/hle/service/am/applets/applet_controller.h" 20#include "core/hle/service/am/applets/applet_controller.h"
20#include "core/hle/service/am/applets/applet_error.h" 21#include "core/hle/service/am/applets/applet_error.h"
21#include "core/hle/service/am/applets/applet_general_backend.h" 22#include "core/hle/service/am/applets/applet_general_backend.h"
23#include "core/hle/service/am/applets/applet_mii.h"
22#include "core/hle/service/am/applets/applet_profile_select.h" 24#include "core/hle/service/am/applets/applet_profile_select.h"
23#include "core/hle/service/am/applets/applet_software_keyboard.h" 25#include "core/hle/service/am/applets/applet_software_keyboard.h"
24#include "core/hle/service/am/applets/applet_web_browser.h" 26#include "core/hle/service/am/applets/applet_web_browser.h"
@@ -172,10 +174,11 @@ AppletFrontendSet::AppletFrontendSet() = default;
172 174
173AppletFrontendSet::AppletFrontendSet(ControllerApplet controller_applet, ErrorApplet error_applet, 175AppletFrontendSet::AppletFrontendSet(ControllerApplet controller_applet, ErrorApplet error_applet,
174 ParentalControlsApplet parental_controls_applet, 176 ParentalControlsApplet parental_controls_applet,
175 PhotoViewer photo_viewer_, ProfileSelect profile_select_, 177 MiiApplet mii_applet, PhotoViewer photo_viewer_,
178 ProfileSelect profile_select_,
176 SoftwareKeyboard software_keyboard_, WebBrowser web_browser_) 179 SoftwareKeyboard software_keyboard_, WebBrowser web_browser_)
177 : controller{std::move(controller_applet)}, error{std::move(error_applet)}, 180 : controller{std::move(controller_applet)}, error{std::move(error_applet)},
178 parental_controls{std::move(parental_controls_applet)}, 181 parental_controls{std::move(parental_controls_applet)}, mii{std::move(mii_applet)},
179 photo_viewer{std::move(photo_viewer_)}, profile_select{std::move(profile_select_)}, 182 photo_viewer{std::move(photo_viewer_)}, profile_select{std::move(profile_select_)},
180 software_keyboard{std::move(software_keyboard_)}, web_browser{std::move(web_browser_)} {} 183 software_keyboard{std::move(software_keyboard_)}, web_browser{std::move(web_browser_)} {}
181 184
@@ -206,6 +209,10 @@ void AppletManager::SetAppletFrontendSet(AppletFrontendSet set) {
206 frontend.parental_controls = std::move(set.parental_controls); 209 frontend.parental_controls = std::move(set.parental_controls);
207 } 210 }
208 211
212 if (set.mii != nullptr) {
213 frontend.mii = std::move(set.mii);
214 }
215
209 if (set.photo_viewer != nullptr) { 216 if (set.photo_viewer != nullptr) {
210 frontend.photo_viewer = std::move(set.photo_viewer); 217 frontend.photo_viewer = std::move(set.photo_viewer);
211 } 218 }
@@ -243,6 +250,10 @@ void AppletManager::SetDefaultAppletsIfMissing() {
243 std::make_unique<Core::Frontend::DefaultParentalControlsApplet>(); 250 std::make_unique<Core::Frontend::DefaultParentalControlsApplet>();
244 } 251 }
245 252
253 if (frontend.mii == nullptr) {
254 frontend.mii = std::make_unique<Core::Frontend::DefaultMiiApplet>();
255 }
256
246 if (frontend.photo_viewer == nullptr) { 257 if (frontend.photo_viewer == nullptr) {
247 frontend.photo_viewer = std::make_unique<Core::Frontend::DefaultPhotoViewerApplet>(); 258 frontend.photo_viewer = std::make_unique<Core::Frontend::DefaultPhotoViewerApplet>();
248 } 259 }
@@ -277,6 +288,8 @@ std::shared_ptr<Applet> AppletManager::GetApplet(AppletId id, LibraryAppletMode
277 return std::make_shared<ProfileSelect>(system, mode, *frontend.profile_select); 288 return std::make_shared<ProfileSelect>(system, mode, *frontend.profile_select);
278 case AppletId::SoftwareKeyboard: 289 case AppletId::SoftwareKeyboard:
279 return std::make_shared<SoftwareKeyboard>(system, mode, *frontend.software_keyboard); 290 return std::make_shared<SoftwareKeyboard>(system, mode, *frontend.software_keyboard);
291 case AppletId::MiiEdit:
292 return std::make_shared<Mii>(system, mode, *frontend.mii);
280 case AppletId::Web: 293 case AppletId::Web:
281 case AppletId::Shop: 294 case AppletId::Shop:
282 case AppletId::OfflineWeb: 295 case AppletId::OfflineWeb:
diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h
index 15eeb4ee1..0c44aec79 100644
--- a/src/core/hle/service/am/applets/applets.h
+++ b/src/core/hle/service/am/applets/applets.h
@@ -21,6 +21,7 @@ class ControllerApplet;
21class ECommerceApplet; 21class ECommerceApplet;
22class ErrorApplet; 22class ErrorApplet;
23class ParentalControlsApplet; 23class ParentalControlsApplet;
24class MiiApplet;
24class PhotoViewerApplet; 25class PhotoViewerApplet;
25class ProfileSelectApplet; 26class ProfileSelectApplet;
26class SoftwareKeyboardApplet; 27class SoftwareKeyboardApplet;
@@ -179,6 +180,7 @@ struct AppletFrontendSet {
179 using ControllerApplet = std::unique_ptr<Core::Frontend::ControllerApplet>; 180 using ControllerApplet = std::unique_ptr<Core::Frontend::ControllerApplet>;
180 using ErrorApplet = std::unique_ptr<Core::Frontend::ErrorApplet>; 181 using ErrorApplet = std::unique_ptr<Core::Frontend::ErrorApplet>;
181 using ParentalControlsApplet = std::unique_ptr<Core::Frontend::ParentalControlsApplet>; 182 using ParentalControlsApplet = std::unique_ptr<Core::Frontend::ParentalControlsApplet>;
183 using MiiApplet = std::unique_ptr<Core::Frontend::MiiApplet>;
182 using PhotoViewer = std::unique_ptr<Core::Frontend::PhotoViewerApplet>; 184 using PhotoViewer = std::unique_ptr<Core::Frontend::PhotoViewerApplet>;
183 using ProfileSelect = std::unique_ptr<Core::Frontend::ProfileSelectApplet>; 185 using ProfileSelect = std::unique_ptr<Core::Frontend::ProfileSelectApplet>;
184 using SoftwareKeyboard = std::unique_ptr<Core::Frontend::SoftwareKeyboardApplet>; 186 using SoftwareKeyboard = std::unique_ptr<Core::Frontend::SoftwareKeyboardApplet>;
@@ -186,9 +188,9 @@ struct AppletFrontendSet {
186 188
187 AppletFrontendSet(); 189 AppletFrontendSet();
188 AppletFrontendSet(ControllerApplet controller_applet, ErrorApplet error_applet, 190 AppletFrontendSet(ControllerApplet controller_applet, ErrorApplet error_applet,
189 ParentalControlsApplet parental_controls_applet, PhotoViewer photo_viewer_, 191 ParentalControlsApplet parental_controls_applet, MiiApplet mii_applet,
190 ProfileSelect profile_select_, SoftwareKeyboard software_keyboard_, 192 PhotoViewer photo_viewer_, ProfileSelect profile_select_,
191 WebBrowser web_browser_); 193 SoftwareKeyboard software_keyboard_, WebBrowser web_browser_);
192 ~AppletFrontendSet(); 194 ~AppletFrontendSet();
193 195
194 AppletFrontendSet(const AppletFrontendSet&) = delete; 196 AppletFrontendSet(const AppletFrontendSet&) = delete;
@@ -200,6 +202,7 @@ struct AppletFrontendSet {
200 ControllerApplet controller; 202 ControllerApplet controller;
201 ErrorApplet error; 203 ErrorApplet error;
202 ParentalControlsApplet parental_controls; 204 ParentalControlsApplet parental_controls;
205 MiiApplet mii;
203 PhotoViewer photo_viewer; 206 PhotoViewer photo_viewer;
204 ProfileSelect profile_select; 207 ProfileSelect profile_select;
205 SoftwareKeyboard software_keyboard; 208 SoftwareKeyboard software_keyboard;
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 1d459bdb3..06774768d 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -25,6 +25,7 @@
25#include "core/file_sys/vfs_real.h" 25#include "core/file_sys/vfs_real.h"
26#include "core/frontend/applets/controller.h" 26#include "core/frontend/applets/controller.h"
27#include "core/frontend/applets/general_frontend.h" 27#include "core/frontend/applets/general_frontend.h"
28#include "core/frontend/applets/mii.h"
28#include "core/frontend/applets/software_keyboard.h" 29#include "core/frontend/applets/software_keyboard.h"
29#include "core/hid/emulated_controller.h" 30#include "core/hid/emulated_controller.h"
30#include "core/hid/hid_core.h" 31#include "core/hid/hid_core.h"
@@ -1285,6 +1286,7 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p
1285 std::make_unique<QtControllerSelector>(*this), // Controller Selector 1286 std::make_unique<QtControllerSelector>(*this), // Controller Selector
1286 std::make_unique<QtErrorDisplay>(*this), // Error Display 1287 std::make_unique<QtErrorDisplay>(*this), // Error Display
1287 nullptr, // Parental Controls 1288 nullptr, // Parental Controls
1289 nullptr, // Mii editor
1288 nullptr, // Photo Viewer 1290 nullptr, // Photo Viewer
1289 std::make_unique<QtProfileSelector>(*this), // Profile Selector 1291 std::make_unique<QtProfileSelector>(*this), // Profile Selector
1290 std::make_unique<QtSoftwareKeyboard>(*this), // Software Keyboard 1292 std::make_unique<QtSoftwareKeyboard>(*this), // Software Keyboard