Browse Source

[macOS] Fix infinite loop caused by global menu callbacks which trigger EditorProgress dialog.

bruvzg 2 years ago
parent
commit
48730e3b77
2 changed files with 7 additions and 5 deletions
  1. 1 1
      platform/macos/display_server_macos.h
  2. 6 4
      platform/macos/display_server_macos.mm

+ 1 - 1
platform/macos/display_server_macos.h

@@ -188,7 +188,7 @@ private:
 		Variant tag;
 		Callable callback;
 	};
-	Vector<MenuCall> deferred_menu_calls;
+	List<MenuCall> deferred_menu_calls;
 
 	const NSMenu *_get_menu_root(const String &p_menu_root) const;
 	NSMenu *_get_menu_root(const String &p_menu_root);

+ 6 - 4
platform/macos/display_server_macos.mm

@@ -3521,14 +3521,16 @@ void DisplayServerMacOS::process_events() {
 	}
 
 	// Process "menu_callback"s.
-	for (MenuCall &E : deferred_menu_calls) {
-		Variant tag = E.tag;
+	while (List<MenuCall>::Element *call_p = deferred_menu_calls.front()) {
+		MenuCall call = call_p->get();
+		deferred_menu_calls.pop_front(); // Remove before call to avoid infinite loop in case callback is using `process_events` (e.g. EditorProgress).
+
+		Variant tag = call.tag;
 		Variant *tagp = &tag;
 		Variant ret;
 		Callable::CallError ce;
-		E.callback.callp((const Variant **)&tagp, 1, ret, ce);
+		call.callback.callp((const Variant **)&tagp, 1, ret, ce);
 	}
-	deferred_menu_calls.clear();
 
 	if (!drop_events) {
 		_process_key_events();