mirror of
https://github.com/aristocratos/btop.git
synced 2024-06-02 10:35:14 +12:00
Added config file descriptions and config write function
This commit is contained in:
parent
10a8bfe39e
commit
63a286d6a1
4
btop.cpp
4
btop.cpp
|
@ -260,8 +260,8 @@ int main(int argc, char **argv){
|
||||||
if (Global::debug) { Logger::loglevel = 4; Logger::debug("Starting in debug mode");}
|
if (Global::debug) { Logger::loglevel = 4; Logger::debug("Starting in debug mode");}
|
||||||
|
|
||||||
if (!string(getenv("LANG")).ends_with("UTF-8") && !string(getenv("LANG")).ends_with("utf-8")) {
|
if (!string(getenv("LANG")).ends_with("UTF-8") && !string(getenv("LANG")).ends_with("utf-8")) {
|
||||||
string err_msg = "No UTF-8 locale was detected! Symbols might not look as intended.\n"s
|
string err_msg = "No UTF-8 locale was detected! Symbols might not look as intended.\n"
|
||||||
+ "Make sure your $LANG evironment variable is set and with a UTF-8 locale."s;
|
"Make sure your $LANG evironment variable is set and with a UTF-8 locale.";
|
||||||
Logger::warning(err_msg);
|
Logger::warning(err_msg);
|
||||||
cout << "WARNING: " << err_msg << endl;
|
cout << "WARNING: " << err_msg << endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,12 +21,13 @@ tab-size = 4
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <array>
|
||||||
#include <robin_hood.h>
|
#include <robin_hood.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
#include <btop_tools.h>
|
#include <btop_tools.h>
|
||||||
|
|
||||||
using std::string, std::vector, robin_hood::unordered_flat_map;
|
using std::string, std::vector, robin_hood::unordered_flat_map, std::map;
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
using namespace Tools;
|
using namespace Tools;
|
||||||
|
|
||||||
|
@ -40,7 +41,64 @@ namespace Config {
|
||||||
|
|
||||||
atomic<bool> locked (false);
|
atomic<bool> locked (false);
|
||||||
atomic<bool> writelock (false);
|
atomic<bool> writelock (false);
|
||||||
unordered_flat_map<string, bool> changed;
|
bool changed;
|
||||||
|
|
||||||
|
vector<array<string, 2>> descriptions = {
|
||||||
|
{"color_theme", "#* Color theme, looks for a .theme file in \"/usr/[local/]share/bpytop/themes\" and \"~/.config/bpytop/themes\", \"Default\" for builtin default theme.\n"
|
||||||
|
"#* Prefix name by a plus sign (+) for a theme located in user themes folder, i.e. color_theme=\"+monokai\"." },
|
||||||
|
{"theme_background", "#* If the theme set background should be shown, set to False if you want terminal background transparency."},
|
||||||
|
{"truecolor", "#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false."},
|
||||||
|
{"shown_boxes", "#* Manually set which boxes to show. Available values are \"cpu mem net proc\", separate values with whitespace."},
|
||||||
|
{"update_ms", "#* Update time in milliseconds, increases automatically if set below internal loops processing time, recommended 2000 ms or above for better sample times for graphs."},
|
||||||
|
{"proc_update_mult", "#* Processes update multiplier, sets how often the process list is updated as a multiplier of \"update_ms\".\n"
|
||||||
|
"#* Set to 2 or higher to greatly decrease bpytop cpu usage. (Only integers)."},
|
||||||
|
{"proc_sorting", "#* Processes sorting, \"pid\" \"program\" \"arguments\" \"threads\" \"user\" \"memory\" \"cpu lazy\" \"cpu responsive\",\n"
|
||||||
|
"#* \"cpu lazy\" updates top process over time, \"cpu responsive\" updates top process directly."},
|
||||||
|
{"proc_reversed", "#* Reverse sorting order, True or False."},
|
||||||
|
{"proc_tree", "#* Show processes as a tree."},
|
||||||
|
{"tree_depth", "#* Which depth the tree view should auto collapse processes at."},
|
||||||
|
{"proc_colors", "#* Use the cpu graph colors in the process list."},
|
||||||
|
{"proc_gradient", "#* Use a darkening gradient in the process list."},
|
||||||
|
{"proc_per_core", "#* If process cpu usage should be of the core it's running on or usage of the total available cpu power."},
|
||||||
|
{"proc_mem_bytes", "#* Show process memory as bytes instead of percent."},
|
||||||
|
{"cpu_graph_upper", "#* Sets the CPU stat shown in upper half of the CPU graph, \"total\" is always available.\n"
|
||||||
|
"#* Select from a list of detected attributes from the options menu."},
|
||||||
|
{"cpu_graph_lower", "#* Sets the CPU stat shown in lower half of the CPU graph, \"total\" is always available.\n"
|
||||||
|
"#* Select from a list of detected attributes from the options menu."},
|
||||||
|
{"cpu_invert_lower", "#* Toggles if the lower CPU graph should be inverted."},
|
||||||
|
{"cpu_single_graph", "#* Set to True to completely disable the lower CPU graph."},
|
||||||
|
{"show_uptime", "#* Shows the system uptime in the CPU box."},
|
||||||
|
{"check_temp", "#* Show cpu temperature."},
|
||||||
|
{"cpu_sensor", "#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors."},
|
||||||
|
{"show_coretemp", "#* Show temperatures for cpu cores also if check_temp is True and sensors has been found."},
|
||||||
|
{"temp_scale", "#* Which temperature scale to use, available values: \"celsius\", \"fahrenheit\", \"kelvin\" and \"rankine\"."},
|
||||||
|
{"show_cpu_freq", "#* Show CPU frequency."},
|
||||||
|
{"draw_clock", "#* Draw a clock at top of screen, formatting according to strftime, empty string to disable."},
|
||||||
|
{"background_update", "#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort."},
|
||||||
|
{"custom_cpu_name", "#* Custom cpu model name, empty string to disable."},
|
||||||
|
{"disks_filter", "#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with a comma \",\".\n"
|
||||||
|
"#* Begin line with \"exclude=\" to change to exclude filter, otherwise defaults to \"most include\" filter. Example: disks_filter=\"exclude=/boot, /home/user\"."},
|
||||||
|
{"mem_graphs", "#* Show graphs instead of meters for memory values."},
|
||||||
|
{"show_swap", "#* If swap memory should be shown in memory box."},
|
||||||
|
{"swap_disk", "#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk."},
|
||||||
|
{"show_disks", "#* If mem box should be split to also show disks info."},
|
||||||
|
{"only_physical", "#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar."},
|
||||||
|
{"use_fstab", "#* Read disks list from /etc/fstab. This also disables only_physical."},
|
||||||
|
{"show_io_stat", "#* Toggles if io stats should be shown in regular disk usage view."},
|
||||||
|
{"io_mode", "#* Toggles io mode for disks, showing only big graphs for disk read/write speeds."},
|
||||||
|
{"io_graph_combined", "#* Set to True to show combined read/write io graphs in io mode."},
|
||||||
|
{"io_graph_speeds", "#* Set the top speed for the io graphs in MiB/s (10 by default), use format \"device:speed\" separate disks with a comma \",\".\n"
|
||||||
|
"#* Example: \"/dev/sda:100, /dev/sdb:20\"."},
|
||||||
|
{"net_download", "#* Set fixed values for network graphs, default \"10M\" = 10 Mibibytes, possible units \"K\", \"M\", \"G\", append with \"bit\" for bits instead of bytes, i.e \"100mbit\"."},
|
||||||
|
{"net_upload", ""},
|
||||||
|
{"net_auto", "#* Start in network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest."},
|
||||||
|
{"net_sync", "#* Sync the scaling for download and upload to whichever currently has the highest scale."},
|
||||||
|
{"net_color_fixed", "#* If the network graphs color gradient should scale to bandwidth usage or auto scale, bandwidth usage is based on \"net_download\" and \"net_upload\" values."},
|
||||||
|
{"net_iface", "#* Starts with the Network Interface specified here."},
|
||||||
|
{"show_battery", "#* Show battery stats in top right if battery is present."},
|
||||||
|
{"log_level", "#* Set loglevel for \"~/.config/bpytop/error.log\" levels are: \"ERROR\" \"WARNING\" \"INFO\" \"DEBUG\".\n"
|
||||||
|
"#* The level set includes all lower levels, i.e. \"DEBUG\" will show all logging info."}
|
||||||
|
};
|
||||||
|
|
||||||
unordered_flat_map<string, string> strings = {
|
unordered_flat_map<string, string> strings = {
|
||||||
{"color_theme", "Default"},
|
{"color_theme", "Default"},
|
||||||
|
@ -77,7 +135,6 @@ namespace Config {
|
||||||
{"show_coretemp", true},
|
{"show_coretemp", true},
|
||||||
{"show_cpu_freq", true},
|
{"show_cpu_freq", true},
|
||||||
{"background_update", true},
|
{"background_update", true},
|
||||||
{"update_check", true},
|
|
||||||
{"mem_graphs", true},
|
{"mem_graphs", true},
|
||||||
{"show_swap", true},
|
{"show_swap", true},
|
||||||
{"swap_disk", true},
|
{"swap_disk", true},
|
||||||
|
@ -91,7 +148,6 @@ namespace Config {
|
||||||
{"net_auto", true},
|
{"net_auto", true},
|
||||||
{"net_sync", false},
|
{"net_sync", false},
|
||||||
{"show_battery", true},
|
{"show_battery", true},
|
||||||
{"show_init", false}
|
|
||||||
};
|
};
|
||||||
unordered_flat_map<string, bool> boolsTmp;
|
unordered_flat_map<string, bool> boolsTmp;
|
||||||
|
|
||||||
|
@ -104,6 +160,7 @@ namespace Config {
|
||||||
|
|
||||||
bool _locked(){
|
bool _locked(){
|
||||||
atomic_wait(writelock);
|
atomic_wait(writelock);
|
||||||
|
if (!changed) changed = true;
|
||||||
return locked.load();
|
return locked.load();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,21 +184,18 @@ namespace Config {
|
||||||
void set(string name, bool value){
|
void set(string name, bool value){
|
||||||
if (_locked()) boolsTmp.insert_or_assign(name, value);
|
if (_locked()) boolsTmp.insert_or_assign(name, value);
|
||||||
else bools.at(name) = value;
|
else bools.at(name) = value;
|
||||||
changed.insert_or_assign(name, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//* Set config value <name> to int <value>
|
//* Set config value <name> to int <value>
|
||||||
void set(string name, int value){
|
void set(string name, int value){
|
||||||
if (_locked()) intsTmp.insert_or_assign(name, value);
|
if (_locked()) intsTmp.insert_or_assign(name, value);
|
||||||
ints.at(name) = value;
|
ints.at(name) = value;
|
||||||
changed.insert_or_assign(name, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//* Set config value <name> to string <value>
|
//* Set config value <name> to string <value>
|
||||||
void set(string name, string value){
|
void set(string name, string value){
|
||||||
if (_locked()) stringsTmp.insert_or_assign(name, value);
|
if (_locked()) stringsTmp.insert_or_assign(name, value);
|
||||||
else strings.at(name) = value;
|
else strings.at(name) = value;
|
||||||
changed.insert_or_assign(name, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//* Flip config bool <name>
|
//* Flip config bool <name>
|
||||||
|
@ -151,7 +205,6 @@ namespace Config {
|
||||||
else boolsTmp.insert_or_assign(name, (!bools.at(name)));
|
else boolsTmp.insert_or_assign(name, (!bools.at(name)));
|
||||||
}
|
}
|
||||||
else bools.at(name) = !bools.at(name);
|
else bools.at(name) = !bools.at(name);
|
||||||
changed.insert_or_assign(name, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//* Wait if locked then lock config and cache changes until unlock
|
//* Wait if locked then lock config and cache changes until unlock
|
||||||
|
@ -180,24 +233,30 @@ namespace Config {
|
||||||
}
|
}
|
||||||
boolsTmp.clear();
|
boolsTmp.clear();
|
||||||
}
|
}
|
||||||
writelock.store(false);
|
writelock = false;
|
||||||
locked.store(false);
|
locked = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//* Load the config file from disk
|
||||||
void load(){
|
void load(){
|
||||||
if (conf_file.empty()) return;
|
if (conf_file.empty()) return;
|
||||||
|
else if (!fs::exists(conf_file)) { changed = true; return; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//* Write the config file to disk
|
||||||
void write(){
|
void write(){
|
||||||
if (conf_file.empty() || changed.empty()) return;
|
if (conf_file.empty() || !changed) return;
|
||||||
|
Logger::debug("Writing new config file");
|
||||||
if (Logger::loglevel > 3) {
|
std::ofstream cwrite(conf_file, std::ios::trunc);
|
||||||
string items;
|
if (cwrite.good()) {
|
||||||
for (auto item : Config::changed) {
|
cwrite << "#? Config file for btop v. " << Global::Version;
|
||||||
items += item.first + ", ";
|
for (auto [name, description] : descriptions) {
|
||||||
|
cwrite << "\n\n" << (description.empty() ? "" : description + "\n") << name << "=";
|
||||||
|
if (strings.contains(name)) cwrite << "\"" << strings.at(name) << "\"";
|
||||||
|
else if (ints.contains(name)) cwrite << ints.at(name);
|
||||||
|
else if (bools.contains(name)) cwrite << (bools.at(name) ? "True" : "False");
|
||||||
}
|
}
|
||||||
items.pop_back(); items.pop_back();
|
cwrite.close();
|
||||||
Logger::debug("Writing out new config values for: " + items);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue