dotfiles/awes2/module/battery-notifier.lua

158 lines
3.5 KiB
Lua

-- Battery notification module
-- Dependencies:
-- acpid, upower, acpi_listens, acpi_call
-- enabled acpid service
local awful = require('awful')
local naughty = require('naughty')
local icons = require('theme.icons')
local update_interval = 30
-- Periodically get battery info
awful.widget.watch(
[[
sh -c "
upower -i $(upower -e | grep BAT) | grep percentage | awk '{print $2}'
"]],
update_interval,
function(widget, stdout)
local battery = stdout:gsub("%%", "")
awesome.emit_signal("module::battery", tonumber(battery))
end
)
local emit_charger_info = function()
awful.spawn.easy_async_with_shell(
"cat /sys/class/power_supply/*/online",
function (stdout)
status = tonumber(stdout)
if status == 1 then
awesome.emit_signal("module::charger", true)
else
awesome.emit_signal("module::charger", false)
end
end
)
end
emit_charger_info()
awful.spawn.easy_async_with_shell(
"ps x | grep \"acpi_listen\" | grep -v grep | awk '{print $1}' | xargs kill",
function ()
awful.spawn.with_line_callback(
[[
sh -c '
acpi_listen | grep --line-buffered ac_adapter
']],
{
stdout = function(_)
emit_charger_info()
end
}
)
end
)
local charger_plugged = true
local battery_full_already_notified = true
local battery_low_already_notified = false
local battery_critical_already_notified = false
local last_notification
local function send_notification(title, text, icon, timeout, urgency)
local args = {
title = title,
text = text,
icon = icon,
timeout = timeout,
urgency = urgency,
app_name = 'Power Notification'
}
if last_notification and not last_notification.is_expired then
last_notification.title = args.title
last_notification.text = args.text
last_notification.icon = args.icon
else
last_notification = naughty.notification(args)
end
last_notification = notification
end
-- Full / Low / Critical notifications
awesome.connect_signal("module::battery", function(battery)
local text
local icon
local timeout
if not charger_plugged then
icon = icons.batt_discharging
if battery < 6 and not battery_critical_already_notified then
battery_critical_already_notified = true
text = "Battery Critical!"
timeout = 0
urgency = 'critical'
elseif battery < 16 and not battery_low_already_notified then
battery_low_already_notified = true
text = "Battery Full!"
timeout = 6
urgency = 'normal'
end
else
icon = icons.batt_charging
if battery ~= nil then
if battery > 99 and not battery_full_already_notified then
battery_full_already_notified = true
text = "Battery Full!"
timeout = 6
urgency = 'normal'
end
end
end
-- If text has been initialized, then we need to send a
-- notification
if text then
send_notification("Battery status", text, icon, timeout, urgency)
end
end)
-- Charger notifications
local charger_first_time = true
awesome.connect_signal("module::charger", function(plugged)
charger_plugged = plugged
local text
local icon
-- TODO if charger is plugged and battery is full, then set
-- battery_full_already_notified to true
if plugged then
battery_critical_already_notified = false
battery_low_already_notified = false
text = "Plugged"
icon = icons.batt_charging
urgency = 'normal'
else
battery_full_already_notified = false
text = "Unplugged"
icon = icons.batt_discharging
urgency = 'normal'
end
-- Do not send a notification the first time (when AwesomeWM (re)starts)
if charger_first_time then
charger_first_time = false
else
send_notification("Charger Status", text, icon, 3, urgency)
end
end)