From fc82185bc6dc63db2e95f13ebbd7246029813626 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 21 Aug 2023 19:45:54 +1000 Subject: [PATCH] Simplify input handling for consoles by unifying game and launcher input handling --- src/LScreens.c | 9 +++-- src/Window_3DS.c | 21 ++--------- src/Window_Dreamcast.c | 22 ++---------- src/Window_GCWii.c | 81 ++++++++++-------------------------------- src/Window_PSP.c | 43 +++++++++------------- src/Window_PSVita.c | 27 +++----------- src/Window_Xbox.c | 20 ++--------- 7 files changed, 52 insertions(+), 171 deletions(-) diff --git a/src/LScreens.c b/src/LScreens.c index b42d492b8..eaa4f5808 100644 --- a/src/LScreens.c +++ b/src/LScreens.c @@ -18,7 +18,10 @@ #include "Utils.h" #include "LBackend.h" #include "Http.h" + #define LAYOUTS static const struct LLayout +#define IsEnterButton(btn) (Input_IsEnterButton(btn) || btn == CCPAD_A) +#define IsEscapeButton(btn) (Input_IsEscapeButton(btn) || btn == CCPAD_B) /*########################################################################################################################* *---------------------------------------------------------Screen base-----------------------------------------------------* @@ -81,7 +84,7 @@ static void LScreen_CycleSelected(struct LScreen* s, int dir) { } static void LScreen_KeyDown(struct LScreen* s, int key, cc_bool was) { - if (Input_IsEnterButton(key)) { + if (IsEnterButton(key)) { /* Shouldn't multi click when holding down Enter */ if (was) return; @@ -100,13 +103,13 @@ static void LScreen_KeyDown(struct LScreen* s, int key, cc_bool was) { if (s->selectedWidget->VTABLE->KeyDown(s->selectedWidget, key, was)) return; } - if (key == CCKEY_TAB) { + if (key == CCKEY_TAB || key == CCPAD_X) { LScreen_CycleSelected(s, Input_IsShiftPressed() ? -1 : 1); } else if (Input_IsUpButton(key)) { LScreen_CycleSelected(s, -1); } else if (Input_IsDownButton(key)) { LScreen_CycleSelected(s, 1); - } else if (Input_IsEscapeButton(key) && s->onEscapeWidget) { + } else if (IsEscapeButton(key) && s->onEscapeWidget) { s->onEscapeWidget->OnClick(s->onEscapeWidget); } } diff --git a/src/Window_3DS.c b/src/Window_3DS.c index 67b40c2ac..66f382db6 100644 --- a/src/Window_3DS.c +++ b/src/Window_3DS.c @@ -76,7 +76,7 @@ void Window_Close(void) { /*########################################################################################################################* *----------------------------------------------------Input processing-----------------------------------------------------* *#########################################################################################################################*/ -static void HandleButtons_Game(u32 mods) { +static void HandleButtons(u32 mods) { Input_SetNonRepeatable(CCPAD_L, mods & KEY_L); Input_SetNonRepeatable(CCPAD_R, mods & KEY_R); @@ -97,18 +97,6 @@ static void HandleButtons_Game(u32 mods) { Input_SetNonRepeatable(CCPAD_ZR, mods & KEY_ZR); } -static void HandleButtons_Launcher(u32 mods) { - Input_SetNonRepeatable(CCKEY_ENTER, mods & KEY_A); - Input_SetNonRepeatable(CCKEY_ESCAPE, mods & KEY_B); - // fake tab with down for Launcher - //Input_SetNonRepeatable(CCKEY_TAB, mods & KEY_DDOWN); - - Input_SetNonRepeatable(CCPAD_LEFT, mods & KEY_DLEFT); - Input_SetNonRepeatable(CCPAD_RIGHT, mods & KEY_DRIGHT); - Input_SetNonRepeatable(CCPAD_UP, mods & KEY_DUP); - Input_SetNonRepeatable(CCPAD_DOWN, mods & KEY_DDOWN); -} - static void ProcessJoystickInput(circlePosition* pos, double delta) { float scale = (delta * 60.0) / 8.0f; @@ -118,6 +106,7 @@ static void ProcessJoystickInput(circlePosition* pos, double delta) { Event_RaiseRawMove(&PointerEvents.RawMoved, pos->dx * scale, -pos->dy * scale); } + static void ProcessTouchInput(int mods) { touchPosition touch; hidTouchRead(&touch); @@ -147,11 +136,7 @@ void Window_ProcessEvents(double delta) { } u32 mods = hidKeysDown() | hidKeysHeld(); - if (launcherMode) { - HandleButtons_Launcher(mods); - } else { - HandleButtons_Game(mods); - } + HandleButtons(mods); Input_SetNonRepeatable(CCMOUSE_L, mods & KEY_TOUCH); ProcessTouchInput(mods); diff --git a/src/Window_Dreamcast.c b/src/Window_Dreamcast.c index 601b5e368..8ad9d1bd8 100644 --- a/src/Window_Dreamcast.c +++ b/src/Window_Dreamcast.c @@ -59,17 +59,7 @@ void Window_Close(void) { /*########################################################################################################################* *----------------------------------------------------Input processing-----------------------------------------------------* *#########################################################################################################################*/ -static void HandleButtons_Launcher(int mods) { - Input_SetNonRepeatable(CCPAD_START, mods & CONT_A); - Input_SetNonRepeatable(CCPAD_SELECT, mods & CONT_B); - - Input_SetNonRepeatable(CCPAD_LEFT, mods & CONT_DPAD_LEFT); - Input_SetNonRepeatable(CCPAD_RIGHT, mods & CONT_DPAD_RIGHT); - Input_SetNonRepeatable(CCPAD_UP, mods & CONT_DPAD_UP); - Input_SetNonRepeatable(CCPAD_DOWN, mods & CONT_DPAD_DOWN); -} - -static void HandleButtons_Game(int mods) { +static void HandleButtons(int mods) { // TODO CONT_Z Input_SetNonRepeatable(CCPAD_A, mods & CONT_A); @@ -110,14 +100,8 @@ static void ProcessControllerInput(void) { state = (cont_state_t*)maple_dev_status(cont); if (!state) return; - int mods = state->buttons; - if (launcherMode) { - HandleButtons_Launcher(mods); - } else { - HandleButtons_Game(mods); - HandleController(state); - } - + HandleButtons(state->buttons); + HandleController(state); } void Window_ProcessEvents(double delta) { diff --git a/src/Window_GCWii.c b/src/Window_GCWii.c index 97cb24703..4603698a5 100644 --- a/src/Window_GCWii.c +++ b/src/Window_GCWii.c @@ -94,20 +94,6 @@ void Window_Close(void) { *#########################################################################################################################*/ static PADStatus gc_pad; -static void ProcessPAD_Launcher(void) { - int mods = gc_pad.button; - - Input_SetNonRepeatable(CCKEY_ENTER, mods & PAD_BUTTON_A); - Input_SetNonRepeatable(CCKEY_ESCAPE, mods & PAD_BUTTON_B); - // fake tab with down for Launcher - //Input_SetNonRepeatable(CCKEY_TAB, mods & PAD_BUTTON_DOWN); - - Input_SetNonRepeatable(CCPAD_LEFT, mods & PAD_BUTTON_LEFT); - Input_SetNonRepeatable(CCPAD_RIGHT, mods & PAD_BUTTON_RIGHT); - Input_SetNonRepeatable(CCPAD_UP, mods & PAD_BUTTON_UP); - Input_SetNonRepeatable(CCPAD_DOWN, mods & PAD_BUTTON_DOWN); -} - static void ProcessPAD_LeftJoystick(void) { int dx = gc_pad.stickX; int dy = gc_pad.stickY; @@ -133,14 +119,8 @@ static void ProcessPAD_RightJoystick(double delta) { Event_RaiseRawMove(&PointerEvents.RawMoved, dx * scale, -dy * scale); } -static void ProcessPAD_Game(double delta) { +static void ProcessPAD_Buttons(void) { int mods = gc_pad.button; - - if (Input.RawMode) { - ProcessPAD_LeftJoystick(); - ProcessPAD_RightJoystick(delta); - } - Input_SetNonRepeatable(CCPAD_L, mods & PAD_TRIGGER_L); Input_SetNonRepeatable(CCPAD_R, mods & PAD_TRIGGER_R); @@ -152,10 +132,10 @@ static void ProcessPAD_Game(double delta) { Input_SetNonRepeatable(CCPAD_START, mods & PAD_BUTTON_START); Input_SetNonRepeatable(CCPAD_SELECT, mods & PAD_TRIGGER_Z); - Input_SetNonRepeatable(CCPAD_LEFT, mods & PAD_BUTTON_LEFT); - Input_SetNonRepeatable(CCPAD_RIGHT, mods & PAD_BUTTON_RIGHT); - Input_SetNonRepeatable(CCPAD_UP, mods & PAD_BUTTON_UP); - Input_SetNonRepeatable(CCPAD_DOWN, mods & PAD_BUTTON_DOWN); + Input_SetNonRepeatable(CCPAD_LEFT, mods & PAD_BUTTON_LEFT); + Input_SetNonRepeatable(CCPAD_RIGHT, mods & PAD_BUTTON_RIGHT); + Input_SetNonRepeatable(CCPAD_UP, mods & PAD_BUTTON_UP); + Input_SetNonRepeatable(CCPAD_DOWN, mods & PAD_BUTTON_DOWN); } static void ProcessPADInput(double delta) { @@ -171,10 +151,10 @@ static void ProcessPADInput(double delta) { return; // not connected, still busy, etc } - if (launcherMode) { - ProcessPAD_Launcher(); - } else { - ProcessPAD_Game(delta); + ProcessPAD_Buttons(); + if (Input.RawMode) { + ProcessPAD_LeftJoystick(); + ProcessPAD_RightJoystick(delta); } } @@ -248,17 +228,7 @@ static int dragCurX, dragCurY; static int dragStartX, dragStartY; static cc_bool dragActive; -static void ProcessWPAD_Launcher(int mods) { - Input_SetNonRepeatable(CCKEY_ENTER, mods & WPAD_BUTTON_A); - Input_SetNonRepeatable(CCKEY_ESCAPE, mods & WPAD_BUTTON_B); - - Input_SetNonRepeatable(CCPAD_LEFT, mods & WPAD_BUTTON_LEFT); - Input_SetNonRepeatable(CCPAD_RIGHT, mods & WPAD_BUTTON_RIGHT); - Input_SetNonRepeatable(CCPAD_UP, mods & WPAD_BUTTON_UP); - Input_SetNonRepeatable(CCPAD_DOWN, mods & WPAD_BUTTON_DOWN); -} - -static void ProcessWPAD_Game(int mods) { +static void ProcessWPAD_Buttons(int mods) { Input_SetNonRepeatable(CCPAD_L, mods & WPAD_BUTTON_1); Input_SetNonRepeatable(CCPAD_R, mods & WPAD_BUTTON_2); @@ -336,17 +306,7 @@ static void ProcessClassic_RightJoystick(struct joystick_t* js, double delta) { Event_RaiseRawMove(&PointerEvents.RawMoved, dx * scale, -dy * scale); } -static void ProcessClassic_Launcher(int mods) { - Input_SetNonRepeatable(CCPAD_START, mods & CLASSIC_CTRL_BUTTON_A); - Input_SetNonRepeatable(CCPAD_SELECT, mods & CLASSIC_CTRL_BUTTON_B); - - Input_SetNonRepeatable(CCPAD_LEFT, mods & CLASSIC_CTRL_BUTTON_LEFT); - Input_SetNonRepeatable(CCPAD_RIGHT, mods & CLASSIC_CTRL_BUTTON_RIGHT); - Input_SetNonRepeatable(CCPAD_UP, mods & CLASSIC_CTRL_BUTTON_UP); - Input_SetNonRepeatable(CCPAD_DOWN, mods & CLASSIC_CTRL_BUTTON_DOWN); -} - -static void ProcessClassic_Game(int mods, double delta, classic_ctrl_t* ctrls) { +static void ProcessClassicButtons(int mods) { Input_SetNonRepeatable(CCPAD_L, mods & CLASSIC_CTRL_BUTTON_FULL_L); Input_SetNonRepeatable(CCPAD_R, mods & CLASSIC_CTRL_BUTTON_FULL_R); @@ -365,22 +325,17 @@ static void ProcessClassic_Game(int mods, double delta, classic_ctrl_t* ctrls) { Input_SetNonRepeatable(CCPAD_ZL, mods & CLASSIC_CTRL_BUTTON_ZL); Input_SetNonRepeatable(CCPAD_ZR, mods & CLASSIC_CTRL_BUTTON_ZR); - - if (Input.RawMode) { - ProcessClassic_LeftJoystick( &ctrls->ljs); - ProcessClassic_RightJoystick(&ctrls->rjs, delta); - } } static void ProcessClassicInput(double delta) { WPADData* wd = WPAD_Data(0); classic_ctrl_t ctrls = wd->exp.classic; int mods = ctrls.btns | ctrls.btns_held; - - if (launcherMode) { - ProcessClassic_Launcher(mods); - } else { - ProcessClassic_Game(mods, delta, &ctrls); + + ProcessClassicButtons(mods); + if (Input.RawMode) { + ProcessClassic_LeftJoystick(&ctrls.ljs); + ProcessClassic_RightJoystick(&ctrls.rjs, delta); } } @@ -407,11 +362,11 @@ static void ProcessWPADInput(double delta) { if (type == WPAD_EXP_CLASSIC) { ProcessClassicInput(delta); } else if (launcherMode) { - ProcessWPAD_Launcher(mods); + ProcessWPAD_Buttons(mods); } else if (type == WPAD_EXP_NUNCHUK) { ProcessNunchuck_Game(mods, delta); } else { - ProcessWPAD_Game(mods); + ProcessWPAD_Buttons(mods); } int x, y; diff --git a/src/Window_PSP.c b/src/Window_PSP.c index 997ac8aea..3c463f49f 100644 --- a/src/Window_PSP.c +++ b/src/Window_PSP.c @@ -65,19 +65,7 @@ void Window_Close(void) { /*########################################################################################################################* *----------------------------------------------------Input processing-----------------------------------------------------* *#########################################################################################################################*/ -static void HandleButtons_Launcher(int mods) { - Input_SetNonRepeatable(CCKEY_ENTER, mods & PSP_CTRL_TRIANGLE); - Input_SetNonRepeatable(CCKEY_ESCAPE, mods & PSP_CTRL_SQUARE); - // fake tab with PSP_CTRL_SQUARE for Launcher too - //Input_SetNonRepeatable(CCKEY_TAB, mods & PSP_CTRL_SQUARE); - - Input_SetNonRepeatable(CCPAD_LEFT, mods & PSP_CTRL_LEFT); - Input_SetNonRepeatable(CCPAD_RIGHT, mods & PSP_CTRL_RIGHT); - Input_SetNonRepeatable(CCPAD_UP, mods & PSP_CTRL_UP); - Input_SetNonRepeatable(CCPAD_DOWN, mods & PSP_CTRL_DOWN); -} - -static void HandleButtons_Game(int mods) { +static void HandleButtons(int mods) { Input_SetNonRepeatable(CCPAD_L, mods & PSP_CTRL_LTRIGGER); Input_SetNonRepeatable(CCPAD_R, mods & PSP_CTRL_RTRIGGER); @@ -95,25 +83,26 @@ static void HandleButtons_Game(int mods) { Input_SetNonRepeatable(CCPAD_DOWN, mods & PSP_CTRL_DOWN); } +static void ProcessCircleInput(SceCtrlData* pad, double delta) { + float scale = (delta * 60.0) / 16.0f; + int dx = pad->Lx - 127; + int dy = pad->Ly - 127; + + if (Math_AbsI(dx) <= 8) dx = 0; + if (Math_AbsI(dy) <= 8) dy = 0; + + Event_RaiseRawMove(&PointerEvents.RawMoved, dx * scale, dy * scale); +} + void Window_ProcessEvents(double delta) { SceCtrlData pad; /* TODO implement */ /* TODO: Change to Peek instead? */ sceCtrlReadBufferPositive(&pad, 1); - int mods = pad.Buttons; - - int dx = pad.Lx - 127; - int dy = pad.Ly - 127; - if (Input.RawMode && (Math_AbsI(dx) > 1 || Math_AbsI(dy) > 1)) { - //Platform_Log2("RAW: %i, %i", &dx, &dy); - Event_RaiseRawMove(&PointerEvents.RawMoved, dx / 32.0f, dy / 32.0f); - } - - if (launcherMode) { - HandleButtons_Launcher(mods); - } else { - HandleButtons_Game(mods); - } + + HandleButtons(pad.Buttons); + if (Input.RawMode) + ProcessCircleInput(&pad, delta); } void Cursor_SetPosition(int x, int y) { } // Makes no sense for PSP diff --git a/src/Window_PSVita.c b/src/Window_PSVita.c index c22a07e86..33fd234fe 100644 --- a/src/Window_PSVita.c +++ b/src/Window_PSVita.c @@ -68,19 +68,7 @@ void Window_Close(void) { /*########################################################################################################################* *----------------------------------------------------Input processing-----------------------------------------------------* *#########################################################################################################################*/ -static void HandleButtons_Launcher(int mods) { - Input_SetNonRepeatable(CCPAD_START, mods & SCE_CTRL_TRIANGLE); - Input_SetNonRepeatable(CCPAD_SELECT, mods & SCE_CTRL_SQUARE); - // fake tab with PSP_CTRL_SQUARE for Launcher too - //Input_SetNonRepeatable(IPT_TAB, mods & SCE_CTRL_SQUARE); - - Input_SetNonRepeatable(CCPAD_LEFT, mods & SCE_CTRL_LEFT); - Input_SetNonRepeatable(CCPAD_RIGHT, mods & SCE_CTRL_RIGHT); - Input_SetNonRepeatable(CCPAD_UP, mods & SCE_CTRL_UP); - Input_SetNonRepeatable(CCPAD_DOWN, mods & SCE_CTRL_DOWN); -} - -static void HandleButtons_Game(int mods) { +static void HandleButtons(int mods) { Input_SetNonRepeatable(CCPAD_A, mods & SCE_CTRL_TRIANGLE); Input_SetNonRepeatable(CCPAD_B, mods & SCE_CTRL_SQUARE); Input_SetNonRepeatable(CCPAD_X, mods & SCE_CTRL_CROSS); @@ -99,7 +87,7 @@ static void HandleButtons_Game(int mods) { } static void ProcessCircleInput(SceCtrlData* pad, double delta) { - float scale = (delta * 60.0) / 32.0f; + float scale = (delta * 60.0) / 16.0f; int dx = pad->lx - 127; int dy = pad->ly - 127; @@ -147,16 +135,9 @@ static void ProcessPadInput(double delta) { if (res == 0) return; // no data available yet if (res < 0) return; // error occurred - int mods = pad.buttons; - if (launcherMode) { - HandleButtons_Launcher(mods); - } else { - HandleButtons_Game(mods); - } - - if (Input.RawMode) { + HandleButtons(pad.buttons); + if (Input.RawMode) ProcessCircleInput(&pad, delta); - } } void Window_ProcessEvents(double delta) { diff --git a/src/Window_Xbox.c b/src/Window_Xbox.c index 378244690..185033d07 100644 --- a/src/Window_Xbox.c +++ b/src/Window_Xbox.c @@ -122,7 +122,7 @@ void Window_Close(void) { #define XINPUT_GAMEPAD_X 0x4000 #define XINPUT_GAMEPAD_Y 0x8000 -static void HandleButtons_Game(int mods) { +static void HandleButtons(int mods) { Input_SetNonRepeatable(CCPAD_L, mods & XINPUT_GAMEPAD_LEFT_THUMB); Input_SetNonRepeatable(CCPAD_R, mods & XINPUT_GAMEPAD_RIGHT_THUMB); @@ -140,28 +140,12 @@ static void HandleButtons_Game(int mods) { Input_SetNonRepeatable(CCPAD_DOWN, mods & XINPUT_GAMEPAD_DPAD_DOWN); } -static void HandleButtons_Launcher(int mods) { - Input_SetNonRepeatable(CCKEY_ENTER, mods & XINPUT_GAMEPAD_A); - Input_SetNonRepeatable(CCKEY_ESCAPE, mods & XINPUT_GAMEPAD_B); - // fake tab with down for Launcher - //Input_SetNonRepeatable(CCKEY_TAB, mods & KEY_DDOWN); - - Input_SetNonRepeatable(CCPAD_LEFT, mods & XINPUT_GAMEPAD_DPAD_LEFT); - Input_SetNonRepeatable(CCPAD_RIGHT, mods & XINPUT_GAMEPAD_DPAD_RIGHT); - Input_SetNonRepeatable(CCPAD_UP, mods & XINPUT_GAMEPAD_DPAD_UP); - Input_SetNonRepeatable(CCPAD_DOWN, mods & XINPUT_GAMEPAD_DPAD_DOWN); -} - void Window_ProcessEvents(double delta) { usbh_pooling_hubs(); if (!xid_ctrl) return; int mods = gp_state.dButtons; - if (launcherMode) { - HandleButtons_Launcher(mods); - } else { - HandleButtons_Game(mods); - } + HandleButtons(mods); } void Cursor_SetPosition(int x, int y) { } // Makes no sense for Xbox