aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libui_sdl/DlgInputConfig.cpp40
-rw-r--r--src/libui_sdl/PlatformConfig.cpp4
-rw-r--r--src/libui_sdl/PlatformConfig.h2
-rw-r--r--src/libui_sdl/main.cpp121
4 files changed, 115 insertions, 52 deletions
diff --git a/src/libui_sdl/DlgInputConfig.cpp b/src/libui_sdl/DlgInputConfig.cpp
index 392eb44..c2059d1 100644
--- a/src/libui_sdl/DlgInputConfig.cpp
+++ b/src/libui_sdl/DlgInputConfig.cpp
@@ -29,8 +29,11 @@
#include "DlgInputConfig.h"
+extern int JoystickID;
extern SDL_Joystick* Joystick;
+extern void OpenJoystick();
+
namespace DlgInputConfig
{
@@ -303,6 +306,13 @@ void OnJoyStartConfig(uiButton* btn, void* data)
}
+void OnJoystickChanged(uiCombobox* cb, void* data)
+{
+ JoystickID = uiComboboxSelected(cb);
+ OpenJoystick();
+}
+
+
int OnCloseWindow(uiWindow* window, void* blarg)
{
InputDlgData* dlg = (InputDlgData*)(uiControl(window)->UserData);
@@ -458,6 +468,36 @@ void Open(int type)
uiButtonOnClicked(btn, OnJoyStartConfig, (type==0) ? &dskeyorder[i] : &identity[i]);
uiControlSetMinSize(uiControl(btn), width, 1);
}
+
+ if (type == 0)
+ {
+ uiLabel* dummy = uiNewLabel(" ");
+ uiGridAppend(b_key, uiControl(dummy), 0, dlg->numkeys, 2, 1, 1, uiAlignFill, 1, uiAlignCenter);
+
+ uiCombobox* joycombo = uiNewCombobox();
+ uiGridAppend(b_joy, uiControl(joycombo), 0, dlg->numkeys, 2, 1, 1, uiAlignFill, 1, uiAlignCenter);
+
+ int numjoys = SDL_NumJoysticks();
+ if (numjoys < 1)
+ {
+ uiComboboxAppend(joycombo, "(no joysticks available)");
+ uiControlDisable(uiControl(joycombo));
+ }
+ else
+ {
+ for (int i = 0; i < numjoys; i++)
+ {
+ const char* joyname = SDL_JoystickNameForIndex(i);
+ char fullname[256];
+ snprintf(fullname, 256, "%d. %s", i, joyname);
+
+ uiComboboxAppend(joycombo, fullname);
+ }
+
+ uiComboboxSetSelected(joycombo, JoystickID);
+ uiComboboxOnSelected(joycombo, OnJoystickChanged, NULL);
+ }
+ }
}
uiLabel* filler = uiNewLabel("");
diff --git a/src/libui_sdl/PlatformConfig.cpp b/src/libui_sdl/PlatformConfig.cpp
index 5708fc8..ff0ca70 100644
--- a/src/libui_sdl/PlatformConfig.cpp
+++ b/src/libui_sdl/PlatformConfig.cpp
@@ -30,6 +30,8 @@ int JoyMapping[12];
int HKKeyMapping[HK_MAX];
int HKJoyMapping[HK_MAX];
+int JoystickID;
+
int WindowWidth;
int WindowHeight;
int WindowMaximized;
@@ -98,6 +100,8 @@ ConfigEntry PlatformConfigFile[] =
{"HKJoy_FastForward", 0, &HKJoyMapping[HK_FastForward], -1, NULL, 0},
{"HKJoy_FastForwardToggle", 0, &HKJoyMapping[HK_FastForwardToggle], -1, NULL, 0},
+ {"JoystickID", 0, &JoystickID, 0, NULL, 0},
+
{"WindowWidth", 0, &WindowWidth, 256, NULL, 0},
{"WindowHeight", 0, &WindowHeight, 384, NULL, 0},
{"WindowMax", 0, &WindowMaximized, 0, NULL, 0},
diff --git a/src/libui_sdl/PlatformConfig.h b/src/libui_sdl/PlatformConfig.h
index be29c17..aaa56d3 100644
--- a/src/libui_sdl/PlatformConfig.h
+++ b/src/libui_sdl/PlatformConfig.h
@@ -39,6 +39,8 @@ extern int JoyMapping[12];
extern int HKKeyMapping[HK_MAX];
extern int HKJoyMapping[HK_MAX];
+extern int JoystickID;
+
extern int WindowWidth;
extern int WindowHeight;
extern int WindowMaximized;
diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp
index cc01fb6..12da7c4 100644
--- a/src/libui_sdl/main.cpp
+++ b/src/libui_sdl/main.cpp
@@ -146,6 +146,8 @@ bool Touching = false;
u32 KeyInputMask;
u32 HotkeyMask;
bool LidStatus;
+
+int JoystickID;
SDL_Joystick* Joystick;
SDL_AudioDeviceID AudioDevice, MicDevice;
@@ -547,12 +549,6 @@ void MicLoadWav(char* name)
SDL_FreeWAV(buf);
}
-
-void UpdateWindowTitle(void* data)
-{
- uiWindowSetTitle(MainWindow, (const char*)data);
-}
-
void AudioCallback(void* data, Uint8* stream, int len)
{
// resampling:
@@ -619,46 +615,6 @@ void MicCallback(void* data, Uint8* stream, int len)
}
}
-bool JoyButtonPressed(int btnid, int njoybuttons, Uint8* joybuttons, Uint32 hat)
-{
- if (btnid < 0) return false;
-
- hat &= ~(hat >> 4);
-
- bool pressed = false;
- if (btnid == 0x101) // up
- pressed = (hat & SDL_HAT_UP);
- else if (btnid == 0x104) // down
- pressed = (hat & SDL_HAT_DOWN);
- else if (btnid == 0x102) // right
- pressed = (hat & SDL_HAT_RIGHT);
- else if (btnid == 0x108) // left
- pressed = (hat & SDL_HAT_LEFT);
- else if (btnid < njoybuttons)
- pressed = (joybuttons[btnid] & ~(joybuttons[btnid] >> 1)) & 0x01;
-
- return pressed;
-}
-
-bool JoyButtonHeld(int btnid, int njoybuttons, Uint8* joybuttons, Uint32 hat)
-{
- if (btnid < 0) return false;
-
- bool pressed = false;
- if (btnid == 0x101) // up
- pressed = (hat & SDL_HAT_UP);
- else if (btnid == 0x104) // down
- pressed = (hat & SDL_HAT_DOWN);
- else if (btnid == 0x102) // right
- pressed = (hat & SDL_HAT_RIGHT);
- else if (btnid == 0x108) // left
- pressed = (hat & SDL_HAT_LEFT);
- else if (btnid < njoybuttons)
- pressed = joybuttons[btnid] & 0x01;
-
- return pressed;
-}
-
void FeedMicInput()
{
int type = Config::MicInputType;
@@ -722,6 +678,68 @@ void FeedMicInput()
}
}
+void OpenJoystick()
+{
+ if (Joystick) SDL_JoystickClose(Joystick);
+
+ int num = SDL_NumJoysticks();
+ if (num < 1)
+ {
+ Joystick = NULL;
+ return;
+ }
+
+ if (JoystickID >= num)
+ JoystickID = 0;
+
+ Joystick = SDL_JoystickOpen(JoystickID);
+}
+
+bool JoyButtonPressed(int btnid, int njoybuttons, Uint8* joybuttons, Uint32 hat)
+{
+ if (btnid < 0) return false;
+
+ hat &= ~(hat >> 4);
+
+ bool pressed = false;
+ if (btnid == 0x101) // up
+ pressed = (hat & SDL_HAT_UP);
+ else if (btnid == 0x104) // down
+ pressed = (hat & SDL_HAT_DOWN);
+ else if (btnid == 0x102) // right
+ pressed = (hat & SDL_HAT_RIGHT);
+ else if (btnid == 0x108) // left
+ pressed = (hat & SDL_HAT_LEFT);
+ else if (btnid < njoybuttons)
+ pressed = (joybuttons[btnid] & ~(joybuttons[btnid] >> 1)) & 0x01;
+
+ return pressed;
+}
+
+bool JoyButtonHeld(int btnid, int njoybuttons, Uint8* joybuttons, Uint32 hat)
+{
+ if (btnid < 0) return false;
+
+ bool pressed = false;
+ if (btnid == 0x101) // up
+ pressed = (hat & SDL_HAT_UP);
+ else if (btnid == 0x104) // down
+ pressed = (hat & SDL_HAT_DOWN);
+ else if (btnid == 0x102) // right
+ pressed = (hat & SDL_HAT_RIGHT);
+ else if (btnid == 0x108) // left
+ pressed = (hat & SDL_HAT_LEFT);
+ else if (btnid < njoybuttons)
+ pressed = joybuttons[btnid] & 0x01;
+
+ return pressed;
+}
+
+void UpdateWindowTitle(void* data)
+{
+ uiWindowSetTitle(MainWindow, (const char*)data);
+}
+
int EmuThreadFunc(void* burp)
{
NDS::Init();
@@ -786,7 +804,8 @@ int EmuThreadFunc(void* burp)
}
if (!Joystick && (SDL_NumJoysticks() > 0))
{
- Joystick = SDL_JoystickOpen(0);
+ JoystickID = Config::JoystickID;
+ OpenJoystick();
if (Joystick)
{
njoybuttons = SDL_JoystickNumButtons(Joystick);
@@ -2627,11 +2646,9 @@ int main(int argc, char** argv)
MicWavBuffer = NULL;
if (Config::MicInputType == 3) MicLoadWav(Config::MicWavPath);
- // TODO: support more joysticks
- if (SDL_NumJoysticks() > 0)
- Joystick = SDL_JoystickOpen(0);
- else
- Joystick = NULL;
+ JoystickID = Config::JoystickID;
+ Joystick = NULL;
+ OpenJoystick();
EmuRunning = 2;
RunningSomething = false;