summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZach Coleman <ztc0611@gmail.com>2023-11-17 08:23:06 -0500
committerZach Coleman <ztc0611@gmail.com>2024-02-04 21:10:06 -0500
commitfc7a63cbf3dcec176046b3ba047f40d367213cfb (patch)
treed1483c12b03c31a953a9f299de669ae36fe4335d
parentb4e2a24c1f62088b3f7ce0197afc90832fc25009 (diff)
downloadredot-engine-fc7a63cbf3dcec176046b3ba047f40d367213cfb.tar.gz
Enhance mobile suspend MainLoop Notifications
-rw-r--r--doc/classes/MainLoop.xml9
-rw-r--r--doc/classes/Node.xml13
-rw-r--r--platform/android/os_android.cpp6
-rw-r--r--platform/ios/app_delegate.mm8
-rw-r--r--platform/ios/os_ios.h3
-rw-r--r--platform/ios/os_ios.mm28
6 files changed, 57 insertions, 10 deletions
diff --git a/doc/classes/MainLoop.xml b/doc/classes/MainLoop.xml
index b01a3f7a0e..458b3d4107 100644
--- a/doc/classes/MainLoop.xml
+++ b/doc/classes/MainLoop.xml
@@ -119,19 +119,20 @@
</constant>
<constant name="NOTIFICATION_APPLICATION_RESUMED" value="2014">
Notification received from the OS when the application is resumed.
- Specific to the Android platform.
+ Specific to the Android and iOS platforms.
</constant>
<constant name="NOTIFICATION_APPLICATION_PAUSED" value="2015">
Notification received from the OS when the application is paused.
- Specific to the Android platform.
+ Specific to the Android and iOS platforms.
+ [b]Note:[/b] On iOS, you only have approximately 5 seconds to finish a task started by this signal. If you go over this allotment, iOS will kill the app instead of pausing it.
</constant>
<constant name="NOTIFICATION_APPLICATION_FOCUS_IN" value="2016">
Notification received from the OS when the application is focused, i.e. when changing the focus from the OS desktop or a thirdparty application to any open window of the Godot instance.
- Implemented on desktop platforms.
+ Implemented on desktop and mobile platforms.
</constant>
<constant name="NOTIFICATION_APPLICATION_FOCUS_OUT" value="2017">
Notification received from the OS when the application is defocused, i.e. when changing the focus from any open window of the Godot instance to the OS desktop or a thirdparty application.
- Implemented on desktop platforms.
+ Implemented on desktop and mobile platforms.
</constant>
<constant name="NOTIFICATION_TEXT_SERVER_CHANGED" value="2018">
Notification received when text server is changed.
diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml
index 4f09a0c616..1b33666daa 100644
--- a/doc/classes/Node.xml
+++ b/doc/classes/Node.xml
@@ -1151,19 +1151,20 @@
</constant>
<constant name="NOTIFICATION_APPLICATION_RESUMED" value="2014">
Notification received from the OS when the application is resumed.
- Implemented only on Android.
+ Specific to the Android and iOS platforms.
</constant>
<constant name="NOTIFICATION_APPLICATION_PAUSED" value="2015">
Notification received from the OS when the application is paused.
- Implemented only on Android.
+ Specific to the Android and iOS platforms.
+ [b]Note:[/b] On iOS, you only have approximately 5 seconds to finish a task started by this signal. If you go over this allotment, iOS will kill the app instead of pausing it.
</constant>
<constant name="NOTIFICATION_APPLICATION_FOCUS_IN" value="2016">
- Notification received from the OS when the application is focused, i.e. when changing the focus from the OS desktop or a third-party application to any open window of the Godot instance.
- Implemented on desktop platforms.
+ Notification received from the OS when the application is focused, i.e. when changing the focus from the OS desktop or a thirdparty application to any open window of the Godot instance.
+ Implemented on desktop and mobile platforms.
</constant>
<constant name="NOTIFICATION_APPLICATION_FOCUS_OUT" value="2017">
- Notification received from the OS when the application is defocused, i.e. when changing the focus from any open window of the Godot instance to the OS desktop or a third-party application.
- Implemented on desktop platforms.
+ Notification received from the OS when the application is defocused, i.e. when changing the focus from any open window of the Godot instance to the OS desktop or a thirdparty application.
+ Implemented on desktop and mobile platforms.
</constant>
<constant name="NOTIFICATION_TEXT_SERVER_CHANGED" value="2018">
Notification received when the [TextServer] is changed.
diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp
index 0d82bec75d..a86cf43042 100644
--- a/platform/android/os_android.cpp
+++ b/platform/android/os_android.cpp
@@ -324,11 +324,17 @@ void OS_Android::main_loop_end() {
void OS_Android::main_loop_focusout() {
DisplayServerAndroid::get_singleton()->send_window_event(DisplayServer::WINDOW_EVENT_FOCUS_OUT);
+ if (OS::get_singleton()->get_main_loop()) {
+ OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_FOCUS_OUT);
+ }
audio_driver_android.set_pause(true);
}
void OS_Android::main_loop_focusin() {
DisplayServerAndroid::get_singleton()->send_window_event(DisplayServer::WINDOW_EVENT_FOCUS_IN);
+ if (OS::get_singleton()->get_main_loop()) {
+ OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_FOCUS_IN);
+ }
audio_driver_android.set_pause(false);
}
diff --git a/platform/ios/app_delegate.mm b/platform/ios/app_delegate.mm
index 8a16f8fcc1..32ebf7be44 100644
--- a/platform/ios/app_delegate.mm
+++ b/platform/ios/app_delegate.mm
@@ -167,6 +167,14 @@ static ViewController *mainViewController = nil;
OS_IOS::get_singleton()->on_focus_in();
}
+- (void)applicationDidEnterBackground:(UIApplication *)application {
+ OS_IOS::get_singleton()->on_enter_background();
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application {
+ OS_IOS::get_singleton()->on_exit_background();
+}
+
- (void)dealloc {
self.window = nil;
}
diff --git a/platform/ios/os_ios.h b/platform/ios/os_ios.h
index 06724d763f..9248d30387 100644
--- a/platform/ios/os_ios.h
+++ b/platform/ios/os_ios.h
@@ -129,6 +129,9 @@ public:
void on_focus_out();
void on_focus_in();
+
+ void on_enter_background();
+ void on_exit_background();
};
#endif // IOS_ENABLED
diff --git a/platform/ios/os_ios.mm b/platform/ios/os_ios.mm
index 6ac21fa9c8..078f8e8494 100644
--- a/platform/ios/os_ios.mm
+++ b/platform/ios/os_ios.mm
@@ -601,6 +601,10 @@ void OS_IOS::on_focus_out() {
DisplayServerIOS::get_singleton()->send_window_event(DisplayServer::WINDOW_EVENT_FOCUS_OUT);
}
+ if (OS::get_singleton()->get_main_loop()) {
+ OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_FOCUS_OUT);
+ }
+
[AppDelegate.viewController.godotView stopRendering];
audio_driver.stop();
@@ -615,10 +619,34 @@ void OS_IOS::on_focus_in() {
DisplayServerIOS::get_singleton()->send_window_event(DisplayServer::WINDOW_EVENT_FOCUS_IN);
}
+ if (OS::get_singleton()->get_main_loop()) {
+ OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_FOCUS_IN);
+ }
+
[AppDelegate.viewController.godotView startRendering];
audio_driver.start();
}
}
+void OS_IOS::on_enter_background() {
+ // Do not check for is_focused, because on_focus_out will always be fired first by applicationWillResignActive.
+
+ if (OS::get_singleton()->get_main_loop()) {
+ OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_PAUSED);
+ }
+
+ on_focus_out();
+}
+
+void OS_IOS::on_exit_background() {
+ if (!is_focused) {
+ on_focus_in();
+
+ if (OS::get_singleton()->get_main_loop()) {
+ OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_RESUMED);
+ }
+ }
+}
+
#endif // IOS_ENABLED