Merge pull request #85100 from ztc0611/fix-ios-focus-mainloop-notifs
Enhance mobile suspend MainLoop notifications
This commit is contained in:
commit
3a2fb42838
6 changed files with 57 additions and 10 deletions
|
@ -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.
|
||||
|
|
|
@ -1161,19 +1161,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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -129,6 +129,9 @@ public:
|
|||
|
||||
void on_focus_out();
|
||||
void on_focus_in();
|
||||
|
||||
void on_enter_background();
|
||||
void on_exit_background();
|
||||
};
|
||||
|
||||
#endif // IOS_ENABLED
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue