diff --git a/.changes/runtime-wry-avoid-clones.md b/.changes/runtime-wry-avoid-clones.md new file mode 100644 index 000000000000..afa03acab1f4 --- /dev/null +++ b/.changes/runtime-wry-avoid-clones.md @@ -0,0 +1,5 @@ +--- +"tauri-runtime-wry": "minor:changes" +--- + +`EventLoopIterationContext` and `UserMessageContext` now takes references to avoid clones diff --git a/crates/tauri-runtime-wry/src/lib.rs b/crates/tauri-runtime-wry/src/lib.rs index 7cfbe1855033..4cbef1e871db 100644 --- a/crates/tauri-runtime-wry/src/lib.rs +++ b/crates/tauri-runtime-wry/src/lib.rs @@ -241,8 +241,8 @@ pub(crate) fn send_user_message( &context.main_thread.window_target, message, UserMessageContext { - window_id_map: context.window_id_map.clone(), - windows: context.main_thread.windows.clone(), + window_id_map: &context.window_id_map, + windows: &context.main_thread.windows, }, ); Ok(()) @@ -3187,13 +3187,13 @@ impl Runtime for Wry { #[cfg(desktop)] fn run_iteration) + 'static>(&mut self, mut callback: F) { use tao::platform::run_return::EventLoopExtRunReturn; - let windows = self.context.main_thread.windows.clone(); - let window_id_map = self.context.window_id_map.clone(); + let windows = &self.context.main_thread.windows; + let window_id_map = &self.context.window_id_map; let web_context = &self.context.main_thread.web_context; - let plugins = self.context.plugins.clone(); + let plugins = &self.context.plugins; #[cfg(feature = "tracing")] - let active_tracing_spans = self.context.main_thread.active_tracing_spans.clone(); + let active_tracing_spans = &self.context.main_thread.active_tracing_spans; let proxy = self.event_loop.create_proxy(); @@ -3213,10 +3213,10 @@ impl Runtime for Wry { control_flow, EventLoopIterationContext { callback: &mut callback, - window_id_map: window_id_map.clone(), - windows: windows.clone(), + window_id_map, + windows, #[cfg(feature = "tracing")] - active_tracing_spans: active_tracing_spans.clone(), + active_tracing_spans, }, web_context, ); @@ -3231,18 +3231,17 @@ impl Runtime for Wry { control_flow, EventLoopIterationContext { callback: &mut callback, - windows: windows.clone(), - window_id_map: window_id_map.clone(), + windows, + window_id_map, #[cfg(feature = "tracing")] - active_tracing_spans: active_tracing_spans.clone(), + active_tracing_spans, }, ); }); } fn run) + 'static>(self, callback: F) { - let event_handler = make_event_handler(&self, callback); - + let event_handler = make_event_handler(self.context, callback); self.event_loop.run(event_handler) } @@ -3250,8 +3249,7 @@ impl Runtime for Wry { fn run_return) + 'static>(mut self, callback: F) -> i32 { use tao::platform::run_return::EventLoopExtRunReturn; - let event_handler = make_event_handler(&self, callback); - + let event_handler = make_event_handler(self.context, callback); self.event_loop.run_return(event_handler) } @@ -3262,22 +3260,18 @@ impl Runtime for Wry { } } -fn make_event_handler( - runtime: &Wry, +fn make_event_handler) + 'static>( + context: Context, mut callback: F, -) -> impl FnMut(Event<'_, Message>, &EventLoopWindowTarget>, &mut ControlFlow) -where - T: UserEvent, - F: FnMut(RunEvent) + 'static, -{ - let windows = runtime.context.main_thread.windows.clone(); - let window_id_map = runtime.context.window_id_map.clone(); - let web_context = runtime.context.main_thread.web_context.clone(); - let plugins = runtime.context.plugins.clone(); +) -> impl FnMut(Event<'_, Message>, &EventLoopWindowTarget>, &mut ControlFlow) { + let windows = context.main_thread.windows; + let window_id_map = context.window_id_map; + let web_context = context.main_thread.web_context; + let plugins = context.plugins; #[cfg(feature = "tracing")] - let active_tracing_spans = runtime.context.main_thread.active_tracing_spans.clone(); - let proxy = runtime.event_loop.create_proxy(); + let active_tracing_spans = context.main_thread.active_tracing_spans; + let proxy = context.proxy; move |event, event_loop, control_flow| { for p in plugins.lock().unwrap().iter_mut() { @@ -3288,10 +3282,10 @@ where control_flow, EventLoopIterationContext { callback: &mut callback, - window_id_map: window_id_map.clone(), - windows: windows.clone(), + window_id_map: &window_id_map, + windows: &windows, #[cfg(feature = "tracing")] - active_tracing_spans: active_tracing_spans.clone(), + active_tracing_spans: &active_tracing_spans, }, &web_context, ); @@ -3305,10 +3299,10 @@ where control_flow, EventLoopIterationContext { callback: &mut callback, - window_id_map: window_id_map.clone(), - windows: windows.clone(), + window_id_map: &window_id_map, + windows: &windows, #[cfg(feature = "tracing")] - active_tracing_spans: active_tracing_spans.clone(), + active_tracing_spans: &active_tracing_spans, }, ); } @@ -3316,15 +3310,15 @@ where pub struct EventLoopIterationContext<'a, T: UserEvent> { pub callback: &'a mut (dyn FnMut(RunEvent) + 'static), - pub window_id_map: WindowIdStore, - pub windows: Arc, + pub window_id_map: &'a WindowIdStore, + pub windows: &'a WindowsStore, #[cfg(feature = "tracing")] - pub active_tracing_spans: ActiveTraceSpanStore, + pub active_tracing_spans: &'a ActiveTraceSpanStore, } -struct UserMessageContext { - windows: Arc, - window_id_map: WindowIdStore, +struct UserMessageContext<'a> { + windows: &'a WindowsStore, + window_id_map: &'a WindowIdStore, } fn handle_user_message( @@ -4437,7 +4431,7 @@ fn handle_event_loop( fn on_close_requested<'a, T: UserEvent>( callback: &'a mut (dyn FnMut(RunEvent) + 'static), window_id: WindowId, - windows: Arc, + windows: &WindowsStore, ) { let (tx, rx) = channel(); let windows_ref = windows.0.borrow(); @@ -4465,7 +4459,7 @@ fn on_close_requested<'a, T: UserEvent>( } } -fn on_window_close(window_id: WindowId, windows: Arc) { +fn on_window_close(window_id: WindowId, windows: &WindowsStore) { if let Some(window_wrapper) = windows.0.borrow_mut().get_mut(&window_id) { window_wrapper.inner = None; #[cfg(windows)]