diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index 21986e48c..592761c08 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -19,8 +19,9 @@ extern "C" { using namespace QGBA; -InputController::InputController(QObject* parent) +InputController::InputController(int playerId, QObject* parent) : QObject(parent) + , m_playerId(playerId) , m_config(nullptr) , m_gamepadTimer(nullptr) { @@ -28,9 +29,8 @@ InputController::InputController(QObject* parent) #ifdef BUILD_SDL m_sdlEvents.bindings = &m_inputMap; - GBASDLInitEvents(&m_sdlEvents); + GBASDLInitEvents(&m_sdlEvents, playerId); GBASDLInitBindings(&m_inputMap); - SDL_JoystickEventState(SDL_QUERY); m_gamepadTimer = new QTimer(this); connect(m_gamepadTimer, SIGNAL(timeout()), this, SLOT(testGamepad())); diff --git a/src/platform/qt/InputController.h b/src/platform/qt/InputController.h index 14877e3f2..1ed729064 100644 --- a/src/platform/qt/InputController.h +++ b/src/platform/qt/InputController.h @@ -31,7 +31,7 @@ Q_OBJECT public: static const uint32_t KEYBOARD = 0x51545F4B; - InputController(QObject* parent = nullptr); + InputController(int playerId = 0, QObject* parent = nullptr); ~InputController(); void setConfiguration(ConfigController* config); @@ -67,6 +67,7 @@ private: GBAInputMap m_inputMap; ConfigController* m_config; + int m_playerId; #ifdef BUILD_SDL GBASDLEvents m_sdlEvents; diff --git a/src/platform/qt/MultiplayerController.cpp b/src/platform/qt/MultiplayerController.cpp index fae301a49..827900c70 100644 --- a/src/platform/qt/MultiplayerController.cpp +++ b/src/platform/qt/MultiplayerController.cpp @@ -61,3 +61,11 @@ void MultiplayerController::detachGame(GameController* controller) { MutexUnlock(&m_lockstep.mutex); controller->threadContinue(); } + +int MultiplayerController::attached() { + int num; + MutexLock(&m_lockstep.mutex); + num = m_lockstep.attached; + MutexUnlock(&m_lockstep.mutex); + return num; +} diff --git a/src/platform/qt/MultiplayerController.h b/src/platform/qt/MultiplayerController.h index 7c5279823..ac3514c1b 100644 --- a/src/platform/qt/MultiplayerController.h +++ b/src/platform/qt/MultiplayerController.h @@ -22,6 +22,8 @@ public: bool attachGame(GameController*); void detachGame(GameController*); + int attached(); + private: GBASIOLockstep m_lockstep; }; diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 5b603fb31..550c21f71 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -37,13 +37,14 @@ extern "C" { using namespace QGBA; -Window::Window(ConfigController* config, QWidget* parent) +Window::Window(ConfigController* config, int playerId, QWidget* parent) : QMainWindow(parent) , m_logView(new LogView()) , m_stateWindow(nullptr) , m_screenWidget(new WindowBackground()) , m_logo(":/res/mgba-1024.png") , m_config(config) + , m_inputController(playerId) #ifdef USE_FFMPEG , m_videoView(nullptr) #endif @@ -55,6 +56,7 @@ Window::Window(ConfigController* config, QWidget* parent) #endif , m_mruMenu(nullptr) , m_shortcutController(new ShortcutController(this)) + , m_playerId(playerId) { setWindowTitle(PROJECT_NAME); setFocusPolicy(Qt::StrongFocus); @@ -532,7 +534,7 @@ void Window::setupMenu(QMenuBar* menubar) { multiplayer = std::make_shared(); m_controller->setMultiplayerController(multiplayer); } - Window* w2 = new Window(m_config); + Window* w2 = new Window(m_config, multiplayer->attached()); w2->setAttribute(Qt::WA_DeleteOnClose); w2->loadConfig(); w2->controller()->setMultiplayerController(multiplayer); diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 68aac1697..9dce80b42 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -39,7 +39,7 @@ class Window : public QMainWindow { Q_OBJECT public: - Window(ConfigController* config, QWidget* parent = nullptr); + Window(ConfigController* config, int playerId = 0, QWidget* parent = nullptr); virtual ~Window(); GameController* controller() { return m_controller; } @@ -134,6 +134,7 @@ private: QList m_mruFiles; QMenu* m_mruMenu; ShortcutController* m_shortcutController; + int m_playerId; #ifdef USE_FFMPEG VideoView* m_videoView; diff --git a/src/platform/sdl/main.c b/src/platform/sdl/main.c index 441cc23b8..c1d471d4c 100644 --- a/src/platform/sdl/main.c +++ b/src/platform/sdl/main.c @@ -101,7 +101,7 @@ int main(int argc, char** argv) { renderer.events.bindings = &inputMap; GBASDLInitBindings(&inputMap); - GBASDLInitEvents(&renderer.events); + GBASDLInitEvents(&renderer.events, 0); GBASDLEventsLoadConfig(&renderer.events, GBAConfigGetInput(&config)); context.overrides = GBAConfigGetOverrides(&config); diff --git a/src/platform/sdl/sdl-events.c b/src/platform/sdl/sdl-events.c index 49903f09c..c3273ffa0 100644 --- a/src/platform/sdl/sdl-events.c +++ b/src/platform/sdl/sdl-events.c @@ -21,13 +21,13 @@ static int _openContexts = 0; -bool GBASDLInitEvents(struct GBASDLEvents* context) { +bool GBASDLInitEvents(struct GBASDLEvents* context, int playerId) { if (!_openContexts && SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) { return false; } ++_openContexts; SDL_JoystickEventState(SDL_ENABLE); - context->joystick = SDL_JoystickOpen(0); + context->joystick = SDL_JoystickOpen(playerId); #if !SDL_VERSION_ATLEAST(2, 0, 0) SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); #endif diff --git a/src/platform/sdl/sdl-events.h b/src/platform/sdl/sdl-events.h index 997345e73..1e8e3a2a2 100644 --- a/src/platform/sdl/sdl-events.h +++ b/src/platform/sdl/sdl-events.h @@ -28,7 +28,7 @@ struct GBASDLEvents { #endif }; -bool GBASDLInitEvents(struct GBASDLEvents*); +bool GBASDLInitEvents(struct GBASDLEvents*, int playerId); void GBASDLDeinitEvents(struct GBASDLEvents*); void GBASDLInitBindings(struct GBAInputMap* inputMap);