UP | HOME

Polybar Configuration

Table of Contents

Colors

[colors]
bg = ${xrdb:background}
red = ${xrdb:color1}
green = ${xrdb:color2}
yellow = ${xrdb:color3}
blue = ${xrdb:color4}
purple = ${xrdb:color5}
aqua = ${xrdb:color6}
gray = ${colors.color7}
darkgray = ${colors.color8}
darkred = ${xrdb:color9}
darkgreen = ${xrdb:color10}
darkyellow = ${xrdb:color11}
darkblue = ${xrdb:color12}
darkpurple = ${xrdb:color13}
darkaqua = ${xrdb:color14}
fg = ${xrdb:foreground}

VM

[global/wm]
margin-top = 0
margin-bottom = 0

Top Bar

[bar/top]
enable-ipc = true
override-redirect = false
bottom = false
fixed-center = false

width = 100%
height = 27
radius = 0.0

background = ${colors.bg}
foreground = ${colors.fg}

line-size = 2

border-size = 0

padding-left = 2
padding-right = 12

module-margin-left = 1
module-margin-right = 1

font-0 = Hack Nerd Font:style=Medium,Regular:pixelsize=10;1
font-1 = unifont:fontformat=truetype:size=8:antialias=false;0
font-2 = Weather Icons:size=10;1

modules-left = i3 bspwm xwindow
modules-center =
modules-right = pulseaudio wired-network wireless-network nordvpn bluetooth redshift lockscreen dunst packages unread_news unread_mail calendar temperature battery date

wm-restack = i3

tray-position = right
tray-detached = true
tray-padding = 0
tray-background = ${colors.bg}

Show Windows Title

[module/xwindow]
type = internal/xwindow
label = %title:0:30:...%

I3 - Information about workspaces and active one

[module/i3]
type = internal/i3

enable-scroll = false
wrapping-scroll = false
format = <label-state> <label-mode>
index-sort = true
label-mode-foreground = ${colors.bg}
label-mode-background = ${colors.fg}
label-mode-padding = 1

# focused = Active workspace on focused monitor
label-focused = %icon% %index%
label-focused-foreground = ${colors.fg}
label-focused-background = ${colors.bg}
label-focused-underline = ${colors.aqua}
label-focused-padding = 1

# unfocused = Inactive workspace on any monitor
label-unfocused = %icon% %index%
label-unfocused-foreground = ${colors.fg}
label-unfocused-background = ${colors.bg}
label-unfocused-underline = ${colors.bg}
label-unfocused-padding = 1

# visible = Active workspace on unfocused monitor
label-visible = %icon% %index%
label-visible-background = ${colors.bg}
label-visible-underline = ${colors.aqua}
label-visible-padding = 1

# urgent = Workspace with urgency hint set
label-urgent = %icon% %index%
label-urgent-background = ${colors.red}
label-urgent-padding = 1

BSPWM

[module/bspwm]
type = internal/bspwm

pin-workspaces = true
enable-click = true
enable-scroll = false

; Use fuzzy (partial) matching on labels when assigning
; icons to workspaces
; Example: code;♚ will apply the icon to all workspaces
; containing 'code' in the label
fuzzy-match = false


ws-icon-0 = code;
ws-icon-1 = web;
ws-icon-2 = mail;
ws-icon-3 = misc;
ws-icon-4 = figs;ﬧ
ws-icon-default =

label-focused = %icon%
label-focused-foreground = ${colors.bg}
label-focused-background = ${colors.aqua}
label-focused-underline= ${colors.aqua}
label-focused-padding = 1

label-occupied = %icon%
label-occupied-underline = ${colors.fg}
label-occupied-padding = 1

label-urgent = %icon%
label-urgent-background = ${colors.red}
label-urgent-padding = 1

label-empty = %icon%
label-empty-foreground = ${colors.fg}
label-empty-padding = 1

Music using MPD

[module/mpd]
type = internal/mpd
format-online = <icon-prev> <toggle> <icon-next> %{A1:$TERMINAL -e "ncmpcpp" &:}<label-song>%{A}

