awesomerc/ui/desktop_decoration/bar/widgets/battery.lua

103 lines
3.1 KiB
Lua

---------------------------------------------------------------------------
-- An implementation of my battery_widget widget with a dynamicly generated
-- icon based on the battery percentage level.
--
-- Find more about my battery_widget widget at
-- https://github.com/Aire-One/awesome-battery_widget
--
-- @author Aire-One
-- @copyright 2020 Aire-One
---------------------------------------------------------------------------
local lgi = require "lgi"
local cairo = lgi.cairo
local rsvg = lgi.Rsvg
local atooltip = require "awful.tooltip"
local beautiful = require "beautiful"
local gcolor = require "gears.color"
local imagebox = require "wibox.widget.imagebox"
local battery_widget = require "battery-widget"
local my_battery = {}
local mt = {}
--- Generate a drawing for the battery icon.
-- @tparam number percentage The percentage of battery remaining.
-- @tparam gears.color|string color The color of the drawing.
-- @treturn cairo.ImageSurface The generated surface for the drawing.
function my_battery.draw_battery(percentage, color)
local svg_handle = rsvg.Handle.new_from_file(beautiful.icon_battery_outline)
if not svg_handle then
return
end
local surface = cairo.ImageSurface.create(cairo.Format.ARGB32, 24, 24)
local cr = cairo.Context(surface)
svg_handle:render_cairo(cr)
local max_height = 14
local x = 8
local width = 8
local height = percentage / 100 * max_height
local y = 6 + max_height - height
cr:set_source(gcolor(color))
cr:rectangle(x, y, width, height)
cr:fill()
return surface
end
--- Update handler for the battery widget. This is the function called
-- by the signal system on battery update.
-- @tparam my_battery widget The battery widget to update.
-- @tparam UPowerGLib.Device device The UPower device to monitor.
function my_battery.update(widget, device)
widget.image = my_battery.draw_battery(device.percentage, widget.color)
end
--- Give the widget template for the battery widget.
-- (It's a basic `wibox.widget.imagebox` for my battery implementation)
function my_battery.widget_template()
local widget = imagebox()
widget.resize = true
return widget
end
--- Constructor of my battery widget!
-- @tparam table args Table of parameters.
-- @tparam screen|number args.screen The screen of the wodget.
-- @tparam string args.device_path The path of the UPower device to monitor.
-- @tparam gears.color|string args.color Color to use to draw the battery.
-- @treturn my_battery The instantiated widget.
function my_battery.new(args)
local widget = battery_widget {
screen = args.screen,
device_path = args.device_path,
widget_template = my_battery.widget_template(),
instant_update = true,
}
widget.color = args.color
widget:connect_signal("upower::update", function(w, device)
my_battery.update(w, device)
end)
widget.tooltip = atooltip {
objects = { widget },
timer_function = function()
return string.format("%3d", widget.device.percentage) .. "%"
end,
}
return widget
end
function mt:__call(...)
return my_battery.new(...)
end
return setmetatable(my_battery, mt)