Commit Graph
65 Commits
Author SHA1 Message Date
ClementTsang 4ce658b449 add some more tests 2026-08-30 02:47:45 -04:00
ClementTsang c627f76650 clippy 2026-08-30 02:24:47 -04:00
ClementTsang 94fed808c9 start refactoring out ProcColumnWrapper 2026-08-30 02:23:59 -04:00
ClementTsang efae533692 start fix 2026-08-29 19:13:27 -04:00
Clement Tsang 0b22ee4c43 feature: add option to show zeroed total network usage on startup (#2199)
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.
2026-08-17 00:12:21 -04:00
Clement Tsang 726f787b89 bug: fix close logic when pressing enter in sort menu (#2191)
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.
2026-08-13 00:40:41 +00:00
Clement Tsang 95b60c8016 feature: add configurable default column sort order (#2174)
Adds an optional configuration field for the temp/process/disk table widgets to control the default sort order.
2026-07-26 20:37:20 -04:00
Clement Tsang e19480591d deps: bump ratatui to 0.30.2 and ratatui-core to 0.1.2 (#2098) 2026-06-20 22:26:40 +00:00
Clement Tsang 382dfdb80c other: bump min version to 1.95.0 (#2052)
Bumps the minimum version set to 1.95.0. This should give us a couple of neat new features to work with.
2026-06-20 06:16:51 +00:00
ChrisJr404andClementTsang 1888dbb270 feature: configurable default sort column for the process widget (#2053)
## 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>
2026-05-08 00:31:08 -04:00
Clement Tsang 61e56754db feature: basic scrollbar support for tables and dialogs (#2046)
Adds scrollbars to dialogs (help, process kill) and optionally tables.
2026-04-25 09:47:15 +00:00
Clement Tsang 8b548ada95 refactor: run nightly fmt (#2036)
* refactor: run nightly fmt

* manually fix some multilines

* run it again
2026-04-13 05:34:53 +00:00
Clement Tsang d187559af9 refactor: generalize input field logic for easier reuse (#2035)
* 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
2026-04-13 01:24:24 -04:00
Clement Tsang 8353f15a55 refactor: effectively vendor nohash (#2019) 2026-04-11 04:55:33 -04:00
Clement Tsang 6970f0ef61 refactor: clean up some table code (#2014)
* clean up column logic

* some more cleaning around

* clippy
2026-04-11 02:28:38 -04:00
Clement Tsang 7682f9d6b3 refactor: run nightly format on code (#1951) 2026-01-05 03:59:14 -05:00
Clement Tsang b3445b3044 refactor: clean up some query code (#1949)
* 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
2026-01-05 03:51:43 -05:00
Clement Tsang d458d1958b other: fix some config code for nice/priority (#1911)
* other: fix some config code for nice/priority

* driveby change from cfg(target_family=unix) to just cfg(unix)

* remove nice as a default for now
2025-12-21 15:22:00 -05:00
Adarsh Das 102ae6b247 feat: Added priority and nice as columns in process view (#1881)
* 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(?)
2025-12-21 14:31:43 -05:00
Clement Tsang 94af05ee06 refactor: use rustc-hash and nohash (#1902)
* 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
2025-12-19 03:42:46 -05:00
Clement Tsang 86b35bcd79 refactor: use clippy::unwrap_used (#1882)
* refactor: use clippy::unwrap_used

* fix log format use

* fix a bunch of macos ones

* oop

* allow schema script

* driveby schema bump
2025-11-22 23:26:02 -05:00
Clement Tsang e4b814fd0b refactor: optimize username cloning for Unix processes (#1816)
* refactor: rename/update comments for uid_to_username

* use arc<str> instead of cloning user repeatedly

* clippy

* oop

* oop2

* hmmm hopefully that works?

* ugh
2025-09-14 23:47:49 -04:00
Clement Tsang c8614bf2be deps: bump deps and lockfile (#1815)
* deps: bump deps and lockfile

* fix expected error message in test

* fix some windows errors and lint stuff
2025-09-14 19:33:58 +00:00
Justin MartinandClement Tsang b07f940970 feature: hide k-threads (#1772)
* 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>
2025-09-07 18:56:56 -04:00
Clement Tsang 3ff7977e6f feature: add support for threads in linux (#1793)
* 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
2025-08-17 07:07:50 +00:00
2132da2f8b feature: option to have process tree entries be collapsed by default (#1770)
* Add option to have process tree collapsed by default

* Fix collapse logic

* format

* tweak how it's done

* oops

* slight tweaks to the no-children collapse logic

* update schema

---------

Co-authored-by: ceres <ceres.bezuidenhout@trintel.co.za>
Co-authored-by: Bucket-Bucket-Bucket <107044719+Bucket-Bucket-Bucket@users.noreply.github.com>
2025-08-04 23:29:42 +00:00
Clement Tsang 4d935bdd70 feature: support virtual memory column for processes (#1767)
* quick refactor of bytes/name

* oop

* Add virt mem field

* add value

* add virtual memory columns + tests

* fix

* Changelog
2025-07-30 04:24:21 +00:00
Clement Tsang 134888dfec refactor: refactor some process grouping code (#1727)
Remove one clone for process grouping.
2025-05-10 22:24:06 +00:00
Yuri AstrakhanandClement Tsang 729f714bf9 feature: allow left to collapse trees and right to expand them (#1306)
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>
2025-04-21 03:01:18 -04:00
Clement Tsang f7d070f944 refactor: somewhat migrate to Rust 2024 edition (#1681)
* refactor: try bumping to rust 2024 edition

* now run nightly fmt

* fix some macos changes

* only apply a few of these settings
2025-02-22 02:12:08 +00:00
Clement Tsang d63ca07cae refactor: clean up some file structure, process code, and terminal cleanup (#1676)
* 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
2025-02-15 02:32:09 -05:00
Clement Tsang 837e23560f refactor: points rework (v1) (#1663)
* 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
2025-02-03 06:34:58 +00:00
Clement Tsang 0d182e4b3a feature: support custom widget borders (#1642)
* 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
2024-12-05 06:52:55 +00:00
Clement Tsang ae0d350122 refactor: a bunch of cleanup of dead code and misc. stuff (#1634)
* 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
2024-11-28 22:42:17 +00:00
Clement Tsang 6d37d5756f refactor: combine process column code (#1622)
* rename some files

* refactor: combine process column code

* rename some and sort the schema columns
2024-11-14 10:24:24 +00:00
Clement Tsang 02b947dd2d refactor: quick variable/struct/file rename (#1620)
Some renames and file movement. No functional changes.
2024-11-08 04:54:52 +00:00
Clement Tsang 28972a1e64 refactor: refactor styling options (#1499)
Introduce a new configuration system for styling.
2024-07-29 09:03:35 +00:00
Clement Tsang 3602429529 other: add schema test for uncommented default config (#1484)
* other: add schema test for uncommented default time

* ahhh

* forgot to disable this
2024-06-17 00:59:36 -04:00
Clement Tsang 7666a09162 feat: add way to automatically generate new json schemas (#1482) 2024-06-16 19:28:24 -04:00
Clement Tsang 982b7181a6 change: change how disk, temp, and net filters in config are set (#1481)
* change: change how disk, temp, and net filters in config are set

* run rustfmt

* update default config
2024-06-16 02:15:36 -04:00
Clement Tsang 8885910442 refactor: remove lib and move some things around (#1477)
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.
2024-06-05 06:00:21 +00:00
Clement Tsang ee2e1fee1c refactor: use struct for args instead of builder interface (#1472)
* start moving args

* tmp

* refactor config

* port over ags

* update changelog
2024-05-27 01:16:37 -04:00
Clement Tsang 398bf5930f refactor: some string-related code cleanup/refactor (#1463)
* 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
2024-05-07 02:03:30 -04:00
Clement Tsang cd1715cd8f other: add process uptime as a default column (#1411)
* other: add process uptime as a default column

* update docs
2024-02-15 03:27:19 -05:00
Clement Tsang b6660610d0 deps: bump ratatui to 0.26 (#1406)
* deps: bump ratatui to 0.26

* adjust process width

* a few nonzero optimizations

* add a todo

* update comments to be less confusing about time chart
2024-02-03 19:59:12 -05:00
Clement Tsang 77777ef588 refactor: clean up some more drawing/component code (#1372)
* rename battery info widget file

* add widget trait

* move basic table arrows over

* some renaming

* more renaming and shuffling

* cleanup

* fmt
2024-01-02 01:24:13 -05:00
Clement Tsang 228da99489 refactor: move around configuration-related files (#1370)
* rename general utils file

* refactor: move around some configuration files

* more shuffling around

* fix some ugly formatting
2024-01-01 17:20:40 -05:00
Clement Tsang ecb6faa089 refactor: restructure canvas file folder structure (#1368)
* 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
2024-01-01 05:19:52 -05:00
Clement Tsang 22b40780ad refactor: pull data collection out of nested folder structure (#1364)
* refactor: pull data collection out of nested folder structure

* fix sysinfo

* comment
2023-12-27 23:00:58 -05:00
Justin Martin e4a6e751ec feature: Add gpu proc info (#1276)
* 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
2023-11-19 23:54:15 -05:00