summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/os/os.cpp5
-rw-r--r--core/os/os.h5
-rw-r--r--scene/main/scene_tree.cpp4
3 files changed, 13 insertions, 1 deletions
diff --git a/core/os/os.cpp b/core/os/os.cpp
index 182bab4058..8af141ef2f 100644
--- a/core/os/os.cpp
+++ b/core/os/os.cpp
@@ -226,6 +226,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 77a54ba68a..a740a23617 100644
--- a/core/os/os.h
+++ b/core/os/os.h
@@ -40,6 +40,7 @@
#include "core/templates/vector.h"
#include <stdarg.h>
+#include <stdlib.h>
class OS {
static OS *singleton;
@@ -53,7 +54,8 @@ class OS {
bool _debug_stdout = false;
String _local_clipboard;
bool _no_window = false;
- int _exit_code = 0;
+ int _exit_code = EXIT_FAILURE; // unexpected exit is marked as failure
+ bool _is_custom_exit_code = false;
int _orientation;
bool _allow_hidpi = false;
bool _allow_layered = false;
@@ -268,6 +270,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 8bcff4409f..c93306dec8 100644
--- a/scene/main/scene_tree.cpp
+++ b/scene/main/scene_tree.cpp
@@ -54,6 +54,7 @@
#include "window.h"
#include <stdio.h>
+#include <stdlib.h>
void SceneTreeTimer::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_time_left", "time"), &SceneTreeTimer::set_time_left);
@@ -538,6 +539,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;