diff --git a/src/citron/main.cpp b/src/citron/main.cpp index dd0d77ab5..4c3a2dbed 100644 --- a/src/citron/main.cpp +++ b/src/citron/main.cpp @@ -5573,6 +5573,11 @@ void GMainWindow::UpdateUISettings() { } void GMainWindow::UpdateInputDrivers() { + // Do not process ANY controller input until emulation is fully running + if (!emulation_running) { + return; + } + if (!input_subsystem) { return; } diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index 5d3b8a117..0e2c5d899 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-FileCopyrightText: 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include @@ -46,10 +47,14 @@ NPad::NPad(Core::HID::HIDCore& hid_core_, KernelHelpers::ServiceContext& service } NPad::~NPad() { + // Iterate over ALL aruids and ALL controllers to delete every callback for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; ++aruid_index) { for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) { auto& controller = controller_data[aruid_index][i]; - controller.device->DeleteCallback(controller.callback_key); + if (controller.device && controller.callback_key != -1) { + controller.device->DeleteCallback(controller.callback_key); + controller.callback_key = -1; // Prevent double deletion + } } } }