Block on VPADRead() while the plugin menu is open in Hyrule Warriors. (#109)
Some checks are pending
CI-Release / clang-format (push) Waiting to run
CI-Release / build-binary (push) Blocked by required conditions
CI-Release / deploy-binary (push) Blocked by required conditions

* Block on `VPADRead()` while the plugin menu is open.

* Trying to please clang-format.

* Block `VPADRead()` only for Hyrule Warriors.

---------

Co-authored-by: Daniel K. O. (dkosmari) <none@none>
This commit is contained in:
Daniel K. O. 2025-02-14 13:59:06 -03:00 committed by GitHub
parent 9aa660a302
commit c4ba7030d9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 15 additions and 0 deletions

View File

@ -8,8 +8,11 @@
#include "plugin/SectionInfo.h"
#include "utils/config/ConfigUtils.h"
#include <coreinit/cache.h>
#include <coreinit/core.h>
#include <coreinit/messagequeue.h>
#include <coreinit/time.h>
#include <coreinit/title.h>
#include <padscore/wpad.h>
#include <vpad/input.h>
@ -21,9 +24,11 @@ DECL_FUNCTION(void, GX2SwapScanBuffers, void) {
if (sWantsToOpenConfigMenu && !gConfigMenuOpened) {
gConfigMenuOpened = true;
OSMemoryBarrier();
ConfigUtils::openConfigMenu();
gConfigMenuOpened = false;
sWantsToOpenConfigMenu = false;
OSMemoryBarrier();
}
}
@ -89,6 +94,14 @@ DECL_FUNCTION(int32_t, VPADRead, int32_t chan, VPADStatus *buffer, uint32_t buff
if (gConfigMenuOpened) {
// Ignore reading vpad input only from other threads if the config menu is opened
if (OSGetCurrentThread() != gOnlyAcceptFromThread) {
// Quick fix for Hyrule Warriors: block VPADRead() in non-rendering threads.
switch (OSGetTitleID()) {
case 0x00050000'1017CD00: // Hyrule Warriors JPN
case 0x00050000'1017D800: // Hyrule Warriors USA
case 0x00050000'1017D900: // Hyrule Warriors EUR
while (gConfigMenuOpened)
OSSleepTicks(OSMillisecondsToTicks(10));
}
return 0;
}
}

View File

@ -20,6 +20,7 @@
#include <wups/config.h>
#include <wups/hooks.h>
#include <coreinit/cache.h>
#include <coreinit/title.h>
#include <sysapp/launch.h>
@ -166,6 +167,7 @@ void ConfigUtils::displayMenu() {
gOnlyAcceptFromThread = OSGetCurrentThread();
ConfigSubState subStateReturnValue = SUB_STATE_ERROR;
OSMemoryBarrier();
while (true) {
startTime = OSGetTime();
if (gConfigMenuShouldClose) {