Simplify input handling for consoles by unifying game and launcher input handling

This commit is contained in:
UnknownShadow200 2023-08-21 19:45:54 +10:00
parent 4e418f1860
commit fc82185bc6
7 changed files with 52 additions and 171 deletions

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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) {

View File

@ -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;

View File

@ -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

View File

@ -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) {

View File

@ -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