diff options
Diffstat (limited to 'engine/src/windowing.rs')
| -rw-r--r-- | engine/src/windowing.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/engine/src/windowing.rs b/engine/src/windowing.rs index 5cb34f7..a0201db 100644 --- a/engine/src/windowing.rs +++ b/engine/src/windowing.rs @@ -1,3 +1,5 @@ +use std::borrow::Cow; +use std::env::consts::EXE_SUFFIX; use std::hint::cold_path; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Weak}; @@ -5,6 +7,7 @@ use std::thread::Builder as ThreadBuilder; use crossbeam_queue::ArrayQueue; use raw_window_handle::{DisplayHandle, HandleError, HasDisplayHandle, WindowHandle}; +use rfd::{MessageButtons, MessageDialog, MessageLevel}; use winit::application::ApplicationHandler; use winit::dpi::PhysicalPosition; use winit::error::EventLoopError; @@ -75,6 +78,40 @@ impl crate::ecs::extension::Extension for Extension { fn collect(self, mut collector: crate::ecs::extension::Collector<'_>) { + if cfg!(not(debug_assertions)) { + std::panic::set_hook(Box::new(|panic_info| { + let panic_message: Cow<'static, str> = if let Some(panic_message) = + panic_info.payload().downcast_ref::<&'static str>() + { + (*panic_message).into() + } else if let Some(panic_message) = + panic_info.payload().downcast_ref::<String>() + { + panic_message.clone().into() + } else { + "(unknown panic payload type)".into() + }; + + MessageDialog::new() + .set_level(MessageLevel::Error) + .set_title(format!( + "{}: A critical error occurred", + std::env::current_exe().map_or_else( + |_| env!("CARGO_CRATE_NAME").to_owned(), + |current_exe_path| current_exe_path + .file_name() + .unwrap() + .to_string_lossy() + .trim_end_matches(EXE_SUFFIX) + .to_owned() + ) + )) + .set_description(panic_message) + .set_buttons(MessageButtons::Ok) + .show(); + })); + } + if !CONTEXT_CREATED.load(Ordering::Relaxed) { collector.add_sole(Context::new()).ok(); } |
