summaryrefslogtreecommitdiff
path: root/polybar/scripts/awake-toggle.sh
diff options
context:
space:
mode:
authorDavid Moc <personal@cdatgoose.org>2026-05-24 11:48:07 +0200
committerDavid Moc <personal@cdatgoose.org>2026-05-24 11:48:07 +0200
commit5fb19f10389b70ee2389755106092a9ef6c64598 (patch)
tree969eb0466de581cb14aa09f751a95138620fc720 /polybar/scripts/awake-toggle.sh
Go
Diffstat (limited to 'polybar/scripts/awake-toggle.sh')
-rwxr-xr-xpolybar/scripts/awake-toggle.sh122
1 files changed, 122 insertions, 0 deletions
diff --git a/polybar/scripts/awake-toggle.sh b/polybar/scripts/awake-toggle.sh
new file mode 100755
index 0000000..608bbc2
--- /dev/null
+++ b/polybar/scripts/awake-toggle.sh
@@ -0,0 +1,122 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+state_dir="${XDG_RUNTIME_DIR:-/tmp}"
+if [ ! -w "$state_dir" ]; then
+ state_dir="${XDG_CACHE_HOME:-$HOME/.cache}"
+ mkdir -p "$state_dir"
+fi
+if [ ! -w "$state_dir" ]; then
+ state_dir="/tmp"
+fi
+state_file="$state_dir/polybar-awake.state"
+action="${1:-toggle}"
+
+export DISPLAY="${DISPLAY:-:0}"
+if [ -z "${XAUTHORITY:-}" ] && [ -r "$HOME/.Xauthority" ]; then
+ export XAUTHORITY="$HOME/.Xauthority"
+fi
+
+notify() {
+ if command -v dunstify >/dev/null 2>&1; then
+ dunstify -a polybar -u low "Force awake" "$1"
+ fi
+}
+
+save_current_state() {
+ local query
+ query="$(xset q)"
+
+ {
+ printf 'blanking=%s\n' "$(printf '%s\n' "$query" | awk '/prefer blanking:/ { print $3; exit }')"
+ printf 'exposures=%s\n' "$(printf '%s\n' "$query" | awk '/allow exposures:/ { print $6; exit }')"
+ printf 'timeout=%s\n' "$(printf '%s\n' "$query" | awk '/timeout:/ { print $2; exit }')"
+ printf 'cycle=%s\n' "$(printf '%s\n' "$query" | awk '/timeout:/ { print $4; exit }')"
+ printf 'standby=%s\n' "$(printf '%s\n' "$query" | awk '/Standby:/ { print $2; exit }')"
+ printf 'suspend=%s\n' "$(printf '%s\n' "$query" | awk '/Standby:/ { print $4; exit }')"
+ printf 'off=%s\n' "$(printf '%s\n' "$query" | awk '/Standby:/ { print $6; exit }')"
+ printf 'dpms=%s\n' "$(printf '%s\n' "$query" | awk '/DPMS is/ { print $3; exit }')"
+ } >"$state_file"
+}
+
+enable_awake() {
+ if [ ! -f "$state_file" ]; then
+ save_current_state
+ fi
+
+ xset s noblank
+ xset s off
+ xset -dpms
+ notify "enabled"
+}
+
+restore_value() {
+ local name="$1"
+ local fallback="$2"
+ local value
+
+ value="$(awk -F= -v key="$name" '$1 == key { print $2; exit }' "$state_file" 2>/dev/null || true)"
+ printf '%s' "${value:-$fallback}"
+}
+
+disable_awake() {
+ if [ -f "$state_file" ]; then
+ local blanking exposures timeout cycle standby suspend off dpms
+ blanking="$(restore_value blanking yes)"
+ exposures="$(restore_value exposures yes)"
+ timeout="$(restore_value timeout 600)"
+ cycle="$(restore_value cycle 600)"
+ standby="$(restore_value standby 600)"
+ suspend="$(restore_value suspend 600)"
+ off="$(restore_value off 600)"
+ dpms="$(restore_value dpms Enabled)"
+
+ if [ "$blanking" = "yes" ]; then
+ xset s blank
+ else
+ xset s noblank
+ fi
+
+ if [ "$exposures" = "yes" ]; then
+ xset s expose
+ else
+ xset s noexpose
+ fi
+
+ xset s "$timeout" "$cycle"
+ xset dpms "$standby" "$suspend" "$off"
+
+ if [ "$dpms" = "Enabled" ]; then
+ xset +dpms
+ else
+ xset -dpms
+ fi
+
+ rm -f "$state_file"
+ else
+ xset s on
+ xset +dpms
+ fi
+
+ notify "disabled"
+}
+
+case "$action" in
+ on)
+ enable_awake
+ ;;
+ off)
+ disable_awake
+ ;;
+ toggle)
+ if [ -f "$state_file" ]; then
+ disable_awake
+ else
+ enable_awake
+ fi
+ ;;
+ *)
+ notify "unknown action: $action"
+ exit 2
+ ;;
+esac