use crate::extensions::model::Proc;
use crate::ported::panel::Panel;
use crate::ported::process::{processStateChar, Process, Process_getParent, Process_getPid};
use crate::ported::table::Table;
pub fn proc_from(p: &Process) -> Proc {
Proc {
pid: Process_getPid(p).max(0) as u32,
ppid: Process_getParent(p).max(0) as u32,
user: p.user.clone().unwrap_or_else(|| p.st_uid.to_string()),
comm: p.procComm.clone().unwrap_or_default(),
cmdline: p.cmdline.clone().unwrap_or_default(),
state: processStateChar(p.state),
cpu: p.percent_cpu,
mem_kb: p.m_resident.max(0) as u64,
}
}
pub fn snapshot_table(table: &Table) -> Vec<Proc> {
table
.rows
.iter()
.flatten()
.filter_map(|o| o.as_process())
.map(proc_from)
.collect()
}
pub fn selected_pid(table: &Table) -> Option<u32> {
if table.panel.is_null() {
return None;
}
let panel = unsafe { &*table.panel };
index_of_selected(panel)
}
fn index_of_selected(panel: &Panel) -> Option<u32> {
let i = panel.selected;
if i < 0 || i as usize >= panel.items.len() {
return None;
}
panel.items[i as usize]
.object()
.as_process()
.map(|p| Process_getPid(p).max(0) as u32)
}
pub fn index_of_pid(panel: &Panel, pid: u32) -> Option<i32> {
panel.items.iter().enumerate().find_map(|(i, it)| {
it.object()
.as_process()
.filter(|p| Process_getPid(p).max(0) as u32 == pid)
.map(|_| i as i32)
})
}