The item-ordering feature made Host::reorderItems() re-run the full remove/add path over items_ via std::ranges::for_each(on_remove_/on_add_). This caused two confirmed bugs: BUG 1 (iterator invalidation / UAF): on_add_ (Tray::onAdd) calls Host::checkIgnoreList, which erases from items_ while for_each is still iterating items_, invalidating iterators/pointers. Triggered by a non-empty ignore-list matching an item with >=2 items present. BUG 2 (double add): reorderItems runs while an item's Id is resolved in proxyReady, i.e. before setReady(). It added the not-yet-ready item (re-parenting its event_box, pushing into Tray::items_, connecting signal_show/hide), then setReady() -> itemReady -> onAdd added it again: GTK 'widget already has a parent' critical, duplicate Item* and signal handlers that accumulated unbounded. Fixes: - reorderItems() now only reorders already-added GTK box children via a dedicated on_reorder_ callback (Tray::reorderBox), never re-adding or removing. reorderBox stable-sorts items_ by order_ and repositions children with gtk_box_reorder_child (honouring reverse-direction). - Tray::onAdd is idempotent (guards against an already-added item) and positions the new widget via reorderBox before the ignore-list check. - signal_show/signal_hide connections are stored per item and disconnected in Tray::onRemove; onRemove is a no-op for items that were never added.
Waybar
Highly customizable Wayland bar for Sway and wlroots-based compositors.
Available in all major distributions.
Installation · Wiki · Configuration · Styling · Examples · FAQ
Features
Compositor integration
| Compositor | Workspaces / Tags | Window | Layout | Language | Mode |
|---|---|---|---|---|---|
| Sway | ✅ | ✅ | ✅ | ✅ | |
| River | ✅ | ✅ | ✅ | ✅ | |
| Hyprland | ✅ | ✅ | ✅ | ✅ | |
| Niri | ✅ | ✅ | ✅ | ||
| Mango | ✅ | ✅ | ✅ | ✅ | ✅ |
| DWL | ✅ | ✅ | |||
| Wayfire | ✅ | ✅ |
DWL requires the dwl IPC patch.
Modules
- Power & hardware — Battery, UPower, Power profiles daemon, Backlight, CPU, Memory, Disk, Temperature
- Connectivity — Network, Bluetooth, GPS, WWAN
- Audio & media — PulseAudio, WirePlumber, JACK, sndio, Cava, MPD, MPRIS
- Desktop — Clock & calendar, System tray, Idle inhibitor, Keyboard state, Privacy, Gamemode, Systemd failed units, Image, Custom scripts
…and more. Every module is documented on the wiki (see the Modules sidebar).
Getting started
git clone https://github.com/Alexays/Waybar
cd Waybar
meson setup build
ninja -C build
./build/waybar # run without installing
Waybar launches with a sensible default config. To make
it yours, copy the default config and stylesheet into ~/.config/waybar/ and edit
them. The Configuration
and Styling guides cover every
option, and Examples has
ready-to-use community setups.
Installation
Waybar is packaged by most distributions:
An Ubuntu PPA with more recent versions is available here.
Building from source
git clone https://github.com/Alexays/Waybar
cd Waybar
meson setup build
ninja -C build
ninja -C build install # optional
Runtime dependencies
gtkmm3 jsoncpp libsigc++ fmt wayland
chrono-date spdlog xkbregistry libgtk-3-dev upower
libpulse [Pulseaudio module]
libnl [Network module]
libappindicator-gtk3 [Tray module]
libdbusmenu-gtk3 [Tray module]
libmpdclient [MPD module]
libsndio [sndio module]
libevdev [KeyboardState module]
Build dependencies
cmake meson scdoc wayland-protocols
Install dependencies — Ubuntu
sudo apt install \
clang-tidy gobject-introspection libdbusmenu-gtk3-dev libevdev-dev \
libfmt-dev libgirepository1.0-dev libgtk-3-dev libgtkmm-3.0-dev \
libinput-dev libjsoncpp-dev libmpdclient-dev libnl-3-dev libnl-genl-3-dev \
libpulse-dev libsigc++-2.0-dev libspdlog-dev libwayland-dev scdoc upower \
libxkbregistry-dev
Install dependencies — Arch
pacman -S --asdeps \
gtkmm3 jsoncpp libsigc++ fmt wayland chrono-date spdlog gtk3 \
gobject-introspection libgirepository libpulse libnl libappindicator-gtk3 \
libdbusmenu-gtk3 libmpdclient sndio libevdev libxkbcommon upower meson \
cmake scdoc wayland-protocols glib2-devel
Contributing
Contributions are welcome — see CONTRIBUTING.md. The style guidelines are Google's C++ style.
Docs live in the man pages. Module documentation is written in
man/(scdoc) and auto-synced to the wiki. Edit the man page, not the wiki — see.github/wiki.
Caution
Distributions of Waybar are only released on the official GitHub page.
Waybar does not have an official website. Do not trust any site claiming to be official.
License
Waybar is licensed under the MIT license. See LICENSE for details.
