From 1b984738ab7cd2031237e9d97f04ce1ff1ad88bb Mon Sep 17 00:00:00 2001
From: Narr the Reg <juangerman-13@hotmail.com>
Date: Sun, 21 Jan 2024 13:51:50 -0600
Subject: [PATCH] service: hid: Implement EnableAppletForInput

---
 src/core/hle/service/hid/hid_system_server.cpp |  4 ++--
 src/hid_core/resources/npad/npad.cpp           | 13 +++++++++++++
 src/hid_core/resources/npad/npad.h             |  2 ++
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/core/hle/service/hid/hid_system_server.cpp b/src/core/hle/service/hid/hid_system_server.cpp
index 4466a189b3..bf27ddfbf5 100644
--- a/src/core/hle/service/hid/hid_system_server.cpp
+++ b/src/core/hle/service/hid/hid_system_server.cpp
@@ -533,7 +533,7 @@ void IHidSystemServer::EnableAppletToGetInput(HLERequestContext& ctx) {
              parameters.is_enabled, parameters.applet_resource_user_id);
 
     GetResourceManager()->EnableInput(parameters.applet_resource_user_id, parameters.is_enabled);
-    // GetResourceManager()->GetNpad()->EnableInput(parameters.applet_resource_user_id);
+    GetResourceManager()->GetNpad()->EnableAppletToGetInput(parameters.applet_resource_user_id);
 
     IPC::ResponseBuilder rb{ctx, 2};
     rb.Push(ResultSuccess);
@@ -596,7 +596,7 @@ void IHidSystemServer::EnableAppletToGetPadInput(HLERequestContext& ctx) {
              parameters.is_enabled, parameters.applet_resource_user_id);
 
     GetResourceManager()->EnablePadInput(parameters.applet_resource_user_id, parameters.is_enabled);
-    // GetResourceManager()->GetNpad()->EnableInput(parameters.applet_resource_user_id);
+    GetResourceManager()->GetNpad()->EnableAppletToGetInput(parameters.applet_resource_user_id);
 
     IPC::ResponseBuilder rb{ctx, 2};
     rb.Push(ResultSuccess);
diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp
index 212f014297..d13a489c95 100644
--- a/src/hid_core/resources/npad/npad.cpp
+++ b/src/hid_core/resources/npad/npad.cpp
@@ -480,6 +480,10 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) {
                 continue;
             }
 
+            if (!data->flag.enable_pad_input) {
+                continue;
+            }
+
             RequestPadStateUpdate(aruid, controller.device->GetNpadIdType());
             auto& pad_state = controller.npad_pad_state;
             auto& libnx_state = controller.npad_libnx_state;
@@ -1316,4 +1320,13 @@ void NPad::UpdateHandheldAbstractState() {
     abstracted_pads[NpadIdTypeToIndex(Core::HID::NpadIdType::Handheld)].Update();
 }
 
+void NPad::EnableAppletToGetInput(u64 aruid) {
+    std::scoped_lock lock{mutex};
+    std::scoped_lock shared_lock{*applet_resource_holder.shared_mutex};
+
+    for (auto& abstract_pad : abstracted_pads) {
+        abstract_pad.EnableAppletToGetInput(aruid);
+    }
+}
+
 } // namespace Service::HID
diff --git a/src/hid_core/resources/npad/npad.h b/src/hid_core/resources/npad/npad.h
index 18b25c688e..88289fa2b0 100644
--- a/src/hid_core/resources/npad/npad.h
+++ b/src/hid_core/resources/npad/npad.h
@@ -153,6 +153,8 @@ public:
 
     void UpdateHandheldAbstractState();
 
+    void EnableAppletToGetInput(u64 aruid);
+
 private:
     struct NpadControllerData {
         NpadInternalState* shared_memory = nullptr;