mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2024-11-14 21:37:42 -07:00
actual joystick support
This commit is contained in:
parent
12daf16282
commit
762b91d640
@ -129,6 +129,10 @@ MainFrame::MainFrame()
|
|||||||
|
|
||||||
SDL_GetWindowPosition(sdlwin, &WindowX, &WindowY);
|
SDL_GetWindowPosition(sdlwin, &WindowX, &WindowY);
|
||||||
SDL_GetWindowSize(sdlwin, &WindowW, &WindowH);
|
SDL_GetWindowSize(sdlwin, &WindowW, &WindowH);
|
||||||
|
|
||||||
|
joy = NULL;
|
||||||
|
joyid = -1;
|
||||||
|
axismask = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainFrame::OnClose(wxCloseEvent& event)
|
void MainFrame::OnClose(wxCloseEvent& event)
|
||||||
@ -155,6 +159,13 @@ void MainFrame::OnClose(wxCloseEvent& event)
|
|||||||
|
|
||||||
NDS::DeInit();
|
NDS::DeInit();
|
||||||
|
|
||||||
|
if (joy)
|
||||||
|
{
|
||||||
|
SDL_JoystickClose(joy);
|
||||||
|
joy = NULL;
|
||||||
|
joyid = -1;
|
||||||
|
}
|
||||||
|
|
||||||
SDL_UnlockTexture(sdltex);
|
SDL_UnlockTexture(sdltex);
|
||||||
delete texmutex;
|
delete texmutex;
|
||||||
|
|
||||||
@ -192,12 +203,34 @@ void MainFrame::OnOpenROM(wxCommandEvent& event)
|
|||||||
emustatuschangemutex->Lock();
|
emustatuschangemutex->Lock();
|
||||||
emustatuschange->Signal();
|
emustatuschange->Signal();
|
||||||
emustatuschangemutex->Unlock();
|
emustatuschangemutex->Unlock();
|
||||||
|
|
||||||
|
if (!joy)
|
||||||
|
{
|
||||||
|
if (SDL_NumJoysticks() > 0)
|
||||||
|
{
|
||||||
|
joy = SDL_JoystickOpen(0);
|
||||||
|
joyid = SDL_JoystickInstanceID(joy);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainFrame::OnInputConfig(wxCommandEvent& event)
|
void MainFrame::OnInputConfig(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
|
if (joy)
|
||||||
|
{
|
||||||
|
SDL_JoystickClose(joy);
|
||||||
|
joy = NULL;
|
||||||
|
joyid = -1;
|
||||||
|
}
|
||||||
|
|
||||||
InputConfigDialog dlg(this);
|
InputConfigDialog dlg(this);
|
||||||
dlg.ShowModal();
|
dlg.ShowModal();
|
||||||
|
|
||||||
|
if (SDL_NumJoysticks() > 0)
|
||||||
|
{
|
||||||
|
joy = SDL_JoystickOpen(0);
|
||||||
|
joyid = SDL_JoystickInstanceID(joy);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainFrame::ProcessSDLEvents()
|
void MainFrame::ProcessSDLEvents()
|
||||||
@ -243,7 +276,58 @@ void MainFrame::ProcessSDLEvents()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SDL_JOYBUTTONDOWN:
|
case SDL_JOYBUTTONDOWN:
|
||||||
printf("button %d %d\n", evt.jbutton.which, evt.jbutton.button);
|
if (!running) return;
|
||||||
|
if (evt.jbutton.which != joyid) return;
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
if (evt.jbutton.button == Config::JoyMapping[i]) NDS::PressKey(i);
|
||||||
|
if (evt.jbutton.button == Config::JoyMapping[10]) NDS::PressKey(16);
|
||||||
|
if (evt.jbutton.button == Config::JoyMapping[11]) NDS::PressKey(17);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_JOYBUTTONUP:
|
||||||
|
if (!running) return;
|
||||||
|
if (evt.jbutton.which != joyid) return;
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
if (evt.jbutton.button == Config::JoyMapping[i]) NDS::ReleaseKey(i);
|
||||||
|
if (evt.jbutton.button == Config::JoyMapping[10]) NDS::ReleaseKey(16);
|
||||||
|
if (evt.jbutton.button == Config::JoyMapping[11]) NDS::ReleaseKey(17);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_JOYHATMOTION:
|
||||||
|
if (!running) return;
|
||||||
|
if (evt.jhat.which != joyid) return;
|
||||||
|
if (evt.jhat.hat != 0) return;
|
||||||
|
for (int i = 0; i < 12; i++)
|
||||||
|
{
|
||||||
|
int j = (i >= 10) ? (i+6) : i;
|
||||||
|
if (Config::JoyMapping[i] == 0x101)
|
||||||
|
(evt.jhat.value & SDL_HAT_UP) ? NDS::PressKey(j) : NDS::ReleaseKey(j);
|
||||||
|
else if (Config::JoyMapping[i] == 0x102)
|
||||||
|
(evt.jhat.value & SDL_HAT_RIGHT) ? NDS::PressKey(j) : NDS::ReleaseKey(j);
|
||||||
|
else if (Config::JoyMapping[i] == 0x104)
|
||||||
|
(evt.jhat.value & SDL_HAT_DOWN) ? NDS::PressKey(j) : NDS::ReleaseKey(j);
|
||||||
|
else if (Config::JoyMapping[i] == 0x108)
|
||||||
|
(evt.jhat.value & SDL_HAT_LEFT) ? NDS::PressKey(j) : NDS::ReleaseKey(j);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_JOYAXISMOTION:
|
||||||
|
if (!running) return;
|
||||||
|
if (evt.jaxis.which != joyid) return;
|
||||||
|
if (evt.jaxis.axis == 0)
|
||||||
|
{
|
||||||
|
if (evt.jaxis.value >= 16384) { NDS::PressKey(4); axismask |= 0x1; }
|
||||||
|
else if (axismask & 0x1) NDS::ReleaseKey(4);
|
||||||
|
if (evt.jaxis.value <= -16384) { NDS::PressKey(5); axismask |= 0x2; }
|
||||||
|
else if (axismask & 0x2) NDS::ReleaseKey(5);
|
||||||
|
}
|
||||||
|
else if (evt.jaxis.axis == 1)
|
||||||
|
{
|
||||||
|
if (evt.jaxis.value >= 16384) { NDS::PressKey(7); axismask |= 0x4; }
|
||||||
|
else if (axismask & 0x4) NDS::ReleaseKey(7);
|
||||||
|
if (evt.jaxis.value <= -16384) { NDS::PressKey(6); axismask |= 0x8; }
|
||||||
|
else if (axismask & 0x8) NDS::ReleaseKey(6);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,10 @@ public:
|
|||||||
SDL_Renderer* sdlrend;
|
SDL_Renderer* sdlrend;
|
||||||
SDL_Texture* sdltex;
|
SDL_Texture* sdltex;
|
||||||
|
|
||||||
|
SDL_Joystick* joy;
|
||||||
|
SDL_JoystickID joyid;
|
||||||
|
u8 axismask;
|
||||||
|
|
||||||
wxMutex* texmutex;
|
wxMutex* texmutex;
|
||||||
void* texpixels;
|
void* texpixels;
|
||||||
int texstride;
|
int texstride;
|
||||||
|
Loading…
Reference in New Issue
Block a user