diff --git a/api/cpp/include/slint_window.h b/api/cpp/include/slint_window.h index 33247c52fbe..47a0c5098c1 100644 --- a/api/cpp/include/slint_window.h +++ b/api/cpp/include/slint_window.h @@ -93,7 +93,9 @@ class WindowAdapterRc auto popup_dyn = popup.into_dyn(); auto id = cbindgen_private::slint_windowrc_show_popup(&inner, &popup_dyn, p, close_policy, &parent_item, false); - popup->user_init(); + // Defer user_init to prevent recursion when init callbacks call popup.show() + cbindgen_private::slint_post_event([popup](void *) { popup->user_init(); }, nullptr, + nullptr); return id; } @@ -123,7 +125,9 @@ class WindowAdapterRc auto id = cbindgen_private::slint_windowrc_show_popup( &inner, &popup_dyn, pos, cbindgen_private::PopupClosePolicy::CloseOnClickOutside, &context_menu_rc, true); - popup->user_init(); + // Defer user_init to prevent recursion when init callbacks call popup.show() + cbindgen_private::slint_post_event([popup](void *) { popup->user_init(); }, nullptr, + nullptr); return id; } diff --git a/internal/compiler/generator/rust.rs b/internal/compiler/generator/rust.rs index 7e91c07c2a2..810526d3045 100644 --- a/internal/compiler/generator/rust.rs +++ b/internal/compiler/generator/rust.rs @@ -2912,7 +2912,14 @@ fn compile_builtin_function_call( false, // is_menu )) ); - #popup_window_id::user_init(popup_instance_vrc.clone()); + // Defer user_init to prevent recursion when init callbacks call popup.show() + let popup_instance_vrc_for_init = popup_instance_vrc.clone(); + if let Err(_) = i_slint_core::api::invoke_from_event_loop(move || { + #popup_window_id::user_init(popup_instance_vrc_for_init); + }) { + // Fallback: if event loop is not available (e.g., during testing), call synchronously + #popup_window_id::user_init(popup_instance_vrc.clone()); + } }) } else { panic!("internal error: invalid args to ShowPopupWindow {arguments:?}") @@ -2991,7 +2998,14 @@ fn compile_builtin_function_call( true, // is_menu ); #set_id; - #popup_id::user_init(popup_instance_vrc); + // Defer user_init to prevent recursion when init callbacks call popup.show() + let popup_instance_vrc_for_init = popup_instance_vrc.clone(); + if let Err(_) = i_slint_core::api::invoke_from_event_loop(move || { + #popup_id::user_init(popup_instance_vrc_for_init); + }) { + // Fallback: if event loop is not available (e.g., during testing), call synchronously + #popup_id::user_init(popup_instance_vrc); + } }; let common_init = quote! {