#!/usr/bin/env bash set -euo pipefail # Fallback JSON (hidden) fallback='{"text":" ","class":"hidden"}' # Get active workspace ID active_ws=$(hyprctl activeworkspace -j 2>/dev/null | jq -r '.id') || { echo "$fallback" exit 0 } # Get all clients on the active workspace clients=$(hyprctl clients -j 2>/dev/null | jq "[.[] | select(.workspace.id==$active_ws)]") || { echo "$fallback" exit 0 } # Count total windows count=$(echo "$clients" | jq 'length') # Get monitor geometry for active workspace monitor=$(hyprctl monitors -j 2>/dev/null | jq -r ".[] | select(.activeWorkspace==$active_ws)") if [[ -z "$monitor" ]]; then echo "$fallback" exit 0 fi mon_width=$(echo "$monitor" | jq '.width') mon_height=$(echo "$monitor" | jq '.height') # Calculate number of windows that are actually visible on screen # Assume a window is visible if its top-left corner is inside monitor bounds visible_count=$(echo "$clients" | jq --argjson mw "$mon_width" --argjson mh "$mon_height" ' map(select( .at[0] >= 0 and .at[0] < $mw and .at[1] >= 0 and .at[1] < $mh )) | length ') # Show fallback if all windows are already visible if (( count <= visible_count )); then echo "$fallback" exit 0 fi # Build tooltip from window titles (escaped) tooltip=$(echo "$clients" | jq -r '.[].title' | sed ':a;N;$!ba;s/\n/\\n/g') # Output JSON for Waybar echo "{\"text\":\"★ $count\",\"tooltip\":\"$tooltip\",\"class\":\"overflow\"}"