#!/usr/bin/env sh # Checks if a list ($1) contains an element ($2) contains() { for e in $1; do [ "$e" -eq "$2" ] && echo 1 && return done echo 0 } print_workspaces() { buf="" desktops=$(bspc query -D --names) focused_desktop=$(bspc query -D -d focused --names) occupied_desktops=$(bspc query -D -d .occupied --names) urgent_desktops=$(bspc query -D -d .urgent --names) for d in $desktops; do if [ "$(contains "$focused_desktop" "$d")" -eq 1 ]; then ws=$d class="focused" elif [ "$(contains "$occupied_desktops" "$d")" -eq 1 ]; then ws=$d class="occupied" elif [ "$(contains "$urgent_desktops" "$d")" -eq 1 ]; then ws=$d class="urgent" else ws=$d class="empty" fi buf="$buf (eventbox :cursor \"hand\" (button :class \"$class\" :onclick \"bspc desktop -f $ws\" \"\"))" done echo "(box :class \"widget line-workspaces\" :halign \"start\" :valign \"center\" :vexpand true :hexpand true $buf)" } # Listen to bspwm changes print_workspaces bspc subscribe desktop node_transfer | while read -r _ ; do print_workspaces done