Fixed linux issue.

This commit is contained in:
ClementTsang 2019-09-25 01:54:38 -04:00
parent 2e8f23a87a
commit 12deeb9c46
4 changed files with 41 additions and 17 deletions

View File

@ -27,7 +27,9 @@ Currently, I'm unable to really dev or test on MacOS, so I'm not sure how well t
- `-h`, `--help` to show the help screen and exit (basically has all of the below CLI option info). - `-h`, `--help` to show the help screen and exit (basically has all of the below CLI option info).
- `-a`, `--avgcpu` enables showing the average CPU usage on rustop - `-a`, `--avgcpu` enables showing the average CPU usage on rustop.
- `-m`, `--dot-marker` uses a dot marker instead of the default braille marker. This is useful for things like Powershell which display braille markers incorrectly.
- `-c`, `--celsius` displays the temperature type in Celsius. This is the default. - `-c`, `--celsius` displays the temperature type in Celsius. This is the default.

View File

@ -1,6 +1,9 @@
/// This file is meant to house (OS specific) implementations on how to kill processes. /// This file is meant to house (OS specific) implementations on how to kill processes.
use std::process::Command; use std::process::Command;
#[cfg(target_os = "windows")]
use std::ptr::null_mut; use std::ptr::null_mut;
#[cfg(target_os = "windows")]
use winapi::{ use winapi::{
shared::{minwindef::DWORD, ntdef::HANDLE}, shared::{minwindef::DWORD, ntdef::HANDLE},
um::{ um::{
@ -10,7 +13,10 @@ use winapi::{
}; };
// Copied from SO: https://stackoverflow.com/a/55231715 // Copied from SO: https://stackoverflow.com/a/55231715
#[cfg(target_os = "windows")]
struct Process(HANDLE); struct Process(HANDLE);
#[cfg(target_os = "windows")]
impl Process { impl Process {
fn open(pid : DWORD) -> Result<Process, String> { fn open(pid : DWORD) -> Result<Process, String> {
let pc = unsafe { OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE, 0, pid) }; let pc = unsafe { OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE, 0, pid) };
@ -25,11 +31,6 @@ impl Process {
Ok(()) Ok(())
} }
} }
impl Drop for Process {
fn drop(&mut self) {
unsafe { winapi::um::handleapi::CloseHandle(self.0) };
}
}
/// Kills a process, given a PID. /// Kills a process, given a PID.
pub fn kill_process_given_pid(pid : u64) -> crate::utils::error::Result<()> { pub fn kill_process_given_pid(pid : u64) -> crate::utils::error::Result<()> {
@ -38,7 +39,9 @@ pub fn kill_process_given_pid(pid : u64) -> crate::utils::error::Result<()> {
Command::new("kill").arg(pid.to_string()).output()?; Command::new("kill").arg(pid.to_string()).output()?;
} }
else if cfg!(target_os = "windows") { else if cfg!(target_os = "windows") {
#[cfg(target_os = "windows")]
let process = Process::open(pid as DWORD)?; let process = Process::open(pid as DWORD)?;
#[cfg(target_os = "windows")]
process.kill()?; process.kill()?;
} }
else if cfg!(target_os = "macos") { else if cfg!(target_os = "macos") {

View File

@ -87,7 +87,7 @@ pub fn draw_data<B : backend::Backend>(terminal : &mut Terminal<B>, app_state :
dataset_vector.push( dataset_vector.push(
Dataset::default() Dataset::default()
.name(&cpu.0) .name(&cpu.0)
.marker(if (&app_state).use_dot { Marker::Dot } else { Marker::Braille }) .marker(if app_state.use_dot { Marker::Dot } else { Marker::Braille })
.style(Style::default().fg(COLOUR_LIST[i - avg_cpu_exist_offset % COLOUR_LIST.len()])) .style(Style::default().fg(COLOUR_LIST[i - avg_cpu_exist_offset % COLOUR_LIST.len()]))
.data(&(cpu.1)), .data(&(cpu.1)),
); );
@ -97,7 +97,7 @@ pub fn draw_data<B : backend::Backend>(terminal : &mut Terminal<B>, app_state :
dataset_vector.push( dataset_vector.push(
Dataset::default() Dataset::default()
.name(&canvas_data.cpu_data[0].0) .name(&canvas_data.cpu_data[0].0)
.marker(if (&app_state).use_dot { Marker::Dot } else { Marker::Braille }) .marker(if app_state.use_dot { Marker::Dot } else { Marker::Braille })
.style(Style::default().fg(COLOUR_LIST[canvas_data.cpu_data.len() - 1 % COLOUR_LIST.len()])) .style(Style::default().fg(COLOUR_LIST[canvas_data.cpu_data.len() - 1 % COLOUR_LIST.len()]))
.data(&(canvas_data.cpu_data[0].1)), .data(&(canvas_data.cpu_data[0].1)),
); );
@ -138,12 +138,12 @@ pub fn draw_data<B : backend::Backend>(terminal : &mut Terminal<B>, app_state :
.datasets(&[ .datasets(&[
Dataset::default() Dataset::default()
.name(&("RAM:".to_string() + &format!("{:3}%", (canvas_data.mem_data.last().unwrap_or(&(0_f64, 0_f64)).1.round() as u64)))) .name(&("RAM:".to_string() + &format!("{:3}%", (canvas_data.mem_data.last().unwrap_or(&(0_f64, 0_f64)).1.round() as u64))))
.marker(if (&app_state).use_dot { Marker::Dot } else { Marker::Braille }) .marker(if app_state.use_dot { Marker::Dot } else { Marker::Braille })
.style(Style::default().fg(Color::LightBlue)) .style(Style::default().fg(Color::LightBlue))
.data(&canvas_data.mem_data), .data(&canvas_data.mem_data),
Dataset::default() Dataset::default()
.name(&("SWP:".to_string() + &format!("{:3}%", (canvas_data.swap_data.last().unwrap_or(&(0_f64, 0_f64)).1.round() as u64)))) .name(&("SWP:".to_string() + &format!("{:3}%", (canvas_data.swap_data.last().unwrap_or(&(0_f64, 0_f64)).1.round() as u64))))
.marker(if (&app_state).use_dot { Marker::Dot } else { Marker::Braille }) .marker(if app_state.use_dot { Marker::Dot } else { Marker::Braille })
.style(Style::default().fg(Color::LightYellow)) .style(Style::default().fg(Color::LightYellow))
.data(&canvas_data.swap_data), .data(&canvas_data.swap_data),
]) ])
@ -214,12 +214,12 @@ pub fn draw_data<B : backend::Backend>(terminal : &mut Terminal<B>, app_state :
.datasets(&[ .datasets(&[
Dataset::default() Dataset::default()
.name(&(canvas_data.rx_display)) .name(&(canvas_data.rx_display))
.marker(if (&app_state).use_dot { Marker::Dot } else { Marker::Braille }) .marker(if app_state.use_dot { Marker::Dot } else { Marker::Braille })
.style(Style::default().fg(Color::LightBlue)) .style(Style::default().fg(Color::LightBlue))
.data(&canvas_data.network_data_rx), .data(&canvas_data.network_data_rx),
Dataset::default() Dataset::default()
.name(&(canvas_data.tx_display)) .name(&(canvas_data.tx_display))
.marker(if (&app_state).use_dot { Marker::Dot } else { Marker::Braille }) .marker(if app_state.use_dot { Marker::Dot } else { Marker::Braille })
.style(Style::default().fg(Color::LightYellow)) .style(Style::default().fg(Color::LightYellow))
.data(&canvas_data.network_data_tx), .data(&canvas_data.network_data_tx),
]) ])

View File

@ -90,7 +90,6 @@ fn main() -> error::Result<()> {
let backend = CrosstermBackend::with_alternate_screen(stdout, screen)?; let backend = CrosstermBackend::with_alternate_screen(stdout, screen)?;
let mut terminal = Terminal::new(backend)?; let mut terminal = Terminal::new(backend)?;
terminal.set_cursor(0, 0)?;
terminal.hide_cursor()?; terminal.hide_cursor()?;
terminal.clear()?; terminal.clear()?;
@ -100,11 +99,11 @@ fn main() -> error::Result<()> {
let tx = tx.clone(); let tx = tx.clone();
thread::spawn(move || { thread::spawn(move || {
let input = input(); let input = input();
input.enable_mouse_mode().unwrap(); // TODO: I think this is broken on windows... input.enable_mouse_mode().unwrap();
let mut reader = input.read_async(); if cfg!(target_os = "linux") {
loop { let reader = input.read_sync();
if let Some(event) = reader.next() { for event in reader {
match event { match event {
InputEvent::Keyboard(key) => { InputEvent::Keyboard(key) => {
if tx.send(Event::KeyInput(key.clone())).is_err() { if tx.send(Event::KeyInput(key.clone())).is_err() {
@ -120,6 +119,26 @@ fn main() -> error::Result<()> {
} }
} }
} }
else {
let mut reader = input.read_async();
loop {
if let Some(event) = reader.next() {
match event {
InputEvent::Keyboard(key) => {
if tx.send(Event::KeyInput(key.clone())).is_err() {
return;
}
}
InputEvent::Mouse(mouse) => {
if tx.send(Event::MouseInput(mouse)).is_err() {
return;
}
}
_ => {}
}
}
}
}
}); });
} }