Skip to content

Commit

Permalink
Add joystick support
Browse files Browse the repository at this point in the history
  • Loading branch information
pingflood committed Feb 3, 2020
1 parent 173b8cd commit 837645e
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 44 deletions.
5 changes: 2 additions & 3 deletions menu/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,10 +266,9 @@ const char *S9xGetFilename (const char *ex)
uint32 S9xReadJoypad (int which1)
{
uint32 val=0x80000000;
if (mInMenu) return val;
if (which1 != 0) return val;
if (mInMenu || which1 > 1) return val;

u32 joy = sal_InputPoll();
u32 joy = sal_InputPoll(which1);

if (((joy & SAL_INPUT_SELECT) && (joy & SAL_INPUT_START)) || (joy & SAL_INPUT_MENU))
{
Expand Down
18 changes: 9 additions & 9 deletions menu/menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ s32 MenuMessageBox(const char *message1, const char *message2,
sal_InputIgnore();
while(subaction==-1)
{
keys=sal_InputPollRepeat();
keys=sal_InputPollRepeat(0);
if (keys & SAL_INPUT_UP)
{
select=SAL_OK; // Up
Expand Down Expand Up @@ -460,7 +460,7 @@ s32 FileSelect()
sal_InputIgnore();
while (menuExit==0)
{
keys=sal_InputPollRepeat();
keys=sal_InputPollRepeat(0);

if (keys & INP_BUTTON_MENU_SELECT)
{
Expand Down Expand Up @@ -752,7 +752,7 @@ static s32 SaveStateSelect(s32 mode)

while (action!=0&&action!=100)
{
keys=sal_InputPollRepeat();
keys=sal_InputPollRepeat(0);

if(keys&SAL_INPUT_UP || keys&SAL_INPUT_LEFT) {saveno--; action=1;}
if(keys&SAL_INPUT_DOWN || keys&SAL_INPUT_RIGHT) {saveno++; action=1;}
Expand Down Expand Up @@ -980,7 +980,7 @@ void ShowCredits()
sal_InputIgnore();
while (!menuExit)
{
keys=sal_InputPollRepeat();
keys=sal_InputPollRepeat(0);

if (keys & SAL_INPUT_UP) menufocus--; // Up
if (keys & SAL_INPUT_DOWN) menufocus++; // Down
Expand Down Expand Up @@ -1256,7 +1256,7 @@ s32 SettingsMenu(void)
RenderMenu("Settings", menuCount,menuSmooth,menufocus);
sal_VideoFlip(1);

keys=sal_InputPollRepeat();
keys=sal_InputPollRepeat(0);

if (keys & INP_BUTTON_MENU_CANCEL)
{
Expand All @@ -1267,7 +1267,7 @@ s32 SettingsMenu(void)
RenderMenu("Settings", menuCount,menuSmooth,menufocus);
sal_VideoFlip(1);

keys=sal_InputPoll();
keys=sal_InputPoll(0);
}

menuExit=1;
Expand All @@ -1281,7 +1281,7 @@ s32 SettingsMenu(void)
RenderMenu("Settings", menuCount,menuSmooth,menufocus);
sal_VideoFlip(1);

keys=sal_InputPoll();
keys=sal_InputPoll(0);
}

switch(menufocus)
Expand Down Expand Up @@ -1518,7 +1518,7 @@ s32 MenuRun(s8 *romName)
RenderMenu("Main Menu", menuCount,menuSmooth,menufocus);
sal_VideoFlip(1);

keys=sal_InputPollRepeat();
keys=sal_InputPollRepeat(0);

if (keys & INP_BUTTON_MENU_SELECT)
{
Expand All @@ -1529,7 +1529,7 @@ s32 MenuRun(s8 *romName)
RenderMenu("Main Menu", menuCount,menuSmooth,menufocus);
sal_VideoFlip(1);

keys=sal_InputPoll();
keys=sal_InputPoll(0);

usleep(10000);
}
Expand Down
4 changes: 2 additions & 2 deletions sal/include/sal_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ u32 sal_InputHeld();
void sal_InputWaitForRelease();
void sal_InputWaitForPress();
void sal_InputIgnore();
u32 sal_InputPoll();
u32 sal_InputPollRepeat();
u32 sal_InputPoll(u32 j);
u32 sal_InputPollRepeat(u32 j);

void sal_Sleep(u32 milliSecs);

Expand Down
90 changes: 62 additions & 28 deletions sal/linux/sal.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,55 +21,87 @@ s32 mCpuSpeedLookup[1]={0};

#include <sal_common.h>

static u32 inputHeld = 0;
static u32 inputHeld[2] = {0, 0};
static SDL_Joystick *joy[2];

static u32 sal_Input(int held)
static u32 sal_Input(int held, u32 j)
{
SDL_Event event;
if (!SDL_PollEvent(&event)) {
if (held) return inputHeld;
return 0;
}
inputHeld[j] = 0;

if (SDL_NumJoysticks() > 0) {
int deadzone = 10000;
if (joy[j] == NULL) joy[j] = SDL_JoystickOpen(j);

SDL_JoystickUpdate();

int joy_x = SDL_JoystickGetAxis(joy[j], 0);
int joy_y = SDL_JoystickGetAxis(joy[j], 1);

inputHeld = 0;
if (joy_x < -deadzone) inputHeld[j] |= SAL_INPUT_LEFT;
else if (joy_x > deadzone) inputHeld[j] |= SAL_INPUT_RIGHT;

u8 *keystate = SDL_GetKeyState(NULL);
if ( keystate[SDLK_LCTRL] ) inputHeld |= SAL_INPUT_A;
if ( keystate[SDLK_LALT] ) inputHeld |= SAL_INPUT_B;
if ( keystate[SDLK_SPACE] ) inputHeld |= SAL_INPUT_X;
if ( keystate[SDLK_LSHIFT] ) inputHeld |= SAL_INPUT_Y;
if ( keystate[SDLK_TAB] ) inputHeld |= SAL_INPUT_L;
if ( keystate[SDLK_BACKSPACE] ) inputHeld |= SAL_INPUT_R;
if ( keystate[SDLK_RETURN] ) inputHeld |= SAL_INPUT_START;
if ( keystate[SDLK_ESCAPE] ) inputHeld |= SAL_INPUT_SELECT;
if ( keystate[SDLK_UP] ) inputHeld |= SAL_INPUT_UP;
if ( keystate[SDLK_DOWN] ) inputHeld |= SAL_INPUT_DOWN;
if ( keystate[SDLK_LEFT] ) inputHeld |= SAL_INPUT_LEFT;
if ( keystate[SDLK_RIGHT] ) inputHeld |= SAL_INPUT_RIGHT;
if ( keystate[SDLK_END] ) inputHeld |= SAL_INPUT_MENU;
if (joy_y < -deadzone) inputHeld[j] |= SAL_INPUT_UP;
else if (joy_y > deadzone) inputHeld[j] |= SAL_INPUT_DOWN;

if (SDL_JoystickGetButton(joy[j], 0)) inputHeld[j] |= SAL_INPUT_X;
if (SDL_JoystickGetButton(joy[j], 1)) inputHeld[j] |= SAL_INPUT_A;
if (SDL_JoystickGetButton(joy[j], 2)) inputHeld[j] |= SAL_INPUT_B;
if (SDL_JoystickGetButton(joy[j], 3)) inputHeld[j] |= SAL_INPUT_Y;
if (SDL_JoystickGetButton(joy[j], 4)) inputHeld[j] |= SAL_INPUT_L;
if (SDL_JoystickGetButton(joy[j], 5)) inputHeld[j] |= SAL_INPUT_R;
if (SDL_JoystickGetButton(joy[j], 8)) inputHeld[j] |= SAL_INPUT_SELECT;
if (SDL_JoystickGetButton(joy[j], 9)) inputHeld[j] |= SAL_INPUT_START;
if (SDL_JoystickGetButton(joy[j], 8) && SDL_JoystickGetButton(joy[j], 9)) inputHeld[j] |= SAL_INPUT_MENU;
}

if (j == 0) {
u8 *keys = SDL_GetKeyState(NULL);

if (keys[SDLK_LCTRL]) inputHeld[j] |= SAL_INPUT_A;
if (keys[SDLK_LALT]) inputHeld[j] |= SAL_INPUT_B;
if (keys[SDLK_SPACE]) inputHeld[j] |= SAL_INPUT_X;
if (keys[SDLK_LSHIFT]) inputHeld[j] |= SAL_INPUT_Y;
if (keys[SDLK_TAB]) inputHeld[j] |= SAL_INPUT_L;
if (keys[SDLK_BACKSPACE]) inputHeld[j] |= SAL_INPUT_R;
if (keys[SDLK_PAGEDOWN]) inputHeld[j] |= SAL_INPUT_L;
if (keys[SDLK_PAGEUP]) inputHeld[j] |= SAL_INPUT_R;
if (keys[SDLK_RETURN]) inputHeld[j] |= SAL_INPUT_START;
if (keys[SDLK_ESCAPE]) inputHeld[j] |= SAL_INPUT_SELECT;
if (keys[SDLK_UP]) inputHeld[j] |= SAL_INPUT_UP;
if (keys[SDLK_DOWN]) inputHeld[j] |= SAL_INPUT_DOWN;
if (keys[SDLK_LEFT]) inputHeld[j] |= SAL_INPUT_LEFT;
if (keys[SDLK_RIGHT]) inputHeld[j] |= SAL_INPUT_RIGHT;
if (keys[SDLK_ESCAPE] && keys[SDLK_RETURN]) inputHeld[j] |= SAL_INPUT_MENU;

SDL_Event event;
if (!SDL_PollEvent(&event)) {
if (held) return inputHeld[j];
return 0;
}
}

mInputRepeat = inputHeld;
return inputHeld;
mInputRepeat = inputHeld[j];
return inputHeld[j];
}

static int key_repeat_enabled = 1;

u32 sal_InputPollRepeat()
u32 sal_InputPollRepeat(u32 j)
{
if (!key_repeat_enabled) {
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
key_repeat_enabled = 1;
}
return sal_Input(0);
return sal_Input(0, j);
}

u32 sal_InputPoll()
u32 sal_InputPoll(u32 j)
{
if (key_repeat_enabled) {
SDL_EnableKeyRepeat(0, 0);
key_repeat_enabled = 0;
}
return sal_Input(1);
return sal_Input(1, j);
}

const char* sal_DirectoryGetTemp(void)
Expand Down Expand Up @@ -241,6 +273,8 @@ void sal_VideoPaletteSet(u32 index, u32 color)

void sal_Reset(void)
{
for(int j = 0; j < SDL_NumJoysticks(); j++)
SDL_JoystickClose(joy[j]);
sal_AudioClose();
SDL_Quit();
}
Expand Down
4 changes: 2 additions & 2 deletions sal/sal_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ void sal_InputWaitForRelease()
{
while(1)
{
keys=sal_InputPoll();
keys=sal_InputPoll(0);
if(keys==0) break;
}
}
Expand All @@ -315,7 +315,7 @@ void sal_InputWaitForPress()
{
while(1)
{
keys=sal_InputPoll();
keys=sal_InputPoll(0);
if(keys!=0) break;
}
}
Expand Down

0 comments on commit 837645e

Please sign in to comment.