UP | HOME

Polybar Configuration

Table of Contents

Colors

[colors]
base00 = ${xrdb:color0:#000000}
base01 = ${xrdb:color10:#000000}
base02 = ${xrdb:color11:#000000}
base03 = ${xrdb:color8:#000000}
base04 = ${xrdb:color12:#000000}
base05 = ${xrdb:color7:#000000}
base06 = ${xrdb:color13:#000000}
base07 = ${xrdb:color15:#000000}
base08 = ${xrdb:color1:#000000}
base09 = ${xrdb:color9:#000000}
base0A = ${xrdb:color3:#000000}
base0B = ${xrdb:color2:#000000}
base0C = ${xrdb:color6:#000000}
base0D = ${xrdb:color4:#000000}
base0E = ${xrdb:color5:#000000}
base0F = ${xrdb:color14:#000000}

; based on  http://chriskempson.com/projects/base16/
background = ${colors.base00}
background-light = ${colors.base01}
background-selection = ${colors.base02}
comments = ${colors.base03}
foreground-dark = ${colors.base04}
foreground = ${colors.base05}
foreground-light = ${colors.base06}
foreground-light-bis = ${colors.base07}
red = ${colors.base08}
orange = ${colors.base09}
brown = ${colors.base0A}
green = ${colors.base0B}
turquoise = ${colors.base0C}
blue = ${colors.base0D}
purple = ${colors.base0E}
magenta = ${colors.base0F}
black = ${#000000}

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.background}
foreground = ${colors.foreground}

line-size = 2

border-size = 0

padding-left = 2
padding-right = 16

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 xbacklightredshift nordvpn lockscreen dunst unread_mail cpu battery temperature date

wm-restack = bspwm

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

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.background}
label-mode-background = ${colors.foreground}
label-mode-padding = 1

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

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

# visible = Active workspace on unfocused monitor
label-visible = %icon% %index%
label-visible-background = ${colors.background}
label-visible-underline = ${colors.turquoise}
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.background}
label-focused-background = ${colors.turquoise}
label-focused-underline= ${colors.turquoise}
label-focused-padding = 1

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

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

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

Music using MPD

[module/mpd]
type = internal/mpd
format-online = <icon-prev> <toggle> <icon-next> %{A1:termite -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.foreground-light}
toggle-off-foreground = ${colors.comments}

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.foreground}

format-underline = ${colors.background}

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

Date

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

# Open google calendar on left right
date = %{A1:termite -e "ikhal" &:} %d-%m%{A}
date-alt = "%{A1:termite -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.foreground}

Battery

[module/battery]
type = internal/battery

battery = BAT0
adapter = ADP1
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}

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

ramp-capacity-0 = 
ramp-capacity-1 = 
ramp-capacity-2 = 
ramp-capacity-3 = 
ramp-capacity-4 = 
ramp-capacity-foreground = ${colors.foreground}

animation-charging-0 = 
animation-charging-1 = 
animation-charging-2 = 
animation-charging-3 = 
animation-charging-4 = 
animation-charging-foreground = ${colors.foreground}
animation-charging-framerate = 750

animation-discharging-0 = 
animation-discharging-1 = 
animation-discharging-2 = 
animation-discharging-3 = 
animation-discharging-4 = 
animation-discharging-foreground = ${colors.foreground}
animation-discharging-framerate = 750

Temperature

[module/temperature]
type = internal/temperature

interval = 5
thermal-zone = 0
warn-temperature = 70
;; Temperature off one cpu core
hwmon-path = /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_input

format = %{A1:termite -e "watch sensors" &:}<ramp> <label>%{A}
format-underline = ${colors.background}
format-warn = <ramp> <label-warn>
format-warn-underline = ${colors.red}

label = %temperature-c%
label-warn = %temperature-c%
label-warn-foreground = ${colors.red}

ramp-0 = 
ramp-1 = 
ramp-2 = 
ramp-3 = 
ramp-4 = 
ramp-foreground = ${colors.foreground}

Unread Mails

[module/unread_mail]
type = custom/script

label-font = 2
format-underline = ${colors.background}
click-left = ~/.config/polybar/scripts/mail-open.sh
format = <label>
exec = ~/.config/polybar/scripts/mail-status.sh
interval = 1

Unread Mail Scripts

mails=$(du -a ~/.mail/*/Inbox/new/* 2>/dev/null | sed -n '$=')

if [[ -z "$mails" ]]; then
    echo ""
else
    echo "%{F#859900}%{F-}"
fi

Open Mails

termite -e "tmux -L neomutt attach" &

Redshift

[module/redshift]
type = custom/script

label-font = 2
format-underline = ${colors.background}
click-left = ~/.config/polybar/scripts/redshift-toggle.sh
format = <label>
exec = ~/.config/polybar/scripts/redshift-status.sh
interval = 2

Redshift Scripts

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

Toggle Redshift

if pgrep -x "redshift" >/dev/null; then
    killall redshift;
else
    nohup redshift > /dev/null 2>&1 &
fi

NordVPN

[module/nordvpn]
type = custom/script

format-underline = ${colors.background}
click-left = ~/.config/polybar/scripts/nordvpn-toggle.sh
format = <label>
exec = ~/.config/polybar/scripts/nordvpn-status.sh
interval = 2

Nordvpn Status script

vpnstatus=`nordvpn status`;

if [[ ${vpnstatus} == *"Connected"* ]]; then
  # country=`nordvpn status | sed '/Country/!d ; s/Country: //'`
  # echo "%{F#859900}%{F-} $country";
  echo "%{F#859900}%{F-}";
else
  echo "";
fi

Nordvpn Toggle

if [[ $(nordvpn status) == *"Connected"* ]]; then
  nordvpn disconnect && dunstify --replace=23198 "VPN" "Disconnected";
else
  country=`cat ~/bin/nordvpn_countries.txt | sed 's/\s*\t\s*/ /g ; s/\s/\n/g ; s/_/ /g ; /^[a-zA-Z]/!d ; s/\(.*\)/\L\1/' | rofi -i -dmenu | sed 's/\s/_/g'`;
  dunstify --replace=23198 "VPN" "Connecting to $country...";
  nordvpn connect $country && dunstify --replace=23198 "VPN" "Connected to $country";
fi

Dunst

[module/dunst]
type = custom/script

format-underline = ${colors.background}
click-left = ~/.config/polybar/scripts/dunst-toggle.sh
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 ]; then
  if grep -q "on" $tmpfile; then
    killall -SIGUSR1 dunst && echo "off" > $tmpfile;
  elif grep -q "off" $tmpfile; then
    killall -SIGUSR2 dunst && echo "on" > $tmpfile;
    dunstify --replace=16549 "Dunst" "Activated";
  fi
else
  killall -SIGUSR1 dunst && echo "off" > $tmpfile;
fi

Lock Screen

[module/lockscreen]
type = custom/script

format-underline = ${colors.background}
click-left = ~/.config/polybar/scripts/lockscreen-toggle.sh
click-right = ~/scripts/lockscreen.sh
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 "~/scripts/lockscreen.sh" -detectsleep -time 30 -notify 60 -notifier "dunstify --replace=31846 -u critical -t 10000 -- 'Locking Screen' '60 seconds'" &
    dunstify --replace=13602 'Lock Screen' 'Activated'
fi

Weather

https://github.com/x70b1/polybar-scripts/tree/master/polybar-scripts/openweathermap-fullfeatured

[module/weather]
type = custom/script

exec = ~/.config/polybar/scripts/weather-status.sh
click-left = ~/.config/polybar/scripts/weather-open.sh

interval = 600
label-font = 3

Script to retrieve the weather

get_icon() {
    case $1 in
        01d) icon="";;
        01n) icon="";;
        02d) icon="";;
        02n) icon="";;
        03*) icon="";;
        04*) icon="";;
        09d) icon="";;
        09n) icon="";;
        10d) icon="";;
        10n) icon="";;
        11d) icon="";;
        11n) icon="";;
        13d) icon="";;
        13n) icon="";;
        50d) icon="";;
        50n) icon="";;
        *) icon="";
    esac

    echo $icon
}

get_duration() {

    osname=$(uname -s)

    case $osname in
        *BSD) date -r "$1" -u +%H:%M;;
        *) date --date="@$1" -u +%H:%M;;
    esac

}

KEY="a705adc4ce0e271801051b9460ecb1cd"
CITY=""
UNITS="metric"
SYMBOL="°"

API="https://api.openweathermap.org/data/2.5"

if [ -n "$CITY" ]; then
    if [ "$CITY" -eq "$CITY" ] 2>/dev/null; then
        CITY_PARAM="id=$CITY"
    else
        CITY_PARAM="q=$CITY"
    fi

    current=$(curl -sf "$API/weather?appid=$KEY&$CITY_PARAM&units=$UNITS")
    forecast=$(curl -sf "$API/forecast?appid=$KEY&$CITY_PARAM&units=$UNITS&cnt=1")
else
    location=$(curl -sf https://location.services.mozilla.com/v1/geolocate?key=geoclue)

    if [ -n "$location" ]; then
        location_lat="$(echo "$location" | jq '.location.lat')"
        location_lon="$(echo "$location" | jq '.location.lng')"

        current=$(curl -sf "$API/weather?appid=$KEY&lat=$location_lat&lon=$location_lon&units=$UNITS")
        forecast=$(curl -sf "$API/forecast?appid=$KEY&lat=$location_lat&lon=$location_lon&units=$UNITS&cnt=1")
    fi
fi

if [ -n "$current" ] && [ -n "$forecast" ]; then
    current_temp=$(echo "$current" | jq ".main.temp" | cut -d "." -f 1)
    current_icon=$(echo "$current" | jq -r ".weather[0].icon")

    forecast_temp=$(echo "$forecast" | jq ".list[].main.temp" | cut -d "." -f 1)
    forecast_icon=$(echo "$forecast" | jq -r ".list[].weather[0].icon")


    if [ "$current_temp" -gt "$forecast_temp" ]; then
        trend="" #
    elif [ "$forecast_temp" -gt "$current_temp" ]; then
        trend="" #
    else
        trend="" #
    fi


    sun_rise=$(echo "$current" | jq ".sys.sunrise")
    sun_set=$(echo "$current" | jq ".sys.sunset")
    now=$(date +%s)

    if [ "$sun_rise" -gt "$now" ]; then
        daytime=" $(get_duration "$((sun_rise-now))")"
    elif [ "$sun_set" -gt "$now" ]; then
        daytime=" $(get_duration "$((sun_set-now))")"
    else
        daytime=" $(get_duration "$((sun_rise-now))")"
    fi

    echo "$(get_icon "$current_icon") $current_temp$SYMBOL  $trend  $(get_icon "$forecast_icon") $forecast_temp$SYMBOL   $daytime"
fi

TODO Open Weather Webpage

  • [ ] Find a way to open a web page with detailed forecast with the current location
# location=$(curl -sf https://location.services.mozilla.com/v1/geolocate?key=geoclue)

# if [ -n "$location" ]; then
#     location_lat="$(echo "$location" | jq '.location.lat')"
#     location_lon="$(echo "$location" | jq '.location.lng')"
# else

# fi
$BROWSER https://www.yahoo.com/news/weather/france/grenoble/grenoble-593720

Network

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

label-connected = %local_ip%
label-connected-foreground = ${colors.foreground}

format-connected-prefix = " "
format-connected = <label-connected>

label-disconnected = ""
label-disconnected-foreground = ${colors.comments}

format-disconnected = <label-disconnected>

[module/wireless-network]
type = internal/network
interface = wlp2s0

label-connected = %essid%
label-connected-foreground = ${colors.foreground}

format-connected-prefix = " "
format-connected = <label-connected>

label-disconnected = ""
label-disconnected-foreground = ${colors.comments}

format-disconnected = <label-disconnected>

Screenshot

[module/screenshot]
type = custom/text
content = ""
click-left = ~/bin/screenshot

Scripts

Launch

# Terminate already running bar instances
killall -q polybar

# Wait until the processes have been shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done

# Launch Polybar, using default config location ~/.config/polybar/config
polybar top &
# polybar bottom &

echo "Polybar launched..."

Toggle

# Usage : toggle.sh top

pid=$(pgrep -f "polybar $1")

if [ ! -z "$pid" ]; then
    polybar-msg -p $pid cmd toggle >/dev/null 2>&1
fi

Author: Dehaeze Thomas

Created: 2020-01-11 sam. 21:59