Update application

This commit is contained in:
apio 2022-11-11 22:27:05 +01:00
parent 3e82887e99
commit 340508ca57
3 changed files with 190 additions and 4 deletions

117
Cargo.lock generated
View File

@ -291,6 +291,49 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "crossbeam-channel"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
dependencies = [
"cfg-if",
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348"
dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
"memoffset",
"scopeguard",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac"
dependencies = [
"cfg-if",
]
[[package]] [[package]]
name = "crossfont" name = "crossfont"
version = "0.5.1" version = "0.5.1"
@ -481,6 +524,12 @@ dependencies = [
"web-sys", "web-sys",
] ]
[[package]]
name = "either"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
[[package]] [[package]]
name = "emath" name = "emath"
version = "0.19.0" version = "0.19.0"
@ -727,6 +776,15 @@ dependencies = [
"gl_generator", "gl_generator",
] ]
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "ident_case" name = "ident_case"
version = "1.0.1" version = "1.0.1"
@ -1036,6 +1094,25 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "ntapi"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc51db7b362b205941f71232e56c625156eb9a929f8cf74a428fd5bc094a4afc"
dependencies = [
"winapi",
]
[[package]]
name = "num_cpus"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5"
dependencies = [
"hermit-abi",
"libc",
]
[[package]] [[package]]
name = "num_enum" name = "num_enum"
version = "0.5.7" version = "0.5.7"
@ -1210,6 +1287,30 @@ dependencies = [
"cty", "cty",
] ]
[[package]]
name = "rayon"
version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d"
dependencies = [
"autocfg",
"crossbeam-deque",
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-utils",
"num_cpus",
]
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.2.16" version = "0.2.16"
@ -1248,6 +1349,7 @@ dependencies = [
"eframe", "eframe",
"egui", "egui",
"serde", "serde",
"sysinfo",
"toml", "toml",
] ]
@ -1411,6 +1513,21 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "sysinfo"
version = "0.26.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c375d5fd899e32847b8566e10598d6e9f1d9b55ec6de3cdf9e7da4bdc51371bc"
dependencies = [
"cfg-if",
"core-foundation-sys",
"libc",
"ntapi",
"once_cell",
"rayon",
"winapi",
]
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.37" version = "1.0.37"

View File

@ -8,6 +8,7 @@ egui = "0.19.0"
eframe = { version = "0.19.0", features = ["persistence"] } eframe = { version = "0.19.0", features = ["persistence"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
toml = "0.5.9" toml = "0.5.9"
sysinfo = "0.26.7"
[profile.dev.package."*"] [profile.dev.package."*"]
opt-level = 2 opt-level = 2

View File

@ -1,4 +1,5 @@
use serde::{Serialize, Deserialize}; use serde::{Serialize, Deserialize};
use sysinfo::{System, SystemExt, ProcessExt, Pid, Process, Uid};
use eframe::App; use eframe::App;
@ -6,14 +7,26 @@ use eframe::App;
#[serde(default)] #[serde(default)]
pub struct Application pub struct Application
{ {
label: String label: String,
#[serde(skip)]
info: System,
#[serde(skip)]
current_pid: Option<Pid>,
#[serde(skip)]
kill_current: bool,
#[serde(skip)]
this_user_id: Option<Uid>,
} }
impl Default for Application impl Default for Application
{ {
fn default() -> Self { fn default() -> Self {
Self { Self {
label: "Example".to_owned() label: "Example".to_owned(),
info: System::new(),
current_pid: None,
kill_current: false,
this_user_id: None
} }
} }
} }
@ -30,6 +43,10 @@ impl Application {
} }
} }
pub fn get_process_display_name(process: &Process) -> &str {
*process.exe().to_str().unwrap().split("/").collect::<Vec<&str>>().last().unwrap()
}
impl App for Application { impl App for Application {
fn save(&mut self, storage: &mut dyn eframe::Storage) { fn save(&mut self, storage: &mut dyn eframe::Storage) {
eframe::set_value(storage, eframe::APP_KEY, self); eframe::set_value(storage, eframe::APP_KEY, self);
@ -46,9 +63,60 @@ impl App for Application {
}); });
}); });
self.info.refresh_all();
if self.this_user_id.is_none() {
let current_process_or_none = self.info.process(sysinfo::get_current_pid().unwrap());
self.this_user_id = Some(current_process_or_none.unwrap().user_id().unwrap().to_owned())
}
if self.current_pid.is_some() {
let process_or_none = self.info.process(Pid::from(self.current_pid.unwrap()));
if process_or_none.is_none() {
self.current_pid = None
} else {
let process = process_or_none.unwrap();
egui::TopBottomPanel::bottom("process_bottom_panel").show(ctx, |ui| {
ui.horizontal(|ui| {
ui.label(format!("{}: {}", i32::try_from(process.pid()).unwrap_or(-1), process.exe().to_str().unwrap()));
if ui.button("End Process").clicked() {
self.kill_current = true
}
if ui.button("Close").clicked() {
self.kill_current = false;
self.current_pid = None
}
});
});
if self.kill_current {
egui::Window::new("Confirm").collapsible(true).show(ctx, |ui| {
ui.label(format!("Are you sure you want to end the process {}?", get_process_display_name(process)));
if ui.button("End Process").clicked() {
process.kill_with(sysinfo::Signal::Term);
self.current_pid = None;
self.kill_current = false
}
if ui.button("Cancel").clicked() {
self.kill_current = false
}
});
}
}
}
egui::CentralPanel::default().show(ctx, |ui| { egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("Hello, world!"); ui.heading(format!("Total memory: {} bytes", self.info.total_memory()));
egui::warn_if_debug_build(ui); ui.heading(format!("Free memory: {} bytes", self.info.free_memory()));
egui::ScrollArea::vertical().show(ui, |ui| {
let mut values = Vec::from_iter(self.info.processes().values());
values.sort_by(|a, b| a.user_id().unwrap().cmp(b.user_id().unwrap()));
let processes= values.iter().filter(|proc| proc.exe().exists()).filter(|proc| proc.user_id().unwrap() == self.this_user_id.as_ref().expect("User id should have already been loaded"));
for process in processes {
if ui.selectable_label(false, format!("{}", get_process_display_name(*process))).clicked() {
self.current_pid = Some(process.pid());
}
}
});
}); });
} }
} }