mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-13 01:26:50 -04:00
Simplify input handling for consoles by unifying game and launcher input handling
This commit is contained in:
parent
4e418f1860
commit
fc82185bc6
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user