diff --git a/Cargo.toml b/Cargo.toml index da1382a..516dafd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,9 @@ iced = { version = "^0.10.0", features = ["advanced", "image"] } flate2 = { version = "^1", optional = true } tar = { version = "^0.4", optional = true } +[target.'cfg(target_os = "windows")'.dependencies] +windows-sys = { version = "^0.52.0", features = ["Win32_System_Console", "Win32_Foundation"] } + [profile.release] opt-level = "s" lto = true diff --git a/src/main.rs b/src/main.rs index fac4894..5b95249 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,6 +27,8 @@ fn main() -> iced::Result { } pub fn setup_logger() -> Result<(), fern::InitError> { + attach_windows_console(); + let colors = ColoredLevelConfig::new().info(Color::Green); let make_formatter = |use_colors: bool| { @@ -75,3 +77,20 @@ pub fn setup_logger() -> Result<(), fern::InitError> { Ok(()) } + +/// (Windows) Allow the application to display logs to the terminal +/// regardless if it was compiled with `windows_subsystem = "windows"`. +/// +/// This is a no-op when compiled to non-windows targets. +fn attach_windows_console() { + #[cfg(target_os = "windows")] + { + use windows_sys::Win32::System::Console::{AttachConsole, ATTACH_PARENT_PROCESS}; + + // # SAFETY: + // According to the docs: https://learn.microsoft.com/en-us/windows/console/attachconsole + // + // AttachConsole doesn't have any footguns, so calling it like this is fine. + let _ = unsafe { AttachConsole(ATTACH_PARENT_PROCESS) }; + } +}