|
|
|
@ -50,8 +50,9 @@ NPad::NPad(Core::HID::HIDCore& hid_core_, KernelHelpers::ServiceContext& service |
|
|
|
auto& controller = controller_data[aruid_index][i]; |
|
|
|
controller.device = hid_core.GetEmulatedControllerByIndex(i); |
|
|
|
Core::HID::ControllerUpdateCallback engine_callback{ |
|
|
|
.on_change = |
|
|
|
[this, i](Core::HID::ControllerTriggerType type) { ControllerUpdate(type, i); }, |
|
|
|
.on_change = [this, i](Core::HID::ControllerTriggerType type) { |
|
|
|
ControllerUpdate(hid_core.kernel, type, i); |
|
|
|
}, |
|
|
|
.is_npad_service = true, |
|
|
|
}; |
|
|
|
controller.callback_key = controller.device->SetCallback(engine_callback); |
|
|
|
@ -137,10 +138,10 @@ void NPad::FreeAppletResourceId(u64 aruid) { |
|
|
|
return npad_resource.FreeAppletResourceId(aruid); |
|
|
|
} |
|
|
|
|
|
|
|
void NPad::ControllerUpdate(Core::HID::ControllerTriggerType type, std::size_t controller_idx) { |
|
|
|
void NPad::ControllerUpdate(Kernel::KernelCore& kernel, Core::HID::ControllerTriggerType type, std::size_t controller_idx) { |
|
|
|
if (type == Core::HID::ControllerTriggerType::All) { |
|
|
|
ControllerUpdate(Core::HID::ControllerTriggerType::Connected, controller_idx); |
|
|
|
ControllerUpdate(Core::HID::ControllerTriggerType::Battery, controller_idx); |
|
|
|
ControllerUpdate(kernel, Core::HID::ControllerTriggerType::Connected, controller_idx); |
|
|
|
ControllerUpdate(kernel, Core::HID::ControllerTriggerType::Battery, controller_idx); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
@ -165,7 +166,7 @@ void NPad::ControllerUpdate(Core::HID::ControllerTriggerType type, std::size_t c |
|
|
|
if (is_connected == controller.is_connected) { |
|
|
|
return; |
|
|
|
} |
|
|
|
UpdateControllerAt(data->aruid, npad_type, npad_id, is_connected); |
|
|
|
UpdateControllerAt(kernel, data->aruid, npad_type, npad_id, is_connected); |
|
|
|
break; |
|
|
|
case Core::HID::ControllerTriggerType::Battery: { |
|
|
|
if (!controller.device->IsConnected()) { |
|
|
|
@ -187,7 +188,7 @@ void NPad::ControllerUpdate(Core::HID::ControllerTriggerType type, std::size_t c |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void NPad::InitNewlyAddedController(u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
void NPad::InitNewlyAddedController(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
auto& controller = GetControllerFromNpadIdType(aruid, npad_id); |
|
|
|
if (!npad_resource.IsControllerSupported(aruid, controller.device->GetNpadStyleIndex())) { |
|
|
|
return; |
|
|
|
@ -202,7 +203,7 @@ void NPad::InitNewlyAddedController(u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
return; |
|
|
|
} |
|
|
|
if (controller_type == Core::HID::NpadStyleIndex::None) { |
|
|
|
npad_resource.SignalStyleSetUpdateEvent(hid_core.kernel, aruid, npad_id); |
|
|
|
npad_resource.SignalStyleSetUpdateEvent(kernel, aruid, npad_id); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
@ -386,7 +387,7 @@ void NPad::InitNewlyAddedController(u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
Common::Input::PollingMode::Active); |
|
|
|
} |
|
|
|
|
|
|
|
npad_resource.SignalStyleSetUpdateEvent(hid_core.kernel, aruid, npad_id); |
|
|
|
npad_resource.SignalStyleSetUpdateEvent(kernel, aruid, npad_id); |
|
|
|
WriteEmptyEntry(controller.shared_memory); |
|
|
|
hid_core.SetLastActiveController(npad_id); |
|
|
|
abstracted_pads[NpadIdTypeToIndex(npad_id)].Update(); |
|
|
|
@ -413,20 +414,20 @@ void NPad::WriteEmptyEntry(NpadInternalState* npad) { |
|
|
|
npad->gc_trigger_lifo.WriteNextEntry(dummy_gc_state); |
|
|
|
} |
|
|
|
|
|
|
|
void NPad::RequestPadStateUpdate(u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
void NPad::RequestPadStateUpdate(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
std::scoped_lock lock{*applet_resource_holder.shared_mutex}; |
|
|
|
auto& controller = GetControllerFromNpadIdType(aruid, npad_id); |
|
|
|
const auto controller_type = controller.device->GetNpadStyleIndex(); |
|
|
|
|
|
|
|
if (!controller.device->IsConnected() && controller.is_connected) { |
|
|
|
DisconnectNpad(aruid, npad_id); |
|
|
|
DisconnectNpad(kernel, aruid, npad_id); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (!controller.device->IsConnected()) { |
|
|
|
return; |
|
|
|
} |
|
|
|
if (controller.device->IsConnected() && !controller.is_connected) { |
|
|
|
InitNewlyAddedController(aruid, npad_id); |
|
|
|
InitNewlyAddedController(kernel, aruid, npad_id); |
|
|
|
} |
|
|
|
|
|
|
|
// This function is unique to yuzu for the turbo buttons and motion to work properly
|
|
|
|
@ -482,7 +483,7 @@ void NPad::RequestPadStateUpdate(u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { |
|
|
|
void NPad::OnUpdate(Kernel::KernelCore& kernel, const Core::Timing::CoreTiming& core_timing) { |
|
|
|
if (ref_counter == 0) { |
|
|
|
return; |
|
|
|
} |
|
|
|
@ -524,7 +525,7 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
RequestPadStateUpdate(aruid, controller.device->GetNpadIdType()); |
|
|
|
RequestPadStateUpdate(kernel, aruid, controller.device->GetNpadIdType()); |
|
|
|
auto& pad_state = controller.npad_pad_state; |
|
|
|
auto& libnx_state = controller.npad_libnx_state; |
|
|
|
auto& trigger_state = controller.npad_trigger_state; |
|
|
|
@ -641,17 +642,17 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::SetSupportedNpadStyleSet(u64 aruid, Core::HID::NpadStyleSet supported_style_set) { |
|
|
|
Result NPad::SetSupportedNpadStyleSet(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadStyleSet supported_style_set) { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
hid_core.SetSupportedStyleTag({supported_style_set}); |
|
|
|
const Result result = npad_resource.SetSupportedNpadStyleSet(aruid, supported_style_set); |
|
|
|
if (result.IsSuccess()) { |
|
|
|
OnUpdate({}); |
|
|
|
OnUpdate(kernel, {}); |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::GetSupportedNpadStyleSet(u64 aruid, |
|
|
|
Result NPad::GetSupportedNpadStyleSet(Kernel::KernelCore& kernel, u64 aruid, |
|
|
|
Core::HID::NpadStyleSet& out_supported_style_set) const { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
const Result result = npad_resource.GetSupportedNpadStyleSet(out_supported_style_set, aruid); |
|
|
|
@ -664,8 +665,7 @@ Result NPad::GetSupportedNpadStyleSet(u64 aruid, |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::GetMaskedSupportedNpadStyleSet( |
|
|
|
u64 aruid, Core::HID::NpadStyleSet& out_supported_style_set) const { |
|
|
|
Result NPad::GetMaskedSupportedNpadStyleSet(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadStyleSet& out_supported_style_set) const { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
const Result result = |
|
|
|
npad_resource.GetMaskedSupportedNpadStyleSet(out_supported_style_set, aruid); |
|
|
|
@ -678,8 +678,7 @@ Result NPad::GetMaskedSupportedNpadStyleSet( |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::SetSupportedNpadIdType(u64 aruid, |
|
|
|
std::span<const Core::HID::NpadIdType> supported_npad_list) { |
|
|
|
Result NPad::SetSupportedNpadIdType(Kernel::KernelCore& kernel, u64 aruid, std::span<const Core::HID::NpadIdType> supported_npad_list) { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
if (supported_npad_list.size() > MaxSupportedNpadIdTypes) { |
|
|
|
return ResultInvalidArraySize; |
|
|
|
@ -688,7 +687,7 @@ Result NPad::SetSupportedNpadIdType(u64 aruid, |
|
|
|
Result result = npad_resource.SetSupportedNpadIdType(aruid, supported_npad_list); |
|
|
|
|
|
|
|
if (result.IsSuccess()) { |
|
|
|
OnUpdate({}); |
|
|
|
OnUpdate(kernel, {}); |
|
|
|
} |
|
|
|
|
|
|
|
return result; |
|
|
|
@ -704,22 +703,21 @@ Result NPad::GetNpadJoyHoldType(u64 aruid, NpadJoyHoldType& out_hold_type) const |
|
|
|
return npad_resource.GetNpadJoyHoldType(out_hold_type, aruid); |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::SetNpadHandheldActivationMode(u64 aruid, NpadHandheldActivationMode mode) { |
|
|
|
Result NPad::SetNpadHandheldActivationMode(Kernel::KernelCore& kernel, u64 aruid, NpadHandheldActivationMode mode) { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
Result result = npad_resource.SetNpadHandheldActivationMode(aruid, mode); |
|
|
|
if (result.IsSuccess()) { |
|
|
|
OnUpdate({}); |
|
|
|
OnUpdate(kernel, {}); |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::GetNpadHandheldActivationMode(u64 aruid, NpadHandheldActivationMode& out_mode) const { |
|
|
|
Result NPad::GetNpadHandheldActivationMode(Kernel::KernelCore& kernel, u64 aruid, NpadHandheldActivationMode& out_mode) const { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
return npad_resource.GetNpadHandheldActivationMode(out_mode, aruid); |
|
|
|
} |
|
|
|
|
|
|
|
bool NPad::SetNpadMode(u64 aruid, Core::HID::NpadIdType& new_npad_id, Core::HID::NpadIdType npad_id, |
|
|
|
NpadJoyDeviceType npad_device_type, NpadJoyAssignmentMode assignment_mode) { |
|
|
|
bool NPad::SetNpadMode(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadIdType& new_npad_id, Core::HID::NpadIdType npad_id, NpadJoyDeviceType npad_device_type, NpadJoyAssignmentMode assignment_mode) { |
|
|
|
if (!IsNpadIdValid(npad_id)) { |
|
|
|
LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id); |
|
|
|
return false; |
|
|
|
@ -741,17 +739,17 @@ bool NPad::SetNpadMode(u64 aruid, Core::HID::NpadIdType& new_npad_id, Core::HID: |
|
|
|
|
|
|
|
if (assignment_mode == NpadJoyAssignmentMode::Dual) { |
|
|
|
if (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconLeft) { |
|
|
|
DisconnectNpad(aruid, npad_id); |
|
|
|
DisconnectNpad(kernel, aruid, npad_id); |
|
|
|
controller.is_dual_left_connected = true; |
|
|
|
controller.is_dual_right_connected = false; |
|
|
|
UpdateControllerAt(aruid, Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); |
|
|
|
UpdateControllerAt(kernel, aruid, Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); |
|
|
|
return false; |
|
|
|
} |
|
|
|
if (controller.device->GetNpadStyleIndex() == Core::HID::NpadStyleIndex::JoyconRight) { |
|
|
|
DisconnectNpad(aruid, npad_id); |
|
|
|
DisconnectNpad(kernel, aruid, npad_id); |
|
|
|
controller.is_dual_left_connected = false; |
|
|
|
controller.is_dual_right_connected = true; |
|
|
|
UpdateControllerAt(aruid, Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); |
|
|
|
UpdateControllerAt(kernel, aruid, Core::HID::NpadStyleIndex::JoyconDual, npad_id, true); |
|
|
|
return false; |
|
|
|
} |
|
|
|
return false; |
|
|
|
@ -765,30 +763,30 @@ bool NPad::SetNpadMode(u64 aruid, Core::HID::NpadIdType& new_npad_id, Core::HID: |
|
|
|
} |
|
|
|
|
|
|
|
if (controller.is_dual_left_connected && !controller.is_dual_right_connected) { |
|
|
|
DisconnectNpad(aruid, npad_id); |
|
|
|
UpdateControllerAt(aruid, Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); |
|
|
|
DisconnectNpad(kernel, aruid, npad_id); |
|
|
|
UpdateControllerAt(kernel, aruid, Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); |
|
|
|
return false; |
|
|
|
} |
|
|
|
if (!controller.is_dual_left_connected && controller.is_dual_right_connected) { |
|
|
|
DisconnectNpad(aruid, npad_id); |
|
|
|
UpdateControllerAt(aruid, Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); |
|
|
|
DisconnectNpad(kernel, aruid, npad_id); |
|
|
|
UpdateControllerAt(kernel, aruid, Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
// We have two controllers connected to the same npad_id we need to split them
|
|
|
|
new_npad_id = hid_core.GetFirstDisconnectedNpadId(); |
|
|
|
auto& controller_2 = GetControllerFromNpadIdType(aruid, new_npad_id); |
|
|
|
DisconnectNpad(aruid, npad_id); |
|
|
|
DisconnectNpad(kernel, aruid, npad_id); |
|
|
|
if (npad_device_type == NpadJoyDeviceType::Left) { |
|
|
|
UpdateControllerAt(aruid, Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); |
|
|
|
UpdateControllerAt(kernel, aruid, Core::HID::NpadStyleIndex::JoyconLeft, npad_id, true); |
|
|
|
controller_2.is_dual_left_connected = false; |
|
|
|
controller_2.is_dual_right_connected = true; |
|
|
|
UpdateControllerAt(aruid, Core::HID::NpadStyleIndex::JoyconDual, new_npad_id, true); |
|
|
|
UpdateControllerAt(kernel, aruid, Core::HID::NpadStyleIndex::JoyconDual, new_npad_id, true); |
|
|
|
} else { |
|
|
|
UpdateControllerAt(aruid, Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); |
|
|
|
UpdateControllerAt(kernel, aruid, Core::HID::NpadStyleIndex::JoyconRight, npad_id, true); |
|
|
|
controller_2.is_dual_left_connected = true; |
|
|
|
controller_2.is_dual_right_connected = false; |
|
|
|
UpdateControllerAt(aruid, Core::HID::NpadStyleIndex::JoyconDual, new_npad_id, true); |
|
|
|
UpdateControllerAt(kernel, aruid, Core::HID::NpadStyleIndex::JoyconDual, new_npad_id, true); |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
@ -798,24 +796,22 @@ Result NPad::AcquireNpadStyleSetUpdateEventHandle(Kernel::KernelCore& kernel, u6 |
|
|
|
return npad_resource.AcquireNpadStyleSetUpdateEventHandle(kernel, aruid, out_event, npad_id); |
|
|
|
} |
|
|
|
|
|
|
|
void NPad::AddNewControllerAt(u64 aruid, Core::HID::NpadStyleIndex controller, |
|
|
|
Core::HID::NpadIdType npad_id) { |
|
|
|
UpdateControllerAt(aruid, controller, npad_id, true); |
|
|
|
void NPad::AddNewControllerAt(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadStyleIndex controller, Core::HID::NpadIdType npad_id) { |
|
|
|
UpdateControllerAt(kernel, aruid, controller, npad_id, true); |
|
|
|
} |
|
|
|
|
|
|
|
void NPad::UpdateControllerAt(u64 aruid, Core::HID::NpadStyleIndex type, |
|
|
|
Core::HID::NpadIdType npad_id, bool connected) { |
|
|
|
void NPad::UpdateControllerAt(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadStyleIndex type, Core::HID::NpadIdType npad_id, bool connected) { |
|
|
|
auto& controller = GetControllerFromNpadIdType(aruid, npad_id); |
|
|
|
if (!connected) { |
|
|
|
DisconnectNpad(aruid, npad_id); |
|
|
|
DisconnectNpad(kernel, aruid, npad_id); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
controller.device->SetNpadStyleIndex(type); |
|
|
|
InitNewlyAddedController(aruid, npad_id); |
|
|
|
InitNewlyAddedController(kernel, aruid, npad_id); |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::DisconnectNpad(u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
Result NPad::DisconnectNpad(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
if (!IsNpadIdValid(npad_id)) { |
|
|
|
LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id:{}", npad_id); |
|
|
|
return ResultInvalidNpadId; |
|
|
|
@ -858,7 +854,7 @@ Result NPad::DisconnectNpad(u64 aruid, Core::HID::NpadIdType npad_id) { |
|
|
|
controller.is_dual_right_connected = true; |
|
|
|
controller.is_connected = false; |
|
|
|
controller.device->Disconnect(); |
|
|
|
npad_resource.SignalStyleSetUpdateEvent(hid_core.kernel, aruid, npad_id); |
|
|
|
npad_resource.SignalStyleSetUpdateEvent(kernel, aruid, npad_id); |
|
|
|
WriteEmptyEntry(shared_memory); |
|
|
|
return ResultSuccess; |
|
|
|
} |
|
|
|
@ -891,8 +887,7 @@ Result NPad::ResetIsSixAxisSensorDeviceNewlyAssigned( |
|
|
|
return ResultSuccess; |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::MergeSingleJoyAsDualJoy(u64 aruid, Core::HID::NpadIdType npad_id_1, |
|
|
|
Core::HID::NpadIdType npad_id_2) { |
|
|
|
Result NPad::MergeSingleJoyAsDualJoy(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadIdType npad_id_1, Core::HID::NpadIdType npad_id_2) { |
|
|
|
if (!IsNpadIdValid(npad_id_1) || !IsNpadIdValid(npad_id_2)) { |
|
|
|
LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id_1:{}, npad_id_2:{}", npad_id_1, |
|
|
|
npad_id_2); |
|
|
|
@ -946,11 +941,11 @@ Result NPad::MergeSingleJoyAsDualJoy(u64 aruid, Core::HID::NpadIdType npad_id_1, |
|
|
|
} |
|
|
|
|
|
|
|
// Disconnect the joycons and connect them as dual joycon at the first index.
|
|
|
|
DisconnectNpad(aruid, npad_id_1); |
|
|
|
DisconnectNpad(aruid, npad_id_2); |
|
|
|
DisconnectNpad(kernel, aruid, npad_id_1); |
|
|
|
DisconnectNpad(kernel, aruid, npad_id_2); |
|
|
|
controller_1.is_dual_left_connected = true; |
|
|
|
controller_1.is_dual_right_connected = true; |
|
|
|
AddNewControllerAt(aruid, Core::HID::NpadStyleIndex::JoyconDual, npad_id_1); |
|
|
|
AddNewControllerAt(kernel, aruid, Core::HID::NpadStyleIndex::JoyconDual, npad_id_1); |
|
|
|
return ResultSuccess; |
|
|
|
} |
|
|
|
|
|
|
|
@ -974,11 +969,9 @@ Result NPad::StopLrAssignmentMode(u64 aruid) { |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::SwapNpadAssignment(u64 aruid, Core::HID::NpadIdType npad_id_1, |
|
|
|
Core::HID::NpadIdType npad_id_2) { |
|
|
|
Result NPad::SwapNpadAssignment(Kernel::KernelCore& kernel, u64 aruid, Core::HID::NpadIdType npad_id_1, Core::HID::NpadIdType npad_id_2) { |
|
|
|
if (!IsNpadIdValid(npad_id_1) || !IsNpadIdValid(npad_id_2)) { |
|
|
|
LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id_1:{}, npad_id_2:{}", npad_id_1, |
|
|
|
npad_id_2); |
|
|
|
LOG_ERROR(Service_HID, "Invalid NpadIdType npad_id_1:{}, npad_id_2:{}", npad_id_1, npad_id_2); |
|
|
|
return ResultInvalidNpadId; |
|
|
|
} |
|
|
|
if (npad_id_1 == Core::HID::NpadIdType::Handheld || |
|
|
|
@ -1000,20 +993,17 @@ Result NPad::SwapNpadAssignment(u64 aruid, Core::HID::NpadIdType npad_id_1, |
|
|
|
return ResultNpadNotConnected; |
|
|
|
} |
|
|
|
|
|
|
|
UpdateControllerAt(aruid, type_index_2, npad_id_1, is_connected_2); |
|
|
|
UpdateControllerAt(aruid, type_index_1, npad_id_2, is_connected_1); |
|
|
|
|
|
|
|
UpdateControllerAt(kernel, aruid, type_index_2, npad_id_1, is_connected_2); |
|
|
|
UpdateControllerAt(kernel, aruid, type_index_1, npad_id_2, is_connected_1); |
|
|
|
return ResultSuccess; |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::IsUnintendedHomeButtonInputProtectionEnabled(bool& out_is_enabled, u64 aruid, |
|
|
|
Core::HID::NpadIdType npad_id) const { |
|
|
|
Result NPad::IsUnintendedHomeButtonInputProtectionEnabled(bool& out_is_enabled, u64 aruid, Core::HID::NpadIdType npad_id) const { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
return npad_resource.GetHomeProtectionEnabled(out_is_enabled, aruid, npad_id); |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::EnableUnintendedHomeButtonInputProtection(u64 aruid, Core::HID::NpadIdType npad_id, |
|
|
|
bool is_enabled) { |
|
|
|
Result NPad::EnableUnintendedHomeButtonInputProtection(u64 aruid, Core::HID::NpadIdType npad_id, bool is_enabled) { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
return npad_resource.SetHomeProtectionEnabled(aruid, npad_id, is_enabled); |
|
|
|
} |
|
|
|
@ -1067,29 +1057,29 @@ Core::HID::NpadButton NPad::GetAndResetPressState() { |
|
|
|
return static_cast<Core::HID::NpadButton>(press_state.exchange(0)); |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::ApplyNpadSystemCommonPolicy(u64 aruid) { |
|
|
|
Result NPad::ApplyNpadSystemCommonPolicy(Kernel::KernelCore& kernel, u64 aruid) { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
const Result result = npad_resource.ApplyNpadSystemCommonPolicy(aruid, false); |
|
|
|
if (result.IsSuccess()) { |
|
|
|
OnUpdate({}); |
|
|
|
OnUpdate(kernel, {}); |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::ApplyNpadSystemCommonPolicyFull(u64 aruid) { |
|
|
|
Result NPad::ApplyNpadSystemCommonPolicyFull(Kernel::KernelCore& kernel, u64 aruid) { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
const Result result = npad_resource.ApplyNpadSystemCommonPolicy(aruid, true); |
|
|
|
if (result.IsSuccess()) { |
|
|
|
OnUpdate({}); |
|
|
|
OnUpdate(kernel, {}); |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
Result NPad::ClearNpadSystemCommonPolicy(u64 aruid) { |
|
|
|
Result NPad::ClearNpadSystemCommonPolicy(Kernel::KernelCore& kernel, u64 aruid) { |
|
|
|
std::scoped_lock lock{mutex}; |
|
|
|
const Result result = npad_resource.ClearNpadSystemCommonPolicy(aruid); |
|
|
|
if (result.IsSuccess()) { |
|
|
|
OnUpdate({}); |
|
|
|
OnUpdate(kernel, {}); |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
|