From f099cc12fa6e54ba9282fac64f1c93d01b4eef6d Mon Sep 17 00:00:00 2001
From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com>
Date: Wed, 23 Aug 2023 01:16:27 +0300
Subject: [PATCH] Add swkbd applet

---
 CMakeLists.txt                         |  4 ++--
 include/applets/applet.hpp             |  4 ++++
 include/applets/mii_selector.hpp       |  2 ++
 include/applets/software_keyboard.hpp  | 13 +++++++++++++
 include/services/apt.hpp               |  4 +++-
 src/core/applets/mii_selector.cpp      |  7 ++++++-
 src/core/applets/software_keyboard.cpp | 11 +++++++++++
 src/core/services/apt.cpp              | 14 ++++++++++++++
 8 files changed, 55 insertions(+), 4 deletions(-)
 create mode 100644 include/applets/software_keyboard.hpp
 create mode 100644 src/core/applets/software_keyboard.cpp

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());
 }