void CMenu::ButtonsHeld() { gc_btnsHeld = 0; for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--) { wii_btnsHeld[chan] = WPAD_ButtonsHeld(chan); gc_btnsHeld |= PAD_ButtonsHeld(chan); wupc_btnsHeld[chan] = WUPC_ButtonsHeld(chan); } }
u32 ButtonsHold(void) { int i; u32 buttons = 0; WUPC_UpdateButtonStats(); WPAD_ScanPads(); PAD_ScanPads(); for (i = 3; i >= 0; i--) { buttons |= WUPC_ButtonsHeld(i); buttons |= PAD_ButtonsHeld(i); buttons |= WPAD_ButtonsHeld(i); } return buttons; }
void Focus::updateFocus() { int focusDirection = 0; int buttonsDown = 0; #ifdef HW_RVL WPADData* wiiPad = Input::getInstance().getWpad(); #endif // PADStatus* gcPad = Input::getInstance().getPad(); if (!focusActive) return; if (frameSwitch) { if(primaryFocusOwner) primaryFocusOwner->setFocus(false); if (currentFrame) primaryFocusOwner = currentFrame->getDefaultFocus(); else primaryFocusOwner = NULL; frameSwitch = false; } if(clearInput) { for (int i=0; i<4; i++) { previousButtonsGC[i] = PAD_ButtonsHeld(i); #ifdef HW_RVL previousButtonsWii[i] = wiiPad[i].btns_h; previousButtonsWiiUPro[i] = WUPC_ButtonsHeld(i); #endif } clearInput = false; } for (int i=0; i<4; i++) { u32 currentButtonsWiiUPro = WUPC_ButtonsHeld(i); u16 currentButtonsGC = PAD_ButtonsHeld(i); if (currentButtonsGC ^ previousButtonsGC[i]) { u16 currentButtonsDownGC = (currentButtonsGC ^ previousButtonsGC[i]) & currentButtonsGC; switch (currentButtonsDownGC & 0xf) { case PAD_BUTTON_LEFT: focusDirection = DIRECTION_LEFT; break; case PAD_BUTTON_RIGHT: focusDirection = DIRECTION_RIGHT; break; case PAD_BUTTON_DOWN: focusDirection = DIRECTION_DOWN; break; case PAD_BUTTON_UP: focusDirection = DIRECTION_UP; break; default: focusDirection = DIRECTION_NONE; } if (currentButtonsDownGC & PAD_BUTTON_A) buttonsDown |= ACTION_SELECT; if (currentButtonsDownGC & PAD_BUTTON_B) buttonsDown |= ACTION_BACK; if (freezeAction) { focusDirection = DIRECTION_NONE; buttonsDown = 0; } if (primaryFocusOwner) primaryFocusOwner = primaryFocusOwner->updateFocus(focusDirection,buttonsDown); else primaryFocusOwner = currentFrame->updateFocus(focusDirection,buttonsDown); previousButtonsGC[i] = currentButtonsGC; break; } #ifdef HW_RVL else if (wiiPad[i].btns_h ^ previousButtonsWii[i]) { u32 currentButtonsDownWii = (wiiPad[i].btns_h ^ previousButtonsWii[i]) & wiiPad[i].btns_h; if (wiiPad[i].exp.type == WPAD_EXP_CLASSIC) { switch (currentButtonsDownWii & 0xc0030000) { case WPAD_CLASSIC_BUTTON_LEFT: focusDirection = DIRECTION_LEFT; break; case WPAD_CLASSIC_BUTTON_RIGHT: focusDirection = DIRECTION_RIGHT; break; case WPAD_CLASSIC_BUTTON_DOWN: focusDirection = DIRECTION_DOWN; break; case WPAD_CLASSIC_BUTTON_UP: focusDirection = DIRECTION_UP; break; default: focusDirection = DIRECTION_NONE; } } else { switch (currentButtonsDownWii & 0xf00) { case WPAD_BUTTON_LEFT: focusDirection = DIRECTION_LEFT; break; case WPAD_BUTTON_RIGHT: focusDirection = DIRECTION_RIGHT; break; case WPAD_BUTTON_DOWN: focusDirection = DIRECTION_DOWN; break; case WPAD_BUTTON_UP: focusDirection = DIRECTION_UP; break; default: focusDirection = DIRECTION_NONE; } } if (currentButtonsDownWii & (WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A)) buttonsDown |= ACTION_SELECT; if (currentButtonsDownWii & (WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B)) buttonsDown |= ACTION_BACK; if (freezeAction) { focusDirection = DIRECTION_NONE; buttonsDown = 0; } if (primaryFocusOwner) primaryFocusOwner = primaryFocusOwner->updateFocus(focusDirection,buttonsDown); else primaryFocusOwner = currentFrame->updateFocus(focusDirection,buttonsDown); previousButtonsWii[i] = wiiPad[i].btns_h; break; } else if (currentButtonsWiiUPro ^ previousButtonsWiiUPro[i]) { switch (currentButtonsWiiUPro & 0xc0030000) { case WPAD_CLASSIC_BUTTON_LEFT: focusDirection = DIRECTION_LEFT; break; case WPAD_CLASSIC_BUTTON_RIGHT: focusDirection = DIRECTION_RIGHT; break; case WPAD_CLASSIC_BUTTON_DOWN: focusDirection = DIRECTION_DOWN; break; case WPAD_CLASSIC_BUTTON_UP: focusDirection = DIRECTION_UP; break; default: focusDirection = DIRECTION_NONE; } if (currentButtonsWiiUPro & WPAD_CLASSIC_BUTTON_A) buttonsDown |= ACTION_SELECT; if (currentButtonsWiiUPro & WPAD_CLASSIC_BUTTON_B) buttonsDown |= ACTION_BACK; if (freezeAction) { focusDirection = DIRECTION_NONE; buttonsDown = 0; } if (primaryFocusOwner) primaryFocusOwner = primaryFocusOwner->updateFocus(focusDirection, buttonsDown); else primaryFocusOwner = currentFrame->updateFocus(focusDirection, buttonsDown); previousButtonsWiiUPro[i] = currentButtonsWiiUPro; break; } #endif } }
/* Big thanks to JoostinOnline for the new controller code */ u32 DetectInput(u8 DownOrHeld) { u32 pressed = 0; u32 gcpressed = 0; VIDEO_WaitVSync(); // WiiMote, Classic Controller and Wii U Pro Controller take precedence over the GCN Controller to save time if (WUPC_UpdateButtonStats() > WPAD_ERR_NONE) { if (DownOrHeld == DI_BUTTONS_DOWN) { pressed = WUPC_ButtonsDown(0) | WUPC_ButtonsDown(1) | WUPC_ButtonsDown(2) | WUPC_ButtonsDown(3); // Store pressed buttons } else { pressed = WUPC_ButtonsHeld(0) | WUPC_ButtonsHeld(1) | WUPC_ButtonsHeld(2) | WUPC_ButtonsHeld(3); // Store held buttons } } else if (WPAD_ScanPads() > WPAD_ERR_NONE) { if (DownOrHeld == DI_BUTTONS_DOWN) { pressed = WPAD_ButtonsDown(0) | WPAD_ButtonsDown(1) | WPAD_ButtonsDown(2) | WPAD_ButtonsDown(3); // Store pressed buttons } else { pressed = WPAD_ButtonsHeld(0) | WPAD_ButtonsHeld(1) | WPAD_ButtonsHeld(2) | WPAD_ButtonsHeld(3); // Store held buttons } } // Convert to WiiMote values if (pressed & WPAD_CLASSIC_BUTTON_ZR) pressed |= WPAD_BUTTON_PLUS; if (pressed & WPAD_CLASSIC_BUTTON_ZL) pressed |= WPAD_BUTTON_MINUS; if (pressed & WPAD_CLASSIC_BUTTON_PLUS) pressed |= WPAD_BUTTON_PLUS; if (pressed & WPAD_CLASSIC_BUTTON_MINUS) pressed |= WPAD_BUTTON_MINUS; if (pressed & WPAD_CLASSIC_BUTTON_A) pressed |= WPAD_BUTTON_A; if (pressed & WPAD_CLASSIC_BUTTON_B) pressed |= WPAD_BUTTON_B; if (pressed & WPAD_CLASSIC_BUTTON_X) pressed |= WPAD_BUTTON_2; if (pressed & WPAD_CLASSIC_BUTTON_Y) pressed |= WPAD_BUTTON_1; if (pressed & WPAD_CLASSIC_BUTTON_HOME) pressed |= WPAD_BUTTON_HOME; if (pressed & WPAD_CLASSIC_BUTTON_UP) pressed |= WPAD_BUTTON_UP; if (pressed & WPAD_CLASSIC_BUTTON_DOWN) pressed |= WPAD_BUTTON_DOWN; if (pressed & WPAD_CLASSIC_BUTTON_LEFT) pressed |= WPAD_BUTTON_LEFT; if (pressed & WPAD_CLASSIC_BUTTON_RIGHT) pressed |= WPAD_BUTTON_RIGHT; // Return WiiMote / Classic Controller / Wii U Pro Controller values if (pressed) return pressed; // No buttons on the WiiMote or Classic Controller were pressed if (PAD_ScanPads() > PAD_ERR_NONE) { if (DownOrHeld == DI_BUTTONS_DOWN) { gcpressed = PAD_ButtonsDown(0) | PAD_ButtonsDown(1) | PAD_ButtonsDown(2) | PAD_ButtonsDown(3); // Store pressed buttons } else { gcpressed = PAD_ButtonsHeld(0) | PAD_ButtonsHeld(1) | PAD_ButtonsHeld(2) | PAD_ButtonsHeld(3); // Store held buttons } // Convert to WiiMote values if (gcpressed & PAD_TRIGGER_R) pressed |= WPAD_BUTTON_PLUS; if (gcpressed & PAD_TRIGGER_L) pressed |= WPAD_BUTTON_MINUS; if (gcpressed & PAD_BUTTON_A) pressed |= WPAD_BUTTON_A; if (gcpressed & PAD_BUTTON_B) pressed |= WPAD_BUTTON_B; if (gcpressed & PAD_BUTTON_X) pressed |= WPAD_BUTTON_2; if (gcpressed & PAD_BUTTON_Y) pressed |= WPAD_BUTTON_1; if (gcpressed & PAD_BUTTON_MENU) pressed |= WPAD_BUTTON_HOME; if (gcpressed & PAD_BUTTON_UP) pressed |= WPAD_BUTTON_UP; if (gcpressed & PAD_BUTTON_DOWN) pressed |= WPAD_BUTTON_DOWN; if (gcpressed & PAD_BUTTON_LEFT) pressed |= WPAD_BUTTON_LEFT; if (gcpressed & PAD_BUTTON_RIGHT) pressed |= WPAD_BUTTON_RIGHT; } return pressed; }