This adds the ability to run with `--network_start_zeroed` or the `start_zeroed` config option, which will zero out the total network usage so that bottom starts with it at zero, rather than the total network usage reported by the OS since boot.
There was an if-condition that only ran if the sort state was false. But this would never be hit since `use_sort_table_value` always set it to false beforehand, so it would be stuck focusing on a hidden menu.
## Description
You can now tell bottom which column the process widget should be sorted
by at startup, instead of always falling back to CPU%.
It's settable in two places: a `default_sort` field under `[processes]`
in the config file, and a `--process_default_sort` CLI flag. The flag
accepts the same column-name aliases that already work in
`[processes].columns` (e.g. `cpu%`, `mem`, `pid`, `name`, `read`,
`t.write`, etc.), and the CLI flag wins over the config setting.
```toml
[processes]
default_sort = "mem"
```
```
btm --process_default_sort mem
```
This piggybacks on the same wiring that #2003 added for the disk and
temperature widgets, just routed through the existing `ProcTableConfig`
so the widget initializer can pick a non-default sort index without
touching any of the runtime sort code.
A few small things worth flagging:
- If the configured column is not actually present in the user's
`columns` list, the widget falls back to the existing default behaviour
(CPU% in normal/grouped mode, PID in tree mode) instead of silently
snapping to column 0. That keeps misconfiguration predictable.
- The deserializer for `ProcColumn` was refactored to share its parsing
with the CLI's value parser, so config-file and CLI accept the exact
same aliases. The set of accepted strings is unchanged from before.
I checked the `# columns =` workaround floating around in #810 and on
Stack Overflow; it changes layout but not the sort key, so it doesn't
actually solve the original ask.
## Issue
Closes: #810
## Testing
_If this change affects the program, please also indicate which
platforms were tested:_
- [ ] _Windows_
- [ ] _macOS (specify version below)_
- [x] _Linux (Kali, kernel 6.19)_
- [ ] _Other (specify below)_
Added unit tests for `ProcWidgetState::new` covering the happy path
(sort index actually lands on the configured column) and the fallback
path (configured column not in the column list). Also added valid +
invalid config integration tests under `tests/valid_configs/` and
`tests/invalid_configs/`, matching the pattern used for the disk/temp
default-sort tests.
`cargo test`, `cargo clippy --all -- -D warnings`, and `cargo fmt
--check` are all clean.
Manual smoke test: ran `btm --process_default_sort=mem` and `btm
--process_default_sort=garbage`. The first starts the widget sorted by
Mem%, the second exits early with `'garbage' is not a valid process
column for --process_default_sort` from the args layer. Also ran `btm -C
tests/valid_configs/proc_default_sort.toml` to confirm the config-file
path works the same way.
## Checklist
_Ensure **all** of these are met:_
- [x] _If this PR adds or changes a dependency, please justify this in
the description_ (no new deps)
- [x] _If this is a code change, areas your change affects have been
linted using (`cargo fmt`)_
- [x] _If this is a code change, your changes pass `cargo clippy --all
-- -D warnings`_
- [x] _If this is a code change, new tests were added if relevant_
- [x] _If this is a code change, your changes pass `cargo test`_
- [x] _The change has been tested to work (see above) and doesn't appear
to break other things_
- [x] _Documentation has been updated if needed (`README.md`, help menu,
docs, configs, etc.)_
- [x] _There are no merge conflicts_
- [x] _You have reviewed your changes first_
- [x] _The pull request passes the provided CI pipeline_
## Other
The schema under `schema/nightly/bottom.json` was regenerated via `cargo
run --features generate_schema --bin schema`; the only diff is the new
`default_sort` entry on `ProcessesConfig`, mirroring what's already
there on `DiskConfig` and `TemperatureConfig`.
---------
Co-authored-by: ClementTsang <dev@cjhtsang.ca>
* add generalized input field file
* partial migration
* even more!
* app is clean
* move over canvas
* finish migrating
* fmt
* update and generate some tests
* Add test comments
* fix logic issue with me trying to avoid a second cursor
* fix delete word behaviour with unicode
* update changelog
* remove unused reset
* some test updates + cleanup
* clippy
* comment
* remove redundant shrink_to_fit
* tmp
* intermediate work
* delete some code
* hook things up
* use QueryOptions everywhere instead
* comments
* more cleanup
* even more cleanup
* fmt
* update comment
* some more tests while I'm at it
* add todo for additional tests
* more empty quotes
* more empty quote testing
* even more tests
* driveby test for arg tests
* basic priority and nice functionality
* fix fmt, clippy and tests
* trying to fix other platform build errors
* fmt fix
* trying more fixes
* clean project
* refactored nice to be for all unix systems
* few more places where I had to change cfg for Nice
* Fix scheme names issues
* fix for schema
* fmt
* fixed clippy errors
* 'nice' fix
* fmt
* fixed cfg in tests also
* trying to fix macos test errors
* fix nice value extraction for mac
* modularised nice and priority for mac and freebsd
* fmt
* more multi target to unix
* removing unnecesary guards
* added safety comments
- also reverted string array reference changes
utils fix
* weird utils clippy error fix
* removed unneeded commit
* not needed after main merge(?)
* add nohash and rustc-hash
* use fxhash by default
* comment
* fmt
* clippy
* use nohash for pid stuff
* fix import
* fix imports again
* fix windows type for gpu pid
* hide k-threads init
comment
* add config for hide_k_threads
arg help
* update docs for hide_k_threads
* add test_toggle_k_thread for process_table
* update help text and schema
* add hide_k_threads to sample_configs default
* add Virt column to sample default config
* update sample demo config column name for schema ci
* force_rerender_and_update from toggle_k_threads for updates when frozen
* use is_kernel for ProcessType
* remove todo
* Apply suggestions from code review
Co-authored-by: Clement Tsang <34804052+ClementTsang@users.noreply.github.com>
---------
Co-authored-by: Clement Tsang <34804052+ClementTsang@users.noreply.github.com>
* feature: add support for threads in linux
* bump version too
* only enable for linux for now
* thread some things around
* update changelog
* add highlighting support
* fmt and run schema
* how did this get added
* hmmm cfg in if seems to not work
* fix updated fields
* fixes
* revert uptime rename
* some cleanup
* fix doc
* oop
Allow using the left arrow to collapse a tree branch in the process widget, or a right arrow to expand it.
---------
Co-authored-by: Clement Tsang <34804052+ClementTsang@users.noreply.github.com>
* move widgets
* reduce allocations needed
* ah
* more possible optimizations around reducing allocs
* some fixes
* I forgot to clear the buffer oops
* missing
* only run terminal cleanup after certain point
* refactor: add new method of storing timeseries data
* mostly finish adding data
* tmp
* migrate over to separate lib
* prepare to migrate over to new timeseries storage
* prepare to migrate frozen state
* migrate frozen state
* name
* migrate data collection
* migrate network
* fix some stuff
* fix a panic from bad pruning
* Fix pruning issues
* migrate RAM
* migrate swap
* migrate cache label
* refactor out to function
* migrate ram points
* migrate swap points
* migrate cache points
* migrate arc
* migrate gpu, remove a bunch of state code around force update
* rename cache, also some comments
* some temp cleanup
* migrate disk
* comments to remind me above fixmes, fix bug around time graph spans
* migrate load avg
* port temps
* style
* fix bug wiwth left edge gap
* partial migration of cpu, reorganize data file structure
* migrate cpu
* some cleanup
* fix bug with cpu widget + clippy
* start some small optimization work
* fix some things for some platforms
* refactor: rename data_collection to collection
* refactor: only process temp type in data eat step
* flatten components folder a bit
* partially migrate to new graph system and fix cpu bug
* driveby migration of process list to reduce allocs + more migration of points drawing
* revert the collection change
Forgot that I cut a new `Data` on each collection so that change was
useless.
* port over network stuff...
* fully migrate network, and fix some log bugs while we're at it
This is something I never noticed, but the log of 0 is inf - so there
were gaps in the lines when using log scaling!
* fix cpu colour in all mode
* clean up some disk table stuff
* run a dep bump
* add widget border type
* feature: support custom widget borders
* fmt
* remove none since it looks really bad
* fix bug with title for tables with no title when expanded
* fix jsonschema
* fix some unused stuff
* refactor: lines
* shift around some stuff in Cargo.toml
* some docs
* some more cargo stuff
* clean up a bunch of stuff after making things less public
* clippy lints
* a lot more cleanup
* clippy
* fix some errors
* fix for windows
A loooooong time ago (wow, it's been 4 years apparently...), I made the brilliant (/s) decision to use both lib.rs and main.rs because I was trying to add tests in the tests folder that needed private access to some functions in the src - and at the time, the only way I could think of doing so was exposing bottom as a library and a binary.
This isn't necessarily bad, but for my use case, it's pretty unnecessary nowadays (since I've moved all my tests back into the source files) and adds complexity in looking for certain things, so it's high time we move things around and remove lib.rs. I also took the time to clean up some weird code I spotted along the way.
* other: organize some utility function files
* deps: remove kstring
* refactor: some naming changes
* refactor: some more small refactoring/naming changes
* simplify to_cell to return a Cow
* enable lints
* refactor: group together some canvas files
* rename file
* more shuffling around
* fmt
* more shuffling
Going to flatten widgets in another PR.
* some docs
* naming
* fmt
* Add gpu util, power and procs.
Consolidated gpu calls into `data_harvester`.
Changed config flag from `enable_gpu_memory` to `enable_gpu`.
Added GPU utilization to the cpu widget.
Added GPU process memory usage and utilization percentage to the proc widget.
Added key binds for gpu process toggling.
Added GPU power usage to the battery widget.
Added bounds check to battery widget header.
Show battery widget header when `gpu_enable`.
Added feature flag `legacy-functions` to `nvml-wrapper`.
updated config file(s).
updated help text.
updated docs.
* Code Review:
Remove GPU util from cpu widget
Remove GPU power from battery widget
Use reference for gpu widgets_to_harvest
Extract match arm to function for feature gate
* Code Review: add gmem% toggle
* Do not poll gpu temp when filtered
* Code Review Two Changes:
adjust doc wordings
remove extra references
remove extra widget harvest checks
init proc gpu values
use convert_temp_unit for gpu temp