From 98b760c645088ef690c7fe5941bdebeed34a3012 Mon Sep 17 00:00:00 2001
From: David Marcec <dmarcecguzman@gmail.com>
Date: Fri, 12 Oct 2018 16:28:00 +1100
Subject: [PATCH] Wip

---
 src/core/hle/service/hid/controllers/npad.cpp | 20 +++++++++++++++++--
 src/core/hle/service/hid/hid.cpp              |  6 +++++-
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index dbb0dd72d8..9aa8d6f924 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -287,15 +287,31 @@ Controller_NPad::NPadType Controller_NPad::GetSupportedStyleSet() const {
 
 void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) {
     ASSERT(length > 0 && (length % sizeof(u32)) == 0);
+    supported_npad_id_types.clear();
     supported_npad_id_types.resize(length / sizeof(u32));
     std::memcpy(supported_npad_id_types.data(), data, length);
     CheckForHandheldVariant();
 }
-
+#pragma optimize("", off)
 void Controller_NPad::CheckForHandheldVariant() {
     // As some games expect us to use the variant of handheld mode and some games don't. It's
     // consistent that games set the npad ids in order of priority. We can just swap the controller
     // ids on the fly then if we're in handheld mode
+    if (std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(), 32) !=
+        supported_npad_id_types.end()) {
+        const auto& first_controller = connected_controllers.front();
+        if (first_controller.is_connected &&
+            first_controller.type == NPadControllerType::Handheld) {
+            DisconnectNPad(0);
+            AddNewController(NPadControllerType::Handheld, true);
+        }
+    } else {
+        if (connected_controllers[8].is_connected) {
+            DisconnectNPad(8);
+            AddNewController(NPadControllerType::Handheld);
+        }
+    }
+    /*
     if (supported_npad_id_types.size() > 0) {
         const auto& first_controller = supported_npad_id_types.front();
         if (first_controller == 32 && !connected_controllers[8].is_connected) {
@@ -311,7 +327,7 @@ void Controller_NPad::CheckForHandheldVariant() {
                 AddNewController(NPadControllerType::Handheld);
             }
         }
-    }
+    }*/
 }
 
 const void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) {
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index e5cbd2ef6f..db1537b405 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -284,7 +284,7 @@ public:
 
 private:
     std::shared_ptr<IAppletResource> applet_resource;
-
+#pragma optimize("", off)
     void CreateAppletResource(Kernel::HLERequestContext& ctx) {
         if (applet_resource == nullptr) {
             applet_resource = std::make_shared<IAppletResource>();
@@ -405,6 +405,8 @@ private:
     }
 
     void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) {
+        IPC::RequestParser rp{ctx};
+        auto npad_id = rp.PopRaw<u32>();
         IPC::ResponseBuilder rb{ctx, 2, 1};
         rb.Push(RESULT_SUCCESS);
         rb.PushCopyObjects(applet_resource->GetController<Controller_NPad>(HidController::NPad)
@@ -454,6 +456,8 @@ private:
     }
 
     void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx) {
+        IPC::RequestParser rp{ctx};
+        auto npad_id = rp.PopRaw<u32>();
         IPC::ResponseBuilder rb{ctx, 2};
         rb.Push(RESULT_SUCCESS);
         LOG_WARNING(Service_HID, "(STUBBED) called");