-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkeepscreen
More file actions
executable file
·159 lines (136 loc) · 4.32 KB
/
keepscreen
File metadata and controls
executable file
·159 lines (136 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/usr/bin/env bash
set -euo pipefail
PROGRAM_NAME="keepscreen"
usage() {
cat <<'EOF'
Usage:
keepscreen on
keepscreen off
keepscreen status
Behavior:
on:
- Set all related settings to Never (keep screen on)
off:
- Restore preset values (3/5/5/5 minutes)
Options:
--dry-run Print commands without changing settings
-h, --help Show help
EOF
}
die() { echo "${PROGRAM_NAME}: $*" >&2; exit 1; }
DRY_RUN=0
ARGS=()
for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=1 ;;
-h|--help) usage; exit 0 ;;
*) ARGS+=("$arg") ;;
esac
done
ACTION="${ARGS[0]:-}"
case "$ACTION" in
on|off|status) ;;
"" ) usage; exit 2 ;;
* ) die "unknown command: $ACTION (expected: on|off|status)" ;;
esac
need_cmd() { command -v "$1" >/dev/null 2>&1 || die "missing required command: $1"; }
need_cmd defaults
need_cmd pmset
run() {
if [[ "$DRY_RUN" == "1" ]]; then
printf '%s\n' "+ $*"
return 0
fi
"$@"
}
run_sudo() {
if [[ "$DRY_RUN" == "1" ]]; then
printf '%s\n' "+ sudo $*"
return 0
fi
sudo "$@"
}
set_screensaver_idle_seconds() {
local seconds="$1"
run defaults -currentHost write com.apple.screensaver idleTime -int "$seconds"
}
set_password_required() {
local enabled="$1" # 0|1
local delay_seconds="$2"
# macOS preference storage varies by version; set both global and per-host.
run defaults write com.apple.screensaver askForPassword -int "$enabled"
run defaults write com.apple.screensaver askForPasswordDelay -int "$delay_seconds"
run defaults -currentHost write com.apple.screensaver askForPassword -int "$enabled"
run defaults -currentHost write com.apple.screensaver askForPasswordDelay -int "$delay_seconds"
}
set_display_sleep_minutes() {
local minutes="$1"
run_sudo pmset -b displaysleep "$minutes"
run_sudo pmset -c displaysleep "$minutes"
}
read_screensaver_idle_seconds() {
# Returns integer seconds; defaults to 0 when unset.
defaults -currentHost read com.apple.screensaver idleTime 2>/dev/null || echo 0
}
read_password_required() {
local enabled delay enabled_host delay_host
enabled_host="$(defaults -currentHost read com.apple.screensaver askForPassword 2>/dev/null || echo "")"
delay_host="$(defaults -currentHost read com.apple.screensaver askForPasswordDelay 2>/dev/null || echo "")"
enabled="$(defaults read com.apple.screensaver askForPassword 2>/dev/null || echo 0)"
delay="$(defaults read com.apple.screensaver askForPasswordDelay 2>/dev/null || echo 0)"
[[ -n "$enabled_host" ]] && enabled="$enabled_host"
[[ -n "$delay_host" ]] && delay="$delay_host"
printf '%s %s\n' "$enabled" "$delay"
}
read_display_sleep_minutes() {
# Prints: "<battery_minutes> <ac_minutes>" (0 when unset/unknown)
# pmset -g custom format varies slightly across macOS, so parse defensively.
local out battery ac
out="$(pmset -g custom 2>/dev/null || true)"
battery="$(awk '
$0 ~ /^Battery Power/ {inb=1; next}
$0 ~ /^AC Power/ {inb=0}
inb && $1=="displaysleep" {print $2; exit}
' <<<"$out")"
ac="$(awk '
$0 ~ /^AC Power/ {ina=1; next}
$0 ~ /^Battery Power/ {ina=0}
ina && $1=="displaysleep" {print $2; exit}
' <<<"$out")"
[[ -n "${battery:-}" ]] || battery="0"
[[ -n "${ac:-}" ]] || ac="0"
printf '%s %s\n' "$battery" "$ac"
}
print_status() {
local idle enabled delay battery ac
idle="$(read_screensaver_idle_seconds)"
read -r enabled delay < <(read_password_required)
read -r battery ac < <(read_display_sleep_minutes)
echo "Screen saver idleTime: ${idle}s"
echo "Require password: ${enabled} (delay: ${delay}s)"
echo "Display sleep: battery=${battery}m ac=${ac}m"
}
apply_on() {
# Keep screen on: set everything to "Never".
set_screensaver_idle_seconds 0
set_display_sleep_minutes 0
set_password_required 0 0
# Encourage settings to refresh quickly.
run killall cfprefsd >/dev/null 2>&1 || true
run killall "System Settings" >/dev/null 2>&1 || true
run killall "System Preferences" >/dev/null 2>&1 || true
}
apply_off() {
# Restore preset values (matches the screenshot).
set_screensaver_idle_seconds 180
set_display_sleep_minutes 5
set_password_required 1 300
run killall cfprefsd >/dev/null 2>&1 || true
run killall "System Settings" >/dev/null 2>&1 || true
run killall "System Preferences" >/dev/null 2>&1 || true
}
case "$ACTION" in
on) apply_on ;;
off) apply_off ;;
status) print_status ;;
esac