Require frontend to initialize controllers
We currently have two different code paths for initializing controllers:
Either the frontend (DolphinQt) can do it, or if the frontend doesn't do
it, the core will do it automatically when booting. Having these two
paths has caused problems in the past due to only one frontend being
tested (see de7ef47548
). I would like to get rid of the latter path to
avoid further problems like this.
This commit is contained in:
parent
2f3c0cdbc5
commit
dabad82219
|
@ -2,7 +2,6 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <EGL/egl.h>
|
#include <EGL/egl.h>
|
||||||
#include <UICommon/GameFile.h>
|
|
||||||
#include <android/log.h>
|
#include <android/log.h>
|
||||||
#include <android/native_window_jni.h>
|
#include <android/native_window_jni.h>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
@ -56,13 +55,13 @@
|
||||||
#include "InputCommon/ControllerInterface/Touch/ButtonManager.h"
|
#include "InputCommon/ControllerInterface/Touch/ButtonManager.h"
|
||||||
#include "InputCommon/GCAdapter.h"
|
#include "InputCommon/GCAdapter.h"
|
||||||
|
|
||||||
|
#include "UICommon/GameFile.h"
|
||||||
#include "UICommon/UICommon.h"
|
#include "UICommon/UICommon.h"
|
||||||
|
|
||||||
#include "VideoCommon/OnScreenDisplay.h"
|
#include "VideoCommon/OnScreenDisplay.h"
|
||||||
#include "VideoCommon/RenderBase.h"
|
#include "VideoCommon/RenderBase.h"
|
||||||
#include "VideoCommon/VideoBackendBase.h"
|
#include "VideoCommon/VideoBackendBase.h"
|
||||||
|
|
||||||
#include "../../Core/Common/WindowSystemInfo.h"
|
|
||||||
#include "jni/AndroidCommon/AndroidCommon.h"
|
#include "jni/AndroidCommon/AndroidCommon.h"
|
||||||
#include "jni/AndroidCommon/IDCache.h"
|
#include "jni/AndroidCommon/IDCache.h"
|
||||||
|
|
||||||
|
@ -521,7 +520,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Initialize(J
|
||||||
Common::AndroidSetReportHandler(&ReportSend);
|
Common::AndroidSetReportHandler(&ReportSend);
|
||||||
DolphinAnalytics::AndroidSetGetValFunc(&GetAnalyticValue);
|
DolphinAnalytics::AndroidSetGetValFunc(&GetAnalyticValue);
|
||||||
UICommon::Init();
|
UICommon::Init();
|
||||||
GCAdapter::Init();
|
UICommon::InitControllers(WindowSystemInfo(WindowSystemType::Android, nullptr, nullptr, nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ReportStartToAnalytics(JNIEnv*,
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ReportStartToAnalytics(JNIEnv*,
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include "AudioCommon/AudioCommon.h"
|
#include "AudioCommon/AudioCommon.h"
|
||||||
|
|
||||||
|
#include "Common/Assert.h"
|
||||||
#include "Common/CPUDetect.h"
|
#include "Common/CPUDetect.h"
|
||||||
#include "Common/CommonPaths.h"
|
#include "Common/CommonPaths.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
@ -470,26 +471,14 @@ static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi
|
||||||
DeclareAsCPUThread();
|
DeclareAsCPUThread();
|
||||||
s_frame_step = false;
|
s_frame_step = false;
|
||||||
|
|
||||||
// The frontend will likely have initialized the controller interface, as it needs
|
// Switch the window used for inputs to the render window. This way, the cursor position
|
||||||
// it to provide the configuration dialogs. In this case, instead of re-initializing
|
// is relative to the render window, instead of the main window.
|
||||||
// entirely, we switch the window used for inputs to the render window. This way, the
|
ASSERT(g_controller_interface.IsInit());
|
||||||
// cursor position is relative to the render window, instead of the main window.
|
|
||||||
bool init_controllers = false;
|
|
||||||
if (!g_controller_interface.IsInit())
|
|
||||||
{
|
|
||||||
g_controller_interface.Initialize(wsi);
|
|
||||||
Pad::Initialize();
|
|
||||||
Pad::InitializeGBA();
|
|
||||||
Keyboard::Initialize();
|
|
||||||
init_controllers = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_controller_interface.ChangeWindow(wsi.render_window);
|
g_controller_interface.ChangeWindow(wsi.render_window);
|
||||||
|
|
||||||
Pad::LoadConfig();
|
Pad::LoadConfig();
|
||||||
Pad::LoadGBAConfig();
|
Pad::LoadGBAConfig();
|
||||||
Keyboard::LoadConfig();
|
Keyboard::LoadConfig();
|
||||||
}
|
|
||||||
|
|
||||||
BootSessionData boot_session_data = std::move(boot->boot_session_data);
|
BootSessionData boot_session_data = std::move(boot->boot_session_data);
|
||||||
const std::optional<std::string>& savestate_path = boot_session_data.GetSavestatePath();
|
const std::optional<std::string>& savestate_path = boot_session_data.GetSavestatePath();
|
||||||
|
@ -506,53 +495,16 @@ static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi
|
||||||
Common::SyncSDImageToSDFolder();
|
Common::SyncSDImageToSDFolder();
|
||||||
}};
|
}};
|
||||||
|
|
||||||
// Load and Init Wiimotes - only if we are booting in Wii mode
|
// Load Wiimotes - only if we are booting in Wii mode
|
||||||
bool init_wiimotes = false;
|
|
||||||
if (core_parameter.bWii && !Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED))
|
if (core_parameter.bWii && !Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED))
|
||||||
{
|
|
||||||
if (init_controllers)
|
|
||||||
{
|
|
||||||
Wiimote::Initialize(savestate_path ? Wiimote::InitializeMode::DO_WAIT_FOR_WIIMOTES :
|
|
||||||
Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES);
|
|
||||||
init_wiimotes = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
Wiimote::LoadConfig();
|
Wiimote::LoadConfig();
|
||||||
}
|
|
||||||
|
|
||||||
if (NetPlay::IsNetPlayRunning())
|
if (NetPlay::IsNetPlayRunning())
|
||||||
NetPlay::SetupWiimotes();
|
NetPlay::SetupWiimotes();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (init_controllers)
|
|
||||||
{
|
|
||||||
FreeLook::Initialize();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FreeLook::LoadInputConfig();
|
FreeLook::LoadInputConfig();
|
||||||
}
|
|
||||||
|
|
||||||
Common::ScopeGuard controller_guard{[init_controllers, init_wiimotes] {
|
|
||||||
if (!init_controllers)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (init_wiimotes)
|
|
||||||
{
|
|
||||||
Wiimote::ResetAllWiimotes();
|
|
||||||
Wiimote::Shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
FreeLook::Shutdown();
|
|
||||||
|
|
||||||
ResetRumble();
|
|
||||||
|
|
||||||
Keyboard::Shutdown();
|
|
||||||
Pad::Shutdown();
|
|
||||||
Pad::ShutdownGBA();
|
|
||||||
g_controller_interface.Shutdown();
|
|
||||||
}};
|
|
||||||
|
|
||||||
Movie::Init(*boot);
|
Movie::Init(*boot);
|
||||||
Common::ScopeGuard movie_guard{&Movie::Shutdown};
|
Common::ScopeGuard movie_guard{&Movie::Shutdown};
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "Common/ScopeGuard.h"
|
||||||
#include "Common/StringUtil.h"
|
#include "Common/StringUtil.h"
|
||||||
#include "Core/Boot/Boot.h"
|
#include "Core/Boot/Boot.h"
|
||||||
#include "Core/BootManager.h"
|
#include "Core/BootManager.h"
|
||||||
|
@ -226,10 +227,6 @@ int main(int argc, char* argv[])
|
||||||
if (options.is_set("user"))
|
if (options.is_set("user"))
|
||||||
user_directory = static_cast<const char*>(options.get("user"));
|
user_directory = static_cast<const char*>(options.get("user"));
|
||||||
|
|
||||||
UICommon::SetUserDirectory(user_directory);
|
|
||||||
UICommon::Init();
|
|
||||||
GCAdapter::Init();
|
|
||||||
|
|
||||||
s_platform = GetPlatform(options);
|
s_platform = GetPlatform(options);
|
||||||
if (!s_platform || !s_platform->Init())
|
if (!s_platform || !s_platform->Init())
|
||||||
{
|
{
|
||||||
|
@ -237,6 +234,17 @@ int main(int argc, char* argv[])
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const WindowSystemInfo wsi = s_platform->GetWindowSystemInfo();
|
||||||
|
|
||||||
|
UICommon::SetUserDirectory(user_directory);
|
||||||
|
UICommon::Init();
|
||||||
|
UICommon::InitControllers(wsi);
|
||||||
|
|
||||||
|
Common::ScopeGuard ui_common_guard([] {
|
||||||
|
UICommon::ShutdownControllers();
|
||||||
|
UICommon::Shutdown();
|
||||||
|
});
|
||||||
|
|
||||||
if (save_state_path && !game_specified)
|
if (save_state_path && !game_specified)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "A save state cannot be loaded without specifying a game to launch.\n");
|
fprintf(stderr, "A save state cannot be loaded without specifying a game to launch.\n");
|
||||||
|
@ -263,7 +271,7 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
DolphinAnalytics::Instance().ReportDolphinStart("nogui");
|
DolphinAnalytics::Instance().ReportDolphinStart("nogui");
|
||||||
|
|
||||||
if (!BootManager::BootCore(std::move(boot), s_platform->GetWindowSystemInfo()))
|
if (!BootManager::BootCore(std::move(boot), wsi))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Could not boot the specified file\n");
|
fprintf(stderr, "Could not boot the specified file\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -278,7 +286,6 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
Core::Shutdown();
|
Core::Shutdown();
|
||||||
s_platform.reset();
|
s_platform.reset();
|
||||||
UICommon::Shutdown();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue