awesome-batterystat/init.lua

118 lines
3.0 KiB
Lua

local awful = require("awful")
local wibox = require("wibox")
local gears = require("gears")
local beautiful = require("beautiful")
local menubar = require("menubar")
local cairo = require("lgi").cairo
local Rsvg = require("lgi").Rsvg
local longpress = require("awesome-longpress")
local posix = require "posix"
local batterystat = {
batteries = {},
iconSize = 96,
iconPath = os.getenv("HOME") .. "/.config/awesome/awesome-batterystat/"
--iconPath = gears.filesystem.get_configuration_dir() .. "/awesome-batterystat/"
}
local iconNames = {
["battery-full"] = 95,
["battery-good"] = 70,
["battery-low"] = 40,
["battery-caution"] = 20,
["battery-empty"] = 0}
local function chooseIcon(status,percent)
local bestIcon,bestPercent = "", -1
for k,v in pairs(iconNames) do
if v > bestPercent and percent >= v then
bestIcon, bestPercent = k, v
end
end
if status == "Charging" then
return bestIcon.."-charging"
end
return bestIcon
end
-- preload icon widgets to avoid loading them on every update
local icons = {}
for k,v in pairs(iconNames) do
icons[k] = wibox.widget{
widget = wibox.widget.imagebox,
forced_height = batterystat.iconSize,
forced_width = batterystat.iconSize,
image = string.format("%s/%s.svg",batterystat.iconPath,k)
}
icons[k.."-charging"] = wibox.widget{
widget = wibox.widget.imagebox,
forced_height = batterystat.iconSize,
forced_width = batterystat.iconSize,
image = string.format("%s/%s-charging.svg",batterystat.iconPath,k)
}
end
local function getBatteryState(path)
local state, percent
local f = io.open(string.format("%s/status",path),"r")
if f then
state = f:read("*a"):match("%S+")
f:close()
end
local f = io.open(string.format("%s/capacity",path),"r")
if f then
percent = tonumber(f:read("*a"):match("%S+"))
f:close()
end
return state, percent
end
function batterystat.scan()
for _,d in pairs(posix.dir("/sys/class/power_supply")) do
local f = io.open(string.format("/sys/class/power_supply/%s/type",d))
if f then
local ptype = f:read("*a"):match("%S+")
if ptype == "Battery" then
batterystat.batteries[#batterystat.batteries+1] = string.format("/sys/class/power_supply/%s/",d)
end
f:close()
end
end
end
local function bwidgetUpdate(self)
self:reset()
for k,v in pairs(batterystat.batteries) do
local name = v:match("/([^/]+)/$")
local state, percent = getBatteryState(v)
local colour = (state == "Charging") and "lime" or "red"
local sbwidget = (wibox.widget{
layout = wibox.layout.stack,
forced_width = batterystat.iconSize,
icons[chooseIcon(state,percent)],
wibox.widget{
widget = wibox.widget.textbox,
align = "center",
valign = "top",
text = name
},
wibox.widget{
widget = wibox.widget.textbox,
align = "right",
valign = "bottom",
markup = string.format('<span foreground="%s" size="x-large">%d%%</span>',colour,percent)
}
})
self:add(sbwidget)
end
end
function batterystat.new()
local bwidget = wibox.widget{
layout = wibox.layout.grid.horizontal,
update = bwidgetUpdate
}
batterystat.scan()
return bwidget
end
return batterystat