#[cfg(windows)]
use std::sync::atomic::{AtomicBool, Ordering};
#[cfg(windows)]
static HAS_CONSOLE: AtomicBool = AtomicBool::new(false);
#[cfg(windows)]
pub fn attach_parent() {
use windows_sys::Win32::System::Console::{
ATTACH_PARENT_PROCESS, AttachConsole, GetConsoleWindow,
};
let attached = unsafe {
!GetConsoleWindow().is_null() || AttachConsole(ATTACH_PARENT_PROCESS) != 0
};
HAS_CONSOLE.store(attached, Ordering::Relaxed);
}
#[cfg(not(windows))]
pub fn attach_parent() {}
pub fn report_error(message: &str) {
#[cfg(windows)]
if !HAS_CONSOLE.load(Ordering::Relaxed) {
show_message_box(message);
return;
}
eprintln!("Error: {message}");
}
#[cfg(windows)]
fn show_message_box(message: &str) {
use windows_sys::Win32::UI::WindowsAndMessaging::{MB_ICONERROR, MB_OK, MessageBoxW};
let wide = |s: &str| {
s.encode_utf16()
.chain(std::iter::once(0))
.collect::<Vec<u16>>()
};
let text = wide(message);
let caption = wide("rigtop");
unsafe {
MessageBoxW(
std::ptr::null_mut(),
text.as_ptr(),
caption.as_ptr(),
MB_OK | MB_ICONERROR,
);
}
}