diff options
-rw-r--r-- | core/error/error_macros.cpp | 7 | ||||
-rw-r--r-- | editor/editor_toaster.cpp | 17 | ||||
-rw-r--r-- | editor/editor_toaster.h | 2 |
3 files changed, 21 insertions, 5 deletions
diff --git a/core/error/error_macros.cpp b/core/error/error_macros.cpp index 61bb949ed4..c236f30945 100644 --- a/core/error/error_macros.cpp +++ b/core/error/error_macros.cpp @@ -37,9 +37,16 @@ static ErrorHandlerList *error_handler_list = nullptr; void add_error_handler(ErrorHandlerList *p_handler) { + // If p_handler is already in error_handler_list + // we'd better remove it first then we can add it. + // This prevent cyclic redundancy. + remove_error_handler(p_handler); + _global_lock(); + p_handler->next = error_handler_list; error_handler_list = p_handler; + _global_unlock(); } diff --git a/editor/editor_toaster.cpp b/editor/editor_toaster.cpp index 0d9a546b8e..05b895519d 100644 --- a/editor/editor_toaster.cpp +++ b/editor/editor_toaster.cpp @@ -173,11 +173,7 @@ void EditorToaster::_error_handler(void *p_self, const char *p_func, const char } Severity severity = (p_type == ERR_HANDLER_WARNING) ? SEVERITY_WARNING : SEVERITY_ERROR; - if (Thread::get_caller_id() != Thread::get_main_id()) { - EditorToaster::get_singleton()->call_deferred(SNAME("popup_str"), err_str, severity, tooltip_str); - } else { - EditorToaster::get_singleton()->popup_str(err_str, severity, tooltip_str); - } + EditorToaster::get_singleton()->popup_str(err_str, severity, tooltip_str); } } @@ -387,6 +383,12 @@ Control *EditorToaster::popup(Control *p_control, Severity p_severity, double p_ } void EditorToaster::popup_str(String p_message, Severity p_severity, String p_tooltip) { + // Since "_popup_str" adds nodes to the tree, and since the "add_child" method is not + // thread-safe, it's better to defer the call to the next cycle to be thread-safe. + call_deferred(SNAME("_popup_str"), p_message, p_severity, p_tooltip); +} + +void EditorToaster::_popup_str(String p_message, Severity p_severity, String p_tooltip) { // Check if we already have a popup with the given message. Control *control = nullptr; for (KeyValue<Control *, Toast> element : toasts) { @@ -440,6 +442,11 @@ EditorToaster *EditorToaster::get_singleton() { return singleton; } +void EditorToaster::_bind_methods() { + // Binding method to make it defer-able. + ClassDB::bind_method(D_METHOD("_popup_str", "message", "severity", "tooltip"), &EditorToaster::_popup_str); +} + EditorToaster::EditorToaster() { set_notify_transform(true); set_process_internal(true); diff --git a/editor/editor_toaster.h b/editor/editor_toaster.h index aac80d8fb1..502498986a 100644 --- a/editor/editor_toaster.h +++ b/editor/editor_toaster.h @@ -94,9 +94,11 @@ private: void _set_notifications_enabled(bool p_enabled); void _repop_old(); + void _popup_str(String p_message, Severity p_severity, String p_tooltip); protected: static EditorToaster *singleton; + static void _bind_methods(); void _notification(int p_what); |