local battery = req_rel(..., "util") local widget = {} -- 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.image_path = beautiful.icons.widget.missing widget.icon = wibox.widget { image = beautiful.icons.widget.missing, resize = true, widget = wibox.widget.imagebox, } widget.progressbar = wibox.widget { max_value = 100, widget = wibox.widget.progressbar, paddings = beautiful.dpi(2), color = beautiful.color.bar.active, background_color = beautiful.color.transparent, border_color = beautiful.color.bar.active, border_width = beautiful.dpi(1), margins = beautiful.dpi(3) } widget.arc = wibox.widget { { widget.icon, top = beautiful.dpi(1), bottom = beautiful.dpi(1), layout = wibox.container.margin, }, max_value = 100, thickness = beautiful.dpi(4), start_angle = 4.71238898, -- 2pi*3/4 --forced_height = beautiful.dpi(16), --forced_width = beautiful.dpi(16), colors = {"#27D4CC", "#00446B"}, bg = "#FFFFFF30", paddings = beautiful.dpi(2), widget = wibox.container.arcchart } widget.rotator = wibox.widget { widget.progressbar, forced_width = beautiful.dpi(15), direction = "east", layout = wibox.container.rotate, } widget.widget = wibox.widget { { { -- Right space widget = wibox.widget.separator, color = beautiful.color.transparent, forced_width = beautiful.dpi(3) }, { widget.arc, top = beautiful.dpi(2), bottom = beautiful.dpi(2), layout = wibox.container.margin, }, { -- Left space widget = wibox.widget.separator, color = beautiful.color.transparent, forced_width = beautiful.dpi(3) }, layout = wibox.layout.align.horizontal, }, 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.widget.caution, timeout = 5, ignore_suspend = true, border_color = beautiful.color.widget.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.progressbar.value = batpec widget.arc.value = batpec if batpec > 60 then widget.progressbar.color = beautiful.color.widget.good elseif batpec > 40 then widget.progressbar.color = beautiful.color.widget.low elseif batpec <= 40 then widget.progressbar.color = beautiful.color.widget.danger end widget.image_path = beautiful.icons.widget.missing -- Set current battery icon if (not discharging) then if batpec > 80 then widget.image_path = beautiful.icons.widget.charging.full elseif batpec > 60 then widget.image_path = beautiful.icons.widget.charging.good elseif batpec > 40 then widget.image_path = beautiful.icons.widget.charging.low elseif batpec > 20 then widget.image_path = beautiful.icons.widget.charging.caution elseif batpec <= 20 then widget.image_path = beautiful.icons.widget.charging.empty end else if batpec > 80 then widget.image_path = beautiful.icons.widget.full elseif batpec > 60 then widget.image_path = beautiful.icons.widget.good elseif batpec > 40 then widget.image_path = beautiful.icons.widget.low elseif batpec > 20 then widget.image_path = beautiful.icons.widget.caution elseif batpec <= 20 then widget.image_path = beautiful.icons.widget.empty end end widget.icon.image = widget.image_path if (not discharging) and (batpec > 90) then widget.progressbar.border_color = beautiful.color.widget.good elseif (discharging) and (batpec <= 25) then widget.progressbar.border_color = beautiful.color.widget.danger else widget.progressbar.border_color = beautiful.color.bar.active end if discharging then widget.rotator.direction = "east" else widget.rotator.direction = "west" end 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)%%") -- (\d?\d?\d)\%) local batstat = string.match(stdout, "discharging") or false if batstat then batstat = "Discharging, " else batstat = "Charging, " end local out = naughty.notify({ title = "Battery:", text = batstat .. batpec .. "%", icon = widget.image_path, replaces_id = widget.notid, ignore_suspend = true, preset = beautiful.notification_templates.bottom_right }) widget.notid = out.id end ) end end ) battery.watch( 10, function(_, stdout) widget.update(stdout) end, widget.widget ) return widget