sysinfo-gui 0.1.18

A cross-platform system-monitoring gui application based on sysinfo and fltk
pub mod cpu;
pub mod disk;
pub mod general;
pub mod info;
pub mod mem;
pub mod net;
pub mod procs;
pub mod settings;

use crate::gui::{message::Message, styles::colors::GRAY, View};
use fltk::app;
use parking_lot::Mutex;
use std::sync::{
    atomic::{AtomicBool, AtomicU64, Ordering},
    Arc,
};
use sysinfo::System;

#[repr(i32)]
#[derive(Debug, Clone, Copy, PartialEq)]
enum SortOrder {
    Pid,
    Mem,
    Virt,
    Cpu,
    Exe,
    User,
    RevPid,
    RevMem,
    RevVirt,
    RevCpu,
    RevExe,
    RevUser,
}

pub struct MyView {
    system: Arc<Mutex<System>>,
    sleep: Arc<AtomicU64>,
    light_mode: Arc<AtomicBool>,
    ordering: Arc<Mutex<SortOrder>>,
}

impl Default for MyView {
    fn default() -> Self {
        #[cfg(feature = "dark-light")]
        let mode = dark_light::detect() == dark_light::Mode::Light;
        #[cfg(not(feature = "dark-light"))]
        let mode = false;

        if mode {
            app::foreground(50, 50, 50);
            app::background(255, 255, 255);
        } else {
            app::foreground(255, 255, 255);
            let (r, g, b) = GRAY.to_rgb();
            app::background(r, g, b);
        }
        let mut sys = System::new_all();
        sys.refresh_all();
        let system = Arc::new(Mutex::new(sys));
        Self {
            system,
            sleep: Arc::new(AtomicU64::from(300)),
            light_mode: Arc::new(AtomicBool::from(mode)),
            ordering: Arc::new(Mutex::new(SortOrder::Pid)),
        }
    }
}

impl View for MyView {
    fn view(&self, msg: Message) -> Option<Box<dyn FnMut() + Send>> {
        match msg {
            Message::General => self.general(),
            Message::Disks => self.disks(),
            Message::Proc => self.cpu(),
            Message::Memory => self.memory(),
            Message::Procs => self.procs(),
            Message::Net => self.network(),
            Message::Settings => self.settings(),
            Message::Info => self.info(),
        }
    }
    fn sleep_duration(&self) -> u64 {
        self.sleep.load(Ordering::Relaxed)
    }
    fn light_mode(&self) -> bool {
        self.light_mode.load(Ordering::Relaxed)
    }
}

impl MyView {
    pub fn general(&self) -> Option<Box<dyn FnMut() + Send>> {
        general::general(self)
    }
    pub fn memory(&self) -> Option<Box<dyn FnMut() + Send>> {
        mem::memory(self)
    }
    pub fn settings(&self) -> Option<Box<dyn FnMut() + Send>> {
        settings::settings(self)
    }
    pub fn network(&self) -> Option<Box<dyn FnMut() + Send>> {
        net::network(self)
    }
    pub fn cpu(&self) -> Option<Box<dyn FnMut() + Send>> {
        cpu::proc(self)
    }
    pub fn disks(&self) -> Option<Box<dyn FnMut() + Send>> {
        disk::disks(self)
    }
    pub fn procs(&self) -> Option<Box<dyn FnMut() + Send>> {
        procs::procs(self)
    }
    pub fn info(&self) -> Option<Box<dyn FnMut() + Send>> {
        info::info(self)
    }
}