diff --git a/CMakeLists.txt b/CMakeLists.txt index ce1885bc..55c0c13c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,7 +150,7 @@ set(FS_SOURCE_FILES src/core/fs/archive_self_ncch.cpp src/core/fs/archive_save_d src/core/fs/ivfc.cpp ) -set(APPLET_SOURCE_FILES src/core/applets/applet.cpp src/core/applets/mii_selector.cpp) +set(APPLET_SOURCE_FILES src/core/applets/applet.cpp src/core/applets/mii_selector.cpp src/core/applets/software_keyboard.cpp) set(RENDERER_SW_SOURCE_FILES src/core/renderer_sw/renderer_sw.cpp) set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp @@ -180,7 +180,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/action_replay.hpp include/renderer_sw/renderer_sw.hpp include/compiler_builtins.hpp include/fs/romfs.hpp include/fs/ivfc.hpp include/discord_rpc.hpp include/services/http.hpp include/result/result_cfg.hpp include/applets/applet.hpp include/applets/mii_selector.hpp include/math_util.hpp include/services/soc.hpp - include/services/news_u.hpp + include/services/news_u.hpp include/applets/software_keyboard.hpp ) cmrc_add_resource_library( diff --git a/include/applets/applet.hpp b/include/applets/applet.hpp index 5aeef718..a424e79d 100644 --- a/include/applets/applet.hpp +++ b/include/applets/applet.hpp @@ -47,8 +47,12 @@ namespace Applets { Memory& mem; public: + virtual const char* name() = 0; + // Called by APT::StartLibraryApplet and similar virtual Result::HorizonResult start() = 0; + // Transfer parameters from application -> applet + virtual Result::HorizonResult receiveParameter() = 0; virtual void reset() = 0; AppletBase(Memory& mem) : mem(mem) {} diff --git a/include/applets/mii_selector.hpp b/include/applets/mii_selector.hpp index 8555b5c1..e40547fb 100644 --- a/include/applets/mii_selector.hpp +++ b/include/applets/mii_selector.hpp @@ -3,7 +3,9 @@ namespace Applets { class MiiSelectorApplet final : public AppletBase { public: + virtual const char* name() override { return "Mii Selector"; } virtual Result::HorizonResult start() override; + virtual Result::HorizonResult receiveParameter() override; virtual void reset() override; MiiSelectorApplet(Memory& memory) : AppletBase(memory) {} diff --git a/include/applets/software_keyboard.hpp b/include/applets/software_keyboard.hpp new file mode 100644 index 00000000..1fb721a1 --- /dev/null +++ b/include/applets/software_keyboard.hpp @@ -0,0 +1,13 @@ +#include "applets/applet.hpp" + +namespace Applets { + class SoftwareKeyboardApplet final : public AppletBase { + public: + virtual const char* name() override { return "Software Keyboard"; } + virtual Result::HorizonResult start() override; + virtual Result::HorizonResult receiveParameter() override; + virtual void reset() override; + + SoftwareKeyboardApplet(Memory& memory) : AppletBase(memory) {} + }; +} // namespace Applets \ No newline at end of file diff --git a/include/services/apt.hpp b/include/services/apt.hpp index 3944e850..02448b8d 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -7,6 +7,7 @@ #include "result/result.hpp" #include "applets/mii_selector.hpp" +#include "applets/software_keyboard.hpp" // Yay, more circular dependencies class Kernel; @@ -28,6 +29,7 @@ class APTService { // Applets here Applets::MiiSelectorApplet miiSelector; + Applets::SoftwareKeyboardApplet swkbd; Applets::AppletBase* getApplet(u32 id); MAKE_LOG_FUNCTION(log, aptLogger) @@ -78,7 +80,7 @@ class APTService { u32 screencapPostPermission; public: - APTService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel), miiSelector(mem) {} + APTService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel), miiSelector(mem), swkbd(mem) {} void reset(); void handleSyncRequest(u32 messagePointer); }; \ No newline at end of file diff --git a/src/core/applets/mii_selector.cpp b/src/core/applets/mii_selector.cpp index 04658736..817545e8 100644 --- a/src/core/applets/mii_selector.cpp +++ b/src/core/applets/mii_selector.cpp @@ -3,4 +3,9 @@ using namespace Applets; void MiiSelectorApplet::reset() {} -Result::HorizonResult MiiSelectorApplet::start() { return Result::Success; } \ No newline at end of file +Result::HorizonResult MiiSelectorApplet::start() { return Result::Success; } + +Result::HorizonResult MiiSelectorApplet::receiveParameter() { + Helpers::panic("Mii Selector received parameter"); + return Result::Success; +} \ No newline at end of file diff --git a/src/core/applets/software_keyboard.cpp b/src/core/applets/software_keyboard.cpp new file mode 100644 index 00000000..a360ef10 --- /dev/null +++ b/src/core/applets/software_keyboard.cpp @@ -0,0 +1,11 @@ +#include "applets/software_keyboard.hpp" + +using namespace Applets; + +void SoftwareKeyboardApplet::reset() {} +Result::HorizonResult SoftwareKeyboardApplet::start() { return Result::Success; } + +Result::HorizonResult SoftwareKeyboardApplet::receiveParameter() { + Helpers::panic("Software keyboard received parameter"); + return Result::Success; +} \ No newline at end of file diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index a775c2cc..1298eab3 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -76,6 +76,9 @@ Applets::AppletBase* APTService::getApplet(u32 id) { case AppletIDs::MiiSelector: case AppletIDs::MiiSelector2: return &miiSelector; + case AppletIDs::SoftwareKeyboard: + case AppletIDs::SoftwareKeyboard2: return &swkbd; + default: return nullptr; } } @@ -257,6 +260,17 @@ void APTService::sendParameter(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x0C, 1, 0)); mem.write32(messagePointer + 4, Result::Success); + if (sourceAppID != Applets::AppletIDs::Application) { + Helpers::warn("APT::SendParameter: Unimplemented source applet ID"); + } + + Applets::AppletBase* destApplet = getApplet(destAppID); + if (destApplet == nullptr) { + Helpers::warn("APT::SendParameter: Unimplemented dest applet ID"); + } else { + auto result = destApplet->receiveParameter(); + } + kernel.signalEvent(resumeEvent.value()); }