1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

[macOS] Add support for loading shell environment from UI apps.

This commit is contained in:
bruvzg
2023-09-03 11:44:18 +03:00
committed by Pāvels Nadtočajevs
parent e45cc68092
commit ee181951b6
5 changed files with 40 additions and 0 deletions

View File

@@ -205,6 +205,7 @@ public:
virtual String get_environment(const String &p_var) const = 0; virtual String get_environment(const String &p_var) const = 0;
virtual void set_environment(const String &p_var, const String &p_value) const = 0; virtual void set_environment(const String &p_var, const String &p_value) const = 0;
virtual void unset_environment(const String &p_var) const = 0; virtual void unset_environment(const String &p_var) const = 0;
virtual void load_shell_environment() const {}
virtual String get_name() const = 0; virtual String get_name() const = 0;
virtual String get_identifier() const; virtual String get_identifier() const;

View File

@@ -373,6 +373,10 @@
Forces a [i]constant[/i] delay between frames in the main loop (in milliseconds). In most situations, [member application/run/max_fps] should be preferred as an FPS limiter as it's more precise. Forces a [i]constant[/i] delay between frames in the main loop (in milliseconds). In most situations, [member application/run/max_fps] should be preferred as an FPS limiter as it's more precise.
This setting can be overridden using the [code]--frame-delay <ms;>[/code] command line argument. This setting can be overridden using the [code]--frame-delay <ms;>[/code] command line argument.
</member> </member>
<member name="application/run/load_shell_environment" type="bool" setter="" getter="" default="false">
If [code]true[/code], loads the default shell and copies environment variables set by the shell startup scripts to the app environment.
[b]Note:[/b] This setting is implemented on macOS for non-sandboxed applications only.
</member>
<member name="application/run/low_processor_mode" type="bool" setter="" getter="" default="false"> <member name="application/run/low_processor_mode" type="bool" setter="" getter="" default="false">
If [code]true[/code], enables low-processor usage mode. When enabled, the engine takes longer to redraw, but only redraws the screen if necessary. This may lower power consumption, and is intended for editors or mobile applications. For most games, because the screen needs to be redrawn every frame, it is recommended to keep this setting disabled. If [code]true[/code], enables low-processor usage mode. When enabled, the engine takes longer to redraw, but only redraws the screen if necessary. This may lower power consumption, and is intended for editors or mobile applications. For most games, because the screen needs to be redrawn every frame, it is recommended to keep this setting disabled.
</member> </member>

View File

@@ -1037,6 +1037,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
Vector<String> breakpoints; Vector<String> breakpoints;
bool delta_smoothing_override = false; bool delta_smoothing_override = false;
bool load_shell_env = false;
String default_renderer = ""; String default_renderer = "";
String default_renderer_mobile = ""; String default_renderer_mobile = "";
@@ -2642,12 +2643,18 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
OS::get_singleton()->_allow_hidpi = GLOBAL_DEF("display/window/dpi/allow_hidpi", true); OS::get_singleton()->_allow_hidpi = GLOBAL_DEF("display/window/dpi/allow_hidpi", true);
OS::get_singleton()->_allow_layered = GLOBAL_DEF_RST("display/window/per_pixel_transparency/allowed", false); OS::get_singleton()->_allow_layered = GLOBAL_DEF_RST("display/window/per_pixel_transparency/allowed", false);
load_shell_env = GLOBAL_DEF("application/run/load_shell_environment", false);
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
if (editor || project_manager) { if (editor || project_manager) {
// The editor and project manager always detect and use hiDPI if needed. // The editor and project manager always detect and use hiDPI if needed.
OS::get_singleton()->_allow_hidpi = true; OS::get_singleton()->_allow_hidpi = true;
load_shell_env = true;
} }
#endif #endif
if (load_shell_env) {
OS::get_singleton()->load_shell_environment();
}
if (separate_thread_render == -1) { if (separate_thread_render == -1) {
separate_thread_render = (int)GLOBAL_DEF("rendering/driver/threads/thread_model", OS::RENDER_THREAD_SAFE) == OS::RENDER_SEPARATE_THREAD; separate_thread_render = (int)GLOBAL_DEF("rendering/driver/threads/thread_model", OS::RENDER_THREAD_SAFE) == OS::RENDER_SEPARATE_THREAD;

View File

@@ -78,6 +78,8 @@ public:
virtual void set_cmdline_platform_args(const List<String> &p_args); virtual void set_cmdline_platform_args(const List<String> &p_args);
virtual List<String> get_cmdline_platform_args() const override; virtual List<String> get_cmdline_platform_args() const override;
virtual void load_shell_environment() const override;
virtual String get_name() const override; virtual String get_name() const override;
virtual String get_distribution_name() const override; virtual String get_distribution_name() const override;
virtual String get_version() const override; virtual String get_version() const override;

View File

@@ -238,6 +238,32 @@ List<String> OS_MacOS::get_cmdline_platform_args() const {
return launch_service_args; return launch_service_args;
} }
void OS_MacOS::load_shell_environment() const {
static bool shell_env_loaded = false;
if (unlikely(!shell_env_loaded)) {
shell_env_loaded = true;
if (OS::get_singleton()->has_environment("TERM") || OS::get_singleton()->has_environment("__GODOT_SHELL_ENV_SET")) {
return; // Already started from terminal, or other the instance with the shell environment, do nothing.
}
String pipe;
List<String> args;
args.push_back("-c");
args.push_back(". /etc/zshrc;. /etc/zprofile;. ~/.zshenv;. ~/.zshrc;. ~/.zprofile;env");
Error err = OS::get_singleton()->execute("zsh", args, &pipe);
if (err == OK) {
Vector<String> env_vars = pipe.split("\n");
for (const String &E : env_vars) {
Vector<String> tags = E.split("=", 2);
if (tags.size() != 2 || tags[0] == "SHELL" || tags[0] == "USER" || tags[0] == "COMMAND_MODE" || tags[0] == "TMPDIR" || tags[0] == "TERM_SESSION_ID" || tags[0] == "PWD" || tags[0] == "OLDPWD" || tags[0] == "SHLVL" || tags[0] == "HOME" || tags[0] == "DISPLAY" || tags[0] == "LOGNAME" || tags[0] == "TERM" || tags[0] == "COLORTERM" || tags[0] == "_" || tags[0].begins_with("__CF") || tags[0].begins_with("XPC_") || tags[0].begins_with("__GODOT")) {
continue;
}
OS::get_singleton()->set_environment(tags[0], tags[1]);
}
}
OS::get_singleton()->set_environment("__GODOT_SHELL_ENV_SET", "1");
}
}
String OS_MacOS::get_name() const { String OS_MacOS::get_name() const {
return "macOS"; return "macOS";
} }