#!/usr/bin/env bash MAX_TITLE_LEN=20 print_status() { window=$(hyprctl activewindow -j 2>/dev/null) address=$(jq -r '.address // empty' <<< "$window") # No active window → show Desktop + Workspace if [[ -z "$address" || "$address" == "null" ]]; then ws=$(hyprctl activeworkspace -j | jq -r '.id') top_line="Desktop" bottom_line="Workspace $ws" esc_top=$(sed 's/&/&/g; s//>/g' <<< "$top_line") esc_bottom=$(sed 's/&/&/g; s//>/g' <<< "$bottom_line") text="$esc_top $esc_bottom" jq -nc \ --arg text "$text" \ --arg tooltip "$bottom_line" \ '{ text: $text, class: "custom-window", tooltip: $tooltip }' return fi class=$(jq -r '.class // "Unknown"' <<< "$window") title=$(jq -r '.title // ""' <<< "$window") app_class="${class,,}" # Discord / Vesktop cleanup if [[ "$app_class" == *discord* || "$app_class" == *vesktop* ]]; then title=$(sed -E 's/^\([0-9]+\)[[:space:]]*//' <<< "$title") title=$(sed -E 's/^Discord[[:space:]]*\|[[:space:]]*//' <<< "$title") fi # Truncate title if (( ${#title} > MAX_TITLE_LEN )); then title="${title:0:$((MAX_TITLE_LEN-3))}..." fi esc_top=$(sed 's/&/&/g; s//>/g' <<< "$class") esc_bottom=$(sed 's/&/&/g; s//>/g' <<< "$title") text="$esc_top $esc_bottom" tooltip="$class: $title" jq -nc \ --arg text "$text" \ --arg tooltip "$tooltip" \ '{ text: $text, class: "custom-window", tooltip: $tooltip }' } # Initial output print_status last="" # Update only when state changes while true; do current_window=$(hyprctl activewindow -j 2>/dev/null) current_ws=$(hyprctl activeworkspace -j 2>/dev/null) current="$current_window$current_ws" if [[ "$current" != "$last" ]]; then print_status last="$current" fi sleep 0.5 done