dotfiles/bin/rice-panel
Sarthak 7f41cf7a82 replace the old dotfiles with the sakura line rice
The bare $HOME repo is gone. This is now the rice: install.sh, rice-*
scripts in bin/, configs in home/ linked into $HOME, theme templates, st
and the particle wallpaper. Clone to ~/rice and run install.sh.
2026-09-14 19:44:44 +05:30

64 lines
2.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# rice-panel <name> | close | list
#
# Opens one eww popup at a time (opening one closes the other). A transparent
# full-screen "closer" window sits underneath, so a click anywhere else closes
# it, and a throwaway sxhkd grabs Escape for as long as a panel is open.
set -uo pipefail
cfg="$HOME/.config/eww"
panels="hub audio network bluetooth display power media calendar notifications"
e() { eww -c "$cfg" "$@"; }
ensure_daemon() {
pgrep -u "$UID" -x eww >/dev/null && return 0
setsid -f eww -c "$cfg" daemon >/dev/null 2>&1
for _ in {1..50}; do e ping >/dev/null 2>&1 && return 0; sleep 0.1; done
}
open_windows() { e active-windows 2>/dev/null | cut -d: -f1; }
# Line panels up with tiled windows. bspwm draws the border inside the gap, so a
# window's outer edge is exactly one gap below the bar and in from the screen's
# right edge; ask it for the live numbers instead of hard-coding them.
position() {
local pt pr gap
read -r pt pr gap < <(bspc query -T -m 2>/dev/null |
jq -r '[.padding.top, .padding.right, .windowGap] | @tsv' 2>/dev/null)
pt=${pt:-37} pr=${pr:-0} gap=${gap:-10}
case "$1" in
media|calendar) echo "0x$(( pt + gap ))" ;;
*) echo "$(( -(pr + gap) ))x$(( pt + gap ))" ;;
esac
}
close_all() {
local w
for w in $(open_windows); do
[[ " $panels closer " == *" $w "* ]] && e close "$w" >/dev/null 2>&1
done
pkill -u "$UID" -f "sxhkd -c $cfg/panel-keys" 2>/dev/null
pgrep -u "$UID" -x eww >/dev/null && e update open_panel="" >/dev/null 2>&1
return 0
}
case "${1:-close}" in
close) close_all ;;
list) tr ' ' '\n' <<<"$panels" ;;
*)
name="$1"
[[ " $panels " == *" $name "* ]] || { echo "rice-panel: unknown panel '$name' (try: rice-panel list)" >&2; exit 2; }
ensure_daemon
if open_windows | grep -qx "$name"; then
close_all
else
close_all
[[ $name == calendar ]] && e update cal_offset=0 cal_day=""
e update open_panel="$name"
e open closer
e open "$name" --pos="$(position "$name")"
setsid -f sxhkd -c "$cfg/panel-keys" >/dev/null 2>&1
fi
;;
esac