use htoprs::ported::commandline;
fn main() {
let args: Vec<String> = std::env::args().collect();
let name = args
.first()
.and_then(|p| p.rsplit('/').next())
.filter(|s| !s.is_empty())
.unwrap_or("htoprs");
for arg in &args[1..] {
match arg.as_str() {
"-V" | "--version" => {
commandline::printVersionFlag(name);
return;
}
"-h" | "--help" => {
commandline::printHelpFlag(name);
return;
}
_ => {}
}
}
run_tui();
}
#[cfg(target_os = "macos")]
fn install_panic_hook() {
let default = std::panic::take_hook();
std::panic::set_hook(Box::new(move |info| {
use crossterm::{cursor, execute, terminal};
let _ = terminal::disable_raw_mode();
let mut out = std::io::stdout();
let _ = execute!(out, terminal::LeaveAlternateScreen, cursor::Show);
default(info);
}));
}
#[cfg(target_os = "macos")]
fn run_tui() {
use htoprs::ported::action::State;
use htoprs::ported::crt::{CRT_done, CRT_init};
use htoprs::ported::darwin::darwinmachine::{DarwinMachine, Machine_new, Machine_scan};
use htoprs::ported::darwin::darwinprocesstable::{DarwinProcessTable, ProcessTable_new};
use htoprs::ported::darwin::platform::Platform_init;
use htoprs::ported::dynamiccolumn::DynamicColumns_new;
use htoprs::ported::hashtable::{Hashtable, Hashtable_new};
use htoprs::ported::header::{Header, Header_new, Header_populateFromSettings};
use htoprs::ported::machine::{
Machine, Machine_populateTablesFromSettings, Machine_scanTables, Machine_setTablesPanel,
};
use htoprs::ported::mainpanel::{
MainPanel, MainPanel_new, MainPanel_setState, MainPanel_updateLabels,
};
use htoprs::ported::panel::Panel;
use htoprs::ported::screenmanager::{ScreenManager_add, ScreenManager_new, ScreenManager_run};
use htoprs::ported::settings::Settings_new;
use htoprs::ported::table::Table;
install_panic_hook();
Platform_init();
let host_raw: *mut DarwinMachine = Box::into_raw(Machine_new(None, u32::MAX));
let host_ptr: *mut Machine = unsafe { &mut (*host_raw).super_ };
let pt_raw: *mut DarwinProcessTable =
Box::into_raw(ProcessTable_new(host_ptr as *const Machine, None));
let pt_table: *mut Table = unsafe { &mut (*pt_raw).super_.super_ };
let dm: *mut Hashtable = Box::into_raw(Box::new(Hashtable_new(7, true)));
let dc: *mut Hashtable = Box::into_raw(Box::new(DynamicColumns_new()));
let ds: *mut Hashtable = Box::into_raw(Box::new(Hashtable_new(7, true)));
let settings = Settings_new(unsafe { &(*host_raw).super_ }, Some(dm), Some(dc), Some(ds));
let delay = settings.delay;
let color_scheme = settings.colorScheme;
let h_layout = settings.hLayout;
Machine_populateTablesFromSettings(unsafe { &mut (*host_raw).super_ }, settings, pt_table);
let header_raw: *mut Header =
Box::into_raw(Box::new(Header_new(host_ptr as *const Machine, h_layout)));
Header_populateFromSettings(unsafe { &mut *header_raw }, unsafe {
(*host_raw).super_.settings.as_ref().unwrap()
});
CRT_init(delay, color_scheme, false, true, false);
let mut panel_box: Box<MainPanel> = Box::new(MainPanel_new());
let panel_ptr: *mut MainPanel = &mut *panel_box;
Machine_setTablesPanel(unsafe { &mut (*host_raw).super_ }, unsafe {
&mut (*panel_ptr).super_ as *mut Panel
});
MainPanel_updateLabels(&mut panel_box, false, false);
let state_raw: *mut State = Box::into_raw(Box::new(State {
host: host_ptr,
mainPanel: panel_ptr,
header: header_raw,
failedUpdate: None,
pauseUpdate: false,
hideSelection: false,
hideMeters: false,
}));
MainPanel_setState(&mut panel_box, state_raw);
let mut scr = ScreenManager_new(header_raw, host_ptr, state_raw);
ScreenManager_add(&mut scr, panel_box, -1);
Machine_scan(unsafe { &mut *host_raw });
Machine_scanTables(unsafe { &mut (*host_raw).super_ });
htoprs::extensions::overlay::init_from_prefs();
ScreenManager_run(&mut scr, None, None, None);
CRT_done();
}
#[cfg(not(target_os = "macos"))]
fn run_tui() {
eprintln!("htoprs: the interactive TUI is wired for macOS (darwin) in this build");
eprintln!("htoprs: run 'htoprs --help' for the command-line options");
std::process::exit(1);
}