Skip to content

Commit 61e3765

Browse files
authored
fix(core): deadlock when creating window from IPC handler, closes #4121 (#4123)
1 parent b9d9609 commit 61e3765

2 files changed

Lines changed: 15 additions & 17 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri-runtime-wry": patch
3+
---
4+
5+
Use the event loop proxy to create a window so it doesn't deadlock on Windows.

core/tauri-runtime-wry/src/lib.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -225,16 +225,16 @@ impl<T: UserEvent> Context<T> {
225225

226226
self.prepare_window(window_id);
227227

228-
let context_ = context.clone();
229-
send_user_message(
230-
&context_,
231-
Message::CreateWebview(
228+
// we cannot use `send_user_message` here, see https://github.com/tauri-apps/wry/issues/583
229+
self
230+
.proxy
231+
.send_event(Message::CreateWebview(
232232
window_id,
233233
Box::new(move |event_loop, web_context| {
234234
create_webview(window_id, event_loop, web_context, context, pending)
235235
}),
236-
),
237-
)?;
236+
))
237+
.map_err(|_| Error::FailedToSendMessage)?;
238238

239239
let dispatcher = WryDispatcher {
240240
window_id,
@@ -2622,8 +2622,6 @@ fn handle_event_loop<T: UserEvent>(
26222622
#[allow(unused_mut)]
26232623
let mut window_id = window_id.unwrap(); // always Some on MenuBar event
26242624

2625-
println!("got {:?}", window_id);
2626-
26272625
#[cfg(target_os = "macos")]
26282626
{
26292627
// safety: we're only checking to see if the window_id is 0
@@ -2937,6 +2935,8 @@ fn create_webview<T: UserEvent>(
29372935
};
29382936
let window = window_builder.inner.build(event_loop).unwrap();
29392937

2938+
webview_id_map.insert(window.id(), window_id);
2939+
29402940
if window_builder.center {
29412941
let _ = center_window(&window, window.inner_size());
29422942
}
@@ -3008,8 +3008,6 @@ fn create_webview<T: UserEvent>(
30083008
.build()
30093009
.map_err(|e| Error::CreateWebview(Box::new(e)))?;
30103010

3011-
webview_id_map.insert(webview.window().id(), window_id);
3012-
30133011
#[cfg(windows)]
30143012
{
30153013
let controller = webview.controller();
@@ -3059,16 +3057,11 @@ fn create_ipc_handler<T: UserEvent>(
30593057
handler: WebviewIpcHandler<T, Wry<T>>,
30603058
) -> Box<dyn Fn(&Window, String) + 'static> {
30613059
Box::new(move |window, request| {
3060+
let window_id = context.webview_id_map.get(&window.id());
30623061
handler(
30633062
DetachedWindow {
30643063
dispatcher: WryDispatcher {
3065-
window_id: *context
3066-
.webview_id_map
3067-
.0
3068-
.lock()
3069-
.unwrap()
3070-
.get(&window.id())
3071-
.unwrap(),
3064+
window_id,
30723065
context: context.clone(),
30733066
},
30743067
label: label.clone(),

0 commit comments

Comments
 (0)