From 18b198b61e3a3d8091046fab36780b8991fb7f3c Mon Sep 17 00:00:00 2001 From: Rishant12220055 Date: Thu, 25 Sep 2025 16:04:43 +0530 Subject: [PATCH 1/2] Fix recursion panic when PopupWindow.show() called in init callback (#9498) - Defer user_init() call using event loop in both Rust and C++ backends - Add fallback to synchronous call when event loop unavailable - Fixes issue where init callbacks calling popup.show() caused infinite recursion Changes: - internal/compiler/generator/rust.rs: Defer user_init via invoke_from_event_loop - api/cpp/include/slint_window.h: Defer user_init via slint_post_event - Applied to both ShowPopupWindow and ShowPopupMenu cases This change breaks the recursion by deferring the user_init execution, allowing the popup to be properly initialized before init callbacks run. --- api/cpp/include/slint_window.h | 6 ++++-- internal/compiler/generator/rust.rs | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/api/cpp/include/slint_window.h b/api/cpp/include/slint_window.h index 33247c52fbe..25f40a952be 100644 --- a/api/cpp/include/slint_window.h +++ b/api/cpp/include/slint_window.h @@ -93,7 +93,8 @@ 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 +124,8 @@ 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! { From 99c782c5b9827956fc4d0fa66c07f97a97230ea4 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 17:55:38 +0000 Subject: [PATCH 2/2] [autofix.ci] apply automated fixes --- api/cpp/include/slint_window.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/api/cpp/include/slint_window.h b/api/cpp/include/slint_window.h index 25f40a952be..47a0c5098c1 100644 --- a/api/cpp/include/slint_window.h +++ b/api/cpp/include/slint_window.h @@ -94,7 +94,8 @@ class WindowAdapterRc auto id = cbindgen_private::slint_windowrc_show_popup(&inner, &popup_dyn, p, close_policy, &parent_item, false); // Defer user_init to prevent recursion when init callbacks call popup.show() - cbindgen_private::slint_post_event([popup](void *) { popup->user_init(); }, nullptr, nullptr); + cbindgen_private::slint_post_event([popup](void *) { popup->user_init(); }, nullptr, + nullptr); return id; } @@ -125,7 +126,8 @@ class WindowAdapterRc &inner, &popup_dyn, pos, cbindgen_private::PopupClosePolicy::CloseOnClickOutside, &context_menu_rc, true); // Defer user_init to prevent recursion when init callbacks call popup.show() - cbindgen_private::slint_post_event([popup](void *) { popup->user_init(); }, nullptr, nullptr); + cbindgen_private::slint_post_event([popup](void *) { popup->user_init(); }, nullptr, + nullptr); return id; }