#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn install_tracing_subscriber() {
use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt as _};
let filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new("warn,indicatrix=info,indicatrix_cut=info"));
let file_name = "indicatrix-cut.log";
let beside_exe = std::env::current_exe()
.ok()
.and_then(|exe| exe.parent().map(|dir| dir.join(file_name)));
let candidates = [beside_exe, Some(std::env::temp_dir().join(file_name))];
let log_file = std::env::args()
.any(|arg| arg == "--log")
.then(|| {
candidates.into_iter().flatten().find_map(|path| {
std::fs::OpenOptions::new()
.create(true)
.append(true)
.open(path)
.ok()
})
})
.flatten();
let stderr_layer = fmt::layer().with_writer(std::io::stderr).with_target(true);
let file_layer = log_file.map(|file| {
fmt::layer()
.with_writer(file)
.with_ansi(false)
.with_target(true)
});
let _ = tracing_subscriber::registry()
.with(filter)
.with(stderr_layer)
.with(file_layer)
.try_init();
}
fn install_panic_logger() {
let previous = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
let file_name = "indicatrix-cut-panic.log";
let beside_exe = std::env::current_exe()
.ok()
.and_then(|exe| exe.parent().map(|dir| dir.join(file_name)));
let candidates = [beside_exe, Some(std::env::temp_dir().join(file_name))];
let thread = std::thread::current();
let entry = format!(
"---\nthread: {}\n{info}\nbacktrace: {}\n",
thread.name().unwrap_or("<unnamed>"),
std::backtrace::Backtrace::force_capture()
);
for path in candidates.into_iter().flatten() {
use std::io::Write as _;
if let Ok(mut f) = std::fs::OpenOptions::new()
.create(true)
.append(true)
.open(&path)
&& f.write_all(entry.as_bytes()).is_ok()
{
break;
}
}
previous(info);
}));
}
fn apply_saved_ui_scale() {
if let Some(factor) = indicatrix_cut::gui::preferences::saved_ui_scale_factor() {
unsafe { std::env::set_var("SLINT_SCALE_FACTOR", factor) };
}
}
fn main() -> anyhow::Result<()> {
apply_saved_ui_scale();
install_tracing_subscriber();
install_panic_logger();
if let Some(path) =
indicatrix_cut::gui::startup_file::path_from_args(std::env::args_os().skip(1))
{
indicatrix_cut::gui::startup_file::request_open_at_startup(path);
}
indicatrix_cut::gui::main()
}