Polybar Configuration
Table of Contents
- Colors
- VM
- Top Bar
- Show Windows Title
- I3 - Information about workspaces and active one
- BSPWM
- Music using MPD
- Backlight level
- CPU Usage
- Date
- Sound Volume
- Battery
- Temperature
- Unread Mails
- Unread News
- Calendar
- Redshift
- Packages
- Dunst
- Lock Screen
- Network
- Bluetooth
- NordVPN
- Wireguard
- Microphone loopback
- Screenshot
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 &