71 lines
3.1 KiB
Bash
Executable File
71 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# wbar — run the custom waybar rig (layouts/custom.jsonc + custom.css) as a
|
|
# supervised systemd user service, and control it.
|
|
#
|
|
# Why a service: waybar 0.15.0 segfaults when the LG 4K drops its DisplayPort
|
|
# link on power-off (output removed) and again when it comes back (output
|
|
# re-added). Launched as a bare scope nothing relaunched it, so the bar was gone
|
|
# every morning. As a transient *service* with Restart=always systemd brings it
|
|
# back after RestartSec, at both ends of the cycle. StartLimitIntervalSec=0 keeps
|
|
# systemd from giving up while the monitor is gone and Hyprland sits on its
|
|
# headless fallback output (the default limit of 5 starts per 10 s would
|
|
# reproduce the original "stays dead" behavior). RestartSec=3 keeps that
|
|
# potential loop cheap; `systemctl --user show dots-waybar.service -p NRestarts`
|
|
# after a night says how many restarts a sleep cycle really costs.
|
|
#
|
|
# The unit is dots-owned on purpose. HyDE's own bar unit
|
|
# (hyde-$XDG_SESSION_DESKTOP-bar.service) is masked on rig hosts (README.md) so
|
|
# waybar.py can never spawn a second, plain bar — reusing that name would need
|
|
# the mask lifted. Under a different name HyDE keeps seeing "no bar", exactly as
|
|
# before.
|
|
#
|
|
# Because a killed waybar now comes straight back, every killall-based control
|
|
# goes through here:
|
|
# wbar restart (what the old `wbar` abbr did) also: hc.start.bar
|
|
# wbar toggle Ctrl+Alt+W
|
|
# wbar reload re-read config + CSS in place (SIGUSR2), no restart
|
|
# wbar start|stop|status
|
|
set -euo pipefail
|
|
|
|
unit="dots-waybar.service"
|
|
cfg="$HOME/.config/waybar/layouts/custom.jsonc"
|
|
css="$HOME/.config/waybar/layouts/custom.css"
|
|
|
|
active() { systemctl --user is-active --quiet "$unit"; }
|
|
|
|
start() {
|
|
active && return 0
|
|
systemctl --user reset-failed "$unit" 2>/dev/null || true
|
|
# A service gets the user manager's environment, not Hyprland's. Forward the
|
|
# session vars app2unit forwards for HyDE's own units, plus GTK scaling
|
|
# (GDK_SCALE=1 is what keeps the bar sized right on the 1.25-scaled output).
|
|
local -a env=()
|
|
local v
|
|
for v in XDG_VTNR XDG_SEAT XDG_SEAT_PATH XDG_SESSION_ID XDG_SESSION_PATH GDK_SCALE GDK_DPI_SCALE; do
|
|
[ -n "${!v:-}" ] && env+=("--setenv=$v=${!v}")
|
|
done
|
|
systemd-run --user --quiet --collect \
|
|
--unit="$unit" --slice=app-graphical.slice --description="waybar (dots custom rig)" \
|
|
--property=Type=exec --property=ExitType=cgroup \
|
|
--property=Restart=always --property=RestartSec=3 --property=StartLimitIntervalSec=0 \
|
|
--property=After=graphical-session.target --property=PartOf=graphical-session.target \
|
|
"${env[@]}" -- waybar -c "$cfg" -s "$css"
|
|
}
|
|
|
|
case "${1:-restart}" in
|
|
start) start ;;
|
|
stop) systemctl --user stop "$unit" ;;
|
|
restart)
|
|
if active; then systemctl --user restart "$unit"; else start; fi
|
|
;;
|
|
toggle)
|
|
if active; then systemctl --user stop "$unit"; else start; fi
|
|
;;
|
|
reload) systemctl --user kill -s SIGUSR2 "$unit" ;;
|
|
status) systemctl --user status --no-pager "$unit" ;;
|
|
*)
|
|
echo "usage: wbar [start|stop|restart|toggle|reload|status] (default: restart)" >&2
|
|
exit 2
|
|
;;
|
|
esac
|