#!/usr/bin/env bash # The Sway configuration file in ~/.config/sway/config calls this script. # status_command should just be: ~/.config/sway/status.sh # (no outer while/sleep needed anymore — this script loops itself) get_title() { local t t=$(swaymsg -t get_tree | jq -r '.. | select(.type?=="con" and .focused==true) | .name // empty' 2>/dev/null) t=${t:-Desktop} local max_len=50 if [ ${#t} -gt $max_len ]; then t="${t:0:$((max_len - 1))}…" fi echo "$t" } refresh_slow() { date_formatted=$(date "+%a %F %H:%M") cpu_percentage=$(top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%.1f%%\n", 100 - v }') ram_percentage="$(free | grep Mem | awk '{print substr($3/$2 * 100.0, 1, 3)}')%" cpu_percentage=$(printf "%5s" "$cpu_percentage") ram_percentage=$(printf "%4s" "$ram_percentage") } # Prime the slow-changing values once before the loop starts refresh_slow tick=0 while true; do window_title=$(get_title) # Emojis and characters for the status bar # 💎 💻 💡 🔌 ⚡ 📁 \| echo "\ $window_title | \ $ram_percentage RAM |\ $cpu_percentage CPU | \ $date_formatted\ " if [ "$tick" -ge 29 ]; then refresh_slow tick=0 else tick=$((tick + 1)) fi sleep 1 done