# yaib: Yet Another i3 Bar yaib is a very simple (at this time of writing) status bar for the i3 window manager (X11) that leverages async computation to limit performance bottlenecks. This results in a very resource efficient bar capable of displaying statistics and other things you'd like to display. yaib is very immature at this writing. Lots of things you want won't be here. Some features: - Expandable. Each block has an `icon` value which can then be clicked on to expand it. Combine it with the urgency coloring values, and you don't have to see text updating all day; just the colors when it matters. - Pages: Flip between lots of different pages using the arrows. This way you can hide less important things you care about in your bar, but get to them when you want to. - Resource light: yaib is very small and uses almost no resources. For an example of the expansion, here's the expanded Disk section in the default configuration: And here it is collapsed (just click): ## Installation Release: ``` cargo install yaib ``` Development (recommended): ``` cargo install --git https://github.com/erikh/yaib ``` ## Execution & Setup ``` yaib ``` Will emit the bar's contents to standard output in JSON format. To integrate it into your i3 installation, provide a stanza like so in your `~/.config/i3/config` file; remember to remove any other block like it. **NOTE:** in this block, you must replace `$HOME` with your home directory. ``` bar { font pango:monospace 10, FontAwesome 10 position bottom status_command $HOME/.cargo/bin/yaib colors { separator #666666 background #222222 statusline #dddddd focused_workspace #0088CC #0088CC #ffffff active_workspace #333333 #333333 #ffffff inactive_workspace #333333 #333333 #888888 urgent_workspace #2f343a #900000 #ffffff } } ``` Do this and reload your configuration (mod + shift + r by default) and the bar should appear! ## Configuration There is an [example](example_config.yaml) configuration file. This configuration file can either be specified by setting `YAIB_CONFIG` in the environment, or by making a file in `$XDG_CONFIG_HOME/yaib/yaib.config.yaml`. Field descriptions follow: - `update_interval` is the amount of time to wait before polling the system, and displaying new stats. It is specified in [fancy duration format](https://docs.rs/fancy-duration/latest/fancy_duration/struct.FancyDuration.html) which you can read more about at that link. - `pages` is a list of pages to flip through. Each page consists of a list of items: - `name` is the name of the block. It is required, and must be unique for all blocks. - `icon` is the short initial clickable content. Not supported on static values. If not provided, it will display the formatted content always. - `urgency` is a 3-element tuple of values that are all under 100. They correspond to urgency values, green/yellow/red. Not supported on static or music values. When under the minimum, the default text color is used. - `urgency_colors` is a 3-element tuple of `#rrggbb` values. These values are used when the urgency thresholds are set. - `type` is the type of block. `value` and `format` are dependent on this type, so they will be specified with the type below: - `command` runs a command. It does not run it through a shell, and tokenizes the value by whitespace. The value is the command to run. `update_interval` can be used to override the global `update_interval` for slow running or needlessly updating commands. See `example_command.sh` for more information. The command must emit (and only emit) a JSON blob with the following three parameters: - `name`: this is the name of the block you configured it with, so it can map back. - `value`: this is the data you want to show in the bar. The icon will be automatically concatenated if it exists. - `percent`: this is optional, an integer from 0-100 which helps with urgency coloring. - `dynamic` is only for types which are updated by the unix socket (see below). It carries no value and communicates no urgency and has no format. - `static` just displays a static string set in the `value`. No formatting is applied. - `music` displays several options for listing the current music track playing via MPRIS (e.g., spotify, xmms). No value is used. - `%artist` is the current artist - `%title` is the current track title - `%pct_played` is the whole number percentage of how far along in the track you are. - `%total_played` is the `minute:second` time well suited for regular updates. - `cpu` are CPU metrics. Both `%count` (number of CPUs) and `%usage` are available as format strings. - `disk` are storage metrics. The `value` is a mount point. - `%total` is the total user storage - `%usage` is the amount used - `%pct` is the percent of disk used. - `memory` are memory metrics. No value is used. - `%total` is the total user memory - `%usage` is the amount used - `%swap_total` is the amount of swap available - `%swap_usage` is the amount of swap used - `%pct` is the percent of memory used. - `%pct_swap` is the percent of swap used. - `load` are memory metrics. No value is used. - `%1` is the one minute load average - `%5` is the five minute load average - `%15` is the fifteen minute load average - `time` are time metrics. No value is used. The format is [chrono's strftime format](https://docs.rs/chrono/latest/chrono/format/strftime/index.html) ## Unix Socket **NOTE:** This layer is likely to be changed dramatically in the future. It is recommended that if you use this feature, you use it through `yaib` commands, and not writing to the socket directly, as the protocol is certain to change. You can write blocks using the JSON format also used for the `command` type. One block per write; use `yaib write-block ''` to write directly to the socket. The socket is also located at `/tmp/yaib.sock`; only the most recent copy of `yaib` running will respond to it, but you can use this with `nc` et al to control it. Just barf some JSON at the socket. See [example_command.sh](example_command.sh) for an example of the output format. Whatever the block's `name` value is set to will replace the block in the bar. If this block is not of a `dynamic` type in the configuration, it will not persist and be overwritten by new collection data in the next iteration (this behavior is expected to change in the future). ## License MIT ## Author Erik Hollensbe