format-online-spacing = 0
format-online-padding = 0

label-offline = mpd is offline
format-offline = <label-offline>
format-offline-foreground = #777

label-song = %artist% - %title%
label-song-maxlen = 30
label-song-ellipsis = true

icon-prev = 寧
icon-stop = 栗
icon-play = 契
icon-pause = 
icon-next = 嶺
icon-random = 咽
icon-repeat = 凌

# Used to display the state of random/repeat/repeatone/single
# Only applies if <icon-[random|repeat|repeatone|single]> is used
toggle-on-foreground = ${colors.fg}
toggle-off-foreground = ${colors.gray}

bar-progress-width = 15
bar-progress-indicator = |
bar-progress-fill = ─
bar-progress-empty = ─

Backlight level

[module/xbacklight]
type = internal/xbacklight

format = <ramp>
ramp-0 = 
ramp-1 = 
ramp-2 = 
ramp-3 = 
ramp-4 = 
ramp-5 = 
ramp-6 = 
ramp-7 = 
ramp-8 = 
ramp-9 = 
ramp-10 = 
ramp-11 = 

CPU Usage

[module/cpu]
type = internal/cpu
interval = 2

format-prefix-foreground = ${colors.fg}
format-underline = ${colors.bg}

label = %{A1:$TERMINAL -e "htop" &:}﬙ %percentage:2%%%{A}

Date

[module/date]
type = internal/date
interval = 1

# Open google calendar on left right
date = %{A1:$TERMINAL -e "ikhal" &:} %d-%m%{A}
date-alt = "%{A1:$TERMINAL -e \"ikhal\" &:} %d-%m-%Y%{A}"

time =  %H:%M
time-alt =  %H:%M:%S

label = %date% %time%

Sound Volume

[module/pulseaudio]
type = internal/pulseaudio

sink = alsa_output.pci-0000_00_1f.3.analog-stereo

# Open pavucontrol on left right
format-volume =%{A1:pavucontrol &:}<label-volume> <bar-volume>%{A}

label-volume = %percentage%%
label-volume-foreground = ${root.foreground}

label-muted = ﱝ muted

bar-volume-width = 10
bar-volume-foreground-0 = ${colors.green}
bar-volume-foreground-1 = ${colors.green}
bar-volume-foreground-2 = ${colors.blue}
bar-volume-foreground-3 = ${colors.blue}
bar-volume-foreground-4 = ${colors.red}
bar-volume-foreground-5 = ${colors.red}
bar-volume-foreground-6 = ${colors.red}
bar-volume-gradient = false
bar-volume-indicator = |
bar-volume-indicator-font = 2
bar-volume-fill = ─
bar-volume-fill-font = 2
bar-volume-empty = ─
bar-volume-empty-font = 2
bar-volume-empty-foreground = ${colors.fg}

Battery

[module/battery]
type = internal/battery

battery = BAT0
adapter = AC
full-at = 95

format-charging = %{A1:xfce4-power-manager-settings &:}<ramp-capacity>  <label-charging>%{A}
format-charging-underline = ${colors.blue}

format-discharging = %{A1:xfce4-power-manager-settings &:}<ramp-capacity>  <label-discharging>%{A}
format-discharging-underline = ${colors.red}

label-full = %{A1:xfce4-power-manager-settings &:} %{A}
format-full-underline = ${colors.bg}

ramp-capacity-0 = 
ramp-capacity-1 = 
ramp-capacity-2 = 
ramp-capacity-3 = 
ramp-capacity-4 = 

Temperature

[module/temperature]
type = internal/temperature
interval = 2
thermal-zone = 0
warn-temperature = 70
hwmon-path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_input
units = false
format = %{A1:$TERMINAL --class="Floating" -e "watch sensors" &:}<ramp> <label>%{A}
format-warn = <ramp> <label-warn>
label = %temperature-c%°C
label-warn = %temperature-c%°C
label-warn-foreground = ${colors.fg}
format-warn-underline = ${colors.red}
ramp-0 = 
ramp-1 = 
ramp-2 = 
ramp-3 = 
ramp-4 = 
ramp-foreground = ${colors.fg}

