#!/usr/bin/env bash # Generates hypridle's configuration from Panama's shared settings. # # Why this exists rather than editing hypridle.conf directly: ~/.config/hypr is # a symlink into the Panama repository, so writing hypridle.conf at runtime # would dirty a tracked file with machine state. The generated config therefore # lives under XDG_STATE_HOME, and a systemd drop-in points hypridle at it with # `-c`. The repository's hypridle.conf remains the shipped default and is what # runs if this has never been set up. # # panama-idle apply regenerate and restart hypridle # panama-idle status report as JSON what is in effect # panama-idle install write the systemd drop-in (idempotent) # panama-idle remove remove the drop-in and fall back to the shipped config # # All values are read from the settings store and clamped here as well as in the # schema, because this script is also reachable from a shell. set -euo pipefail settings="${XDG_CONFIG_HOME:-$HOME/.config}/panama/settings.json" state_dir="${XDG_STATE_HOME:-$HOME/.local/state}/panama" generated="$state_dir/hypridle.conf" dropin_dir="${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/hypridle.service.d" dropin="$dropin_dir/panama.conf" read_setting() { local key="$1" fallback="$2" [[ -r "$settings" ]] || { printf '%s' "$fallback"; return; } jq -r --arg k "$key" --arg d "$fallback" \ 'if has($k) and (.[$k] != null) then (.[$k] | tostring) else $d end' \ "$settings" 2>/dev/null || printf '%s' "$fallback" } clamp_int() { local value="$1" low="$2" high="$3" fallback="$4" [[ "$value" =~ ^-?[0-9]+$ ]] || { printf '%s' "$fallback"; return; } (( value < low )) && value="$low" (( value > high )) && value="$high" printf '%s' "$value" } load() { blank_min="$(clamp_int "$(read_setting screenBlankMinutes 5)" 0 120 5)" lock_min="$(clamp_int "$(read_setting lockMinutes 10)" 0 240 10)" suspend_min="$(clamp_int "$(read_setting suspendMinutes 0)" 0 480 0)" lock_on_sleep="$(read_setting lockOnSleep true)" [[ "$lock_on_sleep" == "true" || "$lock_on_sleep" == "false" ]] || lock_on_sleep=true } generate() { load mkdir -p "$state_dir" { printf '# Generated by panama-idle from %s\n' "$settings" printf '# Do not edit: it is rewritten whenever the idle settings change.\n' printf '# The shipped defaults live in the Panama repo at config/dot/hypr/hypridle.conf.\n\n' printf 'general {\n' printf ' lock_cmd = pidof hyprlock || ~/.config/quickshell/scripts/panama-lock run\n' if [[ "$lock_on_sleep" == "true" ]]; then printf ' before_sleep_cmd = loginctl lock-session\n' fi printf " after_sleep_cmd = hyprctl dispatch 'hl.dsp.dpms({ action = \"on\" })'\n" printf ' inhibit_sleep = 2\n' printf '}\n' if (( blank_min > 0 )); then printf '\n# %s minutes -> screen off.\n' "$blank_min" printf 'listener {\n' printf ' timeout = %s\n' "$(( blank_min * 60 ))" printf " on-timeout = hyprctl dispatch 'hl.dsp.dpms({ action = \"off\" })'\n" printf " on-resume = hyprctl dispatch 'hl.dsp.dpms({ action = \"on\" })'\n" printf '}\n' fi if (( lock_min > 0 )); then printf '\n# %s minutes -> lock.\n' "$lock_min" printf 'listener {\n' printf ' timeout = %s\n' "$(( lock_min * 60 ))" printf ' on-timeout = loginctl lock-session\n' printf '}\n' fi if (( suspend_min > 0 )); then printf '\n# %s minutes -> suspend.\n' "$suspend_min" printf 'listener {\n' printf ' timeout = %s\n' "$(( suspend_min * 60 ))" printf ' on-timeout = systemctl suspend\n' printf '}\n' fi } >"$generated.tmp" mv "$generated.tmp" "$generated" } install_dropin() { mkdir -p "$dropin_dir" cat >"$dropin" </dev/null || printf unknown)" \ "$blank_min" "$lock_min" "$suspend_min" "$lock_on_sleep" "$generated" ;; *) printf 'usage: panama-idle [apply|install|remove|status]\n' >&2 exit 2 ;; esac