diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp index d1f421e1d..880b39a00 100644 --- a/editor/editor_log.cpp +++ b/editor/editor_log.cpp @@ -96,22 +96,17 @@ void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_f EditorLog *self = (EditorLog *)p_self; String err_str; + if (p_errorexp && p_errorexp[0]) { err_str = String::utf8(p_errorexp); } else { err_str = String::utf8(p_file) + ":" + itos(p_line) + " - " + String::utf8(p_error); } - if (p_type == ERR_HANDLER_WARNING) { - self->add_message(err_str, MSG_TYPE_WARNING); - } else { - self->add_message(err_str, MSG_TYPE_ERROR); - } - MessageType message_type = p_type == ERR_HANDLER_WARNING ? MSG_TYPE_WARNING : MSG_TYPE_ERROR; if (self->current != Thread::get_caller_id()) { - self->call_deferred("add_message", err_str, message_type); + self->call_deferred("add_thread_message", Thread::get_caller_id(), err_str, message_type); } else { self->add_message(err_str, message_type); } @@ -260,39 +255,6 @@ void EditorLog::_process_message(const String &p_msg, MessageType p_type, bool p } void EditorLog::add_message(const String &p_msg, MessageType p_type) { - /* TODO - bool restore = p_type != MSG_TYPE_STD; - switch (p_type) { - case MSG_TYPE_STD: { - } break; - case MSG_TYPE_ERROR: { - log->push_color(get_theme_color("error_color", "Editor")); - Ref icon = get_theme_icon("Error", "EditorIcons"); - log->add_image(icon); - log->add_text(" "); - tool_button->set_icon(icon); - } break; - case MSG_TYPE_WARNING: { - log->push_color(get_theme_color("warning_color", "Editor")); - Ref icon = get_theme_icon("Warning", "EditorIcons"); - log->add_image(icon); - log->add_text(" "); - tool_button->set_icon(icon); - } break; - case MSG_TYPE_EDITOR: { - // Distinguish editor messages from messages printed by the project - log->push_color(get_theme_color("font_color", "Editor") * Color(1, 1, 1, 0.6)); - } break; - } - - log->add_text(p_msg); - log->add_newline(); - - if (restore) { - log->pop(); - } - */ - // Make text split by new lines their own message. // See #41321 for reasoning. At time of writing, multiple print()'s in running projects // get grouped together and sent to the editor log as one message. This can mess with the @@ -306,6 +268,22 @@ void EditorLog::add_message(const String &p_msg, MessageType p_type) { } } +void EditorLog::add_thread_message(Thread::ID thread_id, const String &p_msg, MessageType p_type) { + // Make text split by new lines their own message. + // See #41321 for reasoning. At time of writing, multiple print()'s in running projects + // get grouped together and sent to the editor log as one message. This can mess with the + // search functionality (see the comments on the PR above for more details). This behavior + // also matches that of other IDE's. + Vector lines = p_msg.split("\n", true); + int line_count = lines.size(); + + String thread_str = "(T: " + String::num(thread_id) + ") "; + + for (int i = 0; i < line_count; i++) { + _process_message(thread_str + lines[i], p_type, i == line_count - 1); + } +} + void EditorLog::set_tool_button(ToolButton *p_tool_button) { tool_button = p_tool_button; } @@ -412,6 +390,9 @@ void EditorLog::_reset_message_counts() { } void EditorLog::_bind_methods() { + ClassDB::bind_method(D_METHOD("add_message"), &EditorLog::add_message); + ClassDB::bind_method(D_METHOD("add_thread_message"), &EditorLog::add_thread_message); + ClassDB::bind_method(D_METHOD("_clear_request"), &EditorLog::_clear_request); ClassDB::bind_method(D_METHOD("_copy_request"), &EditorLog::_copy_request); diff --git a/editor/editor_log.h b/editor/editor_log.h index 01fcecb44..f27ffdee1 100644 --- a/editor/editor_log.h +++ b/editor/editor_log.h @@ -153,6 +153,8 @@ protected: public: void add_message(const String &p_msg, MessageType p_type = MSG_TYPE_STD); + //not thread safe! + void add_thread_message(Thread::ID thread_id, const String &p_msg, MessageType p_type = MSG_TYPE_STD); void set_tool_button(ToolButton *p_tool_button); void deinit(); diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp index 57be4717f..816804aca 100644 --- a/editor/script_editor_debugger.cpp +++ b/editor/script_editor_debugger.cpp @@ -961,10 +961,11 @@ void EditorScriptEditorDebugger::_parse_message(const String &p_msg, uint64_t p_ //OUT for (int i = 0; i < p_data.size(); i++) { Array output = p_data[i]; - ERR_FAIL_COND_MSG(output.size() < 2, "Malformed output message from script debugger."); + ERR_FAIL_COND_MSG(output.size() < 3, "Malformed output message from script debugger."); String str = output[0]; ScriptDebuggerRemote::MessageType type = (ScriptDebuggerRemote::MessageType)(int)(output[1]); + Thread::ID logger_thread_id = (Thread::ID)(output[2]); EditorLog::MessageType msg_type; switch (type) { @@ -990,7 +991,11 @@ void EditorScriptEditorDebugger::_parse_message(const String &p_msg, uint64_t p_ } } - EditorNode::get_log()->add_message(str, msg_type); + if (process_main_thread_id == 0 || process_main_thread_id == logger_thread_id) { + EditorNode::get_log()->add_message(str, msg_type); + } else { + EditorNode::get_log()->add_thread_message(logger_thread_id, str, msg_type); + } } } else if (p_msg == "performance") { Array arr = p_data[0]; diff --git a/scene/debugger/script_debugger_remote.cpp b/scene/debugger/script_debugger_remote.cpp index 2ae748d04..45e045e31 100644 --- a/scene/debugger/script_debugger_remote.cpp +++ b/scene/debugger/script_debugger_remote.cpp @@ -496,6 +496,7 @@ void ScriptDebuggerRemote::_get_output() { Array msg_data; msg_data.push_back(output_string.message); msg_data.push_back(output_string.type); + msg_data.push_back(output_string.thread); packet_peer_stream->put_var(msg_data); @@ -1250,11 +1251,13 @@ void ScriptDebuggerRemote::_print_handler(void *p_this, const String &p_string, OutputString output_string; output_string.message = s; output_string.type = p_error ? MESSAGE_TYPE_ERROR : MESSAGE_TYPE_LOG; + output_string.thread = Thread::get_caller_id(); sdr->output_strings.push_back(output_string); if (overflowed) { output_string.message = "[output overflow, print less text!]"; output_string.type = MESSAGE_TYPE_ERROR; + output_string.thread = Thread::get_caller_id(); sdr->output_strings.push_back(output_string); } } diff --git a/scene/debugger/script_debugger_remote.h b/scene/debugger/script_debugger_remote.h index e692b2b1a..3bb577394 100644 --- a/scene/debugger/script_debugger_remote.h +++ b/scene/debugger/script_debugger_remote.h @@ -91,6 +91,7 @@ class ScriptDebuggerRemote : public ScriptDebugger { struct OutputString { String message; int type; + Thread::ID thread; }; List output_strings;