A fast and easy-to-use status bar
Go to file
Patrick Ziegler ce93188a4a
Add units support (POINT, PIXEL, SPACE) (#2578)
* add units support (POINT, PIXEL, SPACE) for polybar

- add a size_with_unit struct
- add a geometry_format_values struct
- move dpi initialisation from renderer.cpp to bar.cpp
- add a string to size_with_unit converter
- add point support (with pt)
- add pixel support (with px)

* Fix unit test compilation

* clang-format

* Better names

The old names didn't really capture the purpose of the structs and
function.

space_type -> spacing_type
space_size -> spacing_val

size_type -> extent_type
geometry -> extent_val

geometry_format_values -> percentage_with_offset

* Remove parse_size_with_unit

No longer needed. The convert<spacing_val> function in config.cpp
already does all the work for us and always setting the type to pixel
was wrong.

In addition, line-size should not be of type spacing_val but extent_val.

* Cleanup

I tried to address most of my comments on the old PR

* Fix renderer width calculation

We can't just blindly add the x difference to the width because for
example the width should increase if x < width and the increase keeps
x < width.

Similarly, we can't just add the offset to the width.

* Rename geom_format_to_pixels to percentage_with_offset_to_pixel

* Cleanup

* Apply suggested changes from Patrick on GitHub

Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>

* Update src/components/bar.cpp

Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>

* Update src/components/config.cpp

Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>

* Update src/components/builder.cpp

Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>

* Update src/components/builder.cpp

Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>

* config: Use stod for parsing percentage

* Use stof instead of strtof

* units: Fix test edge cases

* Remove unnecessary clang-format toggle

* Use percentage_with_offset for margin-{top,bottom}

* Support negative extent values

* Rename unit to units and create a cpp file

* Move percentage_with_offset_to_pixel unit test to units

* Add unit tests for units_utils

* Clarify when and how negative spacing/extent is allowed

Negative spacing is never allowed and produces a config error.

Extents allow negative values in theory, but only a few use-cases accept
it.
Only the extent value used for the `%{O}` tag and the offset value in
percentage_with_offset can be negative. Everything else is capped below
at 0.

The final pixel value of percentage_with_offset also caps below at 0.

* Fix parsing errors not being caught in config

* Print a proper error message for uncaught exceptions

* Cleanup module::get_output

All changes preserve the existing semantics

* Stop using remove_trailing_space in module::get_output

Instead, we first check if the current tag is built, and only if it is,
the spacing is prepended.

* Remove unused imports

* Restore old behavior

If there are two tags and the second one isn't built (module::build
returns false), the space in between them is removed.
For example in the mpd module:

format-online = <toggle> <label-song> foo

If mpd is not running, the mpd module will return false when trying to
build the `<label-song>` tag. If we don't remove the space between
`<toggle>` and `<label-song>`, we end up with two spaces between
`<toggle>` and `foo`.

This change is to match the old behavior where at least one trailing
space character was removed from the builder.

* Add changelog entry

* Remove unused setting

* Use percentage with offset for tray-offset

