From cc626acf45c305ffa1bf98013a6bfcb767d703d4 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Sun, 29 Dec 2019 16:39:24 +0100 Subject: [PATCH] Add a shorthand for setting the exit code using `SceneTree::quit()` This reduces the amount of code required to exit a process with a non-zero exit code. This pattern is also found in most other programming languages. --- doc/classes/OS.xml | 1 + doc/classes/SceneTree.xml | 4 +++- scene/main/scene_tree.cpp | 12 ++++++++---- scene/main/scene_tree.h | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index 265e87eba37..22f4dc2d837 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -906,6 +906,7 @@ The exit code passed to the OS when the main loop exits. By convention, an exit code of [code]0[/code] indicates success whereas a non-zero exit code indicates an error. For portability reasons, the exit code should be set between 0 and 125 (inclusive). + [b]Note:[/b] This value will be ignored if using [method SceneTree.quit] with an [code]exit_code[/code] argument passed. If [code]true[/code], the engine tries to keep the screen on while the game is running. Useful on mobile. diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml index 0635dd89357..6a4105ca2fa 100644 --- a/doc/classes/SceneTree.xml +++ b/doc/classes/SceneTree.xml @@ -185,8 +185,10 @@ + + - Quits the application. + Quits the application. A process [code]exit_code[/code] can optionally be passed as an argument. If this argument is [code]0[/code] or greater, it will override the [member OS.exit_code] defined before quitting the application. diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 09b001b3778..da147e71122 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -631,7 +631,13 @@ void SceneTree::finish() { timers.clear(); } -void SceneTree::quit() { +void SceneTree::quit(int p_exit_code) { + + if (p_exit_code >= 0) { + // 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); + } _quit = true; } @@ -1812,8 +1818,6 @@ bool SceneTree::is_refusing_new_network_connections() const { void SceneTree::_bind_methods() { - //ClassDB::bind_method(D_METHOD("call_group","call_flags","group","method","arg1","arg2"),&SceneMainLoop::_call_group,DEFVAL(Variant()),DEFVAL(Variant())); - ClassDB::bind_method(D_METHOD("get_root"), &SceneTree::get_root); ClassDB::bind_method(D_METHOD("has_group", "name"), &SceneTree::has_group); @@ -1837,7 +1841,7 @@ void SceneTree::_bind_methods() { ClassDB::bind_method(D_METHOD("get_node_count"), &SceneTree::get_node_count); ClassDB::bind_method(D_METHOD("get_frame"), &SceneTree::get_frame); - ClassDB::bind_method(D_METHOD("quit"), &SceneTree::quit); + ClassDB::bind_method(D_METHOD("quit", "exit_code"), &SceneTree::quit, DEFVAL(-1)); ClassDB::bind_method(D_METHOD("set_screen_stretch", "mode", "aspect", "minsize", "shrink"), &SceneTree::set_screen_stretch, DEFVAL(1)); diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index 9bb24238f25..55304fb12d8 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -303,7 +303,7 @@ public: void set_auto_accept_quit(bool p_enable); void set_quit_on_go_back(bool p_enable); - void quit(); + void quit(int p_exit_code = -1); void set_input_as_handled(); bool is_input_handled();