move ghostty and hyprland to dotfiles
This commit is contained in:
76
roles/hyprland/files/waybar/scripts/page.sh
Executable file
76
roles/hyprland/files/waybar/scripts/page.sh
Executable file
@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env bash
|
||||
# page.sh 1‒10 – Waybar “page” indicator
|
||||
# deps: socat, awk • (still no jq)
|
||||
|
||||
page=$1 # this script instance’s page (1‒10)
|
||||
|
||||
# ── icon lookup table ────────────────────────────────────────────
|
||||
icons=( "" "" "" "" "" "" "" "" "" "" "" )
|
||||
|
||||
# map numeric workspace → page (1‒10)
|
||||
to_page() {
|
||||
(( $1 <= 3 )) && echo 1 && return
|
||||
(( $1 <= 6 )) && echo 2 && return
|
||||
(( $1 <= 9 )) && echo 3 && return
|
||||
(( $1 <= 12 )) && echo 4 && return
|
||||
(( $1 <= 15 )) && echo 5 && return
|
||||
(( $1 <= 18 )) && echo 6 && return
|
||||
(( $1 <= 21 )) && echo 7 && return
|
||||
(( $1 <= 24 )) && echo 8 && return
|
||||
(( $1 <= 27 )) && echo 9 && return
|
||||
echo 10
|
||||
}
|
||||
|
||||
# does THIS page contain at least one window?
|
||||
is_occupied() {
|
||||
while read -r ws_id; do
|
||||
(( $(to_page "$ws_id") == page )) && return 0
|
||||
done < <(hyprctl clients | awk '/workspace:/ {print $2}')
|
||||
return 1
|
||||
}
|
||||
|
||||
emit() {
|
||||
local classes=()
|
||||
|
||||
if (( $1 == page )); then # ← is THIS instance the active page?
|
||||
classes+=(active) # yes → mark it only “active”
|
||||
else
|
||||
is_occupied && classes+=(occupied) # no → maybe “occupied”
|
||||
fi
|
||||
|
||||
if ((${#classes[@]})); then
|
||||
printf '{"text":"%s","class":"%s"}\n' \
|
||||
"${icons[page]}" "$(IFS=' '; echo "${classes[*]}")"
|
||||
else
|
||||
printf '{"text":"%s"}\n' "${icons[page]}"
|
||||
fi
|
||||
}
|
||||
|
||||
# ── initial state ────────────────────────────────────────────────
|
||||
active_ws=$(hyprctl activeworkspace | awk '/^ID /{print $2}')
|
||||
current_page=$(to_page "${active_ws:-1}")
|
||||
emit "$current_page"
|
||||
current_occ=$(is_occupied && echo 1 || echo 0)
|
||||
|
||||
# ── live updates via Hyprland socket2 ───────────────────────────
|
||||
socket="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock"
|
||||
socat -U - UNIX-CONNECT:"$socket" | while read -r line; do
|
||||
[[ $line =~ ^(workspace|openwindow|closewindow) ]] || continue
|
||||
|
||||
# recompute state if anything relevant changed
|
||||
if [[ $line == workspace* ]]; then
|
||||
ws=${line#*>>}; ws=${ws%% *}
|
||||
new_page=$(to_page "$ws")
|
||||
else
|
||||
new_page=$current_page
|
||||
fi
|
||||
new_occ=$(is_occupied && echo 1 || echo 0)
|
||||
|
||||
# update Waybar only when something actually changed
|
||||
if (( new_page != current_page || new_occ != current_occ )); then
|
||||
emit "$new_page"
|
||||
current_page=$new_page
|
||||
current_occ=$new_occ
|
||||
fi
|
||||
done
|
||||
|
||||
Reference in New Issue
Block a user