From 18eca560f01c1ca2ab05f7f18addecb6b938c24d Mon Sep 17 00:00:00 2001 From: Zarithya Date: Sat, 29 Nov 2025 16:03:08 -0800 Subject: [PATCH] Clear Wiimote active list on poweroff --- gc/wiiuse/wiiuse.h | 4 ++-- libogc/system.c | 12 ++++++++++-- wiiuse/io_wii.c | 4 ++-- wiiuse/wpad.c | 40 +++++++++++++++++++++++++++++++++++++--- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/gc/wiiuse/wiiuse.h b/gc/wiiuse/wiiuse.h index b394485bf..a5c515015 100644 --- a/gc/wiiuse/wiiuse.h +++ b/gc/wiiuse/wiiuse.h @@ -720,8 +720,8 @@ WIIUSE_EXPORT extern const char* wiiuse_version(); #ifndef GEKKO WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); #else -WIIUSE_EXPORT extern int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)); -WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)); +WIIUSE_EXPORT extern int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, const u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)); +WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, const u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb); WIIUSE_EXPORT extern void wiiuse_sensorbar_enable(int enable); #endif diff --git a/libogc/system.c b/libogc/system.c index 41bff36c7..6d48aef50 100644 --- a/libogc/system.c +++ b/libogc/system.c @@ -205,6 +205,7 @@ extern void __reset(u32 reset_code); extern u32 __IPC_ClntInit(void); extern u32 __PADDisableRecalibration(s32 disable); +extern u32 __WPADClearActiveList(void); extern void __console_init_ex(void *conbuffer,int tgt_xstart,int tgt_ystart,int tgt_stride,int con_xres,int con_yres,int con_stride); @@ -1189,8 +1190,15 @@ void SYS_ResetSystem(s32 reset,u32 reset_code,s32 force_menu) __dsp_shutdown(); - if(reset==SYS_SHUTDOWN) { - ret = __PADDisableRecalibration(TRUE); + switch(reset) { + case SYS_SHUTDOWN: + ret = __PADDisableRecalibration(TRUE); + break; + case SYS_POWEROFF: + case SYS_POWEROFF_STANDBY: + case SYS_POWEROFF_IDLE: + __WPADClearActiveList(); + break; } while(__call_resetfuncs(FALSE)==0); diff --git a/wiiuse/io_wii.c b/wiiuse/io_wii.c index 6c964fbff..75b43a2d3 100644 --- a/wiiuse/io_wii.c +++ b/wiiuse/io_wii.c @@ -161,7 +161,7 @@ void __wiiuse_sensorbar_enable(int enable) IRQ_Restore(level); } -int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)) +int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, const u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)) { s32 err; @@ -205,7 +205,7 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name return 0; } -int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)) +int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, const u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err)) { s32 err; diff --git a/wiiuse/wpad.c b/wiiuse/wpad.c index 2b812b15f..7c4b37a38 100644 --- a/wiiuse/wpad.c +++ b/wiiuse/wpad.c @@ -137,6 +137,40 @@ static s32 __wpad_onreset(s32 final) return 1; } +u32 __WPADClearActiveList(void) +{ + u32 level,ret; + + _CPU_ISR_Disable(level); + + if(CONF_GetPadDevices(&__wpad_devs) < 0) { + ret = 1; + goto err; + } + + __wpads_active = 0; + __wpads_used = 0; + memset(__wpad_devs.active,0,sizeof(__wpad_devs.active)); + memset(&__wpad_guests,0,sizeof(__wpad_guests)); + memset(__wpad_guest_keys,0,sizeof(__wpad_guest_keys)); + + if(CONF_SetPadDevices(&__wpad_devs) < 0) { + ret = 1; + goto err; + } + + if(CONF_SetPadGuestDevices(&__wpad_guests) < 0) { + ret = 1; + goto err; + } + + ret = CONF_SaveChanges(); + +err: + _CPU_ISR_Restore(level); + return ret; +} + static void __wpad_def_powcb(s32 chan) { SYS_DoPowerCB(); @@ -939,7 +973,7 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty int slot = WPAD_MAX_DEVICES; int confslot = CONF_PAD_MAX_ACTIVE; struct bd_addr bdaddr; - u8 *name = NULL; + const u8 *name = NULL; WIIUSE_DEBUG("__wpad_connreqCB"); _CPU_ISR_Disable(level); @@ -950,7 +984,7 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty confslot = GetActiveSlot(pad_addr); if (confslot < CONF_PAD_MAX_ACTIVE) { BD_ADDR_FROM_BYTES(&bdaddr,__wpad_devs.active[confslot].bdaddr); - name = (u8 *)__wpad_devs.active[confslot].name; + name = (const u8 *)__wpad_devs.active[confslot].name; WIIUSE_DEBUG("Active pad '%s' found in slot %d", name, confslot); if (!(__wpads_used & (1<