Skip to content

Commit

Permalink
Add error applet panic hook
Browse files Browse the repository at this point in the history
  • Loading branch information
FenrirWolf committed Feb 24, 2024
1 parent a9ded19 commit c6d5cdc
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions ctru-rs/src/applets/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,34 @@ impl PopUp {
}
}

/// Sets a custom panic hook that uses the error applet to display panic messages. You can also choose to have
/// messages printed over stderr along with the pop-up display.
///
/// SAFETY: The error applet requires that both the [`Apt`] and [`Gfx`] services are active whenever it launches.
/// By calling this function, you promise that you will keep those services alive until either the program ends or
/// you unregister this hook with [`std::panic::take_hook`](https://doc.rust-lang.org/std/panic/fn.take_hook.html).
pub unsafe fn set_panic_hook(use_stderr: bool) {

Check warning on line 88 in ctru-rs/src/applets/error.rs

View workflow job for this annotation

GitHub Actions / lint (nightly-2024-02-18)

unsafe function's docs miss `# Safety` section
std::panic::set_hook(Box::new(move |panic_info| {
let mut popup = PopUp::new(Kind::Top);

let thread = std::thread::current();

let name = thread.name().unwrap_or("<unnamed>");

let payload = format!("thread '{name}' {panic_info}");

popup.set_text(&payload);

if use_stderr {
eprintln!("{payload}");
}

unsafe {
ctru_sys::errorDisp(popup.state.as_mut());
}
}))
}

impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Expand Down

0 comments on commit c6d5cdc

Please sign in to comment.