distribution/packages/games/emulators/dolphinsa/patches/new/003-fix-x11-window.patch

145 lines
4.4 KiB
Diff
Raw Normal View History

2022-09-28 05:59:00 +00:00
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<const char*>(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;
}
2022-10-04 18:48:05 +00:00
2022-09-28 05:59:00 +00:00
diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp
2022-10-04 18:48:05 +00:00
index 8a02534c57..00d8ac09e8 100644
2022-09-28 05:59:00 +00:00
--- a/Source/Core/Core/Core.cpp
+++ b/Source/Core/Core/Core.cpp
@@ -470,14 +470,26 @@ static void EmuThread(std::unique_ptr<BootParameters> 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<std::string>& savestate_path = boot_session_data.GetSavestatePath();
2022-10-04 18:48:05 +00:00
@@ -494,13 +506,50 @@ static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi
2022-09-28 05:59:00 +00:00
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};