diff --git a/core/os/os.cpp b/core/os/os.cpp index 1c1bbe16277..a5c0ea45169 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -296,6 +296,11 @@ int OS::get_exit_code() const { void OS::set_exit_code(int p_code) { _exit_code = p_code; + _is_custom_exit_code = true; +} + +bool OS::is_custom_exit_code() { + return _is_custom_exit_code; } String OS::get_locale() const { diff --git a/core/os/os.h b/core/os/os.h index 29582991953..11bf0fa460a 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -40,6 +40,7 @@ #include "core/vector.h" #include +#include class OS { @@ -55,7 +56,8 @@ class OS { String _local_clipboard; uint64_t _msec_splash; bool _no_window; - int _exit_code; + int _exit_code = EXIT_FAILURE; // unexpected exit is marked as failure + bool _is_custom_exit_code = false; int _orientation; bool _allow_hidpi; bool _allow_layered; @@ -488,6 +490,7 @@ public: virtual int get_exit_code() const; virtual void set_exit_code(int p_code); + virtual bool is_custom_exit_code(); virtual int get_processor_count() const; diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 8fe3a62e031..55973b72d9b 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -51,6 +51,7 @@ #include "viewport.h" #include +#include void SceneTreeTimer::_bind_methods() { @@ -638,6 +639,9 @@ void SceneTree::quit(int p_exit_code) { // Override the exit code if a positive argument is given (the default is `-1`). // This is a shorthand for calling `set_exit_code()` on the OS singleton then quitting. OS::get_singleton()->set_exit_code(p_exit_code); + } else if (!OS::get_singleton()->is_custom_exit_code()) { + // Must customize exit code, otherwise it will default to a non-zero value + OS::get_singleton()->set_exit_code(EXIT_SUCCESS); } _quit = true;