122 lines
2.9 KiB
Awk
Executable File
122 lines
2.9 KiB
Awk
Executable File
#!/usr/bin/env -S awk -f
|
|
# -*- mode: awk -*-
|
|
function get_icon(charge) {
|
|
if (charge <= 10) {
|
|
return "";
|
|
} else if (charge <= 20) {
|
|
return "";
|
|
} else if (charge <= 30) {
|
|
return "";
|
|
} else if (charge <= 40) {
|
|
return "";
|
|
} else if (charge <= 50) {
|
|
return "";
|
|
} else if (charge <= 60) {
|
|
return "";
|
|
} else if (charge <= 70) {
|
|
return "";
|
|
} else if (charge <= 80) {
|
|
return "";
|
|
} if (charge < 100) {
|
|
return "";
|
|
} else {
|
|
return ""
|
|
}
|
|
}
|
|
|
|
function notify_send(title, desc, id) {
|
|
if (!id) {
|
|
cmd="dunstify -t 0 -p \"" title "\" \"" desc "\""
|
|
while ((cmd | getline id) > 0) { }
|
|
close(cmd)
|
|
} else {
|
|
system("dunstify -r " id " \"" title "\" \"" desc "\"")
|
|
}
|
|
return id
|
|
}
|
|
|
|
function close_notify(id) {
|
|
system("dunstify -C " id)
|
|
}
|
|
|
|
function warn_if_low() {
|
|
percentage = state_info["percentage"]
|
|
id = state_info["id"]
|
|
notified = state_info["notified"]
|
|
if (percentage <= 10) {
|
|
if (!notified) {
|
|
state_info["id"] = notify_send("Battery Low", percentage "%", id)
|
|
state_info["notified"] = 1
|
|
}
|
|
} else if (notified) {
|
|
close_notify(id)
|
|
state_info["notified"] = 0
|
|
}
|
|
}
|
|
|
|
function print_state() {
|
|
percentage = state_info["percentage"]
|
|
printf "%s%s%d%%\n",
|
|
get_icon(percentage),
|
|
state_info["charging"] ? "" : "",
|
|
percentage
|
|
fflush()
|
|
}
|
|
|
|
function parse_record(record, exit_on_absent) {
|
|
split(record, fields)
|
|
for (i in fields) {
|
|
match(fields[i], /^ *([^:]+): *(.+)$/, parts)
|
|
if (length(parts) >= 3) {
|
|
props[parts[1]] = parts[2]
|
|
}
|
|
}
|
|
name = props["native-path"]
|
|
if (name == "") {
|
|
return 0
|
|
} else if ((! BATTERY && props["power supply"] == "yes" && \
|
|
props["native-path"] ~ /BAT[0-9]+/) || name == BATTERY) {
|
|
state_info["percentage"] = props["percentage"] + 0
|
|
return 1
|
|
} else if ((! ADAPTER && props["power supply"] == "yes" && \
|
|
props["native-path"] ~ /ADP[0-9]+/) || name == ADAPTER) {
|
|
state_info["charging"] = (props["online"] == "yes")
|
|
return 1
|
|
} else {
|
|
return 0
|
|
}
|
|
}
|
|
|
|
function print_initial_stats() {
|
|
cmd = "upower --dump"
|
|
found = 0
|
|
while ((cmd | getline record) > 0) {
|
|
if (record ~ /Device: \/org\/freedesktop\/UPower\/devices\// \
|
|
&& parse_record(record)) {
|
|
found = 1
|
|
}
|
|
}
|
|
close(cmd)
|
|
if (! found) {
|
|
# we found no battery adapters
|
|
exit 1
|
|
}
|
|
print_state()
|
|
warn_if_low()
|
|
}
|
|
|
|
BEGIN {
|
|
RS = ""
|
|
FS = "\n"
|
|
print_initial_stats()
|
|
cmd = "upower --monitor-detail"
|
|
while ((cmd | getline record) > 0) {
|
|
if (record ~ /device changed/) {
|
|
parse_record(record)
|
|
print_state()
|
|
warn_if_low()
|
|
}
|
|
}
|
|
close(cmd)
|
|
}
|