Co-authored-by: Jérôme BOULMIER <jerome.boulmier@outlook.fr>
Co-authored-by: Joe Groocock <github@frebib.net>
2022-02-20 21:08:57 +01:00
.github Use sockets for IPC (#2539) 2022-01-22 20:35:37 +01:00
cmake Use sockets for IPC (#2539) 2022-01-22 20:35:37 +01:00
common cmake: Stop using CMAKE_* variables for flags 2021-07-11 14:47:26 +02:00
contrib Create default config (#2511) 2021-10-05 13:07:19 +02:00
doc doc: Defer parsing version_txt to fix an obscure bug 2022-01-31 01:20:18 +01:00
include Add units support (POINT, PIXEL, SPACE) (#2578) 2022-02-20 21:08:57 +01:00
lib Remove unused moodycamel concurrentqueue 2021-09-21 21:43:27 +02:00
src Add units support (POINT, PIXEL, SPACE) (#2578) 2022-02-20 21:08:57 +01:00
tests Add units support (POINT, PIXEL, SPACE) (#2578) 2022-02-20 21:08:57 +01:00
.clang-format Add units support (POINT, PIXEL, SPACE) (#2578) 2022-02-20 21:08:57 +01:00
.clang-tidy Use sockets for IPC (#2539) 2022-01-22 20:35:37 +01:00
.codecov.yml codecov: Disable pull request annotations 2020-12-16 00:06:10 +01:00
.editorconfig Add trim_trailing_whitespace to .editorconfig 2017-09-24 08:31:42 +02:00
.gitignore Notification string to a queue of strings (#2517) 2021-10-03 11:24:24 +02:00
.gitmodules migration: Update submodule URLs 2019-05-08 12:20:33 +02:00
.valgrind-suppressions refactor(x11): Merge xlib/xutils with connection 2016-12-31 10:02:32 +01:00
.ycm_extra_conf.py ycm: Remove -Werror from ycm flags 2018-07-30 14:12:22 +02:00
CHANGELOG.md Add units support (POINT, PIXEL, SPACE) (#2578) 2022-02-20 21:08:57 +01:00
CMakeLists.txt Create default config (#2511) 2021-10-05 13:07:19 +02:00
CONTRIBUTING.md Use the new GitHub issue forms (#2530) 2021-10-10 14:00:18 +02:00
LICENSE init(git): Base commit 2016-05-19 20:23:45 +02:00
README.md Create default config (#2511) 2021-10-05 13:07:19 +02:00
SUPPORT.md Change over all IRC mentions to libera (#2450) 2021-06-16 17:02:58 +02:00
banner.png Add polybar banner 2018-05-27 09:37:56 +02:00
build.sh Create default config (#2511) 2021-10-05 13:07:19 +02:00
version.txt Release 3.5.7 2021-09-21 18:12:57 +02:00

README.md

Polybar

A fast and easy-to-use tool for creating status bars.

GitHub All Releases

Documentation | Installation | Support | Donate

Polybar aims to help users build beautiful and highly customizable status bars for their desktop environment, without the need of having a black belt in shell scripting.

sample screenshot

Table of Contents

Introduction

The main purpose of Polybar is to help users create awesome status bars. It has built-in functionality to display information about the most commonly used services. Some of the services included so far:

  • Systray icons
  • Window title
  • Playback controls and status display for MPD using libmpdclient
  • ALSA and PulseAudio volume controls
  • Workspace and desktop panel for bspwm and i3
  • Workspace module for EWMH compliant window managers
  • Keyboard layout and indicator status
  • CPU and memory load indicator
  • Battery display
  • Network connection details
  • Backlight level
  • Date and time label
  • Time-based shell script execution
  • Command output tailing
  • User-defined menu tree
  • Inter-process messaging
  • And more...

See the wiki for more details.

Getting Help

If you find yourself stuck, have a look at our Support page for resources where you can find help.

Contributing

Read our contributing guidelines for how to get started with contributing to polybar.

Getting started

Installation

Packaging status

Polybar is already available in the package manager for many repositories. We list some of the more prominent ones here. Also click the image on the right to see a more complete list of available polybar packages.

If you are using Debian (bullseye/11/stable) or later, you can install polybar using sudo apt install polybar. Newer releases of polybar are sometimes provided in the backports repository for stable users, you need to enable backports and then install using sudo apt -t buster-backports install polybar.

If you are using Ubuntu 20.10 (Groovy Gorilla) or later, you can install polybar using sudo apt install polybar.

If you are using Arch Linux, you can install the AUR package polybar to get the latest version, or polybar-git for the most up-to-date (unstable) changes.

If you are using Void Linux, you can install polybar using xbps-install -S polybar.

If you are using NixOS, polybar is available in both the stable and unstable channels and can be installed with the command nix-env -iA nixos.polybar.

If you are using Slackware, polybar is available from the SlackBuilds repository.

If you are using Source Mage GNU/Linux, polybar spell is available in test grimoire and can be installed via cast polybar.

If you are using openSUSE Tumbleweed, polybar is available from the official repositories and can be installed via zypper install polybar.

If you are using openSUSE Leap, polybar is available from OBS. The package is available for openSUSE Leap 15.1 and above.

If you are using FreeBSD, polybar can be installed using pkg install polybar. Make sure you are using the latest package branch.

If you are using Gentoo, both release and git-master versions are available in the main repository.

If you are using Fedora, you can install polybar using sudo dnf install polybar.

If you can't find your distro here, you will have to build from source.

Configuration

Details on how to setup and configure the bar and each module have been moved to the wiki.

Install the example configuration

For a normal installation, polybar will install the example config to /usr/share/doc/polybar/config or /usr/local/share/doc/polybar/config (depending on your install parameters)

From there you can copy it to ~/.config/polybar/config to get started (make sure to backup any existing config file there).

Note: This example file is meant to showcase available modules and configuration options. Running it as-is will work but many modules will likely not start because they require machine-specific configuration and many of the font icons will not show up because they require a very specific font configuration. We encourage you to use it as a reference when building your own configuration.

Launch the example bar

$ polybar example

Running

See the wiki for details on how to run polybar.

Community

Want to get in touch?

Contributors

Owner

Maintainers

Logo Design by

All Contributors

Donations

Polybar accepts donations through open collective.

Become a backer and support polybar!

Sponsors

Backers

License

Polybar is licensed under the MIT license. See LICENSE for more information.