mirror of
https://github.com/aristocratos/btop.git
synced 2024-06-02 02:24:54 +12:00
934a9e3cf2
commit285fb215d1
Author: aristocratos <gnmjpl@gmail.com> Date: Thu Dec 28 13:10:18 2023 +0100 Proc::draw() -> Use std::erase_if() instead of for loops commit2fba934cde
Author: aristocratos <gnmjpl@gmail.com> Date: Wed Dec 27 00:54:28 2023 +0100 Fixed leftover code in GPU init logging false errors commitad14554f32
Author: aristocratos <gnmjpl@gmail.com> Date: Tue Dec 26 19:32:43 2023 +0100 Try alternative names for GPU libraries during GPU init commita8fda16bf6
Merge:e15e0b7
2796af3
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Dec 26 19:19:14 2023 +0100 Merge pull request #696 from aristocratos/map_safety commit2796af3f37
Author: aristocratos <gnmjpl@gmail.com> Date: Tue Dec 26 19:18:37 2023 +0100 Document DEBUG flag for Makefile commitf484326bf2
Merge:b4eb397
e15e0b7
Author: aristocratos <gnmjpl@gmail.com> Date: Tue Dec 26 19:11:26 2023 +0100 Merge branch 'main' into map_safety commitb4eb397fc6
Author: aristocratos <gnmjpl@gmail.com> Date: Mon Dec 25 10:52:52 2023 +0100 Fix errors commit3c04a7a380
Author: aristocratos <gnmjpl@gmail.com> Date: Mon Dec 25 10:41:15 2023 +0100 Added more checks and debug logging commit8b81c4a4ec
Author: aristocratos <gnmjpl@gmail.com> Date: Mon Dec 25 03:28:35 2023 +0100 Return const refs commitf836233b64
Author: aristocratos <gnmjpl@gmail.com> Date: Mon Dec 25 02:49:24 2023 +0100 Remove robin_hood.h commit3a8ceacaf8
Author: aristocratos <gnmjpl@gmail.com> Date: Mon Dec 25 02:37:32 2023 +0100 Fix call to compact and missing utility include commite15e0b7188
Author: aristocratos <gnmjpl@gmail.com> Date: Mon Dec 25 02:27:38 2023 +0100 Revert "Replace robin_hood map and set with STD alternative and add safeVal() function for map/vector access with fallback" This reverts commit6c87ab6196
. commitced47a960f
Author: aristocratos <gnmjpl@gmail.com> Date: Mon Dec 25 02:26:13 2023 +0100 Replace robin_hood map and set with STD alternative and add safeVal() function for map/vector access with fallback commit6c87ab6196
Author: aristocratos <gnmjpl@gmail.com> Date: Mon Dec 25 02:16:15 2023 +0100 Replace robin_hood map and set with STD alternative and add safeVal() function for map/vector access with fallback commita2325371d4
Merge:aab2e8c
b598f02
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sun Dec 17 19:56:31 2023 +0100 Merge pull request #690 from aristocratos/osx-fix commitb598f02468
Merge:b1fe377
aab2e8c
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sun Dec 17 12:06:39 2023 +0100 Merge branch 'main' into osx-fix commitaab2e8cc55
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sun Dec 17 12:03:47 2023 +0100 Fixed test-snap-can-build.yml commitb1fe3779e1
Merge:7805242
2d15c41
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sun Dec 17 11:56:14 2023 +0100 Merge branch 'main' into osx-fix commit2d15c41555
Merge:fe699b4
2d3e453
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sun Dec 17 11:54:49 2023 +0100 Merge pull request #684 from kz6fittycent/main commit2d3e453ed5
Merge:0a38864
fe699b4
Author: kz6fittycent <jimmy.tigert@gmail.com> Date: Fri Dec 15 12:02:11 2023 -0600 Merge branch 'main' into main commit0a388647cc
Author: kz6fittycent <jimmy.tigert@gmail.com> Date: Fri Dec 15 12:01:45 2023 -0600 Update test-snap-can-build.yml whoops commit49f425f356
Author: kz6fittycent <jimmy.tigert@gmail.com> Date: Fri Dec 15 12:00:48 2023 -0600 Update test-snap-can-build.yml https://github.com/aristocratos/btop/pull/684#issuecomment-1852801811 commit780524267f
Author: Jos Dehaes <jos.dehaes@gmail.com> Date: Fri Dec 15 09:02:57 2023 +0100 conditional compile on Big Sur and up commitfe699b4333
Author: aristocratos <gnmjpl@gmail.com> Date: Tue Dec 12 23:20:09 2023 +0100 Version bump to 1.3.0 in preparation for upcoming release commit2d2df23198
Merge:d7b581e
b71538e
Author: aristocratos <gnmjpl@gmail.com> Date: Tue Dec 12 23:19:31 2023 +0100 Merge branch 'main' of github.com:aristocratos/btop commitd7b581eda4
Author: aristocratos <gnmjpl@gmail.com> Date: Tue Dec 12 23:17:36 2023 +0100 Updated changes commitb71538eabe
Merge:a017056
730af5d
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Dec 12 23:07:39 2023 +0100 Merge pull request #666 from muneebmahmed/macos-clang commit730af5d4e1
Merge:0246b1b
a017056
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Dec 12 23:05:52 2023 +0100 Merge branch 'main' into macos-clang commita017056ea0
Author: aristocratos <gnmjpl@gmail.com> Date: Tue Dec 12 23:05:07 2023 +0100 Added swap to ignore for statvfs() since it will always fail commite770cccaf8
Author: aristocratos <gnmjpl@gmail.com> Date: Tue Dec 12 22:55:48 2023 +0100 Added try->catch for get_zfs_stat_file() to avoid fs error commit0246b1b971
Author: Muneeb Ahmed <32603485+muneebmahmed@users.noreply.github.com> Date: Mon Nov 20 12:18:40 2023 -0800 Enable macos clang Apple clang uses different versioning from LLVM, so 15.0.0 is compatible commit6282f36f8f
Merge:cfd20a3
be73160
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Dec 12 22:06:02 2023 +0100 Merge pull request #675 from imwints/cmake commitbe731600f1
Merge:f4b14ce
cfd20a3
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Dec 12 22:01:21 2023 +0100 Merge branch 'main' into cmake commit450b59b657
Merge:875f08b
cfd20a3
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Dec 12 21:55:27 2023 +0100 Merge branch 'main' into main commitcfd20a374b
Merge:14e664e
b6a8696
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Dec 12 21:48:55 2023 +0100 Merge pull request #677 from imwints/cpu-model commitb6a86962e2
Merge:8096433
14e664e
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Dec 12 21:47:01 2023 +0100 Merge branch 'main' into cpu-model commit14e664e756
Merge:0d35746
5902484
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Tue Dec 12 21:41:55 2023 +0100 Merge pull request #679 from masiboss/main commit875f08ba5e
Author: kz6fittycent <jimmy.tigert@gmail.com> Date: Tue Dec 12 14:27:16 2023 -0600 Update snapcraft.yaml - opengl - Testing opengl plug commit3ee4b18e57
Author: kz6fittycent <jimmy.tigert@gmail.com> Date: Tue Dec 12 14:14:59 2023 -0600 Update bug_report.md - added snap info for bug reports to delineate commit2973a76f2b
Merge:fb782a2
0d35746
Author: kz6fittycent <jimmy.tigert@gmail.com> Date: Tue Dec 12 14:06:44 2023 -0600 Merge branch 'aristocratos:main' into main commitfb782a2ab3
Author: kz6fittycent <jimmy.tigert@gmail.com> Date: Tue Dec 12 14:02:27 2023 -0600 Create test-snap-can-build.yml commit5902484f39
Author: masiboss <32394683+masiboss@users.noreply.github.com> Date: Thu Dec 7 21:42:11 2023 +0100 simplify removal of "Apple" commit5beb9e12e5
Author: masiboss <32394683+masiboss@users.noreply.github.com> Date: Thu Dec 7 20:56:40 2023 +0100 in case apple decides to add another suffix to the cpu name commit1b2f11b412
Author: masiboss <32394683+masiboss@users.noreply.github.com> Date: Thu Dec 7 20:49:34 2023 +0100 cut less of cpu name if frequency is not shown commitbcf4ad8ab6
Author: masiboss <32394683+masiboss@users.noreply.github.com> Date: Thu Dec 7 19:50:12 2023 +0100 fix array out of bounds on regular m chip commitaeefcacbc9
Author: masiboss <32394683+masiboss@users.noreply.github.com> Date: Thu Dec 7 19:34:11 2023 +0100 fix cpu version not included commit23698940df
Author: masiboss <32394683+masiboss@users.noreply.github.com> Date: Thu Dec 7 19:23:58 2023 +0100 strip "Apple" from name of Apple silicon chips commit8096433736
Author: Steffen Winter <steffen.winter@proton.me> Date: Tue Dec 5 02:34:24 2023 +0100 Fix printed model name for older Intel CPU commitf4b14ce97e
Author: Steffen Winter <steffen.winter@proton.me> Date: Tue Dec 5 01:00:14 2023 +0100 Add CMake compile instructions for macOS commit97b35d9720
Author: Steffen Winter <steffen.winter@proton.me> Date: Sat Dec 2 00:35:13 2023 +0100 Add cmake workflow for all platforms commite35538fa29
Author: Steffen Winter <steffen.winter@proton.me> Date: Sat Dec 2 00:34:32 2023 +0100 Patch RPATH on FreeBSD, support OSX and format commit0d357468b5
Merge:ebc46ca
00f58b6
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Fri Dec 1 22:52:51 2023 +0100 Merge pull request #674 from imwints/bsd-workflow Provide FreeBSD static release binaries commit00f58b6228
Author: Steffen Winter <steffen.winter@proton.me> Date: Thu Nov 30 23:07:52 2023 +0100 Provide FreeBSD static release binaries Bumps vmaction@freesdb-vm to version 1 which runs on Linux and doesn't hang all the time. Also uses clang for full static compilation commitebc46ca12c
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Mon Nov 27 18:21:42 2023 +0100 Clean up compile instructions commitd1384c9341
Merge:2b0cc37
6f12e35
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Mon Nov 27 17:53:39 2023 +0100 Merge pull request #671 from imwints/cmake-gpu Bring GPU support to CMake and improve how Make handles the ROCm library build commit6f12e3555d
Author: Steffen Winter <steffen.winter@proton.me> Date: Mon Nov 27 00:33:11 2023 +0100 Properly invoke CMake to build ROCm * Build an optimized library by default * Only build the library target * ROCm is build with debug symbols when `make DEBUG=true` * Enable LTO * Use the more generic CMake build command instead of calling make directly, this always uses all cores by default and makes it easier to switch to another generator e.g. Ninja * Use a variable to store the ROCm source directory. The directory can be changed with `make ROCM_DIR=<dir>` * The static library is now directly linked by CMake and not created off of the object files from a shared library build * The C++ compiler used to compile btop is now used to compile ROCm to avoid name mangling when `CXX` from the environment and `make CXX=` differ * CMake is invoked from btop's root directory commit0585bc9cfb
Author: Steffen Winter <steffen.winter@proton.me> Date: Mon Nov 27 00:31:10 2023 +0100 Suppress all output from ROCm build Similar to including external include files with `-isystem`, ignore output from ROCm build since these warnings aren't a concern here commit831be262b0
Author: Steffen Winter <steffen.winter@proton.me> Date: Mon Nov 27 00:29:14 2023 +0100 Remove ROCm object files with `make clean/distclean` commit2f59e61d87
Author: Steffen Winter <steffen.winter@proton.me> Date: Sun Nov 26 22:56:58 2023 +0100 Add GPU options for cmake based builds commit7588d96dd4
Author: Steffen Winter <steffen.winter@proton.me> Date: Sun Nov 26 21:40:29 2023 +0100 Add check for <ranges> header commitebbb769a6a
Author: Steffen Winter <steffen.winter@proton.me> Date: Sun Nov 26 21:39:13 2023 +0100 Move calls to find_package to where they're required commited0fa34a9d
Author: Steffen Winter <steffen.winter@proton.me> Date: Sun Nov 26 19:39:29 2023 +0100 Bump required CMake version commit2b0cc37632
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Nov 25 23:11:54 2023 +0100 Update compile instructions for Gpu support commit359c67136b
Author: aristocratos <gnmjpl@gmail.com> Date: Sat Nov 25 22:49:26 2023 +0100 Update changelog commit5b01235315
Merge:0267eba
0bb8599
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Nov 25 21:57:32 2023 +0100 Merge pull request #529 from romner-set/main Add GPU monitoring support commit0bb8599a96
Merge:94d4502
0267eba
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Nov 25 21:51:09 2023 +0100 Merge branch 'main' into main commit94d4502901
Author: aristocratos <gnmjpl@gmail.com> Date: Sat Nov 25 21:48:50 2023 +0100 Readme update and Makfile fixes. commit19bcff894b
Author: aristocratos <gnmjpl@gmail.com> Date: Sat Nov 25 21:01:11 2023 +0100 Squashed commit of the following: 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"... commitb87772611c
Author: aristocratos <gnmjpl@gmail.com> Date: Sat Nov 25 20:44:45 2023 +0100 Added definition GPU_SUPPORT to toggle GPU related code 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") commit975525d38f
Author: aristocratos <gnmjpl@gmail.com> Date: Sun Aug 27 12:34:46 2023 +0200 Fix: Cpu gpu stats always shown when show_gpu_info is On and sizing issues commit08abf0b930
Author: aristocratos <gnmjpl@gmail.com> Date: Sun Aug 27 01:28:36 2023 +0200 Quickfixes for MacOS and FreeBSD compilation. commit7290109f80
Author: aristocratos <gnmjpl@gmail.com> Date: Sun Aug 27 00:58:30 2023 +0200 Merge fix commit283d463242
Merge:efddad4
c296ac1
Author: aristocratos <gnmjpl@gmail.com> Date: Sun Aug 27 00:56:22 2023 +0200 Merge branch 'main' into pr/romner-set/529 commitefddad42dc
Author: aristocratos <gnmjpl@gmail.com> Date: Sun Aug 27 00:39:57 2023 +0200 Changed: cpu_graph_lower Auto defaults to cpu_graph_upper when show_gpu_info is Off commita9bc0874d4
Author: aristocratos <gnmjpl@gmail.com> Date: Sun Aug 27 00:31:07 2023 +0200 Added show_gpu_info setting and Auto options for cpu graphs commitb3970ee19c
Author: aristocratos <gnmjpl@gmail.com> Date: Sat Aug 26 20:52:59 2023 +0200 Fixed: Key 5-0 gpu box toggle commitbd5d697830
Author: aristocratos <gnmjpl@gmail.com> Date: Sat Aug 26 20:29:43 2023 +0200 Squashed commit of the following: commitc296ac13cd
Merge:9a1e760
091c30a
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Aug 26 19:29:57 2023 +0200 Merge pull request #590 from nobounce/dangling-reference-config Convert parameters and config keys to std::string_view commit9a1e760a66
Merge:9c8af4d
22e64ca
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Aug 26 19:20:18 2023 +0200 Merge pull request #602 from jfouquart/main Fix getting zfs pool name with '.' char in freebsd commit9c8af4df43
Merge:8a49d8c
2217cbe
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Aug 26 19:18:55 2023 +0200 Merge pull request #601 from joske/cleanup [macos] don't check /sys on macos commit8a49d8cf45
Merge:1556388
008fcd8
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Aug 26 19:18:07 2023 +0200 Merge pull request #600 from joske/makefile [macos/freebsd] support gcc13 commit1556388c83
Merge:1b126f5
d17e1a2
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sat Aug 26 19:14:00 2023 +0200 Merge pull request #599 from joske/main [macos] fix temp sensor on system with many cores commitd17e1a2dac
Author: Jos Dehaes <jos.dehaes@gmail.com> Date: Fri Aug 25 16:18:39 2023 +0200 fix some warnings commit4d8aa6b118
Author: Jos Dehaes <jos.dehaes@gmail.com> Date: Fri Aug 25 15:52:58 2023 +0200 fix core check commit22e64caaff
Author: Jonathan Fouquart <jfouquart@hotmail.fr> Date: Fri Aug 25 09:37:49 2023 +0200 Fix getting zfs pool name with '.' char in freebsd commit2217cbe143
Author: Jos Dehaes <jos.dehaes@gmail.com> Date: Wed Aug 23 16:01:04 2023 +0200 [macos] don't check /sys on macos commit008fcd889e
Author: Jos Dehaes <jos.dehaes@gmail.com> Date: Wed Aug 23 16:05:00 2023 +0200 also add g++13 commit0fdca5eb03
Author: Jos Dehaes <jos.dehaes@gmail.com> Date: Wed Aug 23 15:54:07 2023 +0200 support gcc13 commitdcbdb7360d
Author: Jos Dehaes <jos.dehaes@gmail.com> Date: Wed Aug 23 15:46:47 2023 +0200 [macos] fix temp sensor on system with many cores commit1b126f55e3
Author: aristocratos <gnmjpl@gmail.com> Date: Fri Aug 4 01:08:27 2023 +0200 Update Makefile for partial static compilation on freebsd commitc8ec6bbb00
Author: aristocratos <gnmjpl@gmail.com> Date: Thu Aug 3 23:08:33 2023 +0200 Fix freebsd nullptr changes and makefile for gcc12 and newer commit8a33aab588
Merge:94e5c02
e4abcef
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Sun Jul 30 13:21:48 2023 +0200 Merge pull request #539 from nobounce/replace-NULL-nullptr Modernize using nullptr. commit94e5c02d11
Author: aristocratos <gnmjpl@gmail.com> Date: Thu Jul 27 20:51:21 2023 +0200 Better text editing commit091c30ab2b
Author: nobounce <steffen.winter@proton.me> Date: Thu Jul 27 14:17:54 2023 +0200 Convert parameters and config keys to std::string_view Using std::string_view instead of std::string& silences a new warning from GCC 13, -Wdangling-reference Also switch return type of `getI` from int& to int, trivial types are cheaper to copy by value commite4abcefbf9
Author: nobounce <steffen.winter@proton.me> Date: Wed Jul 26 16:19:17 2023 +0200 Use nullptr instead of NULL. See https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf TLDR: NULL is of type int and relies on proper implicit pointer conversion which may lead to issues when using overloaded functions It is also considered a 'best practise' for modern C++ and conveys the programmers intention more precisly. commitd53307f14c
Author: nobounce <steffen.winter@proton.me> Date: Sun Jul 23 19:53:36 2023 +0200 Fix path to Linux CI file in itself The CI file has a list of dependent files including itself. The path was not updated when the CI was split into different files commit594f42b9eb
Merge:aca2e4b
53d6eba
Author: Jakob P. Liljenberg <admin@qvantnet.com> Date: Wed Jul 26 15:38:01 2023 +0200 Merge pull request #584 from nobounce/nb/fix-ci-path Fix path to Linux CI file in itself commitaca2e4be75
Author: aristocratos <gnmjpl@gmail.com> Date: Wed Jul 26 14:38:48 2023 +0200 Fix whitespace indent -> tab indent commit33faa01910
Author: aristocratos <gnmjpl@gmail.com> Date: Wed Jul 26 14:34:15 2023 +0200 Revert fmt submodule to static fmt folder in include commit53d6ebabc0
Author: nobounce <steffen.winter@proton.me> Date: Sun Jul 23 19:53:36 2023 +0200 Fix path to Linux CI file in itself The CI file has a list of dependent files including itself. The path was not updated when the CI was split into different files commit346c9e479b
Author: romner <roman@skotnica.com> Date: Wed Jul 19 16:53:58 2023 +0200 Fix GPU text overflow in CPU panel, again commit3a5e5fd5d3
Author: romner <roman@skotnica.com> Date: Wed Jul 19 16:22:45 2023 +0200 Improve 0-10 key input commit972b2b6a01
Author: romner <roman@skotnica.com> Date: Wed Jul 19 15:54:35 2023 +0200 Fix available boxes in menu & config description commit1f73453aec
Author: romner <roman@skotnica.com> Date: Wed Jul 19 15:34:23 2023 +0200 Fix crashes when trying to open nth GPU box with only n-1 GPUs in the system commit46c6be0a29
Author: romner <roman@skotnica.com> Date: Sun Jul 16 17:19:09 2023 +0200 Fix GPU horizontal text overflow in CPU panel commit85fb28cee6
Author: romner <roman@skotnica.com> Date: Fri Jul 14 02:39:44 2023 +0200 Fix RSMI_STATIC=true and add GPU section to README.md commit3fad8a6fde
Author: romner-set <roman@skotnica.com> Date: Mon Jun 26 13:10:31 2023 +0200 Add GPU options commit746f716a02
Author: romner-set <roman@skotnica.com> Date: Fri Jun 16 11:11:57 2023 +0200 Remove lib/rocm_smi_lib and add instructions for obtaining it to README commitd8ebbe1181
Author: romner <roman@skotnica.com> Date: Thu Jun 8 20:24:01 2023 +0200 Join NVML PCIe threads only if PCIe TX/RX is supported by GPU commitbe10989151
Author: romner <roman@skotnica.com> Date: Tue Jun 6 19:47:07 2023 +0200 Parallelize NVML PCIe TX/RX data collection commit85892a9fe3
Author: aristocratos <gnmjpl@gmail.com> Date: Mon Jun 5 21:59:26 2023 +0200 Fix type: ulong -> size_t and compare std::cmp_less commit85a10f0305
Author: romner <roman@skotnica.com> Date: Fri Jun 2 16:14:24 2023 +0200 Fix ROCm SMI makefile flags commitcd6979277d
Author: romner <roman@skotnica.com> Date: Fri Jun 2 15:44:44 2023 +0200 Fix error when ROCm SMI static compilation fails commitdaaa45324f
Author: romner <roman@skotnica.com> Date: Fri Jun 2 15:34:12 2023 +0200 Load ROCm SMI dynamically by default, optionally statically compile and link commit093edfe948
Author: aristocratos <gnmjpl@gmail.com> Date: Thu Jun 1 19:49:00 2023 +0200 Minor changes in wording... commitb9a4d31fa4
Author: aristocratos <gnmjpl@gmail.com> Date: Thu Jun 1 19:37:53 2023 +0200 Fix Makefile dependency order and layout commita0163ce220
Author: romner <roman@skotnica.com> Date: Thu Jun 1 16:42:02 2023 +0200 Statically link ROCm SMI commitb2df0696fd
Author: romner-set <roman@skotnica.com> Date: Thu Jun 1 03:41:56 2023 +0200 Dynamically load NVML commit547f17dda3
Author: romner-set <roman@skotnica.com> Date: Tue May 30 18:24:50 2023 +0200 Add more GPU graph types to the CPU panel commit842c761a73
Author: romner-set <roman@skotnica.com> Date: Mon May 22 09:46:20 2023 +0200 Fix crash when all GPU panels are open but the CPU panel is closed commit8c96bd51e9
Author: romner <roman@skotnica.com> Date: Sun May 21 20:34:47 2023 +0200 Handle GPUs which cannot report certain stats in GPU panel commit414d7eb94c
Author: romner <roman@skotnica.com> Date: Sun May 21 18:02:50 2023 +0200 Handle GPUs which cannot report certain stats in btop_collect.cpp and CPU panel commit005de97e6d
Author: aristocratos <gnmjpl@gmail.com> Date: Sun May 21 13:58:11 2023 +0200 Add missing fmt prefixes commit1fee2bc08b
Author: aristocratos <gnmjpl@gmail.com> Date: Sun May 21 13:52:19 2023 +0200 Add DebugTimer class and change some Logger::error calls to Logger::debug commit2e68c0b916
Author: aristocratos <gnmjpl@gmail.com> Date: Sat May 20 17:27:20 2023 +0200 Fixed key > gpu_names check commit04ed16a9f6
Author: aristocratos <gnmjpl@gmail.com> Date: Sat May 20 17:15:45 2023 +0200 Merged changes from main commit8c710a2b68
Author: aristocratos <gnmjpl@gmail.com> Date: Sat May 20 01:41:04 2023 +0200 Makefile auto detection and initial logic for excluding gpu code when libs are missing commit8bae1ec092
Author: aristocratos <gnmjpl@gmail.com> Date: Sat May 20 00:13:00 2023 +0200 Fixed debug timer for gpu commit01acfd603e
Author: romner-set <roman@skotnica.com> Date: Fri May 19 16:42:32 2023 +0200 Bind GPU panel to 5,6,7,8,9,0 and fully implement multi-GPU support commit22a463976d
Author: romner <roman@skotnica.com> Date: Thu May 18 16:07:05 2023 +0200 Add GPU info to CPU panel commitc352bf2613
Author: romner-set <roman@skotnica.com> Date: Mon May 15 19:42:55 2023 +0200 Add ROCm SMI backend for AMD GPU support commit917d568a77
Author: romner-set <roman@skotnica.com> Date: Mon May 15 13:58:54 2023 +0200 Add multi-GPU support for NVML data collection commit2d27f2ff61
Author: romner <roman@skotnica.com> Date: Sun May 14 17:40:50 2023 +0200 Fix crash when no nvidia GPU is detected commit0e0025a2c3
Author: romner <roman@skotnica.com> Date: Sun May 14 17:31:39 2023 +0200 Update makefile text, fix typo and adhere to contibuting guidelines commitbcffcdf19f
Author: romner <roman@skotnica.com> Date: Sun May 14 16:53:06 2023 +0200 Make GPU window's size dynamic and integrate it with the rest of btop commit95b3228308
Author: romner <roman@skotnica.com> Date: Sat May 13 19:41:51 2023 +0200 Improve GPU side panel commitadcdc583b0
Author: romner <roman@skotnica.com> Date: Sat May 13 00:27:23 2023 +0200 Add GPU side panel commitd522a91ef4
Author: romner <roman@skotnica.com> Date: Fri May 12 19:34:47 2023 +0200 Add rudimentary, fullscreen single-GPU NVML utilization graph
1120 lines
34 KiB
C++
1120 lines
34 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 <csignal>
|
|
#include <clocale>
|
|
#include <pthread.h>
|
|
#ifdef __FreeBSD__
|
|
#include <pthread_np.h>
|
|
#endif
|
|
#include <thread>
|
|
#include <numeric>
|
|
#include <ranges>
|
|
#include <unistd.h>
|
|
#include <cmath>
|
|
#include <iostream>
|
|
#include <exception>
|
|
#include <tuple>
|
|
#include <regex>
|
|
#include <chrono>
|
|
#include <utility>
|
|
#ifdef __APPLE__
|
|
#include <CoreFoundation/CoreFoundation.h>
|
|
#include <mach-o/dyld.h>
|
|
#include <limits.h>
|
|
#endif
|
|
#if !defined(__clang__) && __GNUC__ < 11
|
|
#include <semaphore.h>
|
|
#else
|
|
#include <semaphore>
|
|
#endif
|
|
|
|
#include "btop_shared.hpp"
|
|
#include "btop_tools.hpp"
|
|
#include "btop_config.hpp"
|
|
#include "btop_input.hpp"
|
|
#include "btop_theme.hpp"
|
|
#include "btop_draw.hpp"
|
|
#include "btop_menu.hpp"
|
|
|
|
using std::atomic;
|
|
using std::cout;
|
|
using std::flush;
|
|
using std::min;
|
|
using std::string;
|
|
using std::string_view;
|
|
using std::to_string;
|
|
using std::vector;
|
|
|
|
namespace fs = std::filesystem;
|
|
|
|
using namespace Tools;
|
|
using namespace std::chrono_literals;
|
|
using namespace std::literals;
|
|
|
|
namespace Global {
|
|
const vector<array<string, 2>> Banner_src = {
|
|
{"#E62525", "██████╗ ████████╗ ██████╗ ██████╗"},
|
|
{"#CD2121", "██╔══██╗╚══██╔══╝██╔═══██╗██╔══██╗ ██╗ ██╗"},
|
|
{"#B31D1D", "██████╔╝ ██║ ██║ ██║██████╔╝ ██████╗██████╗"},
|
|
{"#9A1919", "██╔══██╗ ██║ ██║ ██║██╔═══╝ ╚═██╔═╝╚═██╔═╝"},
|
|
{"#801414", "██████╔╝ ██║ ╚██████╔╝██║ ╚═╝ ╚═╝"},
|
|
{"#000000", "╚═════╝ ╚═╝ ╚═════╝ ╚═╝"},
|
|
};
|
|
const string Version = "1.3.0";
|
|
|
|
int coreCount;
|
|
string overlay;
|
|
string clock;
|
|
|
|
string bg_black = "\x1b[0;40m";
|
|
string fg_white = "\x1b[1;97m";
|
|
string fg_green = "\x1b[1;92m";
|
|
string fg_red = "\x1b[0;91m";
|
|
|
|
uid_t real_uid, set_uid;
|
|
|
|
fs::path self_path;
|
|
|
|
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
|
|
|
|
uint64_t start_time;
|
|
|
|
atomic<bool> resized (false);
|
|
atomic<bool> quitting (false);
|
|
atomic<bool> should_quit (false);
|
|
atomic<bool> should_sleep (false);
|
|
atomic<bool> _runner_started (false);
|
|
|
|
bool arg_tty{}; // defaults to false
|
|
bool arg_low_color{}; // defaults to false
|
|
int arg_preset = -1;
|
|
}
|
|
|
|
//* A simple argument parser
|
|
void argumentParser(const int& argc, char **argv) {
|
|
for(int i = 1; i < argc; i++) {
|
|
const string argument = argv[i];
|
|
if (is_in(argument, "-h", "--help")) {
|
|
fmt::println(
|
|
"usage: btop [-h] [-v] [-/+t] [-p <id>] [--utf-force] [--debug]\n\n"
|
|
"optional arguments:\n"
|
|
" -h, --help show this help message and exit\n"
|
|
" -v, --version show version info and exit\n"
|
|
" -lc, --low-color disable truecolor, converts 24-bit colors to 256-color\n"
|
|
" -t, --tty_on force (ON) tty mode, max 16 colors and tty friendly graph symbols\n"
|
|
" +t, --tty_off force (OFF) tty mode\n"
|
|
" -p, --preset <id> start with preset, integer value between 0-9\n"
|
|
" --utf-force force start even if no UTF-8 locale was detected\n"
|
|
" --debug start in DEBUG mode: shows microsecond timer for information collect\n"
|
|
" and screen draw functions and sets loglevel to DEBUG"
|
|
);
|
|
exit(0);
|
|
}
|
|
else if (is_in(argument, "-v", "--version")) {
|
|
fmt::println("btop version: {}", Global::Version);
|
|
exit(0);
|
|
}
|
|
else if (is_in(argument, "-lc", "--low-color")) {
|
|
Global::arg_low_color = true;
|
|
}
|
|
else if (is_in(argument, "-t", "--tty_on")) {
|
|
Config::set("tty_mode", true);
|
|
Global::arg_tty = true;
|
|
}
|
|
else if (is_in(argument, "+t", "--tty_off")) {
|
|
Config::set("tty_mode", false);
|
|
Global::arg_tty = true;
|
|
}
|
|
else if (is_in(argument, "-p", "--preset")) {
|
|
if (++i >= argc) {
|
|
fmt::println("ERROR: Preset option needs an argument.");
|
|
exit(1);
|
|
}
|
|
else if (const string val = argv[i]; isint(val) and val.size() == 1) {
|
|
Global::arg_preset = std::clamp(stoi(val), 0, 9);
|
|
}
|
|
else {
|
|
fmt::println("ERROR: Preset option only accepts an integer value between 0-9.");
|
|
exit(1);
|
|
}
|
|
}
|
|
else if (argument == "--utf-force")
|
|
Global::utf_force = true;
|
|
else if (argument == "--debug")
|
|
Global::debug = true;
|
|
else {
|
|
fmt::println(" Unknown argument: {}\n"
|
|
" Use -h or --help for help.", argument);
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//* Handler for SIGWINCH and general resizing events, does nothing if terminal hasn't been resized unless force=true
|
|
void term_resize(bool force) {
|
|
static atomic<bool> resizing (false);
|
|
if (Input::polling) {
|
|
Global::resized = true;
|
|
Input::interrupt = true;
|
|
return;
|
|
}
|
|
atomic_lock lck(resizing, true);
|
|
if (auto refreshed = Term::refresh(true); refreshed or force) {
|
|
if (force and refreshed) force = false;
|
|
}
|
|
else return;
|
|
#ifdef GPU_SUPPORT
|
|
static const array<string, 10> all_boxes = {"gpu5", "cpu", "mem", "net", "proc", "gpu0", "gpu1", "gpu2", "gpu3", "gpu4"};
|
|
#else
|
|
static const array<string, 5> all_boxes = {"", "cpu", "mem", "net", "proc"};
|
|
#endif
|
|
Global::resized = true;
|
|
if (Runner::active) Runner::stop();
|
|
Term::refresh();
|
|
Config::unlock();
|
|
|
|
auto boxes = Config::getS("shown_boxes");
|
|
auto min_size = Term::get_min_size(boxes);
|
|
auto minWidth = min_size.at(0), minHeight = min_size.at(1);
|
|
|
|
while (not force or (Term::width < minWidth or Term::height < minHeight)) {
|
|
sleep_ms(100);
|
|
if (Term::width < minWidth or Term::height < minHeight) {
|
|
int width = Term::width, height = Term::height;
|
|
cout << fmt::format("{clear}{bg_black}{fg_white}"
|
|
"{mv1}Terminal size too small:"
|
|
"{mv2} Width = {fg_width}{width} {fg_white}Height = {fg_height}{height}"
|
|
"{mv3}{fg_white}Needed for current config:"
|
|
"{mv4}Width = {minWidth} Height = {minHeight}",
|
|
"clear"_a = Term::clear, "bg_black"_a = Global::bg_black, "fg_white"_a = Global::fg_white,
|
|
"mv1"_a = Mv::to((height / 2) - 2, (width / 2) - 11),
|
|
"mv2"_a = Mv::to((height / 2) - 1, (width / 2) - 10),
|
|
"fg_width"_a = (width < minWidth ? Global::fg_red : Global::fg_green),
|
|
"width"_a = width,
|
|
"fg_height"_a = (height < minHeight ? Global::fg_red : Global::fg_green),
|
|
"height"_a = height,
|
|
"mv3"_a = Mv::to((height / 2) + 1, (width / 2) - 12),
|
|
"mv4"_a = Mv::to((height / 2) + 2, (width / 2) - 10),
|
|
"minWidth"_a = minWidth,
|
|
"minHeight"_a = minHeight
|
|
) << std::flush;
|
|
|
|
bool got_key = false;
|
|
for (; not Term::refresh() and not got_key; got_key = Input::poll(10));
|
|
if (got_key) {
|
|
auto key = Input::get();
|
|
if (key == "q")
|
|
clean_quit(0);
|
|
else if (key.size() == 1 and isint(key)) {
|
|
auto intKey = stoi(key);
|
|
#ifdef GPU_SUPPORT
|
|
if ((intKey == 0 and Gpu::gpu_names.size() >= 5) or (intKey >= 5 and std::cmp_greater_equal(Gpu::gpu_names.size(), intKey - 4))) {
|
|
#else
|
|
if (intKey > 0 and intKey < 5) {
|
|
#endif
|
|
auto box = all_boxes.at(intKey);
|
|
Config::current_preset = -1;
|
|
Config::toggle_box(box);
|
|
boxes = Config::getS("shown_boxes");
|
|
}
|
|
}
|
|
}
|
|
min_size = Term::get_min_size(boxes);
|
|
minWidth = min_size.at(0), minHeight = min_size.at(1);
|
|
}
|
|
else if (not Term::refresh()) break;
|
|
}
|
|
|
|
Input::interrupt = true;
|
|
}
|
|
|
|
//* Exit handler; stops threads, restores terminal and saves config changes
|
|
void clean_quit(int sig) {
|
|
if (Global::quitting) return;
|
|
Global::quitting = true;
|
|
Runner::stop();
|
|
if (Global::_runner_started) {
|
|
#if defined __APPLE__ || defined __OpenBSD__
|
|
if (pthread_join(Runner::runner_id, nullptr) != 0) {
|
|
Logger::warning("Failed to join _runner thread on exit!");
|
|
pthread_cancel(Runner::runner_id);
|
|
}
|
|
#else
|
|
struct timespec ts;
|
|
ts.tv_sec = 5;
|
|
if (pthread_timedjoin_np(Runner::runner_id, nullptr, &ts) != 0) {
|
|
Logger::warning("Failed to join _runner thread on exit!");
|
|
pthread_cancel(Runner::runner_id);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#ifdef GPU_SUPPORT
|
|
Gpu::Nvml::shutdown();
|
|
Gpu::Rsmi::shutdown();
|
|
#endif
|
|
|
|
Config::write();
|
|
|
|
if (Term::initialized) {
|
|
Input::clear();
|
|
Term::restore();
|
|
}
|
|
|
|
if (not Global::exit_error_msg.empty()) {
|
|
sig = 1;
|
|
Logger::error(Global::exit_error_msg);
|
|
fmt::println(std::cerr, "{}ERROR: {}{}{}", Global::fg_red, Global::fg_white, Global::exit_error_msg, Fx::reset);
|
|
}
|
|
Logger::info("Quitting! Runtime: " + sec_to_dhms(time_s() - Global::start_time));
|
|
|
|
const auto excode = (sig != -1 ? sig : 0);
|
|
|
|
#if defined __APPLE__ || defined __OpenBSD__
|
|
_Exit(excode);
|
|
#else
|
|
quick_exit(excode);
|
|
#endif
|
|
}
|
|
|
|
//* Handler for SIGTSTP; stops threads, restores terminal and sends SIGSTOP
|
|
void _sleep() {
|
|
Runner::stop();
|
|
Term::restore();
|
|
std::raise(SIGSTOP);
|
|
}
|
|
|
|
//* Handler for SIGCONT; re-initialize terminal and force a resize event
|
|
void _resume() {
|
|
Term::init();
|
|
term_resize(true);
|
|
}
|
|
|
|
void _exit_handler() {
|
|
clean_quit(-1);
|
|
}
|
|
|
|
void _signal_handler(const int sig) {
|
|
switch (sig) {
|
|
case SIGINT:
|
|
if (Runner::active) {
|
|
Global::should_quit = true;
|
|
Runner::stopping = true;
|
|
Input::interrupt = true;
|
|
}
|
|
else {
|
|
clean_quit(0);
|
|
}
|
|
break;
|
|
case SIGTSTP:
|
|
if (Runner::active) {
|
|
Global::should_sleep = true;
|
|
Runner::stopping = true;
|
|
Input::interrupt = true;
|
|
}
|
|
else {
|
|
_sleep();
|
|
}
|
|
break;
|
|
case SIGCONT:
|
|
_resume();
|
|
break;
|
|
case SIGWINCH:
|
|
term_resize();
|
|
break;
|
|
}
|
|
}
|
|
|
|
//* Manages secondary thread for collection and drawing of boxes
|
|
namespace Runner {
|
|
atomic<bool> active (false);
|
|
atomic<bool> stopping (false);
|
|
atomic<bool> waiting (false);
|
|
atomic<bool> redraw (false);
|
|
atomic<bool> coreNum_reset (false);
|
|
|
|
//* Setup semaphore for triggering thread to do work
|
|
#if !defined(__clang__) && __GNUC__ < 11
|
|
sem_t do_work;
|
|
inline void thread_sem_init() { sem_init(&do_work, 0, 0); }
|
|
inline void thread_wait() { sem_wait(&do_work); }
|
|
inline void thread_trigger() { sem_post(&do_work); }
|
|
#else
|
|
std::binary_semaphore do_work(0);
|
|
inline void thread_sem_init() { ; }
|
|
inline void thread_wait() { do_work.acquire(); }
|
|
inline void thread_trigger() { do_work.release(); }
|
|
#endif
|
|
|
|
//* RAII wrapper for pthread_mutex locking
|
|
class thread_lock {
|
|
pthread_mutex_t& pt_mutex;
|
|
public:
|
|
int status;
|
|
thread_lock(pthread_mutex_t& mtx) : pt_mutex(mtx) {
|
|
pthread_mutex_init(&pt_mutex, nullptr);
|
|
status = pthread_mutex_lock(&pt_mutex);
|
|
}
|
|
~thread_lock() {
|
|
if (status == 0)
|
|
pthread_mutex_unlock(&pt_mutex);
|
|
}
|
|
};
|
|
|
|
//* Wrapper for raising priviliges when using SUID bit
|
|
class gain_priv {
|
|
int status = -1;
|
|
public:
|
|
gain_priv() {
|
|
if (Global::real_uid != Global::set_uid)
|
|
this->status = seteuid(Global::set_uid);
|
|
}
|
|
~gain_priv() {
|
|
if (status == 0)
|
|
status = seteuid(Global::real_uid);
|
|
}
|
|
};
|
|
|
|
string output;
|
|
string empty_bg;
|
|
bool pause_output{}; // defaults to false
|
|
sigset_t mask;
|
|
pthread_t runner_id;
|
|
pthread_mutex_t mtx;
|
|
|
|
enum debug_actions {
|
|
collect_begin,
|
|
collect_done,
|
|
draw_begin,
|
|
draw_begin_only,
|
|
draw_done
|
|
};
|
|
|
|
enum debug_array {
|
|
collect,
|
|
draw
|
|
};
|
|
|
|
string debug_bg;
|
|
std::unordered_map<string, array<uint64_t, 2>> debug_times;
|
|
|
|
class MyNumPunct : public std::numpunct<char>
|
|
{
|
|
protected:
|
|
virtual char do_thousands_sep() const { return '\''; }
|
|
virtual std::string do_grouping() const { return "\03"; }
|
|
};
|
|
|
|
|
|
struct runner_conf {
|
|
vector<string> boxes;
|
|
bool no_update;
|
|
bool force_redraw;
|
|
bool background_update;
|
|
string overlay;
|
|
string clock;
|
|
};
|
|
|
|
struct runner_conf current_conf;
|
|
|
|
void debug_timer(const char* name, const int action) {
|
|
switch (action) {
|
|
case collect_begin:
|
|
debug_times[name].at(collect) = time_micros();
|
|
return;
|
|
case collect_done:
|
|
debug_times[name].at(collect) = time_micros() - debug_times[name].at(collect);
|
|
debug_times["total"].at(collect) += debug_times[name].at(collect);
|
|
return;
|
|
case draw_begin_only:
|
|
debug_times[name].at(draw) = time_micros();
|
|
return;
|
|
case draw_begin:
|
|
debug_times[name].at(draw) = time_micros();
|
|
debug_times[name].at(collect) = debug_times[name].at(draw) - debug_times[name].at(collect);
|
|
debug_times["total"].at(collect) += debug_times[name].at(collect);
|
|
return;
|
|
case draw_done:
|
|
debug_times[name].at(draw) = time_micros() - debug_times[name].at(draw);
|
|
debug_times["total"].at(draw) += debug_times[name].at(draw);
|
|
return;
|
|
}
|
|
}
|
|
|
|
//? ------------------------------- Secondary thread: async launcher and drawing ----------------------------------
|
|
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);
|
|
// sigaddset(&mask, SIGTSTP);
|
|
sigaddset(&mask, SIGWINCH);
|
|
sigaddset(&mask, SIGTERM);
|
|
pthread_sigmask(SIG_BLOCK, &mask, nullptr);
|
|
|
|
//? pthread_mutex_lock to lock thread and monitor health from main thread
|
|
thread_lock pt_lck(mtx);
|
|
if (pt_lck.status != 0) {
|
|
Global::exit_error_msg = "Exception in runner thread -> pthread_mutex_lock error id: " + to_string(pt_lck.status);
|
|
Global::thread_exception = true;
|
|
Input::interrupt = true;
|
|
stopping = true;
|
|
}
|
|
|
|
//* ----------------------------------------------- THREAD LOOP -----------------------------------------------
|
|
while (not Global::quitting) {
|
|
thread_wait();
|
|
atomic_wait_for(active, true, 5000);
|
|
if (active) {
|
|
Global::exit_error_msg = "Runner thread failed to get active lock!";
|
|
Global::thread_exception = true;
|
|
Input::interrupt = true;
|
|
stopping = true;
|
|
}
|
|
if (stopping or Global::resized) {
|
|
sleep_ms(1);
|
|
continue;
|
|
}
|
|
|
|
//? Atomic lock used for blocking non thread-safe actions in main thread
|
|
atomic_lock lck(active);
|
|
|
|
//? Set effective user if SUID bit is set
|
|
gain_priv powers{};
|
|
|
|
auto& conf = current_conf;
|
|
|
|
//! DEBUG stats
|
|
if (Global::debug) {
|
|
if (debug_bg.empty() or redraw)
|
|
Runner::debug_bg = Draw::createBox(2, 2, 33,
|
|
#ifdef GPU_SUPPORT
|
|
9,
|
|
#else
|
|
8,
|
|
#endif
|
|
"", true, "μs");
|
|
|
|
debug_times.clear();
|
|
debug_times["total"] = {0, 0};
|
|
}
|
|
|
|
output.clear();
|
|
|
|
//* Run collection and draw functions for all boxes
|
|
try {
|
|
#ifdef GPU_SUPPORT
|
|
//? GPU data collection
|
|
const bool gpu_in_cpu_panel = Gpu::gpu_names.size() > 0 and (
|
|
Config::getS("cpu_graph_lower").starts_with("gpu-") or Config::getS("cpu_graph_upper").starts_with("gpu-")
|
|
or (Gpu::shown == 0 and Config::getS("show_gpu_info") != "Off")
|
|
);
|
|
|
|
vector<unsigned int> gpu_panels = {};
|
|
for (auto& box : conf.boxes)
|
|
if (box.starts_with("gpu"))
|
|
gpu_panels.push_back(box.back()-'0');
|
|
|
|
vector<Gpu::gpu_info> gpus;
|
|
if (gpu_in_cpu_panel or not gpu_panels.empty()) {
|
|
if (Global::debug) debug_timer("gpu", collect_begin);
|
|
gpus = Gpu::collect(conf.no_update);
|
|
if (Global::debug) debug_timer("gpu", collect_done);
|
|
}
|
|
auto& gpus_ref = gpus;
|
|
#else
|
|
vector<Gpu::gpu_info> gpus_ref{};
|
|
#endif
|
|
|
|
//? CPU
|
|
if (v_contains(conf.boxes, "cpu")) {
|
|
try {
|
|
if (Global::debug) debug_timer("cpu", collect_begin);
|
|
|
|
//? Start collect
|
|
auto cpu = Cpu::collect(conf.no_update);
|
|
|
|
if (coreNum_reset) {
|
|
coreNum_reset = false;
|
|
Cpu::core_mapping = Cpu::get_core_mapping();
|
|
Global::resized = true;
|
|
Input::interrupt = true;
|
|
continue;
|
|
}
|
|
|
|
if (Global::debug) debug_timer("cpu", draw_begin);
|
|
|
|
//? Draw box
|
|
if (not pause_output) output += Cpu::draw(cpu, gpus_ref, conf.force_redraw, conf.no_update);
|
|
|
|
if (Global::debug) debug_timer("cpu", draw_done);
|
|
}
|
|
catch (const std::exception& e) {
|
|
throw std::runtime_error("Cpu:: -> " + string{e.what()});
|
|
}
|
|
}
|
|
#ifdef GPU_SUPPORT
|
|
//? GPU
|
|
if (not gpu_panels.empty() and not gpus_ref.empty()) {
|
|
try {
|
|
if (Global::debug) debug_timer("gpu", draw_begin_only);
|
|
|
|
//? Draw box
|
|
if (not pause_output)
|
|
for (unsigned long i = 0; i < gpu_panels.size(); ++i)
|
|
output += Gpu::draw(gpus_ref[gpu_panels[i]], i, conf.force_redraw, conf.no_update);
|
|
|
|
if (Global::debug) debug_timer("gpu", draw_done);
|
|
}
|
|
catch (const std::exception& e) {
|
|
throw std::runtime_error("Gpu:: -> " + string{e.what()});
|
|
}
|
|
}
|
|
#endif
|
|
//? MEM
|
|
if (v_contains(conf.boxes, "mem")) {
|
|
try {
|
|
if (Global::debug) debug_timer("mem", collect_begin);
|
|
|
|
//? Start collect
|
|
auto mem = Mem::collect(conf.no_update);
|
|
|
|
if (Global::debug) debug_timer("mem", draw_begin);
|
|
|
|
//? Draw box
|
|
if (not pause_output) output += Mem::draw(mem, conf.force_redraw, conf.no_update);
|
|
|
|
if (Global::debug) debug_timer("mem", draw_done);
|
|
}
|
|
catch (const std::exception& e) {
|
|
throw std::runtime_error("Mem:: -> " + string{e.what()});
|
|
}
|
|
}
|
|
|
|
//? NET
|
|
if (v_contains(conf.boxes, "net")) {
|
|
try {
|
|
if (Global::debug) debug_timer("net", collect_begin);
|
|
|
|
//? Start collect
|
|
auto net = Net::collect(conf.no_update);
|
|
|
|
if (Global::debug) debug_timer("net", draw_begin);
|
|
|
|
//? Draw box
|
|
if (not pause_output) output += Net::draw(net, conf.force_redraw, conf.no_update);
|
|
|
|
if (Global::debug) debug_timer("net", draw_done);
|
|
}
|
|
catch (const std::exception& e) {
|
|
throw std::runtime_error("Net:: -> " + string{e.what()});
|
|
}
|
|
}
|
|
|
|
//? PROC
|
|
if (v_contains(conf.boxes, "proc")) {
|
|
try {
|
|
if (Global::debug) debug_timer("proc", collect_begin);
|
|
|
|
//? Start collect
|
|
auto proc = Proc::collect(conf.no_update);
|
|
|
|
if (Global::debug) debug_timer("proc", draw_begin);
|
|
|
|
//? Draw box
|
|
if (not pause_output) output += Proc::draw(proc, conf.force_redraw, conf.no_update);
|
|
|
|
if (Global::debug) debug_timer("proc", draw_done);
|
|
}
|
|
catch (const std::exception& e) {
|
|
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::thread_exception = true;
|
|
Input::interrupt = true;
|
|
stopping = true;
|
|
}
|
|
|
|
if (stopping) {
|
|
continue;
|
|
}
|
|
|
|
if (redraw or conf.force_redraw) {
|
|
empty_bg.clear();
|
|
redraw = false;
|
|
}
|
|
|
|
if (not pause_output) output += conf.clock;
|
|
if (not conf.overlay.empty() and not conf.background_update) pause_output = true;
|
|
if (output.empty() and not pause_output) {
|
|
if (empty_bg.empty()) {
|
|
const int x = Term::width / 2 - 10, y = Term::height / 2 - 10;
|
|
output += Term::clear;
|
|
empty_bg = fmt::format(
|
|
"{banner}"
|
|
"{mv1}{titleFg}{b}No boxes shown!"
|
|
"{mv2}{hiFg}1 {mainFg}| Show CPU box"
|
|
"{mv3}{hiFg}2 {mainFg}| Show MEM box"
|
|
"{mv4}{hiFg}3 {mainFg}| Show NET box"
|
|
"{mv5}{hiFg}4 {mainFg}| Show PROC box"
|
|
"{mv6}{hiFg}5-0 {mainFg}| Show GPU boxes"
|
|
"{mv7}{hiFg}esc {mainFg}| Show menu"
|
|
"{mv8}{hiFg}q {mainFg}| Quit",
|
|
"banner"_a = Draw::banner_gen(y, 0, true),
|
|
"titleFg"_a = Theme::c("title"), "b"_a = Fx::b, "hiFg"_a = Theme::c("hi_fg"), "mainFg"_a = Theme::c("main_fg"),
|
|
"mv1"_a = Mv::to(y+6, x),
|
|
"mv2"_a = Mv::to(y+8, x),
|
|
"mv3"_a = Mv::to(y+9, x),
|
|
"mv4"_a = Mv::to(y+10, x),
|
|
"mv5"_a = Mv::to(y+11, x),
|
|
"mv6"_a = Mv::to(y+12, x-2),
|
|
"mv7"_a = Mv::to(y+13, x-2),
|
|
"mv8"_a = Mv::to(y+14, x)
|
|
);
|
|
}
|
|
output += empty_bg;
|
|
}
|
|
|
|
//! DEBUG stats -->
|
|
if (Global::debug and not Menu::active) {
|
|
output += fmt::format("{pre}{box:5.5} {collect:>12.12} {draw:>12.12}{post}",
|
|
"pre"_a = debug_bg + Theme::c("title") + Fx::b,
|
|
"box"_a = "box", "collect"_a = "collect", "draw"_a = "draw",
|
|
"post"_a = Theme::c("main_fg") + Fx::ub
|
|
);
|
|
static auto loc = std::locale(std::locale::classic(), new MyNumPunct);
|
|
#ifdef GPU_SUPPORT
|
|
for (const string name : {"cpu", "mem", "net", "proc", "gpu", "total"}) {
|
|
#else
|
|
for (const string name : {"cpu", "mem", "net", "proc", "total"}) {
|
|
#endif
|
|
if (not debug_times.contains(name)) debug_times[name] = {0,0};
|
|
const auto& [time_collect, time_draw] = debug_times.at(name);
|
|
if (name == "total") output += Fx::b;
|
|
output += fmt::format(loc, "{mvLD}{name:5.5} {collect:12L} {draw:12L}",
|
|
"mvLD"_a = Mv::l(31) + Mv::d(1),
|
|
"name"_a = name,
|
|
"collect"_a = time_collect,
|
|
"draw"_a = time_draw
|
|
);
|
|
}
|
|
}
|
|
|
|
//? If overlay isn't empty, print output without color and then print overlay on top
|
|
cout << Term::sync_start << (conf.overlay.empty()
|
|
? output
|
|
: (output.empty() ? "" : Fx::ub + Theme::c("inactive_fg") + Fx::uncolor(output)) + conf.overlay)
|
|
<< Term::sync_end << flush;
|
|
}
|
|
//* ----------------------------------------------- THREAD LOOP -----------------------------------------------
|
|
return {};
|
|
}
|
|
//? ------------------------------------------ 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) {
|
|
atomic_wait_for(active, true, 5000);
|
|
if (active) {
|
|
Logger::error("Stall in Runner thread, restarting!");
|
|
active = false;
|
|
// exit(1);
|
|
pthread_cancel(Runner::runner_id);
|
|
if (pthread_create(&Runner::runner_id, nullptr, &Runner::_runner, nullptr) != 0) {
|
|
Global::exit_error_msg = "Failed to re-create _runner thread!";
|
|
clean_quit(1);
|
|
}
|
|
}
|
|
if (stopping or Global::resized) return;
|
|
|
|
if (box == "overlay") {
|
|
cout << Term::sync_start << Global::overlay << Term::sync_end << flush;
|
|
}
|
|
else if (box == "clock") {
|
|
cout << Term::sync_start << Global::clock << Term::sync_end << flush;
|
|
}
|
|
else {
|
|
Config::unlock();
|
|
Config::lock();
|
|
|
|
current_conf = {
|
|
(box == "all" ? Config::current_boxes : vector{box}),
|
|
no_update, force_redraw,
|
|
(not Config::getB("tty_mode") and Config::getB("background_update")),
|
|
Global::overlay,
|
|
Global::clock
|
|
};
|
|
|
|
if (Menu::active and not current_conf.background_update) Global::overlay.clear();
|
|
|
|
thread_trigger();
|
|
atomic_wait_for(active, false, 10);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//* Stops any work being done in runner thread and checks for thread errors
|
|
void stop() {
|
|
stopping = true;
|
|
int ret = pthread_mutex_trylock(&mtx);
|
|
if (ret != EBUSY and not Global::quitting) {
|
|
if (active) active = false;
|
|
Global::exit_error_msg = "Runner thread died unexpectedly!";
|
|
clean_quit(1);
|
|
}
|
|
else if (ret == EBUSY) {
|
|
atomic_wait_for(active, true, 5000);
|
|
if (active) {
|
|
active = false;
|
|
if (Global::quitting) {
|
|
return;
|
|
}
|
|
else {
|
|
Global::exit_error_msg = "No response from Runner thread, quitting!";
|
|
clean_quit(1);
|
|
}
|
|
}
|
|
thread_trigger();
|
|
atomic_wait_for(active, false, 100);
|
|
atomic_wait_for(active, true, 100);
|
|
}
|
|
stopping = false;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//* --------------------------------------------- Main starts here! ---------------------------------------------------
|
|
int main(int argc, char **argv) {
|
|
|
|
//? ------------------------------------------------ INIT ---------------------------------------------------------
|
|
|
|
Global::start_time = time_s();
|
|
|
|
//? Save real and effective userid's and drop priviliges until needed if running with SUID bit set
|
|
Global::real_uid = getuid();
|
|
Global::set_uid = geteuid();
|
|
if (Global::real_uid != Global::set_uid) {
|
|
if (seteuid(Global::real_uid) != 0) {
|
|
Global::real_uid = Global::set_uid;
|
|
Global::exit_error_msg = "Failed to change effective user ID. Unset btop SUID bit to ensure security on this system. Quitting!";
|
|
clean_quit(1);
|
|
}
|
|
}
|
|
|
|
//? Call argument parser if launched with arguments
|
|
if (argc > 1) argumentParser(argc, argv);
|
|
|
|
//? Setup paths for config, log and user themes
|
|
for (const auto& env : {"XDG_CONFIG_HOME", "HOME"}) {
|
|
if (std::getenv(env) != nullptr and access(std::getenv(env), W_OK) != -1) {
|
|
Config::conf_dir = fs::path(std::getenv(env)) / (((string)env == "HOME") ? ".config/btop" : "btop");
|
|
break;
|
|
}
|
|
}
|
|
if (Config::conf_dir.empty()) {
|
|
fmt::println("WARNING: Could not get path user HOME folder.\n"
|
|
"Make sure $XDG_CONFIG_HOME or $HOME environment variables is correctly set to fix this.");
|
|
}
|
|
else {
|
|
if (std::error_code ec; not fs::is_directory(Config::conf_dir) and not fs::create_directories(Config::conf_dir, ec)) {
|
|
fmt::println("WARNING: Could not create or access btop config directory. Logging and config saving disabled.\n"
|
|
"Make sure $XDG_CONFIG_HOME or $HOME environment variables is correctly set to fix this.");
|
|
}
|
|
else {
|
|
Config::conf_file = Config::conf_dir / "btop.conf";
|
|
Logger::logfile = Config::conf_dir / "btop.log";
|
|
Theme::user_theme_dir = Config::conf_dir / "themes";
|
|
if (not fs::exists(Theme::user_theme_dir) and not fs::create_directory(Theme::user_theme_dir, ec)) Theme::user_theme_dir.clear();
|
|
}
|
|
}
|
|
//? Try to find global btop theme path relative to binary path
|
|
#ifdef __linux__
|
|
{ std::error_code ec;
|
|
Global::self_path = fs::read_symlink("/proc/self/exe", ec).remove_filename();
|
|
}
|
|
#elif __APPLE__
|
|
{
|
|
char buf [PATH_MAX];
|
|
uint32_t bufsize = PATH_MAX;
|
|
if(!_NSGetExecutablePath(buf, &bufsize))
|
|
Global::self_path = fs::path(buf).remove_filename();
|
|
}
|
|
#endif
|
|
if (std::error_code ec; not Global::self_path.empty()) {
|
|
Theme::theme_dir = fs::canonical(Global::self_path / "../share/btop/themes", ec);
|
|
if (ec or not fs::is_directory(Theme::theme_dir) or access(Theme::theme_dir.c_str(), R_OK) == -1) Theme::theme_dir.clear();
|
|
}
|
|
//? If relative path failed, check two most common absolute paths
|
|
if (Theme::theme_dir.empty()) {
|
|
for (auto theme_path : {"/usr/local/share/btop/themes", "/usr/share/btop/themes"}) {
|
|
if (fs::is_directory(fs::path(theme_path)) and access(theme_path, R_OK) != -1) {
|
|
Theme::theme_dir = fs::path(theme_path);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//? Config init
|
|
{ vector<string> load_warnings;
|
|
Config::load(Config::conf_file, load_warnings);
|
|
|
|
if (Config::current_boxes.empty()) Config::check_boxes(Config::getS("shown_boxes"));
|
|
Config::set("lowcolor", (Global::arg_low_color ? true : not Config::getB("truecolor")));
|
|
|
|
if (Global::debug) {
|
|
Logger::set("DEBUG");
|
|
Logger::debug("Starting in DEBUG mode!");
|
|
}
|
|
else Logger::set(Config::getS("log_level"));
|
|
|
|
Logger::info("Logger set to " + (Global::debug ? "DEBUG" : Config::getS("log_level")));
|
|
|
|
for (const auto& err_str : load_warnings) Logger::warning(err_str);
|
|
}
|
|
|
|
//? Try to find and set a UTF-8 locale
|
|
if (std::setlocale(LC_ALL, "") != nullptr and not s_contains((string)std::setlocale(LC_ALL, ""), ";")
|
|
and str_to_upper(s_replace((string)std::setlocale(LC_ALL, ""), "-", "")).ends_with("UTF8")) {
|
|
Logger::debug("Using locale " + (string)std::setlocale(LC_ALL, ""));
|
|
}
|
|
else {
|
|
string found;
|
|
bool set_failure{}; // defaults to false
|
|
for (const auto loc_env : array{"LANG", "LC_ALL"}) {
|
|
if (std::getenv(loc_env) != nullptr and str_to_upper(s_replace((string)std::getenv(loc_env), "-", "")).ends_with("UTF8")) {
|
|
found = std::getenv(loc_env);
|
|
if (std::setlocale(LC_ALL, found.c_str()) == nullptr) {
|
|
set_failure = true;
|
|
Logger::warning("Failed to set locale " + found + " continuing anyway.");
|
|
}
|
|
}
|
|
}
|
|
if (found.empty()) {
|
|
if (setenv("LC_ALL", "", 1) == 0 and setenv("LANG", "", 1) == 0) {
|
|
try {
|
|
if (const auto loc = std::locale("").name(); not loc.empty() and loc != "*") {
|
|
for (auto& l : ssplit(loc, ';')) {
|
|
if (str_to_upper(s_replace(l, "-", "")).ends_with("UTF8")) {
|
|
found = l.substr(l.find('=') + 1);
|
|
if (std::setlocale(LC_ALL, found.c_str()) != nullptr) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (...) { found.clear(); }
|
|
}
|
|
}
|
|
//
|
|
#ifdef __APPLE__
|
|
if (found.empty()) {
|
|
CFLocaleRef cflocale = CFLocaleCopyCurrent();
|
|
CFStringRef id_value = (CFStringRef)CFLocaleGetValue(cflocale, kCFLocaleIdentifier);
|
|
auto loc_id = CFStringGetCStringPtr(id_value, kCFStringEncodingUTF8);
|
|
CFRelease(cflocale);
|
|
std::string cur_locale = (loc_id != nullptr ? loc_id : "");
|
|
if (cur_locale.empty()) {
|
|
Logger::warning("No UTF-8 locale detected! Some symbols might not display correctly.");
|
|
}
|
|
else if (std::setlocale(LC_ALL, string(cur_locale + ".UTF-8").c_str()) != nullptr) {
|
|
Logger::debug("Setting LC_ALL=" + cur_locale + ".UTF-8");
|
|
}
|
|
else if(std::setlocale(LC_ALL, "en_US.UTF-8") != nullptr) {
|
|
Logger::debug("Setting LC_ALL=en_US.UTF-8");
|
|
}
|
|
else {
|
|
Logger::warning("Failed to set macos locale, continuing anyway.");
|
|
}
|
|
}
|
|
#else
|
|
if (found.empty() and Global::utf_force)
|
|
Logger::warning("No UTF-8 locale detected! Forcing start with --utf-force argument.");
|
|
else if (found.empty()) {
|
|
Global::exit_error_msg = "No UTF-8 locale detected!\nUse --utf-force argument to force start if you're sure your terminal can handle it.";
|
|
clean_quit(1);
|
|
}
|
|
#endif
|
|
else if (not set_failure)
|
|
Logger::debug("Setting LC_ALL=" + found);
|
|
}
|
|
|
|
//? Initialize terminal and set options
|
|
if (not Term::init()) {
|
|
Global::exit_error_msg = "No tty detected!\nbtop++ needs an interactive shell to run.";
|
|
clean_quit(1);
|
|
}
|
|
|
|
if (Term::current_tty != "unknown") Logger::info("Running on " + Term::current_tty);
|
|
if (not Global::arg_tty and Config::getB("force_tty")) {
|
|
Config::set("tty_mode", true);
|
|
Logger::info("Forcing tty mode: setting 16 color mode and using tty friendly graph symbols");
|
|
}
|
|
#if not defined __APPLE__ && not defined __OpenBSD__
|
|
else if (not Global::arg_tty and Term::current_tty.starts_with("/dev/tty")) {
|
|
Config::set("tty_mode", true);
|
|
Logger::info("Real tty detected: setting 16 color mode and using tty friendly graph symbols");
|
|
}
|
|
#endif
|
|
|
|
//? Check for valid terminal dimensions
|
|
{
|
|
int t_count = 0;
|
|
while (Term::width <= 0 or Term::width > 10000 or Term::height <= 0 or Term::height > 10000) {
|
|
sleep_ms(10);
|
|
Term::refresh();
|
|
if (++t_count == 100) {
|
|
Global::exit_error_msg = "Failed to get size of terminal!";
|
|
clean_quit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//? Platform dependent init and error check
|
|
try {
|
|
Shared::init();
|
|
}
|
|
catch (const std::exception& e) {
|
|
Global::exit_error_msg = "Exception in Shared::init() -> " + string{e.what()};
|
|
clean_quit(1);
|
|
}
|
|
|
|
//? Update list of available themes and generate the selected theme
|
|
Theme::updateThemes();
|
|
Theme::setTheme();
|
|
|
|
//? Setup signal handlers for CTRL-C, CTRL-Z, resume and terminal resize
|
|
std::atexit(_exit_handler);
|
|
std::signal(SIGINT, _signal_handler);
|
|
std::signal(SIGTSTP, _signal_handler);
|
|
std::signal(SIGCONT, _signal_handler);
|
|
std::signal(SIGWINCH, _signal_handler);
|
|
|
|
//? Start runner thread
|
|
Runner::thread_sem_init();
|
|
if (pthread_create(&Runner::runner_id, nullptr, &Runner::_runner, nullptr) != 0) {
|
|
Global::exit_error_msg = "Failed to create _runner thread!";
|
|
clean_quit(1);
|
|
}
|
|
else {
|
|
Global::_runner_started = true;
|
|
}
|
|
|
|
//? Calculate sizes of all boxes
|
|
Config::presetsValid(Config::getS("presets"));
|
|
if (Global::arg_preset >= 0) {
|
|
Config::current_preset = min(Global::arg_preset, (int)Config::preset_list.size() - 1);
|
|
Config::apply_preset(Config::preset_list.at(Config::current_preset));
|
|
}
|
|
|
|
{
|
|
const auto [x, y] = Term::get_min_size(Config::getS("shown_boxes"));
|
|
if (Term::height < y or Term::width < x) {
|
|
term_resize(true);
|
|
Global::resized = false;
|
|
Input::interrupt = false;
|
|
}
|
|
|
|
}
|
|
|
|
Draw::calcSizes();
|
|
|
|
//? Print out box outlines
|
|
cout << Term::sync_start << Cpu::box << Mem::box << Net::box << Proc::box << Term::sync_end << flush;
|
|
|
|
|
|
//? ------------------------------------------------ MAIN LOOP ----------------------------------------------------
|
|
|
|
uint64_t update_ms = Config::getI("update_ms");
|
|
auto future_time = time_ms();
|
|
|
|
try {
|
|
while (not true not_eq not false) {
|
|
//? Check for exceptions in secondary thread and exit with fail signal if true
|
|
if (Global::thread_exception) clean_quit(1);
|
|
else if (Global::should_quit) clean_quit(0);
|
|
else if (Global::should_sleep) { Global::should_sleep = false; _sleep(); }
|
|
|
|
//? Make sure terminal size hasn't changed (in case of SIGWINCH not working properly)
|
|
term_resize(Global::resized);
|
|
|
|
//? Trigger secondary thread to redraw if terminal has been resized
|
|
if (Global::resized) {
|
|
Draw::calcSizes();
|
|
Draw::update_clock(true);
|
|
Global::resized = false;
|
|
if (Menu::active) Menu::process();
|
|
else Runner::run("all", true, true);
|
|
atomic_wait_for(Runner::active, true, 1000);
|
|
}
|
|
|
|
//? Update clock if needed
|
|
if (Draw::update_clock() and not Menu::active) {
|
|
Runner::run("clock");
|
|
}
|
|
|
|
//? Start secondary collect & draw thread at the interval set by <update_ms> config value
|
|
if (time_ms() >= future_time and not Global::resized) {
|
|
Runner::run("all");
|
|
update_ms = Config::getI("update_ms");
|
|
future_time = time_ms() + update_ms;
|
|
}
|
|
|
|
//? Loop over input polling and input action processing
|
|
for (auto current_time = time_ms(); current_time < future_time; current_time = time_ms()) {
|
|
|
|
//? Check for external clock changes and for changes to the update timer
|
|
if (std::cmp_not_equal(update_ms, Config::getI("update_ms"))) {
|
|
update_ms = Config::getI("update_ms");
|
|
future_time = time_ms() + update_ms;
|
|
}
|
|
else if (future_time - current_time > update_ms)
|
|
future_time = current_time;
|
|
|
|
//? Poll for input and process any input detected
|
|
else if (Input::poll(min((uint64_t)1000, future_time - current_time))) {
|
|
if (not Runner::active) Config::unlock();
|
|
|
|
if (Menu::active) Menu::process(Input::get());
|
|
else Input::process(Input::get());
|
|
}
|
|
|
|
//? Break the loop at 1000ms intervals or if input polling was interrupted
|
|
else break;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
catch (const std::exception& e) {
|
|
Global::exit_error_msg = "Exception in main loop -> " + string{e.what()};
|
|
clean_quit(1);
|
|
}
|
|
|
|
}
|