mirror of
https://github.com/tauri-apps/tauri.git
synced 2024-12-25 19:54:07 +03:00
Transformed event-loop callback to FnMut to allow mutable values (#2667)
This commit is contained in:
parent
2792531347
commit
bdbf905e5d
7
.changes/mutable-callbacks.md
Normal file
7
.changes/mutable-callbacks.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
"tauri-runtime-wry": minor
|
||||||
|
"tauri-runtime": minor
|
||||||
|
"tauri": minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Change event loop callbacks definition to allow callers to move in mutable values.
|
@ -1770,7 +1770,7 @@ impl Runtime for Wry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "windows", target_os = "macos"))]
|
#[cfg(any(target_os = "windows", target_os = "macos"))]
|
||||||
fn run_iteration<F: Fn(RunEvent) + 'static>(&mut self, callback: F) -> RunIteration {
|
fn run_iteration<F: FnMut(RunEvent) + 'static>(&mut self, mut callback: F) -> RunIteration {
|
||||||
use wry::application::platform::run_return::EventLoopExtRunReturn;
|
use wry::application::platform::run_return::EventLoopExtRunReturn;
|
||||||
let windows = self.windows.clone();
|
let windows = self.windows.clone();
|
||||||
let web_context = &self.web_context;
|
let web_context = &self.web_context;
|
||||||
@ -1795,7 +1795,7 @@ impl Runtime for Wry {
|
|||||||
event_loop,
|
event_loop,
|
||||||
control_flow,
|
control_flow,
|
||||||
EventLoopIterationContext {
|
EventLoopIterationContext {
|
||||||
callback: &callback,
|
callback: &mut callback,
|
||||||
windows: windows.clone(),
|
windows: windows.clone(),
|
||||||
window_event_listeners: &window_event_listeners,
|
window_event_listeners: &window_event_listeners,
|
||||||
global_shortcut_manager: global_shortcut_manager.clone(),
|
global_shortcut_manager: global_shortcut_manager.clone(),
|
||||||
@ -1812,7 +1812,7 @@ impl Runtime for Wry {
|
|||||||
iteration
|
iteration
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run<F: Fn(RunEvent) + 'static>(self, callback: F) {
|
fn run<F: FnMut(RunEvent) + 'static>(self, mut callback: F) {
|
||||||
let windows = self.windows.clone();
|
let windows = self.windows.clone();
|
||||||
let web_context = self.web_context;
|
let web_context = self.web_context;
|
||||||
let window_event_listeners = self.window_event_listeners.clone();
|
let window_event_listeners = self.window_event_listeners.clone();
|
||||||
@ -1829,7 +1829,7 @@ impl Runtime for Wry {
|
|||||||
event_loop,
|
event_loop,
|
||||||
control_flow,
|
control_flow,
|
||||||
EventLoopIterationContext {
|
EventLoopIterationContext {
|
||||||
callback: &callback,
|
callback: &mut callback,
|
||||||
windows: windows.clone(),
|
windows: windows.clone(),
|
||||||
window_event_listeners: &window_event_listeners,
|
window_event_listeners: &window_event_listeners,
|
||||||
global_shortcut_manager: global_shortcut_manager.clone(),
|
global_shortcut_manager: global_shortcut_manager.clone(),
|
||||||
@ -1846,7 +1846,7 @@ impl Runtime for Wry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct EventLoopIterationContext<'a> {
|
struct EventLoopIterationContext<'a> {
|
||||||
callback: &'a (dyn Fn(RunEvent) + 'static),
|
callback: &'a mut (dyn FnMut(RunEvent) + 'static),
|
||||||
windows: Arc<Mutex<HashMap<WindowId, WindowWrapper>>>,
|
windows: Arc<Mutex<HashMap<WindowId, WindowWrapper>>>,
|
||||||
window_event_listeners: &'a WindowEventListeners,
|
window_event_listeners: &'a WindowEventListeners,
|
||||||
global_shortcut_manager: Arc<Mutex<WryShortcutManager>>,
|
global_shortcut_manager: Arc<Mutex<WryShortcutManager>>,
|
||||||
@ -1858,7 +1858,7 @@ struct EventLoopIterationContext<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct UserMessageContext<'a> {
|
struct UserMessageContext<'a> {
|
||||||
callback: Option<&'a (dyn Fn(RunEvent) + 'static)>,
|
callback: Option<&'a mut (dyn FnMut(RunEvent) + 'static)>,
|
||||||
window_event_listeners: &'a WindowEventListeners,
|
window_event_listeners: &'a WindowEventListeners,
|
||||||
global_shortcut_manager: Arc<Mutex<WryShortcutManager>>,
|
global_shortcut_manager: Arc<Mutex<WryShortcutManager>>,
|
||||||
clipboard_manager: Arc<Mutex<Clipboard>>,
|
clipboard_manager: Arc<Mutex<Clipboard>>,
|
||||||
@ -2388,7 +2388,7 @@ fn handle_event_loop(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn on_window_close<'a>(
|
fn on_window_close<'a>(
|
||||||
callback: &'a (dyn Fn(RunEvent) + 'static),
|
callback: &'a mut (dyn FnMut(RunEvent) + 'static),
|
||||||
window_id: WindowId,
|
window_id: WindowId,
|
||||||
mut windows: MutexGuard<'a, HashMap<WindowId, WindowWrapper>>,
|
mut windows: MutexGuard<'a, HashMap<WindowId, WindowWrapper>>,
|
||||||
control_flow: &mut ControlFlow,
|
control_flow: &mut ControlFlow,
|
||||||
|
@ -336,7 +336,7 @@ pub trait Runtime: Sized + 'static {
|
|||||||
fn run_iteration<F: Fn(RunEvent) + 'static>(&mut self, callback: F) -> RunIteration;
|
fn run_iteration<F: Fn(RunEvent) + 'static>(&mut self, callback: F) -> RunIteration;
|
||||||
|
|
||||||
/// Run the webview runtime.
|
/// Run the webview runtime.
|
||||||
fn run<F: Fn(RunEvent) + 'static>(self, callback: F);
|
fn run<F: FnMut(RunEvent) + 'static>(self, callback: F);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Webview dispatcher. A thread-safe handle to the webview API.
|
/// Webview dispatcher. A thread-safe handle to the webview API.
|
||||||
|
@ -432,16 +432,16 @@ impl<R: Runtime> App<R> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Runs the application.
|
/// Runs the application.
|
||||||
pub fn run<F: Fn(&AppHandle<R>, Event) + 'static>(mut self, callback: F) {
|
pub fn run<F: FnMut(&AppHandle<R>, Event) + 'static>(mut self, mut callback: F) {
|
||||||
let app_handle = self.handle();
|
let app_handle = self.handle();
|
||||||
let manager = self.manager.clone();
|
let manager = self.manager.clone();
|
||||||
self.runtime.take().unwrap().run(move |event| match event {
|
self.runtime.take().unwrap().run(move |event| match event {
|
||||||
RunEvent::Exit => {
|
RunEvent::Exit => {
|
||||||
app_handle.cleanup_before_exit();
|
app_handle.cleanup_before_exit();
|
||||||
on_event_loop_event(&app_handle, RunEvent::Exit, &manager, Some(&callback));
|
on_event_loop_event(&app_handle, RunEvent::Exit, &manager, Some(&mut callback));
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
on_event_loop_event(&app_handle, event, &manager, Some(&callback));
|
on_event_loop_event(&app_handle, event, &manager, Some(&mut callback));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -475,7 +475,7 @@ impl<R: Runtime> App<R> {
|
|||||||
&app_handle,
|
&app_handle,
|
||||||
event,
|
event,
|
||||||
&manager,
|
&manager,
|
||||||
Option::<&Box<dyn Fn(&AppHandle<R>, Event)>>::None,
|
Option::<&mut Box<dyn FnMut(&AppHandle<R>, Event)>>::None,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -1034,11 +1034,11 @@ impl<R: Runtime> Builder<R> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_event_loop_event<R: Runtime, F: Fn(&AppHandle<R>, Event) + 'static>(
|
fn on_event_loop_event<R: Runtime, F: FnMut(&AppHandle<R>, Event) + 'static>(
|
||||||
app_handle: &AppHandle<R>,
|
app_handle: &AppHandle<R>,
|
||||||
event: RunEvent,
|
event: RunEvent,
|
||||||
manager: &WindowManager<R>,
|
manager: &WindowManager<R>,
|
||||||
callback: Option<&F>,
|
callback: Option<&mut F>,
|
||||||
) {
|
) {
|
||||||
if let RunEvent::WindowClose(label) = &event {
|
if let RunEvent::WindowClose(label) = &event {
|
||||||
manager.on_window_close(label);
|
manager.on_window_close(label);
|
||||||
|
Loading…
Reference in New Issue
Block a user