Explorar el Código

Defer the call to 'popup_str' to the next cycle to let Godot Engine's editor time to properly start

Xavier Sellier hace 3 años
padre
commit
ba0abd399f
Se han modificado 3 ficheros con 21 adiciones y 5 borrados
  1. 7 0
      core/error/error_macros.cpp
  2. 12 5
      editor/editor_toaster.cpp
  3. 2 0
      editor/editor_toaster.h

+ 7 - 0
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();
 }
 

+ 12 - 5
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);

+ 2 - 0
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);