mirror of
https://github.com/ClementTsang/bottom.git
synced 2025-07-23 13:45:12 +02:00
Clean up and manage some basic stuff (#73)
* Remove debug statement. * Remove redundant functions from main * Update pull request template. * Format temperature line. * Update README for chocolatey. * Add note about basic mode and htop's inspiration.
This commit is contained in:
parent
6342686e22
commit
226c4e5a68
6
.github/pull_request_template.md
vendored
6
.github/pull_request_template.md
vendored
@ -10,18 +10,16 @@ Closes: #
|
|||||||
|
|
||||||
## Type of change
|
## Type of change
|
||||||
|
|
||||||
_Remove the irrelevant one:_
|
_Remove the irrelevant ones:_
|
||||||
|
|
||||||
- [x] Bug fix (non-breaking change which fixes an issue)
|
- [x] Bug fix (non-breaking change which fixes an issue)
|
||||||
- [x] New feature (non-breaking change which adds functionality)
|
- [x] New feature (non-breaking change which adds functionality)
|
||||||
- [x] Other (something else)
|
- [x] Other (something else - please specify if relevant)
|
||||||
|
|
||||||
## Test methodology
|
## Test methodology
|
||||||
|
|
||||||
_Please state how this was tested:_
|
_Please state how this was tested:_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_Please tick which platforms this change was tested on:_
|
_Please tick which platforms this change was tested on:_
|
||||||
|
|
||||||
- [ ] Windows
|
- [ ] Windows
|
||||||
|
12
README.md
12
README.md
@ -62,7 +62,7 @@ You can get the release versions from the AUR by installing [`bottom`](https://a
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
yay bottom
|
yay bottom
|
||||||
#Or
|
# Or
|
||||||
yay bottom-bin
|
yay bottom-bin
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -77,10 +77,12 @@ sudo dpkg -i bottom_0.2.2_amd64.deb
|
|||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
You can get release versions via [Chocolatey](https://chocolatey.org/packages/bottom/) (note it may take a while to be available due to moderation/review):
|
You can get release versions via [Chocolatey](https://chocolatey.org/packages/bottom/):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
choco install bottom --version=0.2.1
|
choco install bottom
|
||||||
|
# Or
|
||||||
|
choco install bottom --version=0.2.1 # Version may be required for newer releases
|
||||||
```
|
```
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
@ -212,7 +214,7 @@ Note that `q` is disabled while in the search widget.
|
|||||||
|
|
||||||
## Bugs and Requests
|
## Bugs and Requests
|
||||||
|
|
||||||
Spot an bug? Have an idea? Leave an issue that explains what you want in detail and I'll try to take a look.
|
Spot an bug? Have an idea? Leave an issue that explains what you want in detail and I'll try to take a look.
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
|
|
||||||
@ -230,6 +232,8 @@ Thanks to those who have contributed:
|
|||||||
|
|
||||||
- This project is very much inspired by both [gotop](https://github.com/cjbassi/gotop) and [gtop](https://github.com/aksakalli/gtop).
|
- This project is very much inspired by both [gotop](https://github.com/cjbassi/gotop) and [gtop](https://github.com/aksakalli/gtop).
|
||||||
|
|
||||||
|
- Basic mode inspired by htop's design.
|
||||||
|
|
||||||
- This application was written with the following libraries, and would otherwise not be possible:
|
- This application was written with the following libraries, and would otherwise not be possible:
|
||||||
|
|
||||||
- [backtrace](https://github.com/rust-lang/backtrace-rs)
|
- [backtrace](https://github.com/rust-lang/backtrace-rs)
|
||||||
|
@ -146,7 +146,6 @@ impl Painter {
|
|||||||
|
|
||||||
terminal.autoresize()?;
|
terminal.autoresize()?;
|
||||||
terminal.draw(|mut f| {
|
terminal.draw(|mut f| {
|
||||||
debug!("{:?}", f.size());
|
|
||||||
if app_state.help_dialog_state.is_showing_help {
|
if app_state.help_dialog_state.is_showing_help {
|
||||||
// Only for the help
|
// Only for the help
|
||||||
|
|
||||||
|
208
src/main.rs
208
src/main.rs
@ -36,7 +36,7 @@ use app::{
|
|||||||
use constants::*;
|
use constants::*;
|
||||||
use data_conversion::*;
|
use data_conversion::*;
|
||||||
use options::*;
|
use options::*;
|
||||||
use utils::error::{self, BottomError};
|
use utils::error;
|
||||||
|
|
||||||
pub mod app;
|
pub mod app;
|
||||||
|
|
||||||
@ -423,212 +423,6 @@ fn create_config(flag_config_location: Option<&str>) -> error::Result<Config> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_update_rate_in_milliseconds(
|
|
||||||
update_rate: &Option<&str>, config: &Config,
|
|
||||||
) -> error::Result<u128> {
|
|
||||||
let update_rate_in_milliseconds = if let Some(update_rate) = update_rate {
|
|
||||||
update_rate.parse::<u128>()?
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(rate) = flags.rate {
|
|
||||||
rate as u128
|
|
||||||
} else {
|
|
||||||
constants::DEFAULT_REFRESH_RATE_IN_MILLISECONDS
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
constants::DEFAULT_REFRESH_RATE_IN_MILLISECONDS
|
|
||||||
};
|
|
||||||
|
|
||||||
if update_rate_in_milliseconds < 250 {
|
|
||||||
return Err(BottomError::InvalidArg(
|
|
||||||
"Please set your update rate to be greater than 250 milliseconds.".to_string(),
|
|
||||||
));
|
|
||||||
} else if update_rate_in_milliseconds > u128::from(std::u64::MAX) {
|
|
||||||
return Err(BottomError::InvalidArg(
|
|
||||||
"Please set your update rate to be less than unsigned INT_MAX.".to_string(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(update_rate_in_milliseconds)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_temperature_option(
|
|
||||||
matches: &clap::ArgMatches<'static>, config: &Config,
|
|
||||||
) -> error::Result<data_harvester::temperature::TemperatureType> {
|
|
||||||
if matches.is_present("FAHRENHEIT") {
|
|
||||||
return Ok(data_harvester::temperature::TemperatureType::Fahrenheit);
|
|
||||||
} else if matches.is_present("KELVIN") {
|
|
||||||
return Ok(data_harvester::temperature::TemperatureType::Kelvin);
|
|
||||||
} else if matches.is_present("CELSIUS") {
|
|
||||||
return Ok(data_harvester::temperature::TemperatureType::Celsius);
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(temp_type) = &flags.temperature_type {
|
|
||||||
// Give lowest priority to config.
|
|
||||||
return match temp_type.as_str() {
|
|
||||||
"fahrenheit" | "f" => Ok(data_harvester::temperature::TemperatureType::Fahrenheit),
|
|
||||||
"kelvin" | "k" => Ok(data_harvester::temperature::TemperatureType::Kelvin),
|
|
||||||
"celsius" | "c" => Ok(data_harvester::temperature::TemperatureType::Celsius),
|
|
||||||
_ => Err(BottomError::ConfigError(
|
|
||||||
"Invalid temperature type. Please have the value be of the form \
|
|
||||||
<kelvin|k|celsius|c|fahrenheit|f>"
|
|
||||||
.to_string(),
|
|
||||||
)),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(data_harvester::temperature::TemperatureType::Celsius)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_avg_cpu_option(matches: &clap::ArgMatches<'static>, config: &Config) -> bool {
|
|
||||||
if matches.is_present("AVG_CPU") {
|
|
||||||
return true;
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(avg_cpu) = flags.avg_cpu {
|
|
||||||
return avg_cpu;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_use_dot_option(matches: &clap::ArgMatches<'static>, config: &Config) -> bool {
|
|
||||||
if matches.is_present("DOT_MARKER") {
|
|
||||||
return true;
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(dot_marker) = flags.dot_marker {
|
|
||||||
return dot_marker;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_use_left_legend_option(matches: &clap::ArgMatches<'static>, config: &Config) -> bool {
|
|
||||||
if matches.is_present("LEFT_LEGEND") {
|
|
||||||
return true;
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(left_legend) = flags.left_legend {
|
|
||||||
return left_legend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_use_current_cpu_total_option(matches: &clap::ArgMatches<'static>, config: &Config) -> bool {
|
|
||||||
if matches.is_present("USE_CURR_USAGE") {
|
|
||||||
return true;
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(current_usage) = flags.current_usage {
|
|
||||||
return current_usage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_show_disabled_data_option(matches: &clap::ArgMatches<'static>, config: &Config) -> bool {
|
|
||||||
if matches.is_present("SHOW_DISABLED_DATA") {
|
|
||||||
return true;
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(show_disabled_data) = flags.show_disabled_data {
|
|
||||||
return show_disabled_data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
fn enable_app_grouping(matches: &clap::ArgMatches<'static>, config: &Config, app: &mut App) {
|
|
||||||
if matches.is_present("GROUP_PROCESSES") {
|
|
||||||
app.toggle_grouping();
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(grouping) = flags.group_processes {
|
|
||||||
if grouping {
|
|
||||||
app.toggle_grouping();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn enable_app_case_sensitive(matches: &clap::ArgMatches<'static>, config: &Config, app: &mut App) {
|
|
||||||
if matches.is_present("CASE_SENSITIVE") {
|
|
||||||
app.process_search_state.search_toggle_ignore_case();
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(case_sensitive) = flags.case_sensitive {
|
|
||||||
if case_sensitive {
|
|
||||||
app.process_search_state.search_toggle_ignore_case();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn enable_app_match_whole_word(
|
|
||||||
matches: &clap::ArgMatches<'static>, config: &Config, app: &mut App,
|
|
||||||
) {
|
|
||||||
if matches.is_present("WHOLE_WORD") {
|
|
||||||
app.process_search_state.search_toggle_whole_word();
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(whole_word) = flags.whole_word {
|
|
||||||
if whole_word {
|
|
||||||
app.process_search_state.search_toggle_whole_word();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn enable_app_use_regex(matches: &clap::ArgMatches<'static>, config: &Config, app: &mut App) {
|
|
||||||
if matches.is_present("REGEX_DEFAULT") {
|
|
||||||
app.process_search_state.search_toggle_regex();
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(regex) = flags.regex {
|
|
||||||
if regex {
|
|
||||||
app.process_search_state.search_toggle_regex();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_default_widget(matches: &clap::ArgMatches<'static>, config: &Config) -> app::WidgetPosition {
|
|
||||||
if matches.is_present("CPU_WIDGET") {
|
|
||||||
return app::WidgetPosition::Cpu;
|
|
||||||
} else if matches.is_present("MEM_WIDGET") {
|
|
||||||
return app::WidgetPosition::Mem;
|
|
||||||
} else if matches.is_present("DISK_WIDGET") {
|
|
||||||
return app::WidgetPosition::Disk;
|
|
||||||
} else if matches.is_present("TEMP_WIDGET") {
|
|
||||||
return app::WidgetPosition::Temp;
|
|
||||||
} else if matches.is_present("NET_WIDGET") {
|
|
||||||
return app::WidgetPosition::Network;
|
|
||||||
} else if matches.is_present("PROC_WIDGET") {
|
|
||||||
return app::WidgetPosition::Process;
|
|
||||||
} else if let Some(flags) = &config.flags {
|
|
||||||
if let Some(default_widget) = &flags.default_widget {
|
|
||||||
match default_widget.as_str() {
|
|
||||||
"cpu_default" => {
|
|
||||||
return app::WidgetPosition::Cpu;
|
|
||||||
}
|
|
||||||
"memory_default" => {
|
|
||||||
return app::WidgetPosition::Mem;
|
|
||||||
}
|
|
||||||
"processes_default" => {
|
|
||||||
return app::WidgetPosition::Process;
|
|
||||||
}
|
|
||||||
"network_default" => {
|
|
||||||
return app::WidgetPosition::Network;
|
|
||||||
}
|
|
||||||
"temperature_default" => {
|
|
||||||
return app::WidgetPosition::Temp;
|
|
||||||
}
|
|
||||||
"disk_default" => {
|
|
||||||
return app::WidgetPosition::Disk;
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
app::WidgetPosition::Process
|
|
||||||
}
|
|
||||||
|
|
||||||
fn try_drawing(
|
fn try_drawing(
|
||||||
terminal: &mut tui::terminal::Terminal<tui::backend::CrosstermBackend<std::io::Stdout>>,
|
terminal: &mut tui::terminal::Terminal<tui::backend::CrosstermBackend<std::io::Stdout>>,
|
||||||
app: &mut App, painter: &mut canvas::Painter,
|
app: &mut App, painter: &mut canvas::Painter,
|
||||||
|
@ -91,20 +91,14 @@ pub fn get_temperature_option(
|
|||||||
if let Some(temp_type) = &flags.temperature_type {
|
if let Some(temp_type) = &flags.temperature_type {
|
||||||
// Give lowest priority to config.
|
// Give lowest priority to config.
|
||||||
return match temp_type.as_str() {
|
return match temp_type.as_str() {
|
||||||
"fahrenheit" | "f" => {
|
"fahrenheit" | "f" => Ok(data_harvester::temperature::TemperatureType::Fahrenheit),
|
||||||
Ok(data_harvester::temperature::TemperatureType::Fahrenheit)
|
"kelvin" | "k" => Ok(data_harvester::temperature::TemperatureType::Kelvin),
|
||||||
}
|
"celsius" | "c" => Ok(data_harvester::temperature::TemperatureType::Celsius),
|
||||||
"kelvin" | "k" => {
|
_ => Err(BottomError::ConfigError(
|
||||||
Ok(data_harvester::temperature::TemperatureType::Kelvin)
|
"Invalid temperature type. Please have the value be of the form \
|
||||||
}
|
<kelvin|k|celsius|c|fahrenheit|f>"
|
||||||
"celsius" | "c" => {
|
.to_string(),
|
||||||
Ok(data_harvester::temperature::TemperatureType::Celsius)
|
)),
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
Err(BottomError::ConfigError(
|
|
||||||
"Invalid temperature type. Please have the value be of the form <kelvin|k|celsius|c|fahrenheit|f>".to_string()
|
|
||||||
))
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user