Unread Mails

[module/unread_mail]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/mail-open.sh >/dev/null 2>%1 &
click-right = ~/.config/polybar/scripts/mail-refresh.sh >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/mail-status.sh
interval = 2

Unread Mail Scripts

mail_nb=`du -a ~/.mail/*/Inbox/new/* 2>/dev/null | wc -l`

if [ "$mail_nb" -eq "0" ]; then
  echo "";
else
  echo "%{F#859900} $mail_nb%{F-}";
fi

Refresh Mail Scripts

dunstify --replace=98465 "Mails " "Syncing...";
checkmail -q && \
    mail_nb=`du -a ~/.mail/*/Inbox/new/* 2>/dev/null | wc -l` && \
    if [ "$mail_nb" -eq "0" ]; then
        dunstify --replace=98465 "Mails " "No new mail";
    fi

Open Mails

$TERMINAL -e "tmux new-session -A -s neomutt neomutt"

Unread News

[module/unread_news]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/news-open.sh >/dev/null 2>%1 &
click-right = ~/.config/polybar/scripts/news-refresh.sh >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/news-status.sh
interval = 60

Unread News Scripts

news_nb=`newsboat -x print-unread 2>/dev/null | cut -d " " -f1`

 if [ -z "$news_nb" ] || [ "$news_nb" -eq "0" ]; then
  echo "";
else
  echo "%{F#859900}  $news_nb%{F-}";
fi

Refresh News Scripts

dunstify --replace=38492 "Newsboat " "Reloading...";

if pgrep -x "newsboat" >/dev/null; then
  # If newsboat is already running, try to refresh in the tmux session
  tmux send-keys -t newsboat R
else
  newsboat -x reload && /
      news_nb=`newsboat -x print-unread | cut -d " " -f1` && \
      dunstify --replace=38492 "Newsboat " "$news_nb Unread News";
fi

Open Newsboat

$TERMINAL -e "tmux new-session -A -s newsboat newsboat"

Calendar

[module/calendar]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/calendar-open.sh >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/calendar-status.sh
interval = 5

Calendar Status Scripts

next_events=$(khal list "$(date +"%H:%M")" 23:59 --format "{start-time} - {title}" -df 'SKIPME' | grep -v 'SKIPME' | grep -v 'No events')

cal_icon=""
cal_nb=""
cal_desc=""

if [ -n "$next_events" ]; then
    events_number="$(echo "$next_events" | wc -l)"

    if [ "$events_number" -gt "1" ]; then
        cal_nb=" ($events_number)"
    fi

    next_timed_events=$(echo "$next_events" | sed -e '/^[^0-9]/d')
    if [ -z "$next_timed_events" ]; then
        # Only full day events
        cal_desc=" $(echo "$next_events" | sed -e '/^[0-9]/d;s/^ - //' | head -n 1 | cut -c 1-15)"
    else
        cal_desc=" $(echo "$next_timed_events" | head -n 1 | cut -c 1-20)"
    fi
fi

echo "${cal_icon}${cal_nb}${cal_desc}"

Open Calendar

$TERMINAL --class="Floating" -e "khal interactive"

Redshift

[module/redshift]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/redshift-toggle.sh >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/redshift-status.sh
interval = 2

Redshift - Status

if pgrep -x "redshift" >/dev/null; then
    echo "望";
else
    echo "盛";
fi

Toggle Redshift

if pgrep -x "redshift" >/dev/null; then
    killall redshift && \
        dunstify --replace=36492 "Redshift 望" "Turned off";
else
    nohup redshift > /dev/null 2>&1 &
    dunstify --replace=36492 "Redshift 望" "Starting...";
fi

Packages

[module/packages]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/packages-update.sh >/dev/null 2>%1 &
click-right = ~/.config/polybar/scripts/packages-refresh.sh >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/packages-status.sh
interval = 600

Packages Status script

paru -Sy > /dev/null 2>&1 && \
    package_nb=`paru -Qu 2> /dev/null | wc -l` || \
    package_nb=0


