42 lines
1.4 KiB
Bash
42 lines
1.4 KiB
Bash
#!/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\"}"
|