Merge pull request #113267 from bruvzg/mac_headless_inst

[macOS] Do not use `openApplicationAtURL` for headless instances.
This commit is contained in:
Rémi Verschelde 2025-12-01 11:49:36 +01:00
commit b275237bbd
No known key found for this signature in database
GPG key ID: C3336907360768E1
3 changed files with 26 additions and 17 deletions

View file

@ -61,21 +61,6 @@ int main(int argc, char **argv) {
bool is_embedded = false;
bool is_headless = false;
const char *headless_args[] = {
"--headless",
"-h",
"--help",
"/?",
"--version",
"--dump-gdextension-interface",
"--dump-extension-api",
"--dump-extension-api-with-docs",
"--validate-extension-api",
"--convert-3to4",
"--validate-conversion-3to4",
"--doctool",
};
for (int i = 0; i < argc; i++) {
if (strcmp("-NSDocumentRevisionsDebugMode", argv[i]) == 0) {
// remove "-NSDocumentRevisionsDebugMode" and the next argument
@ -94,8 +79,8 @@ int main(int argc, char **argv) {
if (strcmp("--embedded", argv[i]) == 0) {
is_embedded = true;
}
for (size_t j = 0; j < std::size(headless_args); j++) {
if (strcmp(headless_args[j], argv[i]) == 0) {
for (size_t j = 0; j < std::size(OS_MacOS::headless_args); j++) {
if (strcmp(OS_MacOS::headless_args[j], argv[i]) == 0) {
is_headless = true;
break;
}

View file

@ -79,6 +79,23 @@ protected:
virtual void delete_main_loop() override;
public:
static inline const char *headless_args[] = {
"--headless",
"-h",
"--help",
"/?",
"--version",
"--dump-gdextension-interface",
"--dump-extension-api",
"--dump-gdextension-interface-json",
"--dump-extension-api-with-docs",
"--validate-extension-api",
"--convert-3to4",
"--validate-conversion-3to4",
"--doctool",
"--test",
};
virtual void add_frame_delay(bool p_can_draw, bool p_wake_for_events) override;
virtual void set_cmdline_platform_args(const List<String> &p_args);

View file

@ -852,6 +852,13 @@ Error OS_MacOS::create_process(const String &p_path, const List<String> &p_argum
}
Error OS_MacOS::create_instance(const List<String> &p_arguments, ProcessID *r_child_id) {
// Do not run headless instance as app bundle, since it will never send `applicationDidFinishLaunching` and register as failed start after timeout.
for (size_t i = 0; i < std::size(OS_MacOS::headless_args); i++) {
if (p_arguments.find(String(OS_MacOS::headless_args[i]))) {
return OS_Unix::create_process(get_executable_path(), p_arguments, r_child_id, false);
}
}
// If executable is bundled, always execute editor instances as an app bundle to ensure app window is registered and activated correctly.
NSString *nsappname = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
if (nsappname != nil) {