diff options
Diffstat (limited to 'alacritty_terminal/src/panic.rs')
-rw-r--r-- | alacritty_terminal/src/panic.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/alacritty_terminal/src/panic.rs b/alacritty_terminal/src/panic.rs new file mode 100644 index 00000000..4d3524ed --- /dev/null +++ b/alacritty_terminal/src/panic.rs @@ -0,0 +1,53 @@ +// Copyright 2016 Joe Wilm, The Alacritty Project Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//! ANSI Terminal Stream Parsing + +// Use the default behavior of the other platforms. +#[cfg(not(windows))] +pub fn attach_handler() {} + +// Install a panic handler that renders the panic in a classical Windows error +// dialog box as well as writes the panic to STDERR. +#[cfg(windows)] +pub fn attach_handler() { + use std::{io, io::Write, panic, ptr}; + use winapi::um::winuser; + + panic::set_hook(Box::new(|panic_info| { + let _ = writeln!(io::stderr(), "{}", panic_info); + let msg = format!("{}\n\nPress Ctrl-C to Copy", panic_info); + unsafe { + winuser::MessageBoxW( + ptr::null_mut(), + win32_string(&msg).as_ptr(), + win32_string("Alacritty: Runtime Error").as_ptr(), + winuser::MB_ICONERROR + | winuser::MB_OK + | winuser::MB_SETFOREGROUND + | winuser::MB_TASKMODAL, + ); + } + })); +} + +// Converts the string slice into a Windows-standard representation for "W"- +// suffixed function variants, which accept UTF-16 encoded string values. +#[cfg(windows)] +fn win32_string(value: &str) -> Vec<u16> { + use std::ffi::OsStr; + use std::iter::once; + use std::os::windows::ffi::OsStrExt; + OsStr::new(value).encode_wide().chain(once(0)).collect() +} |