summaryrefslogtreecommitdiff
path: root/engine/src
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-06-01 01:50:16 +0200
committerHampusM <hampus@hampusmat.com>2026-06-01 01:50:16 +0200
commitc85300fca2c9ece5d3ecd76f0b156b0b53baf6ea (patch)
treef35f946e7aa79c39ea01c54a08eb20aed462d6d0 /engine/src
parentf3f18a6d0593073a222d50a67584ee643d0d299d (diff)
feat(engine): show message dialog with error on panic in release builds
Diffstat (limited to 'engine/src')
-rw-r--r--engine/src/windowing.rs37
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();
}