mirror of
https://github.com/aristocratos/btop.git
synced 2024-05-16 02:13:46 +12:00
Fix whitespace indent -> tab indent
This commit is contained in:
parent
33faa01910
commit
aca2e4be75
62
src/btop.cpp
62
src/btop.cpp
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -93,9 +93,9 @@ namespace Global {
|
|||
string exit_error_msg;
|
||||
atomic<bool> thread_exception (false);
|
||||
|
||||
bool debuginit{}; // defaults to false
|
||||
bool debug{}; // defaults to false
|
||||
bool utf_force{}; // defaults to false
|
||||
bool debuginit{}; // defaults to false
|
||||
bool debug{}; // defaults to false
|
||||
bool utf_force{}; // defaults to false
|
||||
|
||||
uint64_t start_time;
|
||||
|
||||
|
@ -105,8 +105,8 @@ namespace Global {
|
|||
atomic<bool> should_sleep (false);
|
||||
atomic<bool> _runner_started (false);
|
||||
|
||||
bool arg_tty{}; // defaults to false
|
||||
bool arg_low_color{}; // defaults to false
|
||||
bool arg_tty{}; // defaults to false
|
||||
bool arg_low_color{}; // defaults to false
|
||||
int arg_preset = -1;
|
||||
}
|
||||
|
||||
|
@ -355,14 +355,14 @@ namespace Runner {
|
|||
pthread_mutex_t& pt_mutex;
|
||||
public:
|
||||
int status;
|
||||
thread_lock(pthread_mutex_t& mtx) : pt_mutex(mtx) {
|
||||
pthread_mutex_init(&pt_mutex, NULL);
|
||||
status = pthread_mutex_lock(&pt_mutex);
|
||||
}
|
||||
~thread_lock() {
|
||||
if (status == 0)
|
||||
pthread_mutex_unlock(&pt_mutex);
|
||||
}
|
||||
thread_lock(pthread_mutex_t& mtx) : pt_mutex(mtx) {
|
||||
pthread_mutex_init(&pt_mutex, NULL);
|
||||
status = pthread_mutex_lock(&pt_mutex);
|
||||
}
|
||||
~thread_lock() {
|
||||
if (status == 0)
|
||||
pthread_mutex_unlock(&pt_mutex);
|
||||
}
|
||||
};
|
||||
|
||||
//* Wrapper for raising priviliges when using SUID bit
|
||||
|
@ -370,18 +370,18 @@ namespace Runner {
|
|||
int status = -1;
|
||||
public:
|
||||
gain_priv() {
|
||||
if (Global::real_uid != Global::set_uid)
|
||||
this->status = seteuid(Global::set_uid);
|
||||
if (Global::real_uid != Global::set_uid)
|
||||
this->status = seteuid(Global::set_uid);
|
||||
}
|
||||
~gain_priv() {
|
||||
if (status == 0)
|
||||
status = seteuid(Global::real_uid);
|
||||
if (status == 0)
|
||||
status = seteuid(Global::real_uid);
|
||||
}
|
||||
};
|
||||
|
||||
string output;
|
||||
string empty_bg;
|
||||
bool pause_output{}; // defaults to false
|
||||
bool pause_output{}; // defaults to false
|
||||
sigset_t mask;
|
||||
pthread_t runner_id;
|
||||
pthread_mutex_t mtx;
|
||||
|
@ -437,7 +437,7 @@ namespace Runner {
|
|||
}
|
||||
|
||||
//? ------------------------------- Secondary thread: async launcher and drawing ----------------------------------
|
||||
void * _runner(void *) {
|
||||
void * _runner(void *) {
|
||||
//? Block some signals in this thread to avoid deadlock from any signal handlers trying to stop this thread
|
||||
sigemptyset(&mask);
|
||||
// sigaddset(&mask, SIGINT);
|
||||
|
@ -480,8 +480,8 @@ namespace Runner {
|
|||
|
||||
//! DEBUG stats
|
||||
if (Global::debug) {
|
||||
if (debug_bg.empty() or redraw)
|
||||
Runner::debug_bg = Draw::createBox(2, 2, 33, 8, "", true, "μs");
|
||||
if (debug_bg.empty() or redraw)
|
||||
Runner::debug_bg = Draw::createBox(2, 2, 33, 8, "", true, "μs");
|
||||
|
||||
|
||||
|
||||
|
@ -517,7 +517,7 @@ namespace Runner {
|
|||
if (Global::debug) debug_timer("cpu", draw_done);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
throw std::runtime_error("Cpu:: -> " + string{e.what()});
|
||||
throw std::runtime_error("Cpu:: -> " + string{e.what()});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -537,7 +537,7 @@ namespace Runner {
|
|||
if (Global::debug) debug_timer("mem", draw_done);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
throw std::runtime_error("Mem:: -> " + string{e.what()});
|
||||
throw std::runtime_error("Mem:: -> " + string{e.what()});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -557,7 +557,7 @@ namespace Runner {
|
|||
if (Global::debug) debug_timer("net", draw_done);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
throw std::runtime_error("Net:: -> " + string{e.what()});
|
||||
throw std::runtime_error("Net:: -> " + string{e.what()});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -577,12 +577,12 @@ namespace Runner {
|
|||
if (Global::debug) debug_timer("proc", draw_done);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
throw std::runtime_error("Proc:: -> " + string{e.what()});
|
||||
throw std::runtime_error("Proc:: -> " + string{e.what()});
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
Global::exit_error_msg = "Exception in runner thread -> " + string{e.what()};
|
||||
Global::exit_error_msg = "Exception in runner thread -> " + string{e.what()};
|
||||
Global::thread_exception = true;
|
||||
Input::interrupt = true;
|
||||
stopping = true;
|
||||
|
@ -659,7 +659,7 @@ namespace Runner {
|
|||
//? ------------------------------------------ Secondary thread end -----------------------------------------------
|
||||
|
||||
//* Runs collect and draw in a secondary thread, unlocks and locks config to update cached values
|
||||
void run(const string& box, bool no_update, bool force_redraw) {
|
||||
void run(const string& box, bool no_update, bool force_redraw) {
|
||||
atomic_wait_for(active, true, 5000);
|
||||
if (active) {
|
||||
Logger::error("Stall in Runner thread, restarting!");
|
||||
|
@ -827,7 +827,7 @@ int main(int argc, char **argv) {
|
|||
}
|
||||
else {
|
||||
string found;
|
||||
bool set_failure{}; // defaults to false
|
||||
bool set_failure{}; // defaults to false
|
||||
for (const auto loc_env : array{"LANG", "LC_ALL"}) {
|
||||
if (std::getenv(loc_env) != NULL and str_to_upper(s_replace((string)std::getenv(loc_env), "-", "")).ends_with("UTF8")) {
|
||||
found = std::getenv(loc_env);
|
||||
|
@ -923,7 +923,7 @@ int main(int argc, char **argv) {
|
|||
Shared::init();
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
Global::exit_error_msg = "Exception in Shared::init() -> " + string{e.what()};
|
||||
Global::exit_error_msg = "Exception in Shared::init() -> " + string{e.what()};
|
||||
clean_quit(1);
|
||||
}
|
||||
|
||||
|
@ -1035,7 +1035,7 @@ int main(int argc, char **argv) {
|
|||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
Global::exit_error_msg = "Exception in main loop -> " + string{e.what()};
|
||||
Global::exit_error_msg = "Exception in main loop -> " + string{e.what()};
|
||||
clean_quit(1);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -103,7 +103,7 @@ namespace Config {
|
|||
|
||||
{"proc_left", "#* Show proc box on left side of screen instead of right."},
|
||||
|
||||
{"proc_filter_kernel", "#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop)."},
|
||||
{"proc_filter_kernel", "#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop)."},
|
||||
|
||||
{"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."},
|
||||
|
@ -234,7 +234,7 @@ namespace Config {
|
|||
{"proc_cpu_graphs", true},
|
||||
{"proc_info_smaps", false},
|
||||
{"proc_left", false},
|
||||
{"proc_filter_kernel", false},
|
||||
{"proc_filter_kernel", false},
|
||||
{"cpu_invert_lower", true},
|
||||
{"cpu_single_graph", false},
|
||||
{"cpu_bottom", false},
|
||||
|
@ -383,7 +383,7 @@ namespace Config {
|
|||
return false;
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
validError = string{e.what()};
|
||||
validError = string{e.what()};
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -503,7 +503,7 @@ namespace Config {
|
|||
boolsTmp.clear();
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
Global::exit_error_msg = "Exception during Config::unlock() : " + string{e.what()};
|
||||
Global::exit_error_msg = "Exception during Config::unlock() : " + string{e.what()};
|
||||
clean_quit(1);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -65,7 +65,7 @@ namespace Config {
|
|||
bool _locked(const string& name);
|
||||
|
||||
//* Return bool for config key <name>
|
||||
inline bool getB(const string& name) { return bools.at(name); }
|
||||
inline bool getB(const string& name) { return bools.at(name); }
|
||||
|
||||
//* Return integer for config key <name>
|
||||
inline const int& getI(const string& name) { return ints.at(name); }
|
||||
|
@ -81,7 +81,7 @@ namespace Config {
|
|||
bool stringValid(const string& name, const string& value);
|
||||
|
||||
//* Set config key <name> to bool <value>
|
||||
inline void set(const string& name, bool value) {
|
||||
inline void set(const string& name, bool value) {
|
||||
if (_locked(name)) boolsTmp.insert_or_assign(name, value);
|
||||
else bools.at(name) = value;
|
||||
}
|
||||
|
|
|
@ -106,8 +106,8 @@ namespace Draw {
|
|||
if (redraw) banner.clear();
|
||||
if (banner.empty()) {
|
||||
string b_color, bg, fg, oc, letter;
|
||||
auto lowcolor = Config::getB("lowcolor");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto lowcolor = Config::getB("lowcolor");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
for (size_t z = 0; const auto& line : Global::Banner_src) {
|
||||
if (const auto w = ulen(line[1]); w > width) width = w;
|
||||
if (tty_mode) {
|
||||
|
@ -217,7 +217,7 @@ namespace Draw {
|
|||
return first + Fx::bl + "█" + Fx::ubl + uresize(text.substr(pos), limit - ulen(first));
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
Logger::error("In TextEdit::operator() : " + string{e.what()});
|
||||
Logger::error("In TextEdit::operator() : " + string{e.what()});
|
||||
}
|
||||
}
|
||||
return text.substr(0, pos) + Fx::bl + "█" + Fx::ubl + text.substr(pos);
|
||||
|
@ -227,16 +227,16 @@ namespace Draw {
|
|||
this->text.clear();
|
||||
}
|
||||
|
||||
string createBox(const int x, const int y, const int width,
|
||||
const int height, string line_color, bool fill,
|
||||
const string title, const string title2, const int num) {
|
||||
string createBox(const int x, const int y, const int width,
|
||||
const int height, string line_color, bool fill,
|
||||
const string title, const string title2, const int num) {
|
||||
string out;
|
||||
|
||||
if (line_color.empty())
|
||||
line_color = Theme::c("div_line");
|
||||
if (line_color.empty())
|
||||
line_color = Theme::c("div_line");
|
||||
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto rounded = Config::getB("rounded_corners");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto rounded = Config::getB("rounded_corners");
|
||||
const string numbering = (num == 0) ? "" : Theme::c("hi_fg") + (tty_mode ? std::to_string(num) : Symbols::superscript.at(clamp(num, 0, 9)));
|
||||
const auto& right_up = (tty_mode or not rounded ? Symbols::right_up : Symbols::round_right_up);
|
||||
const auto& left_up = (tty_mode or not rounded ? Symbols::left_up : Symbols::round_left_up);
|
||||
|
@ -246,12 +246,12 @@ namespace Draw {
|
|||
out = Fx::reset + line_color;
|
||||
|
||||
//? Draw horizontal lines
|
||||
for (const int& hpos : {y, y + height - 1}) {
|
||||
for (const int& hpos : {y, y + height - 1}) {
|
||||
out += Mv::to(hpos, x) + Symbols::h_line * (width - 1);
|
||||
}
|
||||
|
||||
//? Draw vertical lines and fill if enabled
|
||||
for (const int& hpos : iota(y + 1, y + height - 1)) {
|
||||
for (const int& hpos : iota(y + 1, y + height - 1)) {
|
||||
out += Mv::to(hpos, x) + Symbols::v_line
|
||||
+ ((fill) ? string(width - 2, ' ') : Mv::r(width - 2))
|
||||
+ Symbols::v_line;
|
||||
|
@ -289,8 +289,8 @@ namespace Draw {
|
|||
{"/uptime", ""}
|
||||
};
|
||||
|
||||
static time_t c_time{}; // defaults to 0
|
||||
static size_t clock_len{}; // defaults to 0
|
||||
static time_t c_time{}; // defaults to 0
|
||||
static size_t clock_len{}; // defaults to 0
|
||||
static string clock_str;
|
||||
|
||||
if (auto n_time = time(NULL); not force and n_time == c_time)
|
||||
|
@ -303,7 +303,7 @@ namespace Draw {
|
|||
}
|
||||
|
||||
auto& out = Global::clock;
|
||||
auto cpu_bottom = Config::getB("cpu_bottom");
|
||||
auto cpu_bottom = Config::getB("cpu_bottom");
|
||||
const auto& x = Cpu::x;
|
||||
const auto y = (cpu_bottom ? Cpu::y + Cpu::height - 1 : Cpu::y);
|
||||
const auto& width = Cpu::width;
|
||||
|
@ -343,8 +343,8 @@ namespace Draw {
|
|||
//* Meter class ------------------------------------------------------------------------------------------------------------>
|
||||
Meter::Meter() {}
|
||||
|
||||
Meter::Meter(const int width, const string& color_gradient, bool invert)
|
||||
: width(width), color_gradient(color_gradient), invert(invert) {}
|
||||
Meter::Meter(const int width, const string& color_gradient, bool invert)
|
||||
: width(width), color_gradient(color_gradient), invert(invert) {}
|
||||
|
||||
string Meter::operator()(int value) {
|
||||
if (width < 1) return "";
|
||||
|
@ -366,7 +366,7 @@ namespace Draw {
|
|||
|
||||
//* Graph class ------------------------------------------------------------------------------------------------------------>
|
||||
void Graph::_create(const deque<long long>& data, int data_offset) {
|
||||
bool mult = (data.size() - data_offset > 1);
|
||||
bool mult = (data.size() - data_offset > 1);
|
||||
const auto& graph_symbol = Symbols::graph_symbols.at(symbol + '_' + (invert ? "down" : "up"));
|
||||
array<int, 2> result;
|
||||
const float mod = (height == 1) ? 0.3 : 0.1;
|
||||
|
@ -436,11 +436,11 @@ namespace Draw {
|
|||
|
||||
Graph::Graph() {}
|
||||
|
||||
Graph::Graph(int width, int height, const string& color_gradient,
|
||||
const deque<long long>& data, const string& symbol,
|
||||
bool invert, bool no_zero, long long max_value, long long offset)
|
||||
: width(width), height(height), color_gradient(color_gradient),
|
||||
invert(invert), no_zero(no_zero), offset(offset) {
|
||||
Graph::Graph(int width, int height, const string& color_gradient,
|
||||
const deque<long long>& data, const string& symbol,
|
||||
bool invert, bool no_zero, long long max_value, long long offset)
|
||||
: width(width), height(height), color_gradient(color_gradient),
|
||||
invert(invert), no_zero(no_zero), offset(offset) {
|
||||
if (Config::getB("tty_mode") or symbol == "tty") this->symbol = "tty";
|
||||
else if (symbol != "default") this->symbol = symbol;
|
||||
else this->symbol = Config::getS("graph_symbol");
|
||||
|
@ -464,7 +464,7 @@ namespace Draw {
|
|||
this->_create(data, data_offset);
|
||||
}
|
||||
|
||||
string& Graph::operator()(const deque<long long>& data, bool data_same) {
|
||||
string& Graph::operator()(const deque<long long>& data, bool data_same) {
|
||||
if (data_same) return out;
|
||||
|
||||
//? Make room for new characters on graph
|
||||
|
@ -504,26 +504,26 @@ namespace Cpu {
|
|||
vector<Draw::Graph> core_graphs;
|
||||
vector<Draw::Graph> temp_graphs;
|
||||
|
||||
string draw(const cpu_info& cpu, bool force_redraw, bool data_same) {
|
||||
string draw(const cpu_info& cpu, bool force_redraw, bool data_same) {
|
||||
if (Runner::stopping) return "";
|
||||
if (force_redraw) redraw = true;
|
||||
bool show_temps = (Config::getB("check_temp") and got_sensors);
|
||||
auto single_graph = Config::getB("cpu_single_graph");
|
||||
bool hide_cores = show_temps and (cpu_temp_only or not Config::getB("show_coretemp"));
|
||||
bool show_temps = (Config::getB("check_temp") and got_sensors);
|
||||
auto single_graph = Config::getB("cpu_single_graph");
|
||||
bool hide_cores = show_temps and (cpu_temp_only or not Config::getB("show_coretemp"));
|
||||
const int extra_width = (hide_cores ? max(6, 6 * b_column_size) : 0);
|
||||
auto& graph_up_field = Config::getS("cpu_graph_upper");
|
||||
auto& graph_lo_field = Config::getS("cpu_graph_lower");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto& graph_symbol = (tty_mode ? "tty" : Config::getS("graph_symbol_cpu"));
|
||||
auto& graph_bg = Symbols::graph_symbols.at((graph_symbol == "default" ? Config::getS("graph_symbol") + "_up" : graph_symbol + "_up")).at(6);
|
||||
auto& temp_scale = Config::getS("temp_scale");
|
||||
auto cpu_bottom = Config::getB("cpu_bottom");
|
||||
auto cpu_bottom = Config::getB("cpu_bottom");
|
||||
const string& title_left = Theme::c("cpu_box") + (cpu_bottom ? Symbols::title_left_down : Symbols::title_left);
|
||||
const string& title_right = Theme::c("cpu_box") + (cpu_bottom ? Symbols::title_right_down : Symbols::title_right);
|
||||
static int bat_pos = 0, bat_len = 0;
|
||||
if (cpu.cpu_percent.at("total").empty()
|
||||
or cpu.core_percent.at(0).empty()
|
||||
or (show_temps and cpu.temp.at(0).empty())) return "";
|
||||
if (cpu.cpu_percent.at("total").empty()
|
||||
or cpu.core_percent.at(0).empty()
|
||||
or (show_temps and cpu.temp.at(0).empty())) return "";
|
||||
string out;
|
||||
out.reserve(width * height);
|
||||
|
||||
|
@ -550,15 +550,15 @@ namespace Cpu {
|
|||
//? Graphs & meters
|
||||
graph_upper = Draw::Graph{x + width - b_width - 3, graph_up_height, "cpu", cpu.cpu_percent.at(graph_up_field), graph_symbol, false, true};
|
||||
cpu_meter = Draw::Meter{b_width - (show_temps ? 23 - (b_column_size <= 1 and b_columns == 1 ? 6 : 0) : 11), "cpu"};
|
||||
if (not single_graph) {
|
||||
graph_lower = Draw::Graph{
|
||||
x + width - b_width - 3,
|
||||
graph_low_height, "cpu",
|
||||
cpu.cpu_percent.at(graph_lo_field),
|
||||
graph_symbol,
|
||||
Config::getB("cpu_invert_lower"), true
|
||||
};
|
||||
}
|
||||
if (not single_graph) {
|
||||
graph_lower = Draw::Graph{
|
||||
x + width - b_width - 3,
|
||||
graph_low_height, "cpu",
|
||||
cpu.cpu_percent.at(graph_lo_field),
|
||||
graph_symbol,
|
||||
Config::getB("cpu_invert_lower"), true
|
||||
};
|
||||
}
|
||||
|
||||
if (mid_line) {
|
||||
out += Mv::to(y + graph_up_height + 1, x) + Fx::ub + Theme::c("cpu_box") + Symbols::div_left + Theme::c("div_line")
|
||||
|
@ -587,8 +587,8 @@ namespace Cpu {
|
|||
|
||||
//? Draw battery if enabled and present
|
||||
if (Config::getB("show_battery") and has_battery) {
|
||||
static int old_percent{}; // defaults to = 0
|
||||
static long old_seconds{}; // defaults to = 0
|
||||
static int old_percent{}; // defaults to = 0
|
||||
static long old_seconds{}; // defaults to = 0
|
||||
static string old_status;
|
||||
static Draw::Meter bat_meter {10, "cpu", true};
|
||||
static const unordered_flat_map<string, string> bat_symbols = {
|
||||
|
@ -659,7 +659,7 @@ namespace Cpu {
|
|||
}
|
||||
out += Theme::c("div_line") + Symbols::v_line;
|
||||
|
||||
} catch (const std::exception& e) { throw std::runtime_error("graphs, clock, meter : " + string{e.what()}); }
|
||||
} catch (const std::exception& e) { throw std::runtime_error("graphs, clock, meter : " + string{e.what()}); }
|
||||
|
||||
//? Core text and graphs
|
||||
int cx = 0, cy = 1, cc = 0, core_width = (b_column_size == 0 ? 2 : 3);
|
||||
|
@ -741,17 +741,17 @@ namespace Mem {
|
|||
unordered_flat_map<string, Draw::Meter> disk_meters_free;
|
||||
unordered_flat_map<string, Draw::Graph> io_graphs;
|
||||
|
||||
string draw(const mem_info& mem, bool force_redraw, bool data_same) {
|
||||
string draw(const mem_info& mem, bool force_redraw, bool data_same) {
|
||||
if (Runner::stopping) return "";
|
||||
if (force_redraw) redraw = true;
|
||||
auto show_swap = Config::getB("show_swap");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto show_io_stat = Config::getB("show_io_stat");
|
||||
auto io_mode = Config::getB("io_mode");
|
||||
auto io_graph_combined = Config::getB("io_graph_combined");
|
||||
auto use_graphs = Config::getB("mem_graphs");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto show_swap = Config::getB("show_swap");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto show_io_stat = Config::getB("show_io_stat");
|
||||
auto io_mode = Config::getB("io_mode");
|
||||
auto io_graph_combined = Config::getB("io_graph_combined");
|
||||
auto use_graphs = Config::getB("mem_graphs");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto& graph_symbol = (tty_mode ? "tty" : Config::getS("graph_symbol_mem"));
|
||||
auto& graph_bg = Symbols::graph_symbols.at((graph_symbol == "default" ? Config::getS("graph_symbol") + "_up" : graph_symbol + "_up")).at(6);
|
||||
auto totalMem = Mem::get_totalMem();
|
||||
|
@ -817,20 +817,20 @@ namespace Mem {
|
|||
if (io_graph_combined) {
|
||||
deque<long long> combined(disk.io_read.size(), 0);
|
||||
rng::transform(disk.io_read, disk.io_write, combined.begin(), std::plus<long long>());
|
||||
io_graphs[name] = Draw::Graph{
|
||||
disks_width - (io_mode ? 0 : 6),
|
||||
disks_io_h, "available", combined,
|
||||
graph_symbol, false, true, speed};
|
||||
io_graphs[name] = Draw::Graph{
|
||||
disks_width - (io_mode ? 0 : 6),
|
||||
disks_io_h, "available", combined,
|
||||
graph_symbol, false, true, speed};
|
||||
}
|
||||
else {
|
||||
io_graphs[name + "_read"] = Draw::Graph{
|
||||
disks_width, half_height, "free",
|
||||
disk.io_read, graph_symbol, false,
|
||||
true, speed};
|
||||
io_graphs[name + "_write"] = Draw::Graph{
|
||||
disks_width, disks_io_h - half_height,
|
||||
"used", disk.io_write, graph_symbol,
|
||||
true, true, speed};
|
||||
io_graphs[name + "_read"] = Draw::Graph{
|
||||
disks_width, half_height, "free",
|
||||
disk.io_read, graph_symbol, false,
|
||||
true, speed};
|
||||
io_graphs[name + "_write"] = Draw::Graph{
|
||||
disks_width, disks_io_h - half_height,
|
||||
"used", disk.io_write, graph_symbol,
|
||||
true, true, speed};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -900,7 +900,7 @@ namespace Mem {
|
|||
if (show_disks) {
|
||||
const auto& disks = mem.disks;
|
||||
cx = mem_width; cy = 0;
|
||||
bool big_disk = disks_width >= 25;
|
||||
bool big_disk = disks_width >= 25;
|
||||
divider = Mv::l(1) + Theme::c("div_line") + Symbols::div_left + Symbols::h_line * disks_width + Theme::c("mem_box") + Fx::ub + Symbols::div_right + Mv::l(disks_width);
|
||||
const string hu_div = Theme::c("div_line") + Symbols::h_line + Theme::c("main_fg");
|
||||
if (io_mode) {
|
||||
|
@ -995,12 +995,12 @@ namespace Net {
|
|||
unordered_flat_map<string, Draw::Graph> graphs;
|
||||
string box;
|
||||
|
||||
string draw(const net_info& net, bool force_redraw, bool data_same) {
|
||||
string draw(const net_info& net, bool force_redraw, bool data_same) {
|
||||
if (Runner::stopping) return "";
|
||||
if (force_redraw) redraw = true;
|
||||
auto net_sync = Config::getB("net_sync");
|
||||
auto net_auto = Config::getB("net_auto");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto net_sync = Config::getB("net_sync");
|
||||
auto net_auto = Config::getB("net_auto");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto& graph_symbol = (tty_mode ? "tty" : Config::getS("graph_symbol_net"));
|
||||
string ip_addr = (net.ipv4.empty() ? net.ipv6 : net.ipv4);
|
||||
if (old_ip != ip_addr) {
|
||||
|
@ -1022,13 +1022,13 @@ namespace Net {
|
|||
graphs.clear();
|
||||
if (net.bandwidth.at("download").empty() or net.bandwidth.at("upload").empty())
|
||||
return out + Fx::reset;
|
||||
graphs["download"] = Draw::Graph{
|
||||
width - b_width - 2, u_graph_height, "download",
|
||||
net.bandwidth.at("download"), graph_symbol,
|
||||
false, true, down_max};
|
||||
graphs["upload"] = Draw::Graph{
|
||||
width - b_width - 2, d_graph_height, "upload",
|
||||
net.bandwidth.at("upload"), graph_symbol, true, true, up_max};
|
||||
graphs["download"] = Draw::Graph{
|
||||
width - b_width - 2, u_graph_height, "download",
|
||||
net.bandwidth.at("download"), graph_symbol,
|
||||
false, true, down_max};
|
||||
graphs["upload"] = Draw::Graph{
|
||||
width - b_width - 2, d_graph_height, "upload",
|
||||
net.bandwidth.at("upload"), graph_symbol, true, true, up_max};
|
||||
|
||||
//? Interface selector and buttons
|
||||
|
||||
|
@ -1109,7 +1109,7 @@ namespace Proc {
|
|||
auto selected = Config::getI("proc_selected");
|
||||
auto last_selected = Config::getI("proc_last_selected");
|
||||
const int select_max = (Config::getB("show_detailed") ? Proc::select_max - 8 : Proc::select_max);
|
||||
auto vim_keys = Config::getB("vim_keys");
|
||||
auto vim_keys = Config::getB("vim_keys");
|
||||
|
||||
int numpids = Proc::numpids;
|
||||
if ((cmd_key == "up" or (vim_keys and cmd_key == "k")) and selected > 0) {
|
||||
|
@ -1164,18 +1164,18 @@ namespace Proc {
|
|||
return (not changed ? -1 : selected);
|
||||
}
|
||||
|
||||
string draw(const vector<proc_info>& plist, bool force_redraw, bool data_same) {
|
||||
string draw(const vector<proc_info>& plist, bool force_redraw, bool data_same) {
|
||||
if (Runner::stopping) return "";
|
||||
auto proc_tree = Config::getB("proc_tree");
|
||||
bool show_detailed = (Config::getB("show_detailed") and cmp_equal(Proc::detailed.last_pid, Config::getI("detailed_pid")));
|
||||
bool proc_gradient = (Config::getB("proc_gradient") and not Config::getB("lowcolor") and Theme::gradients.contains("proc"));
|
||||
auto proc_colors = Config::getB("proc_colors");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto proc_tree = Config::getB("proc_tree");
|
||||
bool show_detailed = (Config::getB("show_detailed") and cmp_equal(Proc::detailed.last_pid, Config::getI("detailed_pid")));
|
||||
bool proc_gradient = (Config::getB("proc_gradient") and not Config::getB("lowcolor") and Theme::gradients.contains("proc"));
|
||||
auto proc_colors = Config::getB("proc_colors");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto& graph_symbol = (tty_mode ? "tty" : Config::getS("graph_symbol_proc"));
|
||||
auto& graph_bg = Symbols::graph_symbols.at((graph_symbol == "default" ? Config::getS("graph_symbol") + "_up" : graph_symbol + "_up")).at(6);
|
||||
auto mem_bytes = Config::getB("proc_mem_bytes");
|
||||
auto vim_keys = Config::getB("vim_keys");
|
||||
auto show_graphs = Config::getB("proc_cpu_graphs");
|
||||
auto mem_bytes = Config::getB("proc_mem_bytes");
|
||||
auto vim_keys = Config::getB("vim_keys");
|
||||
auto show_graphs = Config::getB("proc_cpu_graphs");
|
||||
start = Config::getI("proc_start");
|
||||
selected = Config::getI("proc_selected");
|
||||
const int y = show_detailed ? Proc::y + 8 : Proc::y;
|
||||
|
@ -1210,7 +1210,7 @@ namespace Proc {
|
|||
|
||||
//? Detailed box
|
||||
if (show_detailed) {
|
||||
bool alive = detailed.status != "Dead";
|
||||
bool alive = detailed.status != "Dead";
|
||||
dgraph_x = x;
|
||||
dgraph_width = max(width / 3, width - 121);
|
||||
d_width = width - dgraph_width - 1;
|
||||
|
@ -1282,7 +1282,7 @@ namespace Proc {
|
|||
}
|
||||
|
||||
//? Filter
|
||||
auto filtering = Config::getB("proc_filtering"); // ? filter(20) : Config::getS("proc_filter"))
|
||||
auto filtering = Config::getB("proc_filtering"); // ? filter(20) : Config::getS("proc_filter"))
|
||||
const auto filter_text = (filtering) ? filter(max(6, width - 58)) : uresize(Config::getS("proc_filter"), max(6, width - 58));
|
||||
out += Mv::to(y, x+9) + title_left + (not filter_text.empty() ? Fx::b : "") + Theme::c("hi_fg") + 'f'
|
||||
+ Theme::c("title") + (not filter_text.empty() ? ' ' + filter_text : "ilter")
|
||||
|
@ -1363,7 +1363,7 @@ namespace Proc {
|
|||
|
||||
//? Draw details box if shown
|
||||
if (show_detailed) {
|
||||
bool alive = detailed.status != "Dead";
|
||||
bool alive = detailed.status != "Dead";
|
||||
const int item_fit = floor((double)(d_width - 2) / 10);
|
||||
const int item_width = floor((double)(d_width - 2) / min(item_fit, 8));
|
||||
|
||||
|
@ -1422,7 +1422,7 @@ namespace Proc {
|
|||
}
|
||||
|
||||
//? Update graphs for processes with above 0.0% cpu usage, delete if below 0.1% 10x times
|
||||
bool has_graph = show_graphs ? p_counters.contains(p.pid) : false;
|
||||
bool has_graph = show_graphs ? p_counters.contains(p.pid) : false;
|
||||
if (show_graphs and ((p.cpu_p > 0 and not has_graph) or (not data_same and has_graph))) {
|
||||
if (not has_graph) {
|
||||
p_graphs[p.pid] = Draw::Graph{5, 1, "", {}, graph_symbol};
|
||||
|
@ -1579,10 +1579,10 @@ namespace Draw {
|
|||
void calcSizes() {
|
||||
atomic_wait(Runner::active);
|
||||
Config::unlock();
|
||||
auto boxes = Config::getS("shown_boxes");
|
||||
auto cpu_bottom = Config::getB("cpu_bottom");
|
||||
auto mem_below_net = Config::getB("mem_below_net");
|
||||
auto proc_left = Config::getB("proc_left");
|
||||
auto boxes = Config::getS("shown_boxes");
|
||||
auto cpu_bottom = Config::getB("cpu_bottom");
|
||||
auto mem_below_net = Config::getB("mem_below_net");
|
||||
auto proc_left = Config::getB("proc_left");
|
||||
|
||||
Cpu::box.clear();
|
||||
Mem::box.clear();
|
||||
|
@ -1612,7 +1612,7 @@ namespace Draw {
|
|||
//* Calculate and draw cpu box outlines
|
||||
if (Cpu::shown) {
|
||||
using namespace Cpu;
|
||||
bool show_temp = (Config::getB("check_temp") and got_sensors);
|
||||
bool show_temp = (Config::getB("check_temp") and got_sensors);
|
||||
width = round((double)Term::width * width_p / 100);
|
||||
height = max(8, (int)ceil((double)Term::height * (trim(boxes) == "cpu" ? 100 : height_p) / 100));
|
||||
x = 1;
|
||||
|
@ -1651,9 +1651,9 @@ namespace Draw {
|
|||
//* Calculate and draw mem box outlines
|
||||
if (Mem::shown) {
|
||||
using namespace Mem;
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto mem_graphs = Config::getB("mem_graphs");
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto mem_graphs = Config::getB("mem_graphs");
|
||||
|
||||
width = round((double)Term::width * (Proc::shown ? width_p : 100) / 100);
|
||||
height = ceil((double)Term::height * (100 - Cpu::height_p * Cpu::shown - Net::height_p * Net::shown) / 100) + 1;
|
||||
|
|
|
@ -66,8 +66,8 @@ namespace Draw {
|
|||
|
||||
//* An editable text field
|
||||
class TextEdit {
|
||||
size_t pos{}; // defaults to 0
|
||||
size_t upos{}; // defaults to 0
|
||||
size_t pos{}; // defaults to 0
|
||||
size_t upos{}; // defaults to 0
|
||||
bool numeric;
|
||||
public:
|
||||
string text;
|
||||
|
@ -79,11 +79,11 @@ namespace Draw {
|
|||
};
|
||||
|
||||
//* Create a box and return as a string
|
||||
string createBox(const int x, const int y, const int width,
|
||||
const int height, string line_color = "", bool fill = false,
|
||||
const string title = "", const string title2 = "", const int num = 0);
|
||||
string createBox(const int x, const int y, const int width,
|
||||
const int height, string line_color = "", bool fill = false,
|
||||
const string title = "", const string title2 = "", const int num = 0);
|
||||
|
||||
bool update_clock(bool force = false);
|
||||
bool update_clock(bool force = false);
|
||||
|
||||
//* Class holding a percentage meter
|
||||
class Meter {
|
||||
|
@ -93,7 +93,7 @@ namespace Draw {
|
|||
array<string, 101> cache;
|
||||
public:
|
||||
Meter();
|
||||
Meter(const int width, const string& color_gradient, bool invert = false);
|
||||
Meter(const int width, const string& color_gradient, bool invert = false);
|
||||
|
||||
//* Return a string representation of the meter with given value
|
||||
string operator()(int value);
|
||||
|
@ -115,15 +115,15 @@ namespace Draw {
|
|||
|
||||
public:
|
||||
Graph();
|
||||
Graph(int width, int height,
|
||||
const string& color_gradient,
|
||||
const deque<long long>& data,
|
||||
const string& symbol="default",
|
||||
bool invert=false, bool no_zero=false,
|
||||
long long max_value=0, long long offset=0);
|
||||
Graph(int width, int height,
|
||||
const string& color_gradient,
|
||||
const deque<long long>& data,
|
||||
const string& symbol="default",
|
||||
bool invert=false, bool no_zero=false,
|
||||
long long max_value=0, long long offset=0);
|
||||
|
||||
//* Add last value from back of <data> and return string representation of graph
|
||||
string& operator()(const deque<long long>& data, bool data_same=false);
|
||||
string& operator()(const deque<long long>& data, bool data_same=false);
|
||||
|
||||
//* Return string representation of graph
|
||||
string& operator()();
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -238,8 +238,8 @@ namespace Input {
|
|||
void process(const string& key) {
|
||||
if (key.empty()) return;
|
||||
try {
|
||||
auto filtering = Config::getB("proc_filtering");
|
||||
auto vim_keys = Config::getB("vim_keys");
|
||||
auto filtering = Config::getB("proc_filtering");
|
||||
auto vim_keys = Config::getB("vim_keys");
|
||||
auto help_key = (vim_keys ? "H" : "h");
|
||||
auto kill_key = (vim_keys ? "K" : "k");
|
||||
//? Global input actions
|
||||
|
@ -297,12 +297,12 @@ namespace Input {
|
|||
if (key == "enter" or key == "down") {
|
||||
Config::set("proc_filter", Proc::filter.text);
|
||||
Config::set("proc_filtering", false);
|
||||
old_filter.clear();
|
||||
if(key == "down"){
|
||||
process("down");
|
||||
return;
|
||||
}
|
||||
}
|
||||
old_filter.clear();
|
||||
if(key == "down"){
|
||||
process("down");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (key == "escape" or key == "mouse_click") {
|
||||
Config::set("proc_filter", old_filter);
|
||||
Config::set("proc_filtering", false);
|
||||
|
@ -549,7 +549,7 @@ namespace Input {
|
|||
}
|
||||
|
||||
catch (const std::exception& e) {
|
||||
throw std::runtime_error("Input::process(\"" + key + "\") : " + string{e.what()});
|
||||
throw std::runtime_error("Input::process(\"" + key + "\") : " + string{e.what()});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
|
|
@ -617,19 +617,19 @@ namespace Menu {
|
|||
"Show cpu graph for each process.",
|
||||
"",
|
||||
"True or False"},
|
||||
{"proc_filter_kernel",
|
||||
"(Linux) Filter kernel processes from output.",
|
||||
"",
|
||||
"Set to 'True' to filter out internal",
|
||||
"processes started by the Linux kernel."},
|
||||
{"proc_filter_kernel",
|
||||
"(Linux) Filter kernel processes from output.",
|
||||
"",
|
||||
"Set to 'True' to filter out internal",
|
||||
"processes started by the Linux kernel."},
|
||||
}
|
||||
};
|
||||
|
||||
msgBox::msgBox() {}
|
||||
msgBox::msgBox(int width, int boxtype, vector<string> content, string title)
|
||||
: width(width), boxtype(boxtype) {
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto rounded = Config::getB("rounded_corners");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto rounded = Config::getB("rounded_corners");
|
||||
const auto& right_up = (tty_mode or not rounded ? Symbols::right_up : Symbols::round_right_up);
|
||||
const auto& left_up = (tty_mode or not rounded ? Symbols::left_up : Symbols::round_left_up);
|
||||
const auto& right_down = (tty_mode or not rounded ? Symbols::right_down : Symbols::round_right_down);
|
||||
|
@ -718,10 +718,10 @@ namespace Menu {
|
|||
};
|
||||
|
||||
int signalChoose(const string& key) {
|
||||
auto s_pid = (Config::getB("show_detailed") and Config::getI("selected_pid") == 0 ? Config::getI("detailed_pid") : Config::getI("selected_pid"));
|
||||
static int x{}; // defaults to 0
|
||||
static int y{}; // defaults to 0
|
||||
static int selected_signal = -1;
|
||||
auto s_pid = (Config::getB("show_detailed") and Config::getI("selected_pid") == 0 ? Config::getI("detailed_pid") : Config::getI("selected_pid"));
|
||||
static int x{}; // defaults to 0
|
||||
static int y{}; // defaults to 0
|
||||
static int selected_signal = -1;
|
||||
|
||||
if (bg.empty()) selected_signal = -1;
|
||||
auto& out = Global::overlay;
|
||||
|
@ -848,7 +848,7 @@ namespace Menu {
|
|||
}
|
||||
|
||||
int signalSend(const string& key) {
|
||||
auto s_pid = (Config::getB("show_detailed") and Config::getI("selected_pid") == 0 ? Config::getI("detailed_pid") : Config::getI("selected_pid"));
|
||||
auto s_pid = (Config::getB("show_detailed") and Config::getI("selected_pid") == 0 ? Config::getI("detailed_pid") : Config::getI("selected_pid"));
|
||||
if (s_pid == 0) return Closed;
|
||||
if (redraw) {
|
||||
atomic_wait(Runner::active);
|
||||
|
@ -921,11 +921,11 @@ namespace Menu {
|
|||
|
||||
int mainMenu(const string& key) {
|
||||
enum MenuItems { Options, Help, Quit };
|
||||
static int y{}; // defaults to 0
|
||||
static int selected{}; // defaults to 0
|
||||
static int y{}; // defaults to 0
|
||||
static int selected{}; // defaults to 0
|
||||
static vector<string> colors_selected;
|
||||
static vector<string> colors_normal;
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
if (bg.empty()) selected = 0;
|
||||
int retval = Changed;
|
||||
|
||||
|
@ -1000,18 +1000,18 @@ namespace Menu {
|
|||
|
||||
int optionsMenu(const string& key) {
|
||||
enum Predispositions { isBool, isInt, isString, is2D, isBrowseable, isEditable};
|
||||
static int y{}; // defaults to 0
|
||||
static int x{}; // defaults to 0
|
||||
static int height{}; // defaults to 0
|
||||
static int page{}; // defaults to 0
|
||||
static int pages{}; // defaults to 0
|
||||
static int selected{}; // defaults to 0
|
||||
static int select_max{}; // defaults to 0
|
||||
static int item_height{}; // defaults to 0
|
||||
static int selected_cat{}; // defaults to 0
|
||||
static int max_items{}; // defaults to 0
|
||||
static int last_sel{}; // defaults to 0
|
||||
static bool editing{}; // defaults to false
|
||||
static int y{}; // defaults to 0
|
||||
static int x{}; // defaults to 0
|
||||
static int height{}; // defaults to 0
|
||||
static int page{}; // defaults to 0
|
||||
static int pages{}; // defaults to 0
|
||||
static int selected{}; // defaults to 0
|
||||
static int select_max{}; // defaults to 0
|
||||
static int item_height{}; // defaults to 0
|
||||
static int selected_cat{}; // defaults to 0
|
||||
static int max_items{}; // defaults to 0
|
||||
static int last_sel{}; // defaults to 0
|
||||
static bool editing{}; // defaults to false
|
||||
static Draw::TextEdit editor;
|
||||
static string warnings;
|
||||
static bitset<8> selPred;
|
||||
|
@ -1030,8 +1030,8 @@ namespace Menu {
|
|||
{"cpu_sensor", std::cref(Cpu::available_sensors)},
|
||||
{"selected_battery", std::cref(Config::available_batteries)},
|
||||
};
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto vim_keys = Config::getB("vim_keys");
|
||||
auto tty_mode = Config::getB("tty_mode");
|
||||
auto vim_keys = Config::getB("vim_keys");
|
||||
if (max_items == 0) {
|
||||
for (const auto& cat : categories) {
|
||||
if ((int)cat.size() > max_items) max_items = cat.size();
|
||||
|
@ -1043,9 +1043,9 @@ namespace Menu {
|
|||
Theme::updateThemes();
|
||||
}
|
||||
int retval = Changed;
|
||||
bool recollect{}; // defaults to false
|
||||
bool screen_redraw{}; // defaults to false
|
||||
bool theme_refresh{}; // defaults to false
|
||||
bool recollect{}; // defaults to false
|
||||
bool screen_redraw{}; // defaults to false
|
||||
bool theme_refresh{}; // defaults to false
|
||||
|
||||
//? Draw background if needed else process input
|
||||
if (redraw) {
|
||||
|
@ -1338,11 +1338,11 @@ namespace Menu {
|
|||
}
|
||||
|
||||
int helpMenu(const string& key) {
|
||||
static int y{}; // defaults to 0
|
||||
static int x{}; // defaults to 0
|
||||
static int height{}; // defaults to 0
|
||||
static int page{}; // defaults to 0
|
||||
static int pages{}; // defaults to 0
|
||||
static int y{}; // defaults to 0
|
||||
static int x{}; // defaults to 0
|
||||
static int height{}; // defaults to 0
|
||||
static int page{}; // defaults to 0
|
||||
static int pages{}; // defaults to 0
|
||||
|
||||
if (bg.empty()) page = 0;
|
||||
int retval = Changed;
|
||||
|
|
|
@ -46,12 +46,12 @@ namespace Menu {
|
|||
//? Strings in content vector is not checked for box width overflow
|
||||
class msgBox {
|
||||
string box_contents, button_left, button_right;
|
||||
int height{}; // defaults to 0
|
||||
int width{}; // defaults to 0
|
||||
int boxtype{}; // defaults to 0
|
||||
int selected{}; // defaults to 0
|
||||
int x{}; // defaults to 0
|
||||
int y{}; // defaults to 0
|
||||
int height{}; // defaults to 0
|
||||
int width{}; // defaults to 0
|
||||
int boxtype{}; // defaults to 0
|
||||
int selected{}; // defaults to 0
|
||||
int x{}; // defaults to 0
|
||||
int y{}; // defaults to 0
|
||||
public:
|
||||
enum BoxTypes { OK, YES_NO, NO_YES };
|
||||
enum msgReturn {
|
||||
|
|
|
@ -26,7 +26,7 @@ using namespace Tools;
|
|||
|
||||
|
||||
namespace Proc {
|
||||
void proc_sorter(vector<proc_info>& proc_vec, const string& sorting, bool reverse, bool tree) {
|
||||
void proc_sorter(vector<proc_info>& proc_vec, const string& sorting, bool reverse, bool tree) {
|
||||
if (reverse) {
|
||||
switch (v_index(sort_vector, sorting)) {
|
||||
case 0: rng::stable_sort(proc_vec, rng::less{}, &proc_info::pid); break;
|
||||
|
@ -70,7 +70,7 @@ namespace Proc {
|
|||
}
|
||||
}
|
||||
|
||||
void tree_sort(vector<tree_proc>& proc_vec, const string& sorting, bool reverse, int& c_index, const int index_max, bool collapsed) {
|
||||
void tree_sort(vector<tree_proc>& proc_vec, const string& sorting, bool reverse, int& c_index, const int index_max, bool collapsed) {
|
||||
if (proc_vec.size() > 1) {
|
||||
if (reverse) {
|
||||
switch (v_index(sort_vector, sorting)) {
|
||||
|
@ -98,8 +98,8 @@ namespace Proc {
|
|||
}
|
||||
}
|
||||
|
||||
void _tree_gen(proc_info& cur_proc, vector<proc_info>& in_procs, vector<tree_proc>& out_procs,
|
||||
int cur_depth, bool collapsed, const string& filter, bool found, bool no_update, bool should_filter) {
|
||||
void _tree_gen(proc_info& cur_proc, vector<proc_info>& in_procs, vector<tree_proc>& out_procs,
|
||||
int cur_depth, bool collapsed, const string& filter, bool found, bool no_update, bool should_filter) {
|
||||
auto cur_pos = out_procs.size();
|
||||
bool filtering = false;
|
||||
|
||||
|
@ -132,7 +132,7 @@ namespace Proc {
|
|||
std::string_view cmd_view = cur_proc.cmd;
|
||||
cmd_view = cmd_view.substr((size_t)0, std::min(cmd_view.find(' '), cmd_view.size()));
|
||||
cmd_view = cmd_view.substr(std::min(cmd_view.find_last_of('/') + 1, cmd_view.size()));
|
||||
cur_proc.short_cmd = string{cmd_view};
|
||||
cur_proc.short_cmd = string{cmd_view};
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -68,7 +68,7 @@ namespace Runner {
|
|||
extern bool pause_output;
|
||||
extern string debug_bg;
|
||||
|
||||
void run(const string& box="", bool no_update = false, bool force_redraw = false);
|
||||
void run(const string& box="", bool no_update = false, bool force_redraw = false);
|
||||
void stop();
|
||||
|
||||
}
|
||||
|
@ -116,10 +116,10 @@ namespace Cpu {
|
|||
};
|
||||
|
||||
//* Collect cpu stats and temperatures
|
||||
auto collect(bool no_update = false) -> cpu_info&;
|
||||
auto collect(bool no_update = false) -> cpu_info&;
|
||||
|
||||
//* Draw contents of cpu box using <cpu> as source
|
||||
string draw(const cpu_info& cpu, bool force_redraw = false, bool data_same = false);
|
||||
string draw(const cpu_info& cpu, bool force_redraw = false, bool data_same = false);
|
||||
|
||||
//* Parse /proc/cpu info for mapping of core ids
|
||||
auto get_core_mapping() -> unordered_flat_map<int, int>;
|
||||
|
@ -133,20 +133,20 @@ namespace Mem {
|
|||
extern string box;
|
||||
extern int x, y, width, height, min_width, min_height;
|
||||
extern bool has_swap, shown, redraw;
|
||||
const array mem_names { "used"s, "available"s, "cached"s, "free"s };
|
||||
const array swap_names { "swap_used"s, "swap_free"s };
|
||||
const array mem_names { "used"s, "available"s, "cached"s, "free"s };
|
||||
const array swap_names { "swap_used"s, "swap_free"s };
|
||||
extern int disk_ios;
|
||||
|
||||
struct disk_info {
|
||||
std::filesystem::path dev;
|
||||
string name;
|
||||
string fstype{}; // defaults to ""
|
||||
std::filesystem::path stat{}; // defaults to ""
|
||||
int64_t total{}; // defaults to 0
|
||||
int64_t used{}; // defaults to 0
|
||||
int64_t free{}; // defaults to 0
|
||||
int used_percent{}; // defaults to 0
|
||||
int free_percent{}; // defaults to 0
|
||||
string fstype{}; // defaults to ""
|
||||
std::filesystem::path stat{}; // defaults to ""
|
||||
int64_t total{}; // defaults to 0
|
||||
int64_t used{}; // defaults to 0
|
||||
int64_t free{}; // defaults to 0
|
||||
int used_percent{}; // defaults to 0
|
||||
int free_percent{}; // defaults to 0
|
||||
|
||||
array<int64_t, 3> old_io = {0, 0, 0};
|
||||
deque<long long> io_read = {};
|
||||
|
@ -169,10 +169,10 @@ namespace Mem {
|
|||
uint64_t get_totalMem();
|
||||
|
||||
//* Collect mem & disks stats
|
||||
auto collect(bool no_update = false) -> mem_info&;
|
||||
auto collect(bool no_update = false) -> mem_info&;
|
||||
|
||||
//* Draw contents of mem box using <mem> as source
|
||||
string draw(const mem_info& mem, bool force_redraw = false, bool data_same = false);
|
||||
string draw(const mem_info& mem, bool force_redraw = false, bool data_same = false);
|
||||
|
||||
}
|
||||
|
||||
|
@ -186,29 +186,29 @@ namespace Net {
|
|||
extern unordered_flat_map<string, uint64_t> graph_max;
|
||||
|
||||
struct net_stat {
|
||||
uint64_t speed{}; // defaults to 0
|
||||
uint64_t top{}; // defaults to 0
|
||||
uint64_t total{}; // defaults to 0
|
||||
uint64_t last{}; // defaults to 0
|
||||
uint64_t offset{}; // defaults to 0
|
||||
uint64_t rollover{}; // defaults to 0
|
||||
uint64_t speed{}; // defaults to 0
|
||||
uint64_t top{}; // defaults to 0
|
||||
uint64_t total{}; // defaults to 0
|
||||
uint64_t last{}; // defaults to 0
|
||||
uint64_t offset{}; // defaults to 0
|
||||
uint64_t rollover{}; // defaults to 0
|
||||
};
|
||||
|
||||
struct net_info {
|
||||
unordered_flat_map<string, deque<long long>> bandwidth = { {"download", {}}, {"upload", {}} };
|
||||
unordered_flat_map<string, net_stat> stat = { {"download", {}}, {"upload", {}} };
|
||||
string ipv4{}; // defaults to ""
|
||||
string ipv6{}; // defaults to ""
|
||||
bool connected{}; // defaults to false
|
||||
string ipv4{}; // defaults to ""
|
||||
string ipv6{}; // defaults to ""
|
||||
bool connected{}; // defaults to false
|
||||
};
|
||||
|
||||
extern unordered_flat_map<string, net_info> current_net;
|
||||
|
||||
//* Collect net upload/download stats
|
||||
auto collect(bool no_update=false) -> net_info&;
|
||||
auto collect(bool no_update=false) -> net_info&;
|
||||
|
||||
//* Draw contents of net box using <net> as source
|
||||
string draw(const net_info& net, bool force_redraw = false, bool data_same = false);
|
||||
string draw(const net_info& net, bool force_redraw = false, bool data_same = false);
|
||||
}
|
||||
|
||||
namespace Proc {
|
||||
|
@ -251,32 +251,32 @@ namespace Proc {
|
|||
|
||||
//* Container for process information
|
||||
struct proc_info {
|
||||
size_t pid{}; // defaults to 0
|
||||
string name{}; // defaults to ""
|
||||
string cmd{}; // defaults to ""
|
||||
string short_cmd{}; // defaults to ""
|
||||
size_t threads{}; // defaults to 0
|
||||
int name_offset{}; // defaults to 0
|
||||
string user{}; // defaults to ""
|
||||
uint64_t mem{}; // defaults to 0
|
||||
double cpu_p{}; // defaults to = 0.0
|
||||
double cpu_c{}; // defaults to = 0.0
|
||||
size_t pid{}; // defaults to 0
|
||||
string name{}; // defaults to ""
|
||||
string cmd{}; // defaults to ""
|
||||
string short_cmd{}; // defaults to ""
|
||||
size_t threads{}; // defaults to 0
|
||||
int name_offset{}; // defaults to 0
|
||||
string user{}; // defaults to ""
|
||||
uint64_t mem{}; // defaults to 0
|
||||
double cpu_p{}; // defaults to = 0.0
|
||||
double cpu_c{}; // defaults to = 0.0
|
||||
char state = '0';
|
||||
int64_t p_nice{}; // defaults to 0
|
||||
uint64_t ppid{}; // defaults to 0
|
||||
uint64_t cpu_s{}; // defaults to 0
|
||||
uint64_t cpu_t{}; // defaults to 0
|
||||
string prefix{}; // defaults to ""
|
||||
size_t depth{}; // defaults to 0
|
||||
size_t tree_index{}; // defaults to 0
|
||||
bool collapsed{}; // defaults to false
|
||||
bool filtered{}; // defaults to false
|
||||
int64_t p_nice{}; // defaults to 0
|
||||
uint64_t ppid{}; // defaults to 0
|
||||
uint64_t cpu_s{}; // defaults to 0
|
||||
uint64_t cpu_t{}; // defaults to 0
|
||||
string prefix{}; // defaults to ""
|
||||
size_t depth{}; // defaults to 0
|
||||
size_t tree_index{}; // defaults to 0
|
||||
bool collapsed{}; // defaults to false
|
||||
bool filtered{}; // defaults to false
|
||||
};
|
||||
|
||||
//* Container for process info box
|
||||
struct detail_container {
|
||||
size_t last_pid{}; // defaults to 0
|
||||
bool skip_smaps{}; // defaults to false
|
||||
size_t last_pid{}; // defaults to 0
|
||||
bool skip_smaps{}; // defaults to false
|
||||
proc_info entry;
|
||||
string elapsed, parent, status, io_read, io_write, memory;
|
||||
long long first_mem = -1;
|
||||
|
@ -288,13 +288,13 @@ namespace Proc {
|
|||
extern detail_container detailed;
|
||||
|
||||
//* Collect and sort process information from /proc
|
||||
auto collect(bool no_update = false) -> vector<proc_info>&;
|
||||
auto collect(bool no_update = false) -> vector<proc_info>&;
|
||||
|
||||
//* Update current selection and view, returns -1 if no change otherwise the current selection
|
||||
int selection(const string& cmd_key);
|
||||
|
||||
//* Draw contents of proc box using <plist> as data source
|
||||
string draw(const vector<proc_info>& plist, bool force_redraw = false, bool data_same = false);
|
||||
string draw(const vector<proc_info>& plist, bool force_redraw = false, bool data_same = false);
|
||||
|
||||
struct tree_proc {
|
||||
std::reference_wrapper<proc_info> entry;
|
||||
|
@ -302,14 +302,14 @@ namespace Proc {
|
|||
};
|
||||
|
||||
//* Sort vector of proc_info's
|
||||
void proc_sorter(vector<proc_info>& proc_vec, const string& sorting, bool reverse, bool tree = false);
|
||||
void proc_sorter(vector<proc_info>& proc_vec, const string& sorting, bool reverse, bool tree = false);
|
||||
|
||||
//* Recursive sort of process tree
|
||||
void tree_sort(vector<tree_proc>& proc_vec, const string& sorting,
|
||||
bool reverse, int& c_index, const int index_max, bool collapsed = false);
|
||||
void tree_sort(vector<tree_proc>& proc_vec, const string& sorting,
|
||||
bool reverse, int& c_index, const int index_max, bool collapsed = false);
|
||||
|
||||
//* Generate process tree list
|
||||
void _tree_gen(proc_info& cur_proc, vector<proc_info>& in_procs, vector<tree_proc>& out_procs,
|
||||
int cur_depth, bool collapsed, const string& filter,
|
||||
bool found = false, bool no_update = false, bool should_filter = false);
|
||||
void _tree_gen(proc_info& cur_proc, vector<proc_info>& in_procs, vector<tree_proc>& out_procs,
|
||||
int cur_depth, bool collapsed, const string& filter,
|
||||
bool found = false, bool no_update = false, bool should_filter = false);
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -150,15 +150,15 @@ namespace Theme {
|
|||
}
|
||||
}
|
||||
|
||||
string hex_to_color(string hexa, bool t_to_256, const string& depth) {
|
||||
string hex_to_color(string hexa, bool t_to_256, const string& depth) {
|
||||
if (hexa.size() > 1) {
|
||||
hexa.erase(0, 1);
|
||||
for (auto& c : hexa) {
|
||||
if (not isxdigit(c)) {
|
||||
Logger::error("Invalid hex value: " + hexa);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
for (auto& c : hexa) {
|
||||
if (not isxdigit(c)) {
|
||||
Logger::error("Invalid hex value: " + hexa);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
string pre = Fx::e + (depth == "fg" ? "38" : "48") + ";" + (t_to_256 ? "5;" : "2;");
|
||||
|
||||
if (hexa.size() == 2) {
|
||||
|
@ -189,7 +189,7 @@ namespace Theme {
|
|||
return "";
|
||||
}
|
||||
|
||||
string dec_to_color(int r, int g, int b, bool t_to_256, const string& depth) {
|
||||
string dec_to_color(int r, int g, int b, bool t_to_256, const string& depth) {
|
||||
string pre = Fx::e + (depth == "fg" ? "38" : "48") + ";" + (t_to_256 ? "5;" : "2;");
|
||||
r = std::clamp(r, 0, 255);
|
||||
g = std::clamp(g, 0, 255);
|
||||
|
@ -203,17 +203,17 @@ namespace Theme {
|
|||
array<int, 3> hex_to_dec(string hexa) {
|
||||
if (hexa.size() > 1) {
|
||||
hexa.erase(0, 1);
|
||||
for (auto& c : hexa) {
|
||||
if (not isxdigit(c))
|
||||
return array{-1, -1, -1};
|
||||
}
|
||||
for (auto& c : hexa) {
|
||||
if (not isxdigit(c))
|
||||
return array{-1, -1, -1};
|
||||
}
|
||||
|
||||
if (hexa.size() == 2) {
|
||||
int h_int = stoi(hexa, nullptr, 16);
|
||||
return array{h_int, h_int, h_int};
|
||||
return array{h_int, h_int, h_int};
|
||||
}
|
||||
else if (hexa.size() == 6) {
|
||||
return array{
|
||||
return array{
|
||||
stoi(hexa.substr(0, 2), nullptr, 16),
|
||||
stoi(hexa.substr(2, 2), nullptr, 16),
|
||||
stoi(hexa.substr(4, 2), nullptr, 16)
|
||||
|
@ -227,7 +227,7 @@ namespace Theme {
|
|||
void generateColors(const unordered_flat_map<string, string>& source) {
|
||||
vector<string> t_rgb;
|
||||
string depth;
|
||||
bool t_to_256 = Config::getB("lowcolor");
|
||||
bool t_to_256 = Config::getB("lowcolor");
|
||||
colors.clear(); rgbs.clear();
|
||||
for (const auto& [name, color] : Default_theme) {
|
||||
if (name == "main_bg" and not Config::getB("theme_background")) {
|
||||
|
@ -253,11 +253,11 @@ namespace Theme {
|
|||
}
|
||||
else if (not source.at(name).empty()) {
|
||||
t_rgb = ssplit(source.at(name));
|
||||
if (t_rgb.size() != 3) {
|
||||
Logger::error("Invalid RGB decimal value: \"" + source.at(name) + "\"");
|
||||
} else {
|
||||
if (t_rgb.size() != 3) {
|
||||
Logger::error("Invalid RGB decimal value: \"" + source.at(name) + "\"");
|
||||
} else {
|
||||
colors[name] = dec_to_color(stoi(t_rgb[0]), stoi(t_rgb[1]), stoi(t_rgb[2]), t_to_256, depth);
|
||||
rgbs[name] = array{stoi(t_rgb[0]), stoi(t_rgb[1]), stoi(t_rgb[2])};
|
||||
rgbs[name] = array{stoi(t_rgb[0]), stoi(t_rgb[1]), stoi(t_rgb[2])};
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -290,16 +290,16 @@ namespace Theme {
|
|||
//* Generate color gradients from two or three colors, 101 values indexed 0-100
|
||||
void generateGradients() {
|
||||
gradients.clear();
|
||||
bool t_to_256 = Config::getB("lowcolor");
|
||||
bool t_to_256 = Config::getB("lowcolor");
|
||||
|
||||
//? Insert values for processes greyscale gradient and processes color gradient
|
||||
rgbs.insert({
|
||||
{ "proc_start", rgbs["main_fg"] },
|
||||
{ "proc_mid", {-1, -1, -1} },
|
||||
{ "proc_end", rgbs["inactive_fg"] },
|
||||
{ "proc_color_start", rgbs["inactive_fg"] },
|
||||
{ "proc_color_mid", {-1, -1, -1} },
|
||||
{ "proc_color_end", rgbs["process_start"] },
|
||||
rgbs.insert({
|
||||
{ "proc_start", rgbs["main_fg"] },
|
||||
{ "proc_mid", {-1, -1, -1} },
|
||||
{ "proc_end", rgbs["inactive_fg"] },
|
||||
{ "proc_color_start", rgbs["inactive_fg"] },
|
||||
{ "proc_color_mid", {-1, -1, -1} },
|
||||
{ "proc_color_end", rgbs["process_start"] },
|
||||
});
|
||||
|
||||
for (const auto& [name, source_arr] : rgbs) {
|
||||
|
@ -322,10 +322,10 @@ namespace Theme {
|
|||
|
||||
//? Split iteration in two passes of 50 + 51 instead of one pass of 101 if gradient has start, mid and end values defined
|
||||
int current_range = (input_colors[1][0] >= 0) ? 50 : 100;
|
||||
for (int rgb : iota(0, 3)) {
|
||||
for (int rgb : iota(0, 3)) {
|
||||
int start = 0, offset = 0;
|
||||
int end = (current_range == 50) ? 1 : 2;
|
||||
for (int i : iota(0, 101)) {
|
||||
for (int i : iota(0, 101)) {
|
||||
output_colors[i][rgb] = input_colors[start][rgb] + (i - offset) * (input_colors[end][rgb] - input_colors[start][rgb]) / current_range;
|
||||
|
||||
//? Switch source arrays from start->mid to mid->end at 50 passes if mid is defined
|
||||
|
@ -360,7 +360,7 @@ namespace Theme {
|
|||
const string base_name = rtrim(c.first, "_start");
|
||||
string section = "_start";
|
||||
int split = colors.at(base_name + "_mid").empty() ? 50 : 33;
|
||||
for (int i : iota(0, 101)) {
|
||||
for (int i : iota(0, 101)) {
|
||||
gradients[base_name][i] = colors.at(base_name + section);
|
||||
if (i == split) {
|
||||
section = (split == 33) ? "_mid" : "_end";
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -40,13 +40,13 @@ namespace Theme {
|
|||
//* Args hexa: ["#000000"-"#ffffff"] for color, ["#00"-"#ff"] for greyscale
|
||||
//* t_to_256: [true|false] convert 24bit value to 256 color value
|
||||
//* depth: ["fg"|"bg"] for either a foreground color or a background color
|
||||
string hex_to_color(string hexa, bool t_to_256=false, const string& depth="fg");
|
||||
string hex_to_color(string hexa, bool t_to_256=false, const string& depth="fg");
|
||||
|
||||
//* Generate escape sequence for 24-bit or 256 color and return as a string
|
||||
//* Args r: [0-255], g: [0-255], b: [0-255]
|
||||
//* t_to_256: [true|false] convert 24bit value to 256 color value
|
||||
//* depth: ["fg"|"bg"] for either a foreground color or a background color
|
||||
string dec_to_color(int r, int g, int b, bool t_to_256=false, const string& depth="fg");
|
||||
string dec_to_color(int r, int g, int b, bool t_to_256=false, const string& depth="fg");
|
||||
|
||||
//* Update list of paths for available themes
|
||||
void updateThemes();
|
||||
|
|
|
@ -55,9 +55,9 @@ namespace rng = std::ranges;
|
|||
//* Collection of escape codes and functions for terminal manipulation
|
||||
namespace Term {
|
||||
|
||||
atomic<bool> initialized{}; // defaults to false
|
||||
atomic<int> width{}; // defaults to 0
|
||||
atomic<int> height{}; // defaults to 0
|
||||
atomic<bool> initialized{}; // defaults to false
|
||||
atomic<int> width{}; // defaults to 0
|
||||
atomic<int> height{}; // defaults to 0
|
||||
string current_tty;
|
||||
|
||||
namespace {
|
||||
|
@ -99,10 +99,10 @@ namespace Term {
|
|||
}
|
||||
|
||||
auto get_min_size(const string& boxes) -> array<int, 2> {
|
||||
bool cpu = boxes.find("cpu") != string::npos;
|
||||
bool mem = boxes.find("mem") != string::npos;
|
||||
bool net = boxes.find("net") != string::npos;
|
||||
bool proc = boxes.find("proc") != string::npos;
|
||||
bool cpu = boxes.find("cpu") != string::npos;
|
||||
bool mem = boxes.find("mem") != string::npos;
|
||||
bool net = boxes.find("net") != string::npos;
|
||||
bool proc = boxes.find("proc") != string::npos;
|
||||
int width = 0;
|
||||
if (mem) width = Mem::min_width;
|
||||
else if (net) width = Mem::min_width;
|
||||
|
@ -121,7 +121,7 @@ namespace Term {
|
|||
initialized = (bool)isatty(STDIN_FILENO);
|
||||
if (initialized) {
|
||||
tcgetattr(STDIN_FILENO, &initial_settings);
|
||||
current_tty = (ttyname(STDIN_FILENO) != NULL ? static_cast<string>(ttyname(STDIN_FILENO)) : "unknown");
|
||||
current_tty = (ttyname(STDIN_FILENO) != NULL ? static_cast<string>(ttyname(STDIN_FILENO)) : "unknown");
|
||||
|
||||
//? Disable stream sync
|
||||
cin.sync_with_stdio(false);
|
||||
|
@ -206,9 +206,9 @@ namespace Tools {
|
|||
return chars;
|
||||
}
|
||||
|
||||
string uresize(string str, const size_t len, bool wide) {
|
||||
if (len < 1 or str.empty())
|
||||
return "";
|
||||
string uresize(string str, const size_t len, bool wide) {
|
||||
if (len < 1 or str.empty())
|
||||
return "";
|
||||
|
||||
if (wide) {
|
||||
try {
|
||||
|
@ -236,9 +236,9 @@ namespace Tools {
|
|||
return str;
|
||||
}
|
||||
|
||||
string luresize(string str, const size_t len, bool wide) {
|
||||
if (len < 1 or str.empty())
|
||||
return "";
|
||||
string luresize(string str, const size_t len, bool wide) {
|
||||
if (len < 1 or str.empty())
|
||||
return "";
|
||||
|
||||
for (size_t x = 0, last_pos = 0, i = str.size() - 1; i > 0 ; i--) {
|
||||
if (wide and static_cast<unsigned char>(str.at(i)) > 0xef) {
|
||||
|
@ -267,19 +267,19 @@ namespace Tools {
|
|||
}
|
||||
|
||||
string ltrim(const string& str, const string& t_str) {
|
||||
std::string_view str_v{str};
|
||||
while (str_v.starts_with(t_str))
|
||||
str_v.remove_prefix(t_str.size());
|
||||
std::string_view str_v{str};
|
||||
while (str_v.starts_with(t_str))
|
||||
str_v.remove_prefix(t_str.size());
|
||||
|
||||
return string{str_v};
|
||||
return string{str_v};
|
||||
}
|
||||
|
||||
string rtrim(const string& str, const string& t_str) {
|
||||
std::string_view str_v{str};
|
||||
while (str_v.ends_with(t_str))
|
||||
str_v.remove_suffix(t_str.size());
|
||||
std::string_view str_v{str};
|
||||
while (str_v.ends_with(t_str))
|
||||
str_v.remove_suffix(t_str.size());
|
||||
|
||||
return string{str_v};
|
||||
return string{str_v};
|
||||
}
|
||||
|
||||
auto ssplit(const string& str, const char& delim) -> vector<string> {
|
||||
|
@ -293,56 +293,56 @@ namespace Tools {
|
|||
return out;
|
||||
}
|
||||
|
||||
string ljust(string str, const size_t x, bool utf, bool wide, bool limit) {
|
||||
string ljust(string str, const size_t x, bool utf, bool wide, bool limit) {
|
||||
if (utf) {
|
||||
if (limit and ulen(str, wide) > x)
|
||||
return uresize(str, x, wide);
|
||||
if (limit and ulen(str, wide) > x)
|
||||
return uresize(str, x, wide);
|
||||
|
||||
return str + string(max((int)(x - ulen(str)), 0), ' ');
|
||||
}
|
||||
else {
|
||||
if (limit and str.size() > x) {
|
||||
str.resize(x);
|
||||
return str;
|
||||
}
|
||||
if (limit and str.size() > x) {
|
||||
str.resize(x);
|
||||
return str;
|
||||
}
|
||||
return str + string(max((int)(x - str.size()), 0), ' ');
|
||||
}
|
||||
}
|
||||
|
||||
string rjust(string str, const size_t x, bool utf, bool wide, bool limit) {
|
||||
string rjust(string str, const size_t x, bool utf, bool wide, bool limit) {
|
||||
if (utf) {
|
||||
if (limit and ulen(str, wide) > x)
|
||||
return uresize(str, x, wide);
|
||||
if (limit and ulen(str, wide) > x)
|
||||
return uresize(str, x, wide);
|
||||
|
||||
return string(max((int)(x - ulen(str)), 0), ' ') + str;
|
||||
}
|
||||
else {
|
||||
if (limit and str.size() > x) {
|
||||
str.resize(x);
|
||||
return str;
|
||||
};
|
||||
if (limit and str.size() > x) {
|
||||
str.resize(x);
|
||||
return str;
|
||||
};
|
||||
return string(max((int)(x - str.size()), 0), ' ') + str;
|
||||
}
|
||||
}
|
||||
|
||||
string cjust(string str, const size_t x, bool utf, bool wide, bool limit) {
|
||||
string cjust(string str, const size_t x, bool utf, bool wide, bool limit) {
|
||||
if (utf) {
|
||||
if (limit and ulen(str, wide) > x)
|
||||
return uresize(str, x, wide);
|
||||
if (limit and ulen(str, wide) > x)
|
||||
return uresize(str, x, wide);
|
||||
|
||||
return string(max((int)ceil((double)(x - ulen(str)) / 2), 0), ' ') + str + string(max((int)floor((double)(x - ulen(str)) / 2), 0), ' ');
|
||||
}
|
||||
else {
|
||||
if (limit and str.size() > x) {
|
||||
str.resize(x);
|
||||
return str;
|
||||
}
|
||||
if (limit and str.size() > x) {
|
||||
str.resize(x);
|
||||
return str;
|
||||
}
|
||||
return string(max((int)ceil((double)(x - str.size()) / 2), 0), ' ') + str + string(max((int)floor((double)(x - str.size()) / 2), 0), ' ');
|
||||
}
|
||||
}
|
||||
|
||||
string trans(const string& str) {
|
||||
std::string_view oldstr{str};
|
||||
std::string_view oldstr{str};
|
||||
string newstr;
|
||||
newstr.reserve(str.size());
|
||||
for (size_t pos; (pos = oldstr.find(' ')) != string::npos;) {
|
||||
|
@ -352,7 +352,7 @@ namespace Tools {
|
|||
newstr.append(Mv::r(x));
|
||||
oldstr.remove_prefix(pos + x);
|
||||
}
|
||||
return (newstr.empty()) ? str : newstr + string{oldstr};
|
||||
return (newstr.empty()) ? str : newstr + string{oldstr};
|
||||
}
|
||||
|
||||
string sec_to_dhms(size_t seconds, bool no_days, bool no_seconds) {
|
||||
|
@ -366,37 +366,37 @@ namespace Tools {
|
|||
return out;
|
||||
}
|
||||
|
||||
string floating_humanizer(uint64_t value, bool shorten, size_t start, bool bit, bool per_second) {
|
||||
string floating_humanizer(uint64_t value, bool shorten, size_t start, bool bit, bool per_second) {
|
||||
string out;
|
||||
const size_t mult = (bit) ? 8 : 1;
|
||||
bool mega = Config::getB("base_10_sizes");
|
||||
bool mega = Config::getB("base_10_sizes");
|
||||
|
||||
// taking advantage of type deduction for array creation (since C++17)
|
||||
// combined with string literals (operator""s)
|
||||
static const array mebiUnits_bit {
|
||||
"bit"s, "Kib"s, "Mib"s,
|
||||
"Gib"s, "Tib"s, "Pib"s,
|
||||
"Eib"s, "Zib"s, "Yib"s,
|
||||
"Bib"s, "GEb"s
|
||||
};
|
||||
static const array mebiUnits_byte {
|
||||
"Byte"s, "KiB"s, "MiB"s,
|
||||
"GiB"s, "TiB"s, "PiB"s,
|
||||
"EiB"s, "ZiB"s, "YiB"s,
|
||||
"BiB"s, "GEB"s
|
||||
};
|
||||
static const array megaUnits_bit {
|
||||
"bit"s, "Kb"s, "Mb"s,
|
||||
"Gb"s, "Tb"s, "Pb"s,
|
||||
"Eb"s, "Zb"s, "Yb"s,
|
||||
"Bb"s, "Gb"s
|
||||
};
|
||||
static const array megaUnits_byte {
|
||||
"Byte"s, "KB"s, "MB"s,
|
||||
"GB"s, "TB"s, "PB"s,
|
||||
"EB"s, "ZB"s, "YB"s,
|
||||
"BB"s, "GB"s
|
||||
};
|
||||
// taking advantage of type deduction for array creation (since C++17)
|
||||
// combined with string literals (operator""s)
|
||||
static const array mebiUnits_bit {
|
||||
"bit"s, "Kib"s, "Mib"s,
|
||||
"Gib"s, "Tib"s, "Pib"s,
|
||||
"Eib"s, "Zib"s, "Yib"s,
|
||||
"Bib"s, "GEb"s
|
||||
};
|
||||
static const array mebiUnits_byte {
|
||||
"Byte"s, "KiB"s, "MiB"s,
|
||||
"GiB"s, "TiB"s, "PiB"s,
|
||||
"EiB"s, "ZiB"s, "YiB"s,
|
||||
"BiB"s, "GEB"s
|
||||
};
|
||||
static const array megaUnits_bit {
|
||||
"bit"s, "Kb"s, "Mb"s,
|
||||
"Gb"s, "Tb"s, "Pb"s,
|
||||
"Eb"s, "Zb"s, "Yb"s,
|
||||
"Bb"s, "Gb"s
|
||||
};
|
||||
static const array megaUnits_byte {
|
||||
"Byte"s, "KB"s, "MB"s,
|
||||
"GB"s, "TB"s, "PB"s,
|
||||
"EB"s, "ZB"s, "YB"s,
|
||||
"BB"s, "GB"s
|
||||
};
|
||||
const auto& units = (bit) ? ( mega ? megaUnits_bit : mebiUnits_bit) : ( mega ? megaUnits_byte : mebiUnits_byte);
|
||||
|
||||
value *= 100 * mult;
|
||||
|
@ -423,29 +423,29 @@ namespace Tools {
|
|||
}
|
||||
if (out.empty()) {
|
||||
out = to_string(value);
|
||||
if (not mega and out.size() == 4 and start > 0) {
|
||||
out.pop_back();
|
||||
out.insert(2, ".");
|
||||
}
|
||||
else if (out.size() == 3 and start > 0) {
|
||||
out.insert(1, ".");
|
||||
}
|
||||
else if (out.size() >= 2) {
|
||||
out.resize(out.size() - 2);
|
||||
}
|
||||
if (not mega and out.size() == 4 and start > 0) {
|
||||
out.pop_back();
|
||||
out.insert(2, ".");
|
||||
}
|
||||
else if (out.size() == 3 and start > 0) {
|
||||
out.insert(1, ".");
|
||||
}
|
||||
else if (out.size() >= 2) {
|
||||
out.resize(out.size() - 2);
|
||||
}
|
||||
}
|
||||
if (shorten) {
|
||||
auto f_pos = out.find('.');
|
||||
if (f_pos == 1 and out.size() > 3) {
|
||||
out = to_string(round(stod(out) * 10) / 10).substr(0,3);
|
||||
}
|
||||
else if (f_pos != string::npos) {
|
||||
out = to_string((int)round(stod(out)));
|
||||
}
|
||||
if (out.size() > 3) {
|
||||
out = to_string((int)(out[0] - '0') + 1);
|
||||
start++;
|
||||
}
|
||||
if (f_pos == 1 and out.size() > 3) {
|
||||
out = to_string(round(stod(out) * 10) / 10).substr(0,3);
|
||||
}
|
||||
else if (f_pos != string::npos) {
|
||||
out = to_string((int)round(stod(out)));
|
||||
}
|
||||
if (out.size() > 3) {
|
||||
out = to_string((int)(out[0] - '0') + 1);
|
||||
start++;
|
||||
}
|
||||
out.push_back(units[start][0]);
|
||||
}
|
||||
else out += " " + units[start];
|
||||
|
@ -455,18 +455,18 @@ namespace Tools {
|
|||
}
|
||||
|
||||
std::string operator*(const string& str, int64_t n) {
|
||||
if (n < 1 or str.empty()) {
|
||||
return "";
|
||||
}
|
||||
else if (n == 1) {
|
||||
return str;
|
||||
}
|
||||
if (n < 1 or str.empty()) {
|
||||
return "";
|
||||
}
|
||||
else if (n == 1) {
|
||||
return str;
|
||||
}
|
||||
|
||||
string new_str;
|
||||
new_str.reserve(str.size() * n);
|
||||
|
||||
for (; n > 0; n--)
|
||||
new_str.append(str);
|
||||
for (; n > 0; n--)
|
||||
new_str.append(str);
|
||||
|
||||
return new_str;
|
||||
}
|
||||
|
@ -479,11 +479,11 @@ namespace Tools {
|
|||
return ss.str();
|
||||
}
|
||||
|
||||
void atomic_wait(const atomic<bool>& atom, bool old) noexcept {
|
||||
void atomic_wait(const atomic<bool>& atom, bool old) noexcept {
|
||||
while (atom.load(std::memory_order_relaxed) == old ) busy_wait();
|
||||
}
|
||||
|
||||
void atomic_wait_for(const atomic<bool>& atom, bool old, const uint64_t wait_ms) noexcept {
|
||||
void atomic_wait_for(const atomic<bool>& atom, bool old, const uint64_t wait_ms) noexcept {
|
||||
const uint64_t start_time = time_ms();
|
||||
while (atom.load(std::memory_order_relaxed) == old and (time_ms() - start_time < wait_ms)) sleep_ms(1);
|
||||
}
|
||||
|
@ -505,7 +505,7 @@ namespace Tools {
|
|||
for (string readstr; getline(file, readstr); out += readstr);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
Logger::error("readfile() : Exception when reading " + string{path} + " : " + e.what());
|
||||
Logger::error("readfile() : Exception when reading " + string{path} + " : " + e.what());
|
||||
return fallback;
|
||||
}
|
||||
return (out.empty() ? fallback : out);
|
||||
|
@ -526,7 +526,7 @@ namespace Tools {
|
|||
string hostname() {
|
||||
char host[HOST_NAME_MAX];
|
||||
gethostname(host, HOST_NAME_MAX);
|
||||
return string{host};
|
||||
return string{host};
|
||||
}
|
||||
|
||||
string username() {
|
||||
|
@ -551,14 +551,14 @@ namespace Logger {
|
|||
int status = -1;
|
||||
public:
|
||||
lose_priv() {
|
||||
if (geteuid() != Global::real_uid) {
|
||||
this->status = seteuid(Global::real_uid);
|
||||
}
|
||||
if (geteuid() != Global::real_uid) {
|
||||
this->status = seteuid(Global::real_uid);
|
||||
}
|
||||
}
|
||||
~lose_priv() {
|
||||
if (status == 0) {
|
||||
status = seteuid(Global::set_uid);
|
||||
}
|
||||
if (status == 0) {
|
||||
status = seteuid(Global::set_uid);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -576,25 +576,25 @@ namespace Logger {
|
|||
auto old_log = logfile;
|
||||
old_log += ".1";
|
||||
|
||||
if (fs::exists(old_log))
|
||||
fs::remove(old_log, ec);
|
||||
if (fs::exists(old_log))
|
||||
fs::remove(old_log, ec);
|
||||
|
||||
if (not ec)
|
||||
fs::rename(logfile, old_log, ec);
|
||||
if (not ec)
|
||||
fs::rename(logfile, old_log, ec);
|
||||
}
|
||||
if (not ec) {
|
||||
std::ofstream lwrite(logfile, std::ios::app);
|
||||
if (first) {
|
||||
first = false;
|
||||
lwrite << "\n" << strf_time(tdf) << "===> btop++ v." << Global::Version << "\n";
|
||||
}
|
||||
if (first) {
|
||||
first = false;
|
||||
lwrite << "\n" << strf_time(tdf) << "===> btop++ v." << Global::Version << "\n";
|
||||
}
|
||||
lwrite << strf_time(tdf) << log_levels.at(level) << ": " << msg << "\n";
|
||||
}
|
||||
else logfile.clear();
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
logfile.clear();
|
||||
throw std::runtime_error("Exception in Logger::log_write() : " + string{e.what()});
|
||||
throw std::runtime_error("Exception in Logger::log_write() : " + string{e.what()});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -91,19 +91,19 @@ namespace Fx {
|
|||
//* Collection of escape codes and functions for cursor manipulation
|
||||
namespace Mv {
|
||||
//* Move cursor to <line>, <column>
|
||||
inline string to(int line, int col) { return Fx::e + to_string(line) + ';' + to_string(col) + 'f'; }
|
||||
inline string to(int line, int col) { return Fx::e + to_string(line) + ';' + to_string(col) + 'f'; }
|
||||
|
||||
//* Move cursor right <x> columns
|
||||
inline string r(int x) { return Fx::e + to_string(x) + 'C'; }
|
||||
inline string r(int x) { return Fx::e + to_string(x) + 'C'; }
|
||||
|
||||
//* Move cursor left <x> columns
|
||||
inline string l(int x) { return Fx::e + to_string(x) + 'D'; }
|
||||
inline string l(int x) { return Fx::e + to_string(x) + 'D'; }
|
||||
|
||||
//* Move cursor up x lines
|
||||
inline string u(int x) { return Fx::e + to_string(x) + 'A'; }
|
||||
inline string u(int x) { return Fx::e + to_string(x) + 'A'; }
|
||||
|
||||
//* Move cursor down x lines
|
||||
inline string d(int x) { return Fx::e + to_string(x) + 'B'; }
|
||||
inline string d(int x) { return Fx::e + to_string(x) + 'B'; }
|
||||
|
||||
//* Save cursor position
|
||||
const string save = Fx::e + "s";
|
||||
|
@ -155,15 +155,15 @@ namespace Tools {
|
|||
size_t wide_ulen(const std::wstring& w_str);
|
||||
|
||||
//* Return number of UTF8 characters in a string (wide=true for column size needed on terminal)
|
||||
inline size_t ulen(const string& str, bool wide = false) {
|
||||
inline size_t ulen(const string& str, bool wide = false) {
|
||||
return (wide ? wide_ulen(str) : std::ranges::count_if(str, [](char c) { return (static_cast<unsigned char>(c) & 0xC0) != 0x80; }));
|
||||
}
|
||||
|
||||
//* Resize a string consisting of UTF8 characters (only reduces size)
|
||||
string uresize(const string str, const size_t len, bool wide = false);
|
||||
string uresize(const string str, const size_t len, bool wide = false);
|
||||
|
||||
//* Resize a string consisting of UTF8 characters from left (only reduces size)
|
||||
string luresize(const string str, const size_t len, bool wide = false);
|
||||
string luresize(const string str, const size_t len, bool wide = false);
|
||||
|
||||
//* Replace <from> in <str> with <to> and return new string
|
||||
string s_replace(const string& str, const string& from, const string& to);
|
||||
|
@ -200,11 +200,11 @@ namespace Tools {
|
|||
|
||||
//* Check if string <str> contains string <find_val>, while ignoring case
|
||||
inline bool s_contains_ic(const string& str, const string& find_val) {
|
||||
auto it = std::search(
|
||||
str.begin(), str.end(),
|
||||
find_val.begin(), find_val.end(),
|
||||
[](char ch1, char ch2) { return std::toupper(ch1) == std::toupper(ch2); }
|
||||
);
|
||||
auto it = std::search(
|
||||
str.begin(), str.end(),
|
||||
find_val.begin(), find_val.end(),
|
||||
[](char ch1, char ch2) { return std::toupper(ch1) == std::toupper(ch2); }
|
||||
);
|
||||
return it != str.end();
|
||||
}
|
||||
|
||||
|
@ -265,35 +265,35 @@ namespace Tools {
|
|||
auto ssplit(const string& str, const char& delim = ' ') -> vector<string>;
|
||||
|
||||
//* Put current thread to sleep for <ms> milliseconds
|
||||
inline void sleep_ms(const size_t& ms) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
|
||||
}
|
||||
inline void sleep_ms(const size_t& ms) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
|
||||
}
|
||||
|
||||
//* Put current thread to sleep for <micros> microseconds
|
||||
inline void sleep_micros(const size_t& micros) {
|
||||
std::this_thread::sleep_for(std::chrono::microseconds(micros));
|
||||
}
|
||||
inline void sleep_micros(const size_t& micros) {
|
||||
std::this_thread::sleep_for(std::chrono::microseconds(micros));
|
||||
}
|
||||
|
||||
//* Left justify string <str> if <x> is greater than <str> length, limit return size to <x> by default
|
||||
string ljust(string str, const size_t x, bool utf = false, bool wide = false, bool limit = true);
|
||||
string ljust(string str, const size_t x, bool utf = false, bool wide = false, bool limit = true);
|
||||
|
||||
//* Right justify string <str> if <x> is greater than <str> length, limit return size to <x> by default
|
||||
string rjust(string str, const size_t x, bool utf = false, bool wide = false, bool limit = true);
|
||||
string rjust(string str, const size_t x, bool utf = false, bool wide = false, bool limit = true);
|
||||
|
||||
//* Center justify string <str> if <x> is greater than <str> length, limit return size to <x> by default
|
||||
string cjust(string str, const size_t x, bool utf = false, bool wide = false, bool limit = true);
|
||||
string cjust(string str, const size_t x, bool utf = false, bool wide = false, bool limit = true);
|
||||
|
||||
//* Replace whitespaces " " with escape code for move right
|
||||
string trans(const string& str);
|
||||
|
||||
//* Convert seconds to format "<days>d <hours>:<minutes>:<seconds>" and return string
|
||||
string sec_to_dhms(size_t seconds, bool no_days = false, bool no_seconds = false);
|
||||
string sec_to_dhms(size_t seconds, bool no_days = false, bool no_seconds = false);
|
||||
|
||||
//* Scales up in steps of 1024 to highest positive value unit and returns string with unit suffixed
|
||||
//* bit=True or defaults to bytes
|
||||
//* start=int to set 1024 multiplier starting unit
|
||||
//* short=True always returns 0 decimals and shortens unit to 1 character
|
||||
string floating_humanizer(uint64_t value, bool shorten = false, size_t start = 0, bool bit = false, bool per_second = false);
|
||||
string floating_humanizer(uint64_t value, bool shorten = false, size_t start = 0, bool bit = false, bool per_second = false);
|
||||
|
||||
//* Add std::string operator * : Repeat string <str> <n> number of times
|
||||
std::string operator*(const string& str, int64_t n);
|
||||
|
@ -316,21 +316,21 @@ namespace Tools {
|
|||
#endif
|
||||
}
|
||||
|
||||
void atomic_wait(const atomic<bool>& atom, bool old = true) noexcept;
|
||||
void atomic_wait(const atomic<bool>& atom, bool old = true) noexcept;
|
||||
|
||||
void atomic_wait_for(const atomic<bool>& atom, bool old = true, const uint64_t wait_ms = 0) noexcept;
|
||||
void atomic_wait_for(const atomic<bool>& atom, bool old = true, const uint64_t wait_ms = 0) noexcept;
|
||||
|
||||
//* Sets atomic<bool> to true on construct, sets to false on destruct
|
||||
class atomic_lock {
|
||||
atomic<bool>& atom;
|
||||
bool not_true{}; // defaults to false
|
||||
bool not_true{}; // defaults to false
|
||||
public:
|
||||
atomic_lock(atomic<bool>& atom, bool wait = false);
|
||||
atomic_lock(atomic<bool>& atom, bool wait = false);
|
||||
~atomic_lock();
|
||||
};
|
||||
|
||||
//* Read a complete file and return as a string
|
||||
string readfile(const std::filesystem::path& path, const string& fallback = "");
|
||||
string readfile(const std::filesystem::path& path, const string& fallback = "");
|
||||
|
||||
//* Convert a celsius value to celsius, fahrenheit, kelvin or rankin and return tuple with new value and unit.
|
||||
auto celsius_to(const long long& celsius, const string& scale) -> tuple<long long, string>;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -120,12 +120,12 @@ namespace Shared {
|
|||
//? Shared global variables init
|
||||
int mib[2];
|
||||
mib[0] = CTL_HW;
|
||||
mib[1] = HW_NCPU;
|
||||
mib[1] = HW_NCPU;
|
||||
int ncpu;
|
||||
size_t len = sizeof(ncpu);
|
||||
if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1) {
|
||||
size_t len = sizeof(ncpu);
|
||||
if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1) {
|
||||
Logger::warning("Could not determine number of cores, defaulting to 1.");
|
||||
} else {
|
||||
} else {
|
||||
coreCount = ncpu;
|
||||
}
|
||||
|
||||
|
@ -205,12 +205,12 @@ namespace Cpu {
|
|||
const array<string, 10> time_names = {"user", "nice", "system", "idle"};
|
||||
|
||||
unordered_flat_map<string, long long> cpu_old = {
|
||||
{"totals", 0},
|
||||
{"idles", 0},
|
||||
{"user", 0},
|
||||
{"nice", 0},
|
||||
{"system", 0},
|
||||
{"idle", 0}
|
||||
{"totals", 0},
|
||||
{"idles", 0},
|
||||
{"user", 0},
|
||||
{"nice", 0},
|
||||
{"system", 0},
|
||||
{"idle", 0}
|
||||
};
|
||||
|
||||
string get_cpuName() {
|
||||
|
@ -398,7 +398,7 @@ namespace Cpu {
|
|||
return {percent, seconds, status};
|
||||
}
|
||||
|
||||
auto collect(bool no_update) -> cpu_info & {
|
||||
auto collect(bool no_update) -> cpu_info & {
|
||||
if (Runner::stopping or (no_update and not current_cpu.cpu_percent.at("total").empty()))
|
||||
return current_cpu;
|
||||
auto &cpu = current_cpu;
|
||||
|
@ -555,17 +555,17 @@ namespace Mem {
|
|||
}
|
||||
}
|
||||
|
||||
void collect_disk(unordered_flat_map<string, disk_info> &disks, unordered_flat_map<string, string> &mapping) {
|
||||
void collect_disk(unordered_flat_map<string, disk_info> &disks, unordered_flat_map<string, string> &mapping) {
|
||||
// this bit is for 'regular' mounts
|
||||
static struct statinfo cur;
|
||||
long double etime = 0;
|
||||
uint64_t total_bytes_read;
|
||||
static struct statinfo cur;
|
||||
long double etime = 0;
|
||||
uint64_t total_bytes_read;
|
||||
uint64_t total_bytes_write;
|
||||
|
||||
static std::unique_ptr<struct devinfo, decltype(std::free)*> curDevInfo (reinterpret_cast<struct devinfo*>(std::calloc(1, sizeof(struct devinfo))), std::free);
|
||||
cur.dinfo = curDevInfo.get();
|
||||
|
||||
if (devstat_getdevs(NULL, &cur) != -1) {
|
||||
if (devstat_getdevs(NULL, &cur) != -1) {
|
||||
for (int i = 0; i < cur.dinfo->numdevs; i++) {
|
||||
auto d = cur.dinfo->devices[i];
|
||||
string devStatName = "/dev/" + string(d.device_name) + std::to_string(d.unit_number);
|
||||
|
@ -617,17 +617,17 @@ namespace Mem {
|
|||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
auto collect(bool no_update) -> mem_info & {
|
||||
auto collect(bool no_update) -> mem_info & {
|
||||
if (Runner::stopping or (no_update and not current_mem.percent.at("used").empty()))
|
||||
return current_mem;
|
||||
|
||||
auto show_swap = Config::getB("show_swap");
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto show_swap = Config::getB("show_swap");
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto &mem = current_mem;
|
||||
static bool snapped = (getenv("BTOP_SNAPPED") != NULL);
|
||||
static bool snapped = (getenv("BTOP_SNAPPED") != NULL);
|
||||
|
||||
int mib[4];
|
||||
u_int memActive, memWire, cachedMem, freeMem;
|
||||
|
@ -693,7 +693,7 @@ namespace Mem {
|
|||
double uptime = system_uptime();
|
||||
auto &disks_filter = Config::getS("disks_filter");
|
||||
bool filter_exclude = false;
|
||||
// auto only_physical = Config::getB("only_physical");
|
||||
// auto only_physical = Config::getB("only_physical");
|
||||
auto &disks = mem.disks;
|
||||
vector<string> filter;
|
||||
if (not disks_filter.empty()) {
|
||||
|
@ -711,7 +711,7 @@ namespace Mem {
|
|||
for (int i = 0; i < count; i++) {
|
||||
auto fstype = string(stfs[i].f_fstypename);
|
||||
if (fstype == "autofs" || fstype == "devfs" || fstype == "linprocfs" || fstype == "procfs" || fstype == "tmpfs" || fstype == "linsysfs" ||
|
||||
fstype == "fdesckfs") {
|
||||
fstype == "fdesckfs") {
|
||||
// in memory filesystems -> not useful to show
|
||||
continue;
|
||||
}
|
||||
|
@ -826,11 +826,11 @@ namespace Net {
|
|||
auto operator()() -> struct ifaddrs * { return ifaddr; }
|
||||
};
|
||||
|
||||
auto collect(bool no_update) -> net_info & {
|
||||
auto collect(bool no_update) -> net_info & {
|
||||
auto &net = current_net;
|
||||
auto &config_iface = Config::getS("net_iface");
|
||||
auto net_sync = Config::getB("net_sync");
|
||||
auto net_auto = Config::getB("net_auto");
|
||||
auto net_sync = Config::getB("net_sync");
|
||||
auto net_auto = Config::getB("net_auto");
|
||||
auto new_timestamp = time_ms();
|
||||
|
||||
if (not no_update and errors < 3) {
|
||||
|
@ -985,7 +985,7 @@ namespace Net {
|
|||
auto sorted_interfaces = interfaces;
|
||||
rng::sort(sorted_interfaces, [&](const auto &a, const auto &b) {
|
||||
return cmp_greater(net.at(a).stat["download"].total + net.at(a).stat["upload"].total,
|
||||
net.at(b).stat["download"].total + net.at(b).stat["upload"].total);
|
||||
net.at(b).stat["download"].total + net.at(b).stat["upload"].total);
|
||||
});
|
||||
selected_iface.clear();
|
||||
//? Try to set to a connected interface
|
||||
|
@ -1008,8 +1008,8 @@ namespace Net {
|
|||
for (const auto &sel : {0, 1}) {
|
||||
if (rescale or max_count[dir][sel] >= 5) {
|
||||
const long long avg_speed = (net[selected_iface].bandwidth[dir].size() > 5
|
||||
? std::accumulate(net.at(selected_iface).bandwidth.at(dir).rbegin(), net.at(selected_iface).bandwidth.at(dir).rbegin() + 5, 0ll) / 5
|
||||
: net[selected_iface].stat[dir].speed);
|
||||
? std::accumulate(net.at(selected_iface).bandwidth.at(dir).rbegin(), net.at(selected_iface).bandwidth.at(dir).rbegin() + 5, 0ll) / 5
|
||||
: net[selected_iface].stat[dir].speed);
|
||||
graph_max[dir] = max(uint64_t(avg_speed * (sel == 0 ? 1.3 : 3.0)), (uint64_t)10 << 10);
|
||||
max_count[dir][0] = max_count[dir][1] = 0;
|
||||
redraw = true;
|
||||
|
@ -1110,17 +1110,17 @@ namespace Proc {
|
|||
}
|
||||
|
||||
//* Collects and sorts process information from /proc
|
||||
auto collect(bool no_update) -> vector<proc_info> & {
|
||||
auto collect(bool no_update) -> vector<proc_info> & {
|
||||
const auto &sorting = Config::getS("proc_sorting");
|
||||
auto reverse = Config::getB("proc_reversed");
|
||||
auto reverse = Config::getB("proc_reversed");
|
||||
const auto &filter = Config::getS("proc_filter");
|
||||
auto per_core = Config::getB("proc_per_core");
|
||||
auto tree = Config::getB("proc_tree");
|
||||
auto show_detailed = Config::getB("show_detailed");
|
||||
auto per_core = Config::getB("proc_per_core");
|
||||
auto tree = Config::getB("proc_tree");
|
||||
auto show_detailed = Config::getB("show_detailed");
|
||||
const size_t detailed_pid = Config::getI("detailed_pid");
|
||||
bool should_filter = current_filter != filter;
|
||||
if (should_filter) current_filter = filter;
|
||||
bool sorted_change = (sorting != current_sort or reverse != current_rev or should_filter);
|
||||
bool sorted_change = (sorting != current_sort or reverse != current_rev or should_filter);
|
||||
if (sorted_change) {
|
||||
current_sort = sorting;
|
||||
current_rev = reverse;
|
||||
|
@ -1156,12 +1156,12 @@ namespace Proc {
|
|||
const double timeNow = currentTime.tv_sec + (currentTime.tv_usec / 1'000'000);
|
||||
|
||||
int count = 0;
|
||||
char buf[_POSIX2_LINE_MAX];
|
||||
char buf[_POSIX2_LINE_MAX];
|
||||
Shared::kvm_openfiles_wrapper kd(NULL, _PATH_DEVNULL, NULL, O_RDONLY, buf);
|
||||
const struct kinfo_proc* kprocs = kvm_getprocs(kd(), KERN_PROC_PROC, 0, &count);
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
const struct kinfo_proc* kproc = &kprocs[i];
|
||||
const struct kinfo_proc* kproc = &kprocs[i];
|
||||
const size_t pid = (size_t)kproc->ki_pid;
|
||||
if (pid < 1) continue;
|
||||
found.push_back(pid);
|
||||
|
|
|
@ -63,8 +63,8 @@ namespace Cpu {
|
|||
vector<string> available_sensors = {"Auto"};
|
||||
cpu_info current_cpu;
|
||||
fs::path freq_path = "/sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq";
|
||||
bool got_sensors{}; // defaults to false
|
||||
bool cpu_temp_only{}; // defaults to false
|
||||
bool got_sensors{}; // defaults to false
|
||||
bool cpu_temp_only{}; // defaults to false
|
||||
|
||||
//* Populate found_sensors map
|
||||
bool get_sensors();
|
||||
|
@ -78,9 +78,9 @@ namespace Cpu {
|
|||
struct Sensor {
|
||||
fs::path path;
|
||||
string label;
|
||||
int64_t temp{}; // defaults to 0
|
||||
int64_t high{}; // defaults to 0
|
||||
int64_t crit{}; // defaults to 0
|
||||
int64_t temp{}; // defaults to 0
|
||||
int64_t high{}; // defaults to 0
|
||||
int64_t crit{}; // defaults to 0
|
||||
};
|
||||
|
||||
unordered_flat_map<string, Sensor> found_sensors;
|
||||
|
@ -162,10 +162,10 @@ namespace Cpu {
|
|||
bool has_battery = true;
|
||||
tuple<int, long, string> current_bat;
|
||||
|
||||
const array time_names {
|
||||
"user"s, "nice"s, "system"s, "idle"s, "iowait"s,
|
||||
"irq"s, "softirq"s, "steal"s, "guest"s, "guest_nice"s
|
||||
};
|
||||
const array time_names {
|
||||
"user"s, "nice"s, "system"s, "idle"s, "iowait"s,
|
||||
"irq"s, "softirq"s, "steal"s, "guest"s, "guest_nice"s
|
||||
};
|
||||
|
||||
unordered_flat_map<string, long long> cpu_old = {
|
||||
{"totals", 0},
|
||||
|
@ -408,14 +408,14 @@ namespace Cpu {
|
|||
}
|
||||
|
||||
string get_cpuHz() {
|
||||
static int failed{}; // defaults to 0
|
||||
static int failed{}; // defaults to 0
|
||||
|
||||
if (failed > 4)
|
||||
return ""s;
|
||||
if (failed > 4)
|
||||
return ""s;
|
||||
|
||||
string cpuhz;
|
||||
try {
|
||||
double hz{}; // defaults to 0.0
|
||||
double hz{}; // defaults to 0.0
|
||||
//? Try to get freq from /sys/devices/system/cpu/cpufreq/policy first (faster)
|
||||
if (not freq_path.empty()) {
|
||||
hz = stod(readfile(freq_path, "0.0")) / 1000;
|
||||
|
@ -440,8 +440,8 @@ namespace Cpu {
|
|||
}
|
||||
}
|
||||
|
||||
if (hz <= 1 or hz >= 1000000)
|
||||
throw std::runtime_error("Failed to read /sys/devices/system/cpu/cpufreq/policy and /proc/cpuinfo.");
|
||||
if (hz <= 1 or hz >= 1000000)
|
||||
throw std::runtime_error("Failed to read /sys/devices/system/cpu/cpufreq/policy and /proc/cpuinfo.");
|
||||
|
||||
if (hz >= 1000) {
|
||||
if (hz >= 10000) cpuhz = to_string((int)round(hz / 1000)); // Future proof until we reach THz speeds :)
|
||||
|
@ -471,9 +471,9 @@ namespace Cpu {
|
|||
//? Try to get core mapping from /proc/cpuinfo
|
||||
ifstream cpuinfo(Shared::procPath / "cpuinfo");
|
||||
if (cpuinfo.good()) {
|
||||
int cpu{}; // defaults to 0
|
||||
int core{}; // defaults to 0
|
||||
int n{}; // defaults to 0
|
||||
int cpu{}; // defaults to 0
|
||||
int core{}; // defaults to 0
|
||||
int n{}; // defaults to 0
|
||||
for (string instr; cpuinfo >> instr;) {
|
||||
if (instr == "processor") {
|
||||
cpuinfo.ignore(SSmax, ':');
|
||||
|
@ -666,7 +666,7 @@ namespace Cpu {
|
|||
return {percent, seconds, status};
|
||||
}
|
||||
|
||||
auto collect(bool no_update) -> cpu_info& {
|
||||
auto collect(bool no_update) -> cpu_info& {
|
||||
if (Runner::stopping or (no_update and not current_cpu.cpu_percent.at("total").empty())) return current_cpu;
|
||||
auto& cpu = current_cpu;
|
||||
|
||||
|
@ -808,10 +808,10 @@ namespace Cpu {
|
|||
}
|
||||
|
||||
namespace Mem {
|
||||
bool has_swap{}; // defaults to false
|
||||
bool has_swap{}; // defaults to false
|
||||
vector<string> fstab;
|
||||
fs::file_time_type fstab_time;
|
||||
int disk_ios{}; // defaults to 0
|
||||
int disk_ios{}; // defaults to 0
|
||||
vector<string> last_found;
|
||||
|
||||
//?* Find the filepath to the specified ZFS object's stat file
|
||||
|
@ -836,12 +836,12 @@ namespace Mem {
|
|||
return totalMem;
|
||||
}
|
||||
|
||||
auto collect(bool no_update) -> mem_info& {
|
||||
auto collect(bool no_update) -> mem_info& {
|
||||
if (Runner::stopping or (no_update and not current_mem.percent.at("used").empty())) return current_mem;
|
||||
auto show_swap = Config::getB("show_swap");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto zfs_arc_cached = Config::getB("zfs_arc_cached");
|
||||
auto show_swap = Config::getB("show_swap");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto zfs_arc_cached = Config::getB("zfs_arc_cached");
|
||||
auto totalMem = get_totalMem();
|
||||
auto& mem = current_mem;
|
||||
|
||||
|
@ -935,9 +935,9 @@ namespace Mem {
|
|||
try {
|
||||
auto& disks_filter = Config::getS("disks_filter");
|
||||
bool filter_exclude = false;
|
||||
auto use_fstab = Config::getB("use_fstab");
|
||||
auto only_physical = Config::getB("only_physical");
|
||||
auto zfs_hide_datasets = Config::getB("zfs_hide_datasets");
|
||||
auto use_fstab = Config::getB("use_fstab");
|
||||
auto only_physical = Config::getB("only_physical");
|
||||
auto zfs_hide_datasets = Config::getB("zfs_hide_datasets");
|
||||
auto& disks = mem.disks;
|
||||
ifstream diskread;
|
||||
|
||||
|
@ -1208,14 +1208,14 @@ namespace Mem {
|
|||
while (cmp_greater(disk.io_activity.size(), width * 2)) disk.io_activity.pop_front();
|
||||
}
|
||||
} else {
|
||||
Logger::debug("Error in Mem::collect() : when opening " + string{disk.stat});
|
||||
Logger::debug("Error in Mem::collect() : when opening " + string{disk.stat});
|
||||
}
|
||||
diskread.close();
|
||||
}
|
||||
old_uptime = uptime;
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
Logger::warning("Error in Mem::collect() : " + string{e.what()});
|
||||
Logger::warning("Error in Mem::collect() : " + string{e.what()});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1276,13 +1276,13 @@ namespace Mem {
|
|||
bool zfs_collect_pool_total_stats(struct disk_info &disk) {
|
||||
ifstream diskread;
|
||||
|
||||
int64_t bytes_read;
|
||||
int64_t bytes_write;
|
||||
int64_t io_ticks;
|
||||
int64_t bytes_read_total{}; // defaults to 0
|
||||
int64_t bytes_write_total{}; // defaults to 0
|
||||
int64_t io_ticks_total{}; // defaults to 0
|
||||
int64_t objects_read{}; // defaults to 0
|
||||
int64_t bytes_read;
|
||||
int64_t bytes_write;
|
||||
int64_t io_ticks;
|
||||
int64_t bytes_read_total{}; // defaults to 0
|
||||
int64_t bytes_write_total{}; // defaults to 0
|
||||
int64_t io_ticks_total{}; // defaults to 0
|
||||
int64_t objects_read{}; // defaults to 0
|
||||
|
||||
// looking through all files that start with 'objset'
|
||||
for (const auto& file: fs::directory_iterator(disk.stat)) {
|
||||
|
@ -1358,11 +1358,11 @@ namespace Net {
|
|||
net_info empty_net = {};
|
||||
vector<string> interfaces;
|
||||
string selected_iface;
|
||||
int errors{}; // defaults to 0
|
||||
int errors{}; // defaults to 0
|
||||
unordered_flat_map<string, uint64_t> graph_max = { {"download", {}}, {"upload", {}} };
|
||||
unordered_flat_map<string, array<int, 2>> max_count = { {"download", {}}, {"upload", {}} };
|
||||
bool rescale{true};
|
||||
uint64_t timestamp{}; // defaults to 0
|
||||
bool rescale{true};
|
||||
uint64_t timestamp{}; // defaults to 0
|
||||
|
||||
//* RAII wrapper for getifaddrs
|
||||
class getifaddr_wrapper {
|
||||
|
@ -1374,12 +1374,12 @@ namespace Net {
|
|||
auto operator()() -> struct ifaddrs* { return ifaddr; }
|
||||
};
|
||||
|
||||
auto collect(bool no_update) -> net_info& {
|
||||
auto collect(bool no_update) -> net_info& {
|
||||
if (Runner::stopping) return empty_net;
|
||||
auto& net = current_net;
|
||||
auto& config_iface = Config::getS("net_iface");
|
||||
auto net_sync = Config::getB("net_sync");
|
||||
auto net_auto = Config::getB("net_auto");
|
||||
auto net_sync = Config::getB("net_sync");
|
||||
auto net_auto = Config::getB("net_auto");
|
||||
auto new_timestamp = time_ms();
|
||||
|
||||
if (not no_update and errors < 3) {
|
||||
|
@ -1451,7 +1451,7 @@ namespace Net {
|
|||
auto& saved_stat = net.at(iface).stat.at(dir);
|
||||
auto& bandwidth = net.at(iface).bandwidth.at(dir);
|
||||
|
||||
uint64_t val{}; // defaults to 0
|
||||
uint64_t val{}; // defaults to 0
|
||||
try { val = (uint64_t)stoull(readfile(sys_file, "0")); }
|
||||
catch (const std::invalid_argument&) {}
|
||||
catch (const std::out_of_range&) {}
|
||||
|
@ -1572,15 +1572,15 @@ namespace Proc {
|
|||
unordered_flat_map<string, string> uid_user;
|
||||
string current_sort;
|
||||
string current_filter;
|
||||
bool current_rev{}; // defaults to false
|
||||
bool current_rev{}; // defaults to false
|
||||
|
||||
fs::file_time_type passwd_time;
|
||||
|
||||
uint64_t cputimes;
|
||||
int collapse = -1, expand = -1;
|
||||
uint64_t old_cputimes{}; // defaults to 0
|
||||
atomic<int> numpids{}; // defaults to 0
|
||||
int filter_found{}; // defaults to 0
|
||||
uint64_t old_cputimes{}; // defaults to 0
|
||||
atomic<int> numpids{}; // defaults to 0
|
||||
int filter_found{}; // defaults to 0
|
||||
|
||||
detail_container detailed;
|
||||
constexpr size_t KTHREADD = 2;
|
||||
|
@ -1684,19 +1684,19 @@ namespace Proc {
|
|||
}
|
||||
|
||||
//* Collects and sorts process information from /proc
|
||||
auto collect(bool no_update) -> vector<proc_info>& {
|
||||
auto collect(bool no_update) -> vector<proc_info>& {
|
||||
if (Runner::stopping) return current_procs;
|
||||
const auto& sorting = Config::getS("proc_sorting");
|
||||
auto reverse = Config::getB("proc_reversed");
|
||||
auto reverse = Config::getB("proc_reversed");
|
||||
const auto& filter = Config::getS("proc_filter");
|
||||
auto per_core = Config::getB("proc_per_core");
|
||||
auto should_filter_kernel = Config::getB("proc_filter_kernel");
|
||||
auto tree = Config::getB("proc_tree");
|
||||
auto show_detailed = Config::getB("show_detailed");
|
||||
auto per_core = Config::getB("proc_per_core");
|
||||
auto should_filter_kernel = Config::getB("proc_filter_kernel");
|
||||
auto tree = Config::getB("proc_tree");
|
||||
auto show_detailed = Config::getB("show_detailed");
|
||||
const size_t detailed_pid = Config::getI("detailed_pid");
|
||||
bool should_filter = current_filter != filter;
|
||||
if (should_filter) current_filter = filter;
|
||||
bool sorted_change = (sorting != current_sort or reverse != current_rev or should_filter);
|
||||
bool sorted_change = (sorting != current_sort or reverse != current_rev or should_filter);
|
||||
if (sorted_change) {
|
||||
current_sort = sorting;
|
||||
current_rev = reverse;
|
||||
|
@ -1712,7 +1712,7 @@ namespace Proc {
|
|||
const int cmult = (per_core) ? Shared::coreCount : 1;
|
||||
bool got_detailed = false;
|
||||
|
||||
static size_t proc_clear_count{}; // defaults to 0
|
||||
static size_t proc_clear_count{}; // defaults to 0
|
||||
|
||||
//* Use pids from last update if only changing filter, sorting or tree options
|
||||
if (no_update and not current_procs.empty()) {
|
||||
|
@ -1787,7 +1787,7 @@ namespace Proc {
|
|||
|
||||
//? Check if pid already exists in current_procs
|
||||
auto find_old = rng::find(current_procs, pid, &proc_info::pid);
|
||||
bool no_cache{}; // defaults to false
|
||||
bool no_cache{}; // defaults to false
|
||||
if (find_old == current_procs.end()) {
|
||||
current_procs.push_back({pid});
|
||||
find_old = current_procs.end() - 1;
|
||||
|
@ -2070,6 +2070,6 @@ namespace Tools {
|
|||
catch (const std::invalid_argument&) {}
|
||||
catch (const std::out_of_range&) {}
|
||||
}
|
||||
throw std::runtime_error("Failed get uptime from from " + string{Shared::procPath} + "/uptime");
|
||||
throw std::runtime_error("Failed get uptime from from " + string{Shared::procPath} + "/uptime");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -194,12 +194,12 @@ namespace Cpu {
|
|||
const array<string, 10> time_names = {"user", "nice", "system", "idle"};
|
||||
|
||||
unordered_flat_map<string, long long> cpu_old = {
|
||||
{"totals", 0},
|
||||
{"idles", 0},
|
||||
{"user", 0},
|
||||
{"nice", 0},
|
||||
{"system", 0},
|
||||
{"idle", 0}
|
||||
{"totals", 0},
|
||||
{"idles", 0},
|
||||
{"user", 0},
|
||||
{"nice", 0},
|
||||
{"system", 0},
|
||||
{"idle", 0}
|
||||
};
|
||||
|
||||
string get_cpuName() {
|
||||
|
@ -443,7 +443,7 @@ namespace Cpu {
|
|||
return {percent, seconds, status};
|
||||
}
|
||||
|
||||
auto collect(bool no_update) -> cpu_info & {
|
||||
auto collect(bool no_update) -> cpu_info & {
|
||||
if (Runner::stopping or (no_update and not current_cpu.cpu_percent.at("total").empty()))
|
||||
return current_cpu;
|
||||
auto &cpu = current_cpu;
|
||||
|
@ -604,7 +604,7 @@ namespace Mem {
|
|||
}
|
||||
/* Get the list of all drive objects. */
|
||||
if (IOServiceGetMatchingServices(libtop_master_port,
|
||||
IOServiceMatching("IOMediaBSDClient"), &drive_list)) {
|
||||
IOServiceMatching("IOMediaBSDClient"), &drive_list)) {
|
||||
Logger::error("Error in IOServiceGetMatchingServices()");
|
||||
return;
|
||||
}
|
||||
|
@ -664,15 +664,15 @@ namespace Mem {
|
|||
}
|
||||
}
|
||||
|
||||
auto collect(bool no_update) -> mem_info & {
|
||||
auto collect(bool no_update) -> mem_info & {
|
||||
if (Runner::stopping or (no_update and not current_mem.percent.at("used").empty()))
|
||||
return current_mem;
|
||||
|
||||
auto show_swap = Config::getB("show_swap");
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto show_swap = Config::getB("show_swap");
|
||||
auto show_disks = Config::getB("show_disks");
|
||||
auto swap_disk = Config::getB("swap_disk");
|
||||
auto &mem = current_mem;
|
||||
static bool snapped = (getenv("BTOP_SNAPPED") != NULL);
|
||||
static bool snapped = (getenv("BTOP_SNAPPED") != NULL);
|
||||
|
||||
vm_statistics64 p;
|
||||
mach_msg_type_number_t info_size = HOST_VM_INFO64_COUNT;
|
||||
|
@ -714,7 +714,7 @@ namespace Mem {
|
|||
double uptime = system_uptime();
|
||||
auto &disks_filter = Config::getS("disks_filter");
|
||||
bool filter_exclude = false;
|
||||
// auto only_physical = Config::getB("only_physical");
|
||||
// auto only_physical = Config::getB("only_physical");
|
||||
auto &disks = mem.disks;
|
||||
vector<string> filter;
|
||||
if (not disks_filter.empty()) {
|
||||
|
@ -844,11 +844,11 @@ namespace Net {
|
|||
auto operator()() -> struct ifaddrs * { return ifaddr; }
|
||||
};
|
||||
|
||||
auto collect(bool no_update) -> net_info & {
|
||||
auto collect(bool no_update) -> net_info & {
|
||||
auto &net = current_net;
|
||||
auto &config_iface = Config::getS("net_iface");
|
||||
auto net_sync = Config::getB("net_sync");
|
||||
auto net_auto = Config::getB("net_auto");
|
||||
auto net_sync = Config::getB("net_sync");
|
||||
auto net_auto = Config::getB("net_auto");
|
||||
auto new_timestamp = time_ms();
|
||||
|
||||
if (not no_update and errors < 3) {
|
||||
|
@ -1001,7 +1001,7 @@ namespace Net {
|
|||
auto sorted_interfaces = interfaces;
|
||||
rng::sort(sorted_interfaces, [&](const auto &a, const auto &b) {
|
||||
return cmp_greater(net.at(a).stat["download"].total + net.at(a).stat["upload"].total,
|
||||
net.at(b).stat["download"].total + net.at(b).stat["upload"].total);
|
||||
net.at(b).stat["download"].total + net.at(b).stat["upload"].total);
|
||||
});
|
||||
selected_iface.clear();
|
||||
//? Try to set to a connected interface
|
||||
|
@ -1024,8 +1024,8 @@ namespace Net {
|
|||
for (const auto &sel : {0, 1}) {
|
||||
if (rescale or max_count[dir][sel] >= 5) {
|
||||
const long long avg_speed = (net[selected_iface].bandwidth[dir].size() > 5
|
||||
? std::accumulate(net.at(selected_iface).bandwidth.at(dir).rbegin(), net.at(selected_iface).bandwidth.at(dir).rbegin() + 5, 0ll) / 5
|
||||
: net[selected_iface].stat[dir].speed);
|
||||
? std::accumulate(net.at(selected_iface).bandwidth.at(dir).rbegin(), net.at(selected_iface).bandwidth.at(dir).rbegin() + 5, 0ll) / 5
|
||||
: net[selected_iface].stat[dir].speed);
|
||||
graph_max[dir] = max(uint64_t(avg_speed * (sel == 0 ? 1.3 : 3.0)), (uint64_t)10 << 10);
|
||||
max_count[dir][0] = max_count[dir][1] = 0;
|
||||
redraw = true;
|
||||
|
@ -1126,17 +1126,17 @@ namespace Proc {
|
|||
}
|
||||
|
||||
//* Collects and sorts process information from /proc
|
||||
auto collect(bool no_update) -> vector<proc_info> & {
|
||||
auto collect(bool no_update) -> vector<proc_info> & {
|
||||
const auto &sorting = Config::getS("proc_sorting");
|
||||
auto reverse = Config::getB("proc_reversed");
|
||||
auto reverse = Config::getB("proc_reversed");
|
||||
const auto &filter = Config::getS("proc_filter");
|
||||
auto per_core = Config::getB("proc_per_core");
|
||||
auto tree = Config::getB("proc_tree");
|
||||
auto show_detailed = Config::getB("show_detailed");
|
||||
auto per_core = Config::getB("proc_per_core");
|
||||
auto tree = Config::getB("proc_tree");
|
||||
auto show_detailed = Config::getB("show_detailed");
|
||||
const size_t detailed_pid = Config::getI("detailed_pid");
|
||||
bool should_filter = current_filter != filter;
|
||||
if (should_filter) current_filter = filter;
|
||||
bool sorted_change = (sorting != current_sort or reverse != current_rev or should_filter);
|
||||
bool sorted_change = (sorting != current_sort or reverse != current_rev or should_filter);
|
||||
if (sorted_change) {
|
||||
current_sort = sorting;
|
||||
current_rev = reverse;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -74,8 +74,8 @@ double getValue(IOHIDServiceClientRef sc) {
|
|||
|
||||
long long Cpu::ThermalSensors::getSensors() {
|
||||
CFDictionaryRef thermalSensors = matching(0xff00, 5); // 65280_10 = FF00_16
|
||||
// thermalSensors's PrimaryUsagePage should be 0xff00 for M1 chip, instead of 0xff05
|
||||
// can be checked by ioreg -lfx
|
||||
// thermalSensors's PrimaryUsagePage should be 0xff00 for M1 chip, instead of 0xff05
|
||||
// can be checked by ioreg -lfx
|
||||
IOHIDEventSystemClientRef system = IOHIDEventSystemClientCreate(kCFAllocatorDefault);
|
||||
IOHIDEventSystemClientSetMatching(system, thermalSensors);
|
||||
CFArrayRef matchingsrvs = IOHIDEventSystemClientCopyServices(system);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -35,10 +35,10 @@ static UInt32 _strtoul(char *str, int size, int base) {
|
|||
static void _ultostr(char *str, UInt32 val) {
|
||||
str[0] = '\0';
|
||||
sprintf(str, "%c%c%c%c",
|
||||
(unsigned int)val >> 24,
|
||||
(unsigned int)val >> 16,
|
||||
(unsigned int)val >> 8,
|
||||
(unsigned int)val);
|
||||
(unsigned int)val >> 24,
|
||||
(unsigned int)val >> 16,
|
||||
(unsigned int)val >> 8,
|
||||
(unsigned int)val);
|
||||
}
|
||||
|
||||
namespace Cpu {
|
||||
|
@ -65,7 +65,7 @@ namespace Cpu {
|
|||
}
|
||||
}
|
||||
SMCConnection::~SMCConnection() {
|
||||
IOServiceClose(conn);
|
||||
IOServiceClose(conn);
|
||||
}
|
||||
|
||||
long long SMCConnection::getSMCTemp(char *key) {
|
||||
|
@ -132,7 +132,7 @@ namespace Cpu {
|
|||
|
||||
return kIOReturnSuccess;
|
||||
}
|
||||
|
||||
|
||||
kern_return_t SMCConnection::SMCCall(int index, SMCKeyData_t *inputStructure, SMCKeyData_t *outputStructure) {
|
||||
size_t structureInputSize;
|
||||
size_t structureOutputSize;
|
||||
|
@ -141,10 +141,10 @@ namespace Cpu {
|
|||
structureOutputSize = sizeof(SMCKeyData_t);
|
||||
|
||||
return IOConnectCallStructMethod(conn, index,
|
||||
// inputStructure
|
||||
inputStructure, structureInputSize,
|
||||
// ouputStructure
|
||||
outputStructure, &structureOutputSize);
|
||||
// inputStructure
|
||||
inputStructure, structureInputSize,
|
||||
// ouputStructure
|
||||
outputStructure, &structureOutputSize);
|
||||
}
|
||||
|
||||
} // namespace Cpu
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -104,7 +104,7 @@ namespace Cpu {
|
|||
long long getTemp(int core);
|
||||
|
||||
private:
|
||||
kern_return_t SMCReadKey(UInt32Char_t key, SMCVal_t *val);
|
||||
kern_return_t SMCReadKey(UInt32Char_t key, SMCVal_t *val);
|
||||
long long getSMCTemp(char *key);
|
||||
kern_return_t SMCCall(int index, SMCKeyData_t *inputStructure, SMCKeyData_t *outputStructure);
|
||||
|
||||
|
|
Loading…
Reference in a new issue