Browse Source

Fix a crash in Joypad initialization on iOS

Creating a JoypadApple can trigger a notification to add a joypad (if
a device is already connected before the game is started). Observed
on iOS 18.2.1 with a Nimbus SteelSeries.

However at this point the Input singleton is not available yet, so
it will crash.

This commit moves JoypadApple initialization to `initialize_joypad()`
which is called explicitly after the Input singleton is available.

This is consistent with other platform joypad initialization.
Janis Kirsteins 6 months ago
parent
commit
e77a011188
2 changed files with 5 additions and 4 deletions
  1. 1 2
      platform/ios/os_ios.h
  2. 4 2
      platform/ios/os_ios.mm

+ 1 - 2
platform/ios/os_ios.h

@@ -65,8 +65,7 @@ private:
 	virtual void initialize_core() override;
 	virtual void initialize_core() override;
 	virtual void initialize() override;
 	virtual void initialize() override;
 
 
-	virtual void initialize_joypads() override {
-	}
+	virtual void initialize_joypads() override;
 
 
 	virtual void set_main_loop(MainLoop *p_main_loop) override;
 	virtual void set_main_loop(MainLoop *p_main_loop) override;
 	virtual MainLoop *get_main_loop() const override;
 	virtual MainLoop *get_main_loop() const override;

+ 4 - 2
platform/ios/os_ios.mm

@@ -126,11 +126,13 @@ void OS_IOS::initialize() {
 	initialize_core();
 	initialize_core();
 }
 }
 
 
+void OS_IOS::initialize_joypads() {
+	joypad_apple = memnew(JoypadApple);
+}
+
 void OS_IOS::initialize_modules() {
 void OS_IOS::initialize_modules() {
 	ios = memnew(iOS);
 	ios = memnew(iOS);
 	Engine::get_singleton()->add_singleton(Engine::Singleton("iOS", ios));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("iOS", ios));
-
-	joypad_apple = memnew(JoypadApple);
 }
 }
 
 
 void OS_IOS::deinitialize_modules() {
 void OS_IOS::deinitialize_modules() {