Browse Source

Overhaul CLI argument forwarding to processes started by the editor

Pedro J. Estébanez 3 years ago
parent
commit
e886d662ec
8 changed files with 58 additions and 38 deletions
  1. 0 4
      core/os/os.cpp
  2. 0 3
      core/os/os.h
  3. 7 4
      editor/editor_node.cpp
  4. 5 4
      editor/editor_run.cpp
  5. 9 20
      editor/project_manager.cpp
  6. 26 2
      main/main.cpp
  7. 11 0
      main/main.h
  8. 0 1
      platform/javascript/os_javascript.h

+ 0 - 4
core/os/os.cpp

@@ -166,10 +166,6 @@ bool OS::is_stdout_verbose() const {
 	return _verbose_stdout;
 	return _verbose_stdout;
 }
 }
 
 
-bool OS::is_single_window() const {
-	return _single_window;
-}
-
 bool OS::is_stdout_debug_enabled() const {
 bool OS::is_stdout_debug_enabled() const {
 	return _debug_stdout;
 	return _debug_stdout;
 }
 }

+ 0 - 3
core/os/os.h

@@ -52,7 +52,6 @@ class OS {
 	int low_processor_usage_mode_sleep_usec = 10000;
 	int low_processor_usage_mode_sleep_usec = 10000;
 	bool _verbose_stdout = false;
 	bool _verbose_stdout = false;
 	bool _debug_stdout = false;
 	bool _debug_stdout = false;
-	bool _single_window = false;
 	String _local_clipboard;
 	String _local_clipboard;
 	int _exit_code = EXIT_FAILURE; // unexpected exit is marked as failure
 	int _exit_code = EXIT_FAILURE; // unexpected exit is marked as failure
 	bool _allow_hidpi = false;
 	bool _allow_hidpi = false;
@@ -243,8 +242,6 @@ public:
 	void set_stdout_enabled(bool p_enabled);
 	void set_stdout_enabled(bool p_enabled);
 	void set_stderr_enabled(bool p_enabled);
 	void set_stderr_enabled(bool p_enabled);
 
 
-	virtual bool is_single_window() const;
-
 	virtual void disable_crash_handler() {}
 	virtual void disable_crash_handler() {}
 	virtual bool is_disable_crash_handler() const { return false; }
 	virtual bool is_disable_crash_handler() const { return false; }
 	virtual void initialize_debugging() {}
 	virtual void initialize_debugging() {}

+ 7 - 4
editor/editor_node.cpp

@@ -1815,15 +1815,15 @@ void EditorNode::restart_editor() {
 
 
 	List<String> args;
 	List<String> args;
 
 
+	for (const String &a : Main::get_forwardable_cli_arguments(Main::CLI_SCOPE_TOOL)) {
+		args.push_back(a);
+	}
+
 	args.push_back("--path");
 	args.push_back("--path");
 	args.push_back(ProjectSettings::get_singleton()->get_resource_path());
 	args.push_back(ProjectSettings::get_singleton()->get_resource_path());
 
 
 	args.push_back("-e");
 	args.push_back("-e");
 
 
-	if (OS::get_singleton()->is_disable_crash_handler()) {
-		args.push_back("--disable-crash-handler");
-	}
-
 	if (!to_reopen.is_empty()) {
 	if (!to_reopen.is_empty()) {
 		args.push_back(to_reopen);
 		args.push_back(to_reopen);
 	}
 	}
@@ -3162,6 +3162,9 @@ void EditorNode::_discard_changes(const String &p_str) {
 			String exec = OS::get_singleton()->get_executable_path();
 			String exec = OS::get_singleton()->get_executable_path();
 
 
 			List<String> args;
 			List<String> args;
+			for (const String &a : Main::get_forwardable_cli_arguments(Main::CLI_SCOPE_TOOL)) {
+				args.push_back(a);
+			}
 			args.push_back("--path");
 			args.push_back("--path");
 			args.push_back(exec.get_base_dir());
 			args.push_back(exec.get_base_dir());
 			args.push_back("--project-manager");
 			args.push_back("--project-manager");

+ 5 - 4
editor/editor_run.cpp

@@ -33,6 +33,7 @@
 #include "core/config/project_settings.h"
 #include "core/config/project_settings.h"
 #include "editor/editor_node.h"
 #include "editor/editor_node.h"
 #include "editor/editor_settings.h"
 #include "editor/editor_settings.h"
+#include "main/main.h"
 #include "servers/display_server.h"
 #include "servers/display_server.h"
 
 
 EditorRun::Status EditorRun::get_status() const {
 EditorRun::Status EditorRun::get_status() const {
@@ -46,6 +47,10 @@ String EditorRun::get_running_scene() const {
 Error EditorRun::run(const String &p_scene, const String &p_write_movie) {
 Error EditorRun::run(const String &p_scene, const String &p_write_movie) {
 	List<String> args;
 	List<String> args;
 
 
+	for (const String &a : Main::get_forwardable_cli_arguments(Main::CLI_SCOPE_PROJECT)) {
+		args.push_back(a);
+	}
+
 	String resource_path = ProjectSettings::get_singleton()->get_resource_path();
 	String resource_path = ProjectSettings::get_singleton()->get_resource_path();
 	if (!resource_path.is_empty()) {
 	if (!resource_path.is_empty()) {
 		args.push_back("--path");
 		args.push_back("--path");
@@ -105,10 +110,6 @@ Error EditorRun::run(const String &p_scene, const String &p_write_movie) {
 		screen -= 3;
 		screen -= 3;
 	}
 	}
 
 
-	if (OS::get_singleton()->is_disable_crash_handler()) {
-		args.push_back("--disable-crash-handler");
-	}
-
 	Rect2 screen_rect;
 	Rect2 screen_rect;
 	screen_rect.position = DisplayServer::get_singleton()->screen_get_position(screen);
 	screen_rect.position = DisplayServer::get_singleton()->screen_get_position(screen);
 	screen_rect.size = DisplayServer::get_singleton()->screen_get_size(screen);
 	screen_rect.size = DisplayServer::get_singleton()->screen_get_size(screen);

+ 9 - 20
editor/project_manager.cpp

@@ -47,6 +47,7 @@
 #include "editor/editor_settings.h"
 #include "editor/editor_settings.h"
 #include "editor/editor_themes.h"
 #include "editor/editor_themes.h"
 #include "editor/editor_vcs_interface.h"
 #include "editor/editor_vcs_interface.h"
+#include "main/main.h"
 #include "scene/gui/center_container.h"
 #include "scene/gui/center_container.h"
 #include "scene/gui/line_edit.h"
 #include "scene/gui/line_edit.h"
 #include "scene/gui/margin_container.h"
 #include "scene/gui/margin_container.h"
@@ -2109,27 +2110,15 @@ void ProjectManager::_open_selected_projects() {
 
 
 		List<String> args;
 		List<String> args;
 
 
+		for (const String &a : Main::get_forwardable_cli_arguments(Main::CLI_SCOPE_TOOL)) {
+			args.push_back(a);
+		}
+
 		args.push_back("--path");
 		args.push_back("--path");
 		args.push_back(path);
 		args.push_back(path);
 
 
 		args.push_back("--editor");
 		args.push_back("--editor");
 
 
-		if (OS::get_singleton()->is_stdout_debug_enabled()) {
-			args.push_back("--debug");
-		}
-
-		if (OS::get_singleton()->is_stdout_verbose()) {
-			args.push_back("--verbose");
-		}
-
-		if (OS::get_singleton()->is_disable_crash_handler()) {
-			args.push_back("--disable-crash-handler");
-		}
-
-		if (OS::get_singleton()->is_single_window()) {
-			args.push_back("--single-window");
-		}
-
 		Error err = OS::get_singleton()->create_instance(args);
 		Error err = OS::get_singleton()->create_instance(args);
 		ERR_FAIL_COND(err);
 		ERR_FAIL_COND(err);
 	}
 	}
@@ -2242,13 +2231,13 @@ void ProjectManager::_run_project_confirm() {
 
 
 		List<String> args;
 		List<String> args;
 
 
+		for (const String &a : Main::get_forwardable_cli_arguments(Main::CLI_SCOPE_PROJECT)) {
+			args.push_back(a);
+		}
+
 		args.push_back("--path");
 		args.push_back("--path");
 		args.push_back(path);
 		args.push_back(path);
 
 
-		if (OS::get_singleton()->is_disable_crash_handler()) {
-			args.push_back("--disable-crash-handler");
-		}
-
 		Error err = OS::get_singleton()->create_instance(args);
 		Error err = OS::get_singleton()->create_instance(args);
 		ERR_FAIL_COND(err);
 		ERR_FAIL_COND(err);
 	}
 	}

+ 26 - 2
main/main.cpp

@@ -143,6 +143,7 @@ static int audio_driver_idx = -1;
 
 
 // Engine config/tools
 // Engine config/tools
 
 
+static bool single_window = false;
 static bool editor = false;
 static bool editor = false;
 static bool project_manager = false;
 static bool project_manager = false;
 static bool cmdline_tool = false;
 static bool cmdline_tool = false;
@@ -153,6 +154,8 @@ static OS::ProcessID editor_pid = 0;
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 static bool auto_build_solutions = false;
 static bool auto_build_solutions = false;
 static String debug_server_uri;
 static String debug_server_uri;
+
+HashMap<Main::CLIScope, Vector<String>> forwardable_cli_arguments;
 #endif
 #endif
 
 
 // Display
 // Display
@@ -196,6 +199,12 @@ bool Main::is_cmdline_tool() {
 	return cmdline_tool;
 	return cmdline_tool;
 }
 }
 
 
+#ifdef TOOLS_ENABLED
+const Vector<String> &Main::get_forwardable_cli_arguments(Main::CLIScope p_scope) {
+	return forwardable_cli_arguments[p_scope];
+}
+#endif
+
 static String unescape_cmdline(const String &p_str) {
 static String unescape_cmdline(const String &p_str) {
 	return p_str.replace("%20", " ");
 	return p_str.replace("%20", " ");
 }
 }
@@ -703,6 +712,21 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 
 
 		List<String>::Element *N = I->next();
 		List<String>::Element *N = I->next();
 
 
+#ifdef TOOLS_ENABLED
+		if (I->get() == "--debug" ||
+				I->get() == "--verbose" ||
+				I->get() == "--disable-crash-handler") {
+			forwardable_cli_arguments[CLI_SCOPE_TOOL].push_back(I->get());
+			forwardable_cli_arguments[CLI_SCOPE_PROJECT].push_back(I->get());
+		}
+		if (I->get() == "--single-window" ||
+				I->get() == "--audio-driver" ||
+				I->get() == "--display-driver" ||
+				I->get() == "--rendering-driver") {
+			forwardable_cli_arguments[CLI_SCOPE_TOOL].push_back(I->get());
+		}
+#endif
+
 		if (adding_user_args) {
 		if (adding_user_args) {
 			user_args.push_back(I->get());
 			user_args.push_back(I->get());
 		} else if (I->get() == "-h" || I->get() == "--help" || I->get() == "/?") { // display help
 		} else if (I->get() == "-h" || I->get() == "--help" || I->get() == "/?") { // display help
@@ -881,7 +905,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 			}
 			}
 		} else if (I->get() == "--single-window") { // force single window
 		} else if (I->get() == "--single-window") { // force single window
 
 
-			OS::get_singleton()->_single_window = true;
+			single_window = true;
 		} else if (I->get() == "-t" || I->get() == "--always-on-top") { // force always-on-top window
 		} else if (I->get() == "-t" || I->get() == "--always-on-top") { // force always-on-top window
 
 
 			init_always_on_top = true;
 			init_always_on_top = true;
@@ -2446,7 +2470,7 @@ bool Main::start() {
 
 
 		bool embed_subwindows = GLOBAL_DEF("display/window/subwindows/embed_subwindows", true);
 		bool embed_subwindows = GLOBAL_DEF("display/window/subwindows/embed_subwindows", true);
 
 
-		if (OS::get_singleton()->is_single_window() || (!project_manager && !editor && embed_subwindows) || !DisplayServer::get_singleton()->has_feature(DisplayServer::Feature::FEATURE_SUBWINDOWS)) {
+		if (single_window || (!project_manager && !editor && embed_subwindows) || !DisplayServer::get_singleton()->has_feature(DisplayServer::Feature::FEATURE_SUBWINDOWS)) {
 			sml->get_root()->set_embedding_subwindows(true);
 			sml->get_root()->set_embedding_subwindows(true);
 		}
 		}
 
 

+ 11 - 0
main/main.h

@@ -35,6 +35,9 @@
 #include "core/os/thread.h"
 #include "core/os/thread.h"
 #include "core/typedefs.h"
 #include "core/typedefs.h"
 
 
+template <class T>
+class Vector;
+
 class Main {
 class Main {
 	static void print_help(const char *p_binary);
 	static void print_help(const char *p_binary);
 	static uint64_t last_ticks;
 	static uint64_t last_ticks;
@@ -47,6 +50,14 @@ class Main {
 
 
 public:
 public:
 	static bool is_cmdline_tool();
 	static bool is_cmdline_tool();
+#ifdef TOOLS_ENABLED
+	enum CLIScope {
+		CLI_SCOPE_TOOL, // Editor and project manager.
+		CLI_SCOPE_PROJECT,
+	};
+	static const Vector<String> &get_forwardable_cli_arguments(CLIScope p_scope);
+#endif
+
 	static int test_entrypoint(int argc, char *argv[], bool &tests_need_run);
 	static int test_entrypoint(int argc, char *argv[], bool &tests_need_run);
 	static Error setup(const char *execpath, int argc, char *argv[], bool p_second_phase = true);
 	static Error setup(const char *execpath, int argc, char *argv[], bool p_second_phase = true);
 	static Error setup2(Thread::ID p_main_tid_override = 0);
 	static Error setup2(Thread::ID p_main_tid_override = 0);

+ 0 - 1
platform/javascript/os_javascript.h

@@ -98,7 +98,6 @@ public:
 	String get_user_data_dir() const override;
 	String get_user_data_dir() const override;
 
 
 	bool is_userfs_persistent() const override;
 	bool is_userfs_persistent() const override;
-	bool is_single_window() const override { return true; }
 
 
 	void alert(const String &p_alert, const String &p_title = "ALERT!") override;
 	void alert(const String &p_alert, const String &p_title = "ALERT!") override;