mirror of
https://github.com/tauri-apps/tauri.git
synced 2026-04-03 10:11:15 +02:00
feat(core): allow listening to event loop events & prevent window close (#2131)
This commit is contained in:
committed by
GitHub
parent
d69b1cf6d7
commit
8157a68af1
@@ -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<()> {
|
||||
|
||||
Reference in New Issue
Block a user