if [ "$package_nb" -eq "0" ]; then
    echo "";
else
    echo "%{F#859900} $package_nb%{F-}";
fi

Refresh New Packages script

dunstify --replace=64654 'Packages ' "Refreshing..."

paru -Sy > /dev/null 2>&1 && \
    package_nb=$(paru -Qu 2> /dev/null | wc -l) || \
    package_nb=0

if [ "$package_nb" -eq "0" ]; then
  dunstify --replace=64654 'Packages ' "No upgrade available"
else
  dunstify --replace=64654 'Packages ' "$package_nb upgrade(s) available"
fi

Packages Update

$TERMINAL -e "paru"

Dunst

[module/dunst]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/dunst-toggle.sh >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/dunst-status.sh
interval = 2

Dunst Status script

tmpfile="/tmp/dunststatus";

if [ -f $tmpfile ]; then
  if grep -q "on" $tmpfile; then
    echo "";
  elif grep -q "off" $tmpfile; then
    echo "";
  fi
else
  echo "";
fi

Dunst Toggle

tmpfile="/tmp/dunststatus";

if [ -f $tmpfile ] && grep -q "off" $tmpfile ; then
    killall -SIGUSR2 dunst && \
        echo "on" > $tmpfile;
    dunstify --replace=16549 "Notifications " "Activated";
else
    dunstify --replace=16549 "Notifications " "Deactivated";
    sleep 1 && \
        killall -SIGUSR1 dunst && \
        echo "off" > $tmpfile;
fi

Lock Screen

[module/lockscreen]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/lockscreen-toggle.sh >/dev/null 2>%1 &
click-right = ~/.local/bin/lockscreen >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/lockscreen-status.sh

interval = 2

Lock screen Status script

if pgrep -x "xautolock" >/dev/null
then
    echo "";
else
    echo "";
fi

Toggle Automatic Lock Screen

if pgrep -x "xautolock" >/dev/null ; then
    pkill xautolock && \
        dunstify --replace=13602 'Lock Screen ' 'Desactivated'
else
    xautolock -locker "~/.local/bin/lockscreen" -detectsleep -time 30 -notify 60 -notifier "dunstify --replace=31846 -u critical -t 10000 -- 'Locking Screen' '60 seconds'" &
    dunstify --replace=13602 'Lock Screen ' 'Activated'
fi

Network

[module/wired-network]
type = internal/network
interface = enp57s0u2u4u4

label-connected = %{A3:bash ~/.config/polybar/scripts/connection-manager.sh >/dev/null 2>%1 &:}%{A1:bash ~/.config/polybar/scripts/connection-toggle.sh enp57s0u2u4u4 >/dev/null 2>%1 &:} %local_ip%%{A}%{A}
label-connected-foreground = ${colors.fg}

label-disconnected = %{A3:bash ~/.config/polybar/scripts/connection-manager.sh >/dev/null 2>%1 &:}%{A1:bash ~/.config/polybar/scripts/connection-toggle.sh enp57s0u2u4u4 >/dev/null 2>%1 &:}%{A}%{A}
label-disconnected-foreground = #777
[module/wireless-network]
type = internal/network
interface = wlp2s0

format-connected = <label-connected>
format-disconnected = <label-disconnected>

label-connected = %{A3:bash ~/.config/polybar/scripts/connection-manager.sh >/dev/null 2>%1 &:}%{A1:bash ~/.config/polybar/scripts/connection-toggle.sh wlp2s0 >/dev/null 2>%1 &:}直 %essid%%{A}%{A}
label-connected-foreground = ${colors.fg}

label-disconnected = %{A3:bash ~/.config/polybar/scripts/connection-manager.sh >/dev/null 2>%1 &:}%{A1:bash ~/.config/polybar/scripts/connection-toggle.sh wlp2s0 >/dev/null 2>%1 &:}直%{A}%{A}
label-disconnected-foreground = #777

Run Network Manager

$TERMINAL -e 'sudo nmtui'

Toggle Wifi or Ethernet

