diff --git a/Source/Core/DolphinNoGUI/MainNoGUI.cpp b/Source/Core/DolphinNoGUI/MainNoGUI.cpp index 11bbf55da1..71d8960652 100644 --- a/Source/Core/DolphinNoGUI/MainNoGUI.cpp +++ b/Source/Core/DolphinNoGUI/MainNoGUI.cpp @@ -251,6 +251,10 @@ int main(int argc, char* argv[]) if (options.is_set("user")) user_directory = static_cast(options.get("user")); + UICommon::SetUserDirectory(user_directory); + UICommon::Init(); + GCAdapter::Init(); + s_platform = GetPlatform(options); if (!s_platform || !s_platform->Init()) { @@ -258,17 +262,6 @@ int main(int argc, char* argv[]) 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) { fprintf(stderr, "A save state cannot be loaded without specifying a game to launch.\n"); @@ -295,7 +288,7 @@ int main(int argc, char* argv[]) DolphinAnalytics::Instance().ReportDolphinStart("nogui"); - if (!BootManager::BootCore(std::move(boot), wsi)) + if (!BootManager::BootCore(std::move(boot), s_platform->GetWindowSystemInfo())) { fprintf(stderr, "Could not boot the specified file\n"); return 1; @@ -310,6 +303,7 @@ int main(int argc, char* argv[]) Core::Shutdown(); s_platform.reset(); + UICommon::Shutdown(); return 0; } diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 8a02534c57..00d8ac09e8 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -470,14 +470,26 @@ static void EmuThread(std::unique_ptr boot, WindowSystemInfo wsi DeclareAsCPUThread(); s_frame_step = false; - // Switch the window used for inputs to the render window. This way, the cursor position - // is relative to the render window, instead of the main window. - ASSERT(g_controller_interface.IsInit()); - g_controller_interface.ChangeWindow(wsi.render_window); - - Pad::LoadConfig(); - Pad::LoadGBAConfig(); - Keyboard::LoadConfig(); + // The frontend will likely have initialized the controller interface, as it needs + // it to provide the configuration dialogs. In this case, instead of re-initializing + // entirely, we switch the window used for inputs to the render window. This way, the + // 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); + Pad::LoadConfig(); + Pad::LoadGBAConfig(); + Keyboard::LoadConfig(); + } BootSessionData boot_session_data = std::move(boot->boot_session_data); const std::optional& savestate_path = boot_session_data.GetSavestatePath(); @@ -494,13 +506,50 @@ static void EmuThread(std::unique_ptr boot, WindowSystemInfo wsi Common::SyncSDImageToSDFolder(); }}; - // Load Wiimotes - only if we are booting in Wii mode + // Load and Init Wiimotes - only if we are booting in Wii mode + bool init_wiimotes = false; if (core_parameter.bWii && !Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED)) { - Wiimote::LoadConfig(); + 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(); + } } - FreeLook::LoadInputConfig(); + if (init_controllers) + { + FreeLook::Initialize(); + } + else + { + 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); Common::ScopeGuard movie_guard{&Movie::Shutdown};