elenapan/config/awesome/evil/battery.lua
elenapan 20c7a8b4c1 battery: Only send charger update when status changes
On some laptops, `acpi_listen` sometimes prints charger updates even if
there was no change. This commit ensures that no unneeded updates will
be sent with the `evil::charger` signal.
2024-07-17 08:43:02 +03:00

62 lines
2 KiB
Lua

-- Provides:
-- evil::battery
-- percentage (integer)
-- evil::charger
-- plugged (boolean)
local awful = require("awful")
local update_interval = 10
-- Subscribe to power supply status changes with acpi_listen
local charger_script = [[
sh -c '
acpi_listen | grep --line-buffered ac_adapter
'
]]
-- First get battery file path
-- If there are multiple, only get the first one
-- TODO support multiple batteries
awful.spawn.easy_async_with_shell("sh -c 'out=\"$(find /sys/class/power_supply/BAT?/capacity)\" && (echo \"$out\" | head -1) || false' ", function (battery_file, _, __, exit_code)
-- No battery file found
if not (exit_code == 0) then
return
end
-- Periodically get battery info
awful.widget.watch("cat "..battery_file, update_interval, function(_, stdout)
awesome.emit_signal("evil::battery", tonumber(stdout))
end)
end)
local status_old = -1
-- First get charger file path
awful.spawn.easy_async_with_shell("sh -c 'out=\"$(find /sys/class/power_supply/*/online)\" && (echo \"$out\" | head -1) || false' ", function (charger_file, _, __, exit_code)
-- No charger file found
if not (exit_code == 0) then
return
end
-- Then initialize function that emits charger info
local emit_charger_info = function()
awful.spawn.easy_async_with_shell("cat "..charger_file, function (out)
local status = tonumber(out) == 1
if not (status == status_old) then
awesome.emit_signal("evil::charger", status)
status_old = status
end
end)
end
-- Run once to initialize widgets
emit_charger_info()
-- Kill old acpi_listen process
awful.spawn.easy_async_with_shell("ps x | grep \"acpi_listen\" | grep -v grep | awk '{print $1}' | xargs kill", function ()
-- Update charger status with each line printed
awful.spawn.with_line_callback(charger_script, {
stdout = function(_)
emit_charger_info()
end
})
end)
end)