# Check if an argument is passed
if [ -z "$1" ]
then
    exit 1
fi

isdevicedown=$(nmcli device status | grep ^$1 | grep disconnected)

if [ -z "$isdevicedown" ]
then
  dunstify --replace=84847 "$1" "Disconnecting..." && \
        nmcli device disconnect $1 && \
        dunstify --replace=84847 "$1" "Disconnected"
else
  dunstify --replace=84847 "$1" "Connection..." && \
        nmcli device connect $1 && \
        dunstify --replace=84847 "$1" "Connected"
fi

Bluetooth

[module/bluetooth]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/bluetooth-toggle.sh >/dev/null 2>%1 &
click-right = ~/.config/polybar/scripts/bluetooth-run.sh >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/bluetooth-status.sh

interval = 2

bluetooth-run.sh - Bluetooth Run Manager

blueman-manager && pkill blueman-applet

bluetooth-status.sh - Bluetooth Connection Status

controllerid="9C:B6:D0:96:6E:C0"

isconnected=$(bluetoothctl show $controllerid | grep Powered | grep yes)

if [ -z "$isconnected" ]
then
    echo ""
else
    echo "%{F#859900}%{F-}"
fi

bluetooth-toggle.sh - Toggle Bluetooth Connection

controllerid="9C:B6:D0:96:6E:C0"

isconnected=$(bluetoothctl show $controllerid | grep Powered | grep yes)

if [ -z "$isconnected" ]
then
    bluetoothctl power on && \
        dunstify --replace=88498 "Bluetooth" "Power ON"
else
    bluetoothctl power off && \
        dunstify --replace=88498 "Bluetooth" "Power OFF"
fi

NordVPN

[module/nordvpn]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.local/bin/nordvpn-toggle >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/nordvpn-status.sh
interval = 2

Nordvpn Status script

tmpfile="/tmp/vpnstatus";

if [ -f $tmpfile ] && grep -q "on" $tmpfile; then
  echo "%{F#859900}%{F-}";
else
  echo "";
fi

Nordvpn Toggle

The script is accessible here.

Wireguard

[module/wireguard]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/wireguard-toggle.sh >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/wireguard-status.sh

interval = 2

Wireguard Connection Status

config="homelab"

connection=$(sudo wg show "$config" 2>/dev/null | head -n 1 | awk '{print $NF }')

if [ "$connection" = "$config" ]; then
    echo "%{F#859900}%{F-}"
else
    echo ""
fi

Toggle Wireguard Connection

config="homelab"

connection=$(sudo wg show "$config" 2>/dev/null | head -n 1 | awk '{print $NF }')

if [ "$connection" = "$config" ]; then
    sudo wg-quick down "$config" && \
        dunstify --replace=83244 "Wireguard" "Disconnected from $config"
else
    sudo wg-quick up "$config" && \
        dunstify --replace=83244 "Wireguard" "Connected to $config"
fi

Microphone loopback

[module/loopback]
type = custom/script

format-underline = ${colors.bg}
click-left = ~/.config/polybar/scripts/loopback-toggle.sh >/dev/null 2>%1 &
format = <label>
exec = ~/.config/polybar/scripts/loopback-status.sh

interval = 2

Loopback Status

loopback=$(pactl list 2>/dev/null | grep module-loopback | wc -l)

if [ "$loopback" -eq "0" ]; then
    echo ""
else
    echo "%{F#859900}%{F-}"
fi

Toggle Loopback

loopback=$(pactl list 2>/dev/null | grep module-loopback | wc -l)

if [ "$loopback" -eq "0" ]; then
    pactl load-module module-loopback latency_msec=1 && \
        dunstify --replace=82244 "Loopback" "Enabled"
else
    pactl unload-module module-loopback && \
        dunstify --replace=82244 "Loopback" "Disabled"
fi

Screenshot

[module/screenshot]
type = custom/text
content = ""
click-left = ~/.local/bin/screenshot >/dev/null 2>%1 &

Author: Dehaeze Thomas

Created: 2021-04-25 dim. 19:10