mirror of
https://github.com/aristocratos/btop.git
synced 2024-09-29 08:41:19 +13:00
Proc::draw gradients
This commit is contained in:
parent
1ff9e218d3
commit
e3b297e82a
7 changed files with 75 additions and 47 deletions
2
Makefile
2
Makefile
|
@ -87,4 +87,4 @@ $(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SRCEXT)
|
||||||
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
|
||||||
|
|
||||||
#Non-File Targets
|
#Non-File Targets
|
||||||
.PHONY: all clean dist-clean uninstall
|
.PHONY: all
|
||||||
|
|
|
@ -347,7 +347,7 @@ int main(int argc, char **argv){
|
||||||
Global::debuginit = true;
|
Global::debuginit = true;
|
||||||
|
|
||||||
Draw::calcSizes();
|
Draw::calcSizes();
|
||||||
// cout << Cpu::box << Mem::box << Net::box << Proc::box << flush;
|
cout << Cpu::box << Mem::box << Net::box << Proc::box << flush;
|
||||||
|
|
||||||
// cout << Theme("main_bg") << Term::clear << flush;
|
// cout << Theme("main_bg") << Term::clear << flush;
|
||||||
// bool thread_test = false;
|
// bool thread_test = false;
|
||||||
|
|
|
@ -175,7 +175,8 @@ namespace Config {
|
||||||
{"net_upload", "10M"},
|
{"net_upload", "10M"},
|
||||||
{"net_iface", ""},
|
{"net_iface", ""},
|
||||||
{"log_level", "WARNING"},
|
{"log_level", "WARNING"},
|
||||||
{"proc_filter", ""}
|
{"proc_filter", ""},
|
||||||
|
{"proc_command", ""},
|
||||||
};
|
};
|
||||||
unordered_flat_map<string, string> stringsTmp;
|
unordered_flat_map<string, string> stringsTmp;
|
||||||
|
|
||||||
|
|
|
@ -267,7 +267,6 @@ namespace Draw {
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Cpu {
|
namespace Cpu {
|
||||||
|
|
||||||
int width_p = 100, height_p = 32;
|
int width_p = 100, height_p = 32;
|
||||||
int min_w = 60, min_h = 8;
|
int min_w = 60, min_h = 8;
|
||||||
int x = 1, y = 1, width, height;
|
int x = 1, y = 1, width, height;
|
||||||
|
@ -279,7 +278,6 @@ namespace Cpu {
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Mem {
|
namespace Mem {
|
||||||
|
|
||||||
int width_p = 45, height_p = 38;
|
int width_p = 45, height_p = 38;
|
||||||
int min_w = 36, min_h = 10;
|
int min_w = 36, min_h = 10;
|
||||||
int x = 1, y, width, height;
|
int x = 1, y, width, height;
|
||||||
|
@ -290,7 +288,6 @@ namespace Mem {
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Net {
|
namespace Net {
|
||||||
|
|
||||||
int width_p = 45, height_p = 30;
|
int width_p = 45, height_p = 30;
|
||||||
int min_w = 3, min_h = 6;
|
int min_w = 3, min_h = 6;
|
||||||
int x = 1, y, width, height;
|
int x = 1, y, width, height;
|
||||||
|
@ -302,70 +299,105 @@ namespace Net {
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Proc {
|
namespace Proc {
|
||||||
|
|
||||||
int width_p = 55, height_p = 68;
|
int width_p = 55, height_p = 68;
|
||||||
int min_w = 44, min_h = 16;
|
int min_w = 44, min_h = 16;
|
||||||
int x, y, width, height;
|
int x, y, width, height;
|
||||||
int current_y, current_h, select_max;
|
int select_max;
|
||||||
bool shown = true, redraw = true;
|
bool shown = true, redraw = true;
|
||||||
|
|
||||||
string box;
|
string box;
|
||||||
vector<string> greyscale;
|
|
||||||
vector<string> colorfade;
|
|
||||||
|
|
||||||
string draw(vector<proc_info> plist){
|
string draw(vector<proc_info> plist){
|
||||||
auto& filter = Config::getS("proc_filter");
|
auto& filter = Config::getS("proc_filter");
|
||||||
auto& filtering = Config::getB("proc_filtering");
|
auto& filtering = Config::getB("proc_filtering");
|
||||||
auto& proc_tree = Config::getB("proc_tree");
|
auto& proc_tree = Config::getB("proc_tree");
|
||||||
|
bool show_detailed = (Config::getB("show_detailed") and Proc::detailed.last_pid == (size_t)Config::getI("detailed_pid") );
|
||||||
bool proc_gradient = (Config::getB("proc_gradient") and not Config::getB("tty_mode"));
|
bool proc_gradient = (Config::getB("proc_gradient") and not Config::getB("tty_mode"));
|
||||||
|
auto& proc_colors = Config::getB("proc_colors");
|
||||||
|
uint64_t total_mem = 16328872 << 10;
|
||||||
|
int y = show_detailed ? Proc::y + 9 : Proc::y;
|
||||||
|
int height = show_detailed ? Proc::height - 9 : Proc::height;
|
||||||
string out;
|
string out;
|
||||||
|
//* If true, redraw elements not needed to be updated every cycle
|
||||||
if (redraw) {
|
if (redraw) {
|
||||||
redraw = false;
|
redraw = false;
|
||||||
out = box;
|
out = box;
|
||||||
greyscale.clear();
|
select_max = height - 3;
|
||||||
for (int xc = 0; size_t i : iota(0, height - 3)){
|
|
||||||
xc = 230 - i * 150 / (Term::height - 20);
|
|
||||||
greyscale.push_back(Theme::dec_to_color(xc, xc, xc));
|
|
||||||
}
|
|
||||||
out += Mv::to(y, x) + Mv::r(12)
|
out += Mv::to(y, x) + Mv::r(12)
|
||||||
+ trans("Filter: " + filter + (filtering ? Fx::bl + "█" + Fx::reset : " "))
|
+ trans("Filter: " + filter + (filtering ? Fx::bl + "█" + Fx::reset : " "))
|
||||||
+ trans(rjust("Per core: " + (Config::getB("proc_per_core") ? "On "s : "Off"s) + " Sorting: "
|
+ trans(rjust("Per core: " + (Config::getB("proc_per_core") ? "On "s : "Off"s) + " Sorting: "
|
||||||
+ string(Config::getS("proc_sorting")), width - 23 - ulen(filter)));
|
+ string(Config::getS("proc_sorting")), width - 23 - ulen(filter)));
|
||||||
|
|
||||||
|
if (not proc_tree)
|
||||||
|
out += Mv::to(y+1, x+1) + Theme::c("title") + Fx::b + rjust("Pid:", 8) + " " + ljust("Program:", 16) + " "
|
||||||
|
+ ljust("Command:", width - 70) + " Threads: " + ljust("User:", 10) + " " + rjust("MemB", 5)
|
||||||
|
+ " " + rjust("Cpu%", 14) + Fx::ub;
|
||||||
|
else
|
||||||
|
out += Mv::to(y+1, x+1) + Theme::c("title") + Fx::b + ljust("Tree:", width - 44)
|
||||||
|
+ " Threads: " + ljust("User:", 10) + " " + rjust("MemB", 5)
|
||||||
|
+ " " + rjust("Cpu%", 14) + Fx::ub;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (not proc_tree)
|
//* Iteration over processes
|
||||||
out += Mv::to(y+1, x+1) + Theme::c("title") + Fx::b + rjust("Pid:", 8) + " " + ljust("Program:", 16) + " "
|
|
||||||
+ ljust("Command:", width - 70) + " Threads: " + ljust("User:", 10) + " " + rjust("MemB", 5)
|
|
||||||
+ " " + rjust("Cpu%", 14) + Fx::ub;
|
|
||||||
else
|
|
||||||
out += Mv::to(y+1, x+1) + Theme::c("title") + Fx::b + rjust("Pid:", 8) + " " + ljust("Program:", 16) + " "
|
|
||||||
+ ljust("Command:", width - 70) + " Threads: " + ljust("User:", 10) + " " + rjust("MemB", 5)
|
|
||||||
+ " " + rjust("Cpu%", 14) + Fx::ub;
|
|
||||||
|
|
||||||
int lc = 0;
|
int lc = 0;
|
||||||
for (auto& p : plist){
|
for (auto& p : plist){
|
||||||
if (not proc_tree) {
|
//? Set correct gradient colors if enabled
|
||||||
out += Mv::to(y+2+lc, x+1) + (proc_gradient ? greyscale[lc] : "") + rjust(to_string(p.pid), 8) + " " + ljust(p.name, 16) + " "
|
string c_color, m_color, t_color, g_color;
|
||||||
+ ljust(p.cmd, width - 67, true) + " " + rjust(to_string(p.threads), 5) + " " + ljust(p.user, 10) + " "
|
string end = proc_colors ? Theme::c("main_fg") + Fx::ub : Fx::ub;
|
||||||
+ rjust(floating_humanizer(p.mem, true), 5) + string(11, ' ')
|
if (proc_colors) { //! and not is_selected
|
||||||
+ (p.cpu_p < 10 or p.cpu_p >= 100 ? rjust(to_string(p.cpu_p), 3) + " " : rjust(to_string(p.cpu_p), 4));
|
array<string, 3> colors;
|
||||||
|
for (int i = 0; int v : {(int)round(p.cpu_p), (int)round(p.mem * 100 / total_mem), (int)p.threads / 3}) {
|
||||||
|
if (proc_gradient) {
|
||||||
|
int val = (min(v, 100) + 100) - lc * 100 / select_max;
|
||||||
|
if (val < 100) colors[i++] = Theme::g("proc_color")[val];
|
||||||
|
else colors[i++] = Theme::g("process")[val - 100];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
colors[i++] = Theme::g("process")[min(v, 100)];
|
||||||
|
}
|
||||||
|
c_color = colors[0]; m_color = colors[1]; t_color = colors[2];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
c_color = m_color = t_color = Fx::b;
|
||||||
|
if (proc_gradient) { //! and not is_selected
|
||||||
|
g_color = Theme::g("proc")[lc * 100 / select_max];
|
||||||
|
}
|
||||||
|
|
||||||
|
string cpu_str = to_string(p.cpu_p);
|
||||||
|
if (p.cpu_p < 10 or p.cpu_p >= 100) cpu_str.resize(3);
|
||||||
|
|
||||||
|
//? Normal view line
|
||||||
|
if (not proc_tree) {
|
||||||
|
out += Mv::to(y+2+lc, x+1)
|
||||||
|
+ g_color + rjust(to_string(p.pid), 8) + " "
|
||||||
|
+ c_color + ljust(p.name, 16) + end + " "
|
||||||
|
+ g_color + ljust(p.cmd, width - 67, true) + " ";
|
||||||
|
}
|
||||||
|
//? Tree view line
|
||||||
else {
|
else {
|
||||||
|
//? Add process executable name if not same as /proc/comm
|
||||||
string cmd_cond;
|
string cmd_cond;
|
||||||
if (not p.cmd.empty()) {
|
if (not p.cmd.empty()) {
|
||||||
cmd_cond = p.cmd.substr(0, min(p.cmd.find(' '), p.cmd.size()));
|
cmd_cond = p.cmd.substr(0, min(p.cmd.find(' '), p.cmd.size()));
|
||||||
cmd_cond = cmd_cond.substr(min(cmd_cond.find_last_of('/') + 1, cmd_cond.size()));
|
cmd_cond = cmd_cond.substr(min(cmd_cond.find_last_of('/') + 1, cmd_cond.size()));
|
||||||
}
|
}
|
||||||
out += Mv::to(y+2+lc, x+1) + (proc_gradient ? greyscale[lc] : "") + ljust(p.prefix + to_string(p.pid) + " " + p.name + " "
|
string pid_str = to_string(p.pid);
|
||||||
+ (not cmd_cond.empty() and cmd_cond != p.name ? "(" + cmd_cond + ")" : ""), width - 41, true) + " "
|
int size_justify = ulen(p.prefix) + pid_str.size() + p.name.size() + 43;
|
||||||
+ rjust(to_string(p.threads), 5) + " " + ljust(p.user, 10) + " " + rjust(floating_humanizer(p.mem, true), 5) + string(11, ' ')
|
out += Mv::to(y+2+lc, x+1)
|
||||||
+ (p.cpu_p < 10 or p.cpu_p >= 100 ? rjust(to_string(p.cpu_p), 3) + " " : rjust(to_string(p.cpu_p), 4));
|
+ g_color + p.prefix + pid_str + " "
|
||||||
|
+ c_color + p.name + end + " "
|
||||||
|
+ g_color + ljust((not cmd_cond.empty() and cmd_cond != p.name ? "(" + cmd_cond + ")" : ""), width - size_justify, true) + " ";
|
||||||
}
|
}
|
||||||
|
//? Common end of line
|
||||||
|
out += t_color + rjust(to_string(p.threads), 5) + end + " "
|
||||||
|
+ g_color + ljust(p.user, 10) + " "
|
||||||
|
+ m_color + rjust(floating_humanizer(p.mem, true), 5) + string(11, ' ') + end
|
||||||
|
+ c_color + rjust(cpu_str, 4) + end;
|
||||||
if (lc++ > height - 5) break;
|
if (lc++ > height - 5) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (lc++ < height - 4) out += Mv::to(y+lc+2, x+1) + string(width - 3, ' ');
|
while (lc++ < height - 4) out += Mv::to(y+lc+2, x+1) + string(width - 3, ' ');
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,11 +466,6 @@ namespace Draw {
|
||||||
auto& swap_disk = Config::getB("swap_disk");
|
auto& swap_disk = Config::getB("swap_disk");
|
||||||
auto& mem_graphs = Config::getB("mem_graphs");
|
auto& mem_graphs = Config::getB("mem_graphs");
|
||||||
|
|
||||||
// int hp;
|
|
||||||
// if (not Cpu::shown) hp = Net::shown ? 60 : 98;
|
|
||||||
// else if (not Net::shown) hp = 98 - Cpu::height_p;
|
|
||||||
// else hp = height_p;
|
|
||||||
|
|
||||||
width = round(Term::width * (Proc::shown ? width_p : 100) / 100);
|
width = round(Term::width * (Proc::shown ? width_p : 100) / 100);
|
||||||
height = round(Term::height * (100 - Cpu::height_p * Cpu::shown - Net::height_p * Net::shown) / 100) + 1;
|
height = round(Term::height * (100 - Cpu::height_p * Cpu::shown - Net::height_p * Net::shown) / 100) + 1;
|
||||||
if (height + Cpu::height > Term::height) height = Term::height - Cpu::height;
|
if (height + Cpu::height > Term::height) height = Term::height - Cpu::height;
|
||||||
|
@ -510,9 +537,6 @@ namespace Draw {
|
||||||
height = Term::height - Cpu::height;
|
height = Term::height - Cpu::height;
|
||||||
x = Term::width - width + 1;
|
x = Term::width - width + 1;
|
||||||
y = Cpu::height + 1;
|
y = Cpu::height + 1;
|
||||||
current_y = y;
|
|
||||||
current_h = height;
|
|
||||||
select_max = height - 3;
|
|
||||||
|
|
||||||
box = createBox(x, y, width, height, Theme::c("proc_box"), true, "proc", "", 4);
|
box = createBox(x, y, width, height, Theme::c("proc_box"), true, "proc", "", 4);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,9 @@ tab-size = 4
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <robin_hood.h>
|
#include <robin_hood.h>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
using std::string, std::vector, robin_hood::unordered_flat_map, std::deque;
|
using std::string, std::vector, robin_hood::unordered_flat_map, std::deque, std::atomic;
|
||||||
|
|
||||||
namespace Symbols {
|
namespace Symbols {
|
||||||
extern const string h_line;
|
extern const string h_line;
|
||||||
|
@ -87,21 +88,19 @@ namespace Draw {
|
||||||
namespace Cpu {
|
namespace Cpu {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Mem {
|
namespace Mem {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Net {
|
namespace Net {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Proc {
|
namespace Proc {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -205,7 +205,7 @@ namespace Proc {
|
||||||
|
|
||||||
//? Update cpu percent deque for process cpu graph
|
//? Update cpu percent deque for process cpu graph
|
||||||
detailed.cpu_percent.push_back(round(detailed.entry.cpu_c));
|
detailed.cpu_percent.push_back(round(detailed.entry.cpu_c));
|
||||||
while (detailed.cpu_percent.size() > Term::width) detailed.cpu_percent.pop_front();
|
while (detailed.cpu_percent.size() > (size_t)Term::width) detailed.cpu_percent.pop_front();
|
||||||
|
|
||||||
//? Process runtime
|
//? Process runtime
|
||||||
detailed.elapsed = sec_to_dhms(uptime - (cache.at(pid).cpu_s / Shared::clk_tck));
|
detailed.elapsed = sec_to_dhms(uptime - (cache.at(pid).cpu_s / Shared::clk_tck));
|
||||||
|
|
|
@ -265,6 +265,10 @@ namespace Theme {
|
||||||
gradients.clear();
|
gradients.clear();
|
||||||
array<string, 101> c_gradient;
|
array<string, 101> c_gradient;
|
||||||
bool t_to_256 = Config::getB("lowcolor");
|
bool t_to_256 = Config::getB("lowcolor");
|
||||||
|
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 (auto& [name, source_arr] : rgbs) {
|
for (auto& [name, source_arr] : rgbs) {
|
||||||
if (not name.ends_with("_start")) continue;
|
if (not name.ends_with("_start")) continue;
|
||||||
array<array<int, 3>, 101> dec_arr;
|
array<array<int, 3>, 101> dec_arr;
|
||||||
|
|
Loading…
Reference in a new issue