mirror of
https://github.com/aristocratos/btop.git
synced 2024-09-29 22:51:35 +02:00
19bcff894b
commit0267eba2bb
Merge:50bbab0
e81cf2b
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Wed Nov 15 21:43:18 2023 +0100 Merge pull request #659 from ivanp7/patch-1 Add alternative key codes for Delete, Insert, Home, End commit50bbab0512
Merge:9edbf27
5a14c7b
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Wed Nov 15 21:35:50 2023 +0100 Merge pull request #660 from stradicat/feature/elementarish Elementarish theme: color update according to Elementary palette commit5a14c7b6fa
Merge:979506f
71eb414
Author: Dennis Mayr <dmayr.dev@gmail.com> Date: Wed Nov 15 17:27:34 2023 -0300 Merge branch 'main' of https://github.com/stradicat/btop commit979506f18e
Author: Dennis Mayr <dmayr.dev@gmail.com> Date: Wed Nov 8 11:17:47 2023 -0300 Elementarish theme: color update according to Elementary palette commit71eb4142e8
Author: Dennis Mayr <dmayr.dev@gmail.com> Date: Wed Nov 8 11:17:47 2023 -0300 Elementarish theme: color update according to Elementary palette commite81cf2b7ff
Author: vân <3432246+ivanp7@users.noreply.github.com> Date: Tue Nov 7 15:12:27 2023 +0000 Add alternative key codes for Insert, Home, End commitf9452ff6d5
Author: vân <3432246+ivanp7@users.noreply.github.com> Date: Mon Nov 6 13:31:53 2023 +0000 Add alternative Delete key code Delete key not always produces ^[[3~, on some terminals (like st) it produces ^[[P. commit9edbf27f1b
Merge:2a864f6
ff1f51c
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Oct 21 02:09:55 2023 +0200 Merge pull request #649 from nobounce/workflow-timeout Set FreeBSD workflow timeout commitff1f51ccbb
Author: Steffen Winter <steffen.winter@proton.me> Date: Wed Oct 18 22:26:36 2023 +0200 Set FreeBSD workflow timeout Recently the FreeBSD workflow has started to hang in a boot loop when the VM starts up. The issue is being tracked upstream but there is not response at the moment. To work around this set a timeout to not waste CI minutes. Other workflows might also want this change since they don't take 20 minutes anyway. commit2a864f6f2e
Merge:636eb25
b2bf8ef
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Oct 7 10:40:54 2023 +0200 Merge pull request #643 from DecklynKern/main Fix scrollbar not clearing sometimes. commitb2bf8ef504
Author: DecklynKern <DecklynKern@gmail.com> Date: Fri Oct 6 17:33:38 2023 -0600 Fix scrollbar not clearing sometimes. commit636eb25f5e
Merge:260c0f6
b5ba2fc
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Sep 30 19:51:03 2023 +0200 Merge pull request #623 from rahulaggarwal965/main Add keybind for toggling memory display mode in PROC box commitb5ba2fc963
Author: Rahul Aggarwal <rahulaggarwal965@gmail.com> Date: Wed Sep 20 22:55:56 2023 -0400 Add keybind for toggling memory display mode in PROC box commit260c0f6623
Merge:52bfff7
e6a06eb
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Sep 30 18:56:25 2023 +0200 Merge pull request #635 from lvxnull/editorconfig Add hpp files to .editorconfig commite6a06eb729
Author: lvxnull <86745229+lvxnull@users.noreply.github.com> Date: Thu Sep 28 19:44:47 2023 +0200 Add hpp files to .editorconfig commit52bfff7ceb
Merge:1f72e56
19dbbe1
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Sep 30 18:55:08 2023 +0200 Merge pull request #636 from nobounce/performance-iili Minor string initialization improvement commit19dbbe1a17
Author: nobounce <steffen.winter@proton.me> Date: Fri Sep 29 12:20:59 2023 +0200 Minor string initialization improvement commit1f72e56c7d
Merge:278a0e6
cdcf8bc
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Fri Sep 29 10:43:21 2023 +0200 Merge pull request #633 from crestfallnatwork/main [fix] Made disks statvfs logic asynchronous. commitcdcf8bc929
Author: crestfalln <guptahiman01@gmail.com> Date: Fri Sep 29 09:07:27 2023 +0530 fixed bug where updated disks stats overrided disk io data commit9b4e85f08d
Author: crestfalln <no-reply@crestfalln.com> Date: Thu Sep 28 04:57:05 2023 +0530 fixed bug where updated disks stats overrided disk io data commit889623874e
Author: crestfalln <no-reply@crestfalln.com> Date: Wed Sep 27 23:57:06 2023 +0530 made disks stat logic async commit278a0e6b17
Merge:d16adc9
e89519f
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Thu Sep 28 18:32:09 2023 +0200 Merge pull request #630 from lvxnull/signal-list Fix signal list on non-linux/weird linux platforms commite89519fbb2
Author: lvxnull <86745229+lvxnull@users.noreply.github.com> Date: Sun Sep 24 21:44:38 2023 +0200 Fix signal list on non-linux/weird linux platforms commitd16adc9fd0
Merge:2c3ac48
f34b408
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Thu Sep 28 18:20:42 2023 +0200 Merge pull request #618 from nobounce/aggregate-child-processes Add option to accumulate a child's resources in parent in tree-view commitf34b40892f
Author: nobounce <steffen.winter@proton.me> Date: Sun Sep 24 16:34:50 2023 +0200 Make process thread count better readable when wider than 5 digits commit6027cedd42
Author: nobounce <steffen.winter@proton.me> Date: Thu Sep 14 23:27:05 2023 +0200 Add option to accumulate a child's resources in parent in tree-view commit2c3ac4855d
Merge:f90dc37
5c6a281
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Wed Sep 13 21:14:56 2023 +0200 Merge pull request #589 from nobounce/cmake Add CMake support for Linux commitf90dc37c26
Merge:0cac861
68a49c1
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Wed Sep 13 20:27:05 2023 +0200 Merge pull request #610 from SidVeld/feature/horizon-theme Horizon theme commit5c6a281002
Author: nobounce <steffen.winter@proton.me> Date: Tue Aug 29 20:39:00 2023 +0200 Add CMake support Linux is completly supported FreeBSD is not able to create a static executable for now. See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=273398 MacOS was not tested commit68a49c10a6
Author: SidVeld <sidveld@gmail.com> Date: Wed Sep 6 18:03:31 2023 +0300 Add horizon theme commit0cac861910
Merge:31be436
f798acd
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Sep 5 19:27:38 2023 +0200 Merge pull request #609 from scorpion-26/byteconv Fix short conversion of 1000-1023 *iB commitf798acdaf7
Author: scorpion-26 <dev.scorpion26@gmail.com> Date: Tue Sep 5 18:00:47 2023 +0200 Fix short conversion of 1000-1023*iB floating_humanizer([1000-1024], true) with base 8 returns "2K", whereas it should return "1.0K" to align with other formats. The conversion is also broken for all other units(e.g. 1023M is also broken and returns "2G") commit31be4362ce
Author: aristocratos <gnmjpl@gmail.com> Date: Sun Aug 27 02:00:07 2023 +0200 FreeBSD Github action 13.1 -> 13.2 and static libgcc and libstdc++ commitfc523fd1d0
Author: aristocratos <gnmjpl@gmail.com> Date: Sun Aug 27 01:36:26 2023 +0200 Fix for FreeBSD github action not failing "correctly"...
193 lines
7.8 KiB
C++
193 lines
7.8 KiB
C++
/* Copyright 2021 Aristocratos (jakob@qvantnet.com)
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
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
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
|
|
indent = tab
|
|
tab-size = 4
|
|
*/
|
|
|
|
#include <ranges>
|
|
|
|
#include "btop_config.hpp"
|
|
#include "btop_shared.hpp"
|
|
#include "btop_tools.hpp"
|
|
|
|
namespace rng = std::ranges;
|
|
using namespace Tools;
|
|
|
|
#ifdef GPU_SUPPORT
|
|
namespace Gpu {
|
|
vector<string> gpu_names;
|
|
vector<int> gpu_b_height_offsets;
|
|
unordered_flat_map<string, deque<long long>> shared_gpu_percent = {
|
|
{"gpu-average", {}},
|
|
{"gpu-vram-total", {}},
|
|
{"gpu-pwr-total", {}},
|
|
};
|
|
long long gpu_pwr_total_max;
|
|
}
|
|
#endif
|
|
|
|
namespace Proc {
|
|
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;
|
|
case 1: rng::stable_sort(proc_vec, rng::less{}, &proc_info::name); break;
|
|
case 2: rng::stable_sort(proc_vec, rng::less{}, &proc_info::cmd); break;
|
|
case 3: rng::stable_sort(proc_vec, rng::less{}, &proc_info::threads); break;
|
|
case 4: rng::stable_sort(proc_vec, rng::less{}, &proc_info::user); break;
|
|
case 5: rng::stable_sort(proc_vec, rng::less{}, &proc_info::mem); break;
|
|
case 6: rng::stable_sort(proc_vec, rng::less{}, &proc_info::cpu_p); break;
|
|
case 7: rng::stable_sort(proc_vec, rng::less{}, &proc_info::cpu_c); break;
|
|
}
|
|
}
|
|
else {
|
|
switch (v_index(sort_vector, sorting)) {
|
|
case 0: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::pid); break;
|
|
case 1: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::name); break;
|
|
case 2: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::cmd); break;
|
|
case 3: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::threads); break;
|
|
case 4: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::user); break;
|
|
case 5: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::mem); break;
|
|
case 6: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::cpu_p); break;
|
|
case 7: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::cpu_c); break;
|
|
}
|
|
}
|
|
|
|
//* When sorting with "cpu lazy" push processes over threshold cpu usage to the front regardless of cumulative usage
|
|
if (not tree and not reverse and sorting == "cpu lazy") {
|
|
double max = 10.0, target = 30.0;
|
|
for (size_t i = 0, x = 0, offset = 0; i < proc_vec.size(); i++) {
|
|
if (i <= 5 and proc_vec.at(i).cpu_p > max)
|
|
max = proc_vec.at(i).cpu_p;
|
|
else if (i == 6)
|
|
target = (max > 30.0) ? max : 10.0;
|
|
if (i == offset and proc_vec.at(i).cpu_p > 30.0)
|
|
offset++;
|
|
else if (proc_vec.at(i).cpu_p > target) {
|
|
rotate(proc_vec.begin() + offset, proc_vec.begin() + i, proc_vec.begin() + i + 1);
|
|
if (++x > 10) break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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)) {
|
|
case 3: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().threads < b.entry.get().threads; }); break;
|
|
case 5: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().mem < b.entry.get().mem; }); break;
|
|
case 6: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_p < b.entry.get().cpu_p; }); break;
|
|
case 7: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_c < b.entry.get().cpu_c; }); break;
|
|
}
|
|
}
|
|
else {
|
|
switch (v_index(sort_vector, sorting)) {
|
|
case 3: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().threads > b.entry.get().threads; }); break;
|
|
case 5: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().mem > b.entry.get().mem; }); break;
|
|
case 6: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_p > b.entry.get().cpu_p; }); break;
|
|
case 7: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_c > b.entry.get().cpu_c; }); break;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (auto& r : proc_vec) {
|
|
r.entry.get().tree_index = (collapsed or r.entry.get().filtered ? index_max : c_index++);
|
|
if (not r.children.empty()) {
|
|
tree_sort(r.children, sorting, reverse, c_index, (collapsed or r.entry.get().collapsed or r.entry.get().tree_index == (size_t)index_max));
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
|
|
//? If filtering, include children of matching processes
|
|
if (not found and (should_filter or not filter.empty())) {
|
|
if (not s_contains(std::to_string(cur_proc.pid), filter)
|
|
and not s_contains_ic(cur_proc.name, filter)
|
|
and not s_contains_ic(cur_proc.cmd, filter)
|
|
and not s_contains_ic(cur_proc.user, filter)) {
|
|
filtering = true;
|
|
cur_proc.filtered = true;
|
|
filter_found++;
|
|
}
|
|
else {
|
|
found = true;
|
|
cur_depth = 0;
|
|
}
|
|
}
|
|
else if (cur_proc.filtered) cur_proc.filtered = false;
|
|
|
|
cur_proc.depth = cur_depth;
|
|
|
|
//? Set tree index position for process if not filtered out or currently in a collapsed sub-tree
|
|
out_procs.push_back({ cur_proc, {} });
|
|
if (not collapsed and not filtering) {
|
|
cur_proc.tree_index = out_procs.size() - 1;
|
|
|
|
//? Try to find name of the binary file and append to program name if not the same
|
|
if (cur_proc.short_cmd.empty() and not cur_proc.cmd.empty()) {
|
|
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};
|
|
}
|
|
}
|
|
else {
|
|
cur_proc.tree_index = in_procs.size();
|
|
}
|
|
|
|
//? Recursive iteration over all children
|
|
for (auto& p : rng::equal_range(in_procs, cur_proc.pid, rng::less{}, &proc_info::ppid)) {
|
|
if (collapsed and not filtering) {
|
|
cur_proc.filtered = true;
|
|
}
|
|
|
|
_tree_gen(p, in_procs, out_procs.back().children, cur_depth + 1, (collapsed or cur_proc.collapsed), filter, found, no_update, should_filter);
|
|
|
|
if (not no_update and not filtering and (collapsed or cur_proc.collapsed)) {
|
|
//auto& parent = cur_proc;
|
|
cur_proc.cpu_p += p.cpu_p;
|
|
cur_proc.cpu_c += p.cpu_c;
|
|
cur_proc.mem += p.mem;
|
|
cur_proc.threads += p.threads;
|
|
filter_found++;
|
|
p.filtered = true;
|
|
}
|
|
else if (Config::getB("proc_aggregate")) {
|
|
cur_proc.cpu_p += p.cpu_p;
|
|
cur_proc.cpu_c += p.cpu_c;
|
|
cur_proc.mem += p.mem;
|
|
cur_proc.threads += p.threads;
|
|
}
|
|
}
|
|
if (collapsed or filtering) {
|
|
return;
|
|
}
|
|
|
|
//? Add tree terminator symbol if it's the last child in a sub-tree
|
|
if (out_procs.back().children.size() > 0 and out_procs.back().children.back().entry.get().prefix.size() >= 8 and not out_procs.back().children.back().entry.get().prefix.ends_with("]─"))
|
|
out_procs.back().children.back().entry.get().prefix.replace(out_procs.back().children.back().entry.get().prefix.size() - 8, 8, " └─ ");
|
|
|
|
//? Add collapse/expand symbols if process have any children
|
|
out_procs.at(cur_pos).entry.get().prefix = " │ "s * cur_depth + (out_procs.at(cur_pos).children.size() > 0 ? (cur_proc.collapsed ? "[+]─" : "[-]─") : " ├─ ");
|
|
|
|
}
|
|
|
|
}
|