Status bars

Status bars

Waybar

Waybar is a GTK status bar made specifically for wlroots compositors and supports Hyprland by default. To use it, it’s recommended to use your distro’s package.

To start configuring, copy the configuration files from /etc/xdg/waybar/ into ~/.config/waybar/. Then, in ~/.config/waybar/config

To use the workspaces module, replace all the occurrences of sway/workspaces with hyprland/workspaces. Addionally replace all occurences of sway/mode with hyprland/submap

For more info regarding configuration, see The Waybar Wiki.

How to launch

Type waybar into your terminal. In order to have Waybar launch alongside Hyprland, add this line to your Hyprland configuration:

exec-once = waybar

Waybar also provides a systemd service. If you use Hyprland with uwsm, you can enable it, using the following command.

systemctl --user enable --now waybar.service

Waybar FAQ

Waybar popups render behind the windows

In ~/.config/waybar/config, make sure that you have the layer configuration set to top and not bottom.

Active workspace doesn’t show up

Replace #workspaces button.focused with #workspaces button.active in ~/.config/waybar/style.css.

Scrolling through workspaces

Since a lot of configuration options from sway/workspaces are missing, you should deduce some of them by yourself. In the case of scrolling, it should look like this:

"hyprland/workspaces": {
     "format": "{icon}",
     "on-scroll-up": "hyprctl dispatch workspace e+1",
     "on-scroll-down": "hyprctl dispatch workspace e-1"
}

Window title is missing

The prefix for the window module that provides the title is hyprland not wlr. In your Waybar config, insert this module:

"modules-center": ["hyprland/window"],

If you are using multiple monitors, you may want to insert the following option:

"hyprland/window": {
    "separate-outputs": true
},

Eww

Eww (ElKowar’s Wacky Widgets) is a widget system made in Rust + GTK, which allows the creation of custom widgets similarly to AwesomeWM. The key difference is that it is independent of window manager/compositor.

Install Eww either using your distro’s package manager, by searching eww-wayland, or by manually compiling. In the latter case, you can follow the instructions.

Configuration

There are a few examples listed in the Readme. It’s also highly recommended to read through the Configuration options.

Read the Wayland section carefully, otherwise Eww won’t work on Hyprland.

Here are some example widgets that might be useful for Hyprland:

Workspaces widget

This widget displays a list of workspaces 1-10. Each workspace can be clicked on to jump to it, and scrolling over the widget cycles through them. It supports different styles for the current workspace, occupied workspaces, and empty workspaces. It requires bash, awk, stdbuf, grep, seq, socat, jq, and Python 3.

~/.config/eww.yuck

...
(deflisten workspaces :initial "[]" "bash ~/.config/eww/scripts/get-workspaces")
(deflisten current_workspace :initial "1" "bash ~/.config/eww/scripts/get-active-workspace")
(defwidget workspaces []
  (eventbox :onscroll "bash ~/.config/eww/scripts/change-active-workspace {} ${current_workspace}" :class "workspaces-widget"
    (box :space-evenly true
      (label :text "${workspaces}${current_workspace}" :visible false)
      (for workspace in workspaces
        (eventbox :onclick "hyprctl dispatch workspace ${workspace.id}"
          (box :class "workspace-entry ${workspace.windows > 0 ? "occupied" : "empty"}"
            (label :text "${workspace.id}" :class "workspace-entry ${workspace.id == current_workspace ? "current" : ""}" )
            )
          )
        )
      )
    )
  )
...

~/.config/eww/scripts/change-active-workspace

#!/usr/bin/env bash
function clamp {
  min=$1
  max=$2
  val=$3
  python -c "print(max($min, min($val, $max)))"
}

direction=$1
current=$2
if test "$direction" = "down"
then
  target=$(clamp 1 10 $(($current+1)))
  echo "jumping to $target"
  hyprctl dispatch workspace $target
elif test "$direction" = "up"
then
  target=$(clamp 1 10 $(($current-1)))
  echo "jumping to $target"
  hyprctl dispatch workspace $target
fi

~/.config/eww/scripts/get-active-workspace

#!/usr/bin/env bash

hyprctl monitors -j | jq '.[] | select(.focused) | .activeWorkspace.id'

socat -u UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - |
  stdbuf -o0 awk -F '>>|,' -e '/^workspace>>/ {print $2}' -e '/^focusedmon>>/ {print $3}'

~/.config/eww/scripts/get-workspaces

#!/usr/bin/env bash

spaces (){
  WORKSPACE_WINDOWS=$(hyprctl workspaces -j | jq 'map({key: .id | tostring, value: .windows}) | from_entries')
  seq 1 10 | jq --argjson windows "${WORKSPACE_WINDOWS}" --slurp -Mc 'map(tostring) | map({id: ., windows: ($windows[.]//0)})'
}

spaces
socat -u UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | while read -r line; do
  spaces
done
Active window title widget

This widget simply displays the title of the active window. It requires awk, stdbuf, socat, and jq.

~/.config/eww/eww.yuck

...
(deflisten window :initial "..." "sh ~/.config/eww/scripts/get-window-title")
(defwidget window_w []
  (box
    (label :text "${window}"
    )
  )
...

~/.config/eww/scripts/get-window-title

#!/bin/sh
hyprctl activewindow -j | jq --raw-output .title
socat -u UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | stdbuf -o0 awk -F '>>|,' '/^activewindow>>/{print $3}'

Hybrid

Like Waybar, Hybrid is a GTK status bar mainly focused on wlroots compositors.

It can be installed using the hybrid-bar package from the AUR.

Configuration

The configuration is done through JSON. More information is available here.

How to launch

After configuring HybridBar, it can be launched by typing hybrid-bar into a terminal. It is also possible to set it to launch at startup. To do this, add this line to hyprland.conf:

exec-once = hybrid-bar

Blur

To activate blur, set blurls = NAMESPACE in your Hyprland configuration, where NAMESPACE is the gtk-layer-shell namespace of your HybridBar. The default namespace is gtk-layer-shell and can be changed in the HybridBar configuration at

{
     "hybrid" {
          "namespace": "namespace name"
     }
}