local battery = req_rel(..., "util") local widget = {} local dotgrid = require("widgets.dotgrid") -- Percentages to warn at -- (must be in order least -> greatest) widget.warnings = { 5, 10, 25, 50 } widget.warninglog = {} for i=1, #widget.warnings do widget.warninglog[i] = false end widget.dots = dotgrid:new(); widget.dots.on_color = {1, 0, 0} widget.dots.off_color = {0.5, 0, 0} widget.dots.spacing = beautiful.dpi(2) widget.widget = wibox.widget { { widget.dots, top = beautiful.dpi(2), bottom = beautiful.dpi(2), left = beautiful.dpi(2), right = beautiful.dpi(2), layout = wibox.container.margin, }, layout = wibox.container.background, } widget.widget:connect_signal("mouse::enter", function(result) widget.widget.bg = beautiful.color.bar.hover_bg end) widget.widget:connect_signal("mouse::leave", function(result) widget.widget.bg = beautiful.color.transparent end) widget.update = function(stdout) local batpec = string.match(stdout, "(%d?%d?%d)%%") batpec = tonumber(string.format("% 3d", batpec)) local discharging = string.match(stdout, "Discharging") or false -- Handle low power notifications if discharging then for i=1, #widget.warnings do v = widget.warnings[i] if (batpec <= v) and (not widget.warninglog[i]) then widget.warninglog[i] = true naughty.notify({ title = "Low power", text = "Battery is at " .. tostring(batpec) .. "%", icon = beautiful.icons.battery.caution, timeout = 5, ignore_suspend = true, border_color = beautiful.color.battery.danger, preset = beautiful.notification_templates.bottom_right }) break end end else for i=1, #widget.warnings do if (batpec >= widget.warnings[i]) then widget.warninglog[i] = false end end end widget.dots.value = batpec if discharging then widget.dots.on_color = {1, 0, 0} widget.dots.off_color = {0.5, 0, 0} else widget.dots.on_color = {1, 1, 0} widget.dots.off_color = {0.5, 0.5, 0} end widget.dots:emit_signal("widget::redraw_needed") end widget.readupdate = function() battery.status( function(stdout, stderr, exitreason, exitcode) widget.update(stdout) end ) end widget.widget:connect_signal("button::press", function(_, _, _, button, mods) if (button == 1) then battery.status( function(stdout, stderr, exitreason, exitcode) local batpec = string.match(stdout, "(%d?%d?%d)%%") batpec = tonumber(string.format("% 3d", batpec)) local batstat = string.match(stdout, "Discharging") or false debug_message(batpec) if batstat then batstat = "Discharging, " else batstat = "Charging, " end local out = naughty.notify({ title = "Battery:", text = batstat .. batpec .. "%", icon = widget.icon.image, replaces_id = widget.notid, ignore_suspend = true, preset = beautiful.notification_templates.bottom_right }) widget.notid = out.id end ) end end ) battery.watch( 2, function(_, stdout) widget.update(stdout) end, widget.widget ) return widget