feat(core): allow listening to event loop events & prevent window close (#2131)

This commit is contained in:
Lucas Fernandes Nogueira
2021-07-06 13:36:37 -03:00
committed by GitHub
parent d69b1cf6d7
commit 8157a68af1
12 changed files with 169 additions and 56 deletions

View File

@@ -1490,6 +1490,11 @@ fn handle_event_loop(
#[cfg(feature = "system-tray")]
tray_context,
} = context;
if *control_flow == ControlFlow::Exit {
return RunIteration {
webview_count: webviews.len(),
};
}
*control_flow = ControlFlow::Wait;
match event {
@@ -1562,14 +1567,26 @@ fn handle_event_loop(
}
match event {
WryWindowEvent::CloseRequested => {
on_window_close(
callback,
window_id,
&mut webviews,
control_flow,
#[cfg(feature = "menu")]
menu_event_listeners.clone(),
);
let (tx, rx) = channel();
if let Some(w) = webviews.get(&window_id) {
callback(RunEvent::CloseRequested {
label: w.label.clone(),
signal_tx: tx,
});
if let Ok(true) = rx.try_recv() {
} else {
on_window_close(
callback,
window_id,
&mut webviews,
control_flow,
#[cfg(target_os = "linux")]
window_event_listeners,
#[cfg(feature = "menu")]
menu_event_listeners.clone(),
);
}
}
}
// we also resize the webview on `Moved` to fix https://github.com/tauri-apps/tauri/issues/1911
WryWindowEvent::Resized(_) | WryWindowEvent::Moved(_) => {
@@ -1666,22 +1683,13 @@ fn handle_event_loop(
WindowMessage::Show => window.set_visible(true),
WindowMessage::Hide => window.set_visible(false),
WindowMessage::Close => {
for handler in window_event_listeners
.lock()
.unwrap()
.get(&window.id())
.unwrap()
.lock()
.unwrap()
.values()
{
handler(&WindowEvent::CloseRequested);
}
on_window_close(
callback,
id,
&mut webviews,
control_flow,
#[cfg(target_os = "linux")]
window_event_listeners,
#[cfg(feature = "menu")]
menu_event_listeners.clone(),
);
@@ -1851,6 +1859,7 @@ fn on_window_close<'a>(
window_id: WindowId,
webviews: &mut MutexGuard<'a, HashMap<WindowId, WebviewWrapper>>,
control_flow: &mut ControlFlow,
#[cfg(target_os = "linux")] window_event_listeners: &WindowEventListeners,
#[cfg(feature = "menu")] menu_event_listeners: MenuEventListeners,
) {
if let Some(webview) = webviews.remove(&window_id) {
@@ -1862,6 +1871,21 @@ fn on_window_close<'a>(
*control_flow = ControlFlow::Exit;
callback(RunEvent::Exit);
}
// TODO: tao does not fire the destroyed event properly
#[cfg(target_os = "linux")]
{
for handler in window_event_listeners
.lock()
.unwrap()
.get(&window_id)
.unwrap()
.lock()
.unwrap()
.values()
{
handler(&WindowEvent::Destroyed);
}
}
}
fn center_window(window: &Window) -> Result<()> {