literate-dotfiles/polybar.org

27 KiB

Polybar Configuration

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 wireguard 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

NordVPN

  [module/nordvpn]
  type = custom/script

  format-underline = ${colors.bg}
  click-left = ~/.config/polybar/scripts/nordvpn-toggle.sh >/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

  tmpfile="/tmp/vpnstatus";

  if [ -f $tmpfile ] && grep -q "on" $tmpfile; then
    nordvpn disconnect && \
        dunstify --replace=23198 "VPN" "Disconnected" && \
        echo "off" > $tmpfile;
  else
    country=`cat ~/.local/data/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" && \
        echo "on" > $tmpfile;
  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

  yay -Sy > /dev/null 2>&1 && \
      package_nb=`yay -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..."

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

  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 "yay"

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 = ens12u2u4u4

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

  label-disconnected = %{A3:bash ~/.config/polybar/scripts/connection-manager.sh wlp2s0 >/dev/null 2>%1 &:}%{A1:bash ~/.config/polybar/scripts/connection-toggle.sh ens12u2u4u4 >/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 wlp2s0 >/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 wlp2s0 >/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 Manager

  blueman-manager && pkill blueman-applet

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

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

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 &

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 >>/tmp/polybar.log 2>&1 &
  # 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