summaryrefslogtreecommitdiff
path: root/battery_wgt.lua
diff options
context:
space:
mode:
Diffstat (limited to 'battery_wgt.lua')
-rw-r--r--battery_wgt.lua204
1 files changed, 204 insertions, 0 deletions
diff --git a/battery_wgt.lua b/battery_wgt.lua
new file mode 100644
index 0000000..ddf4120
--- /dev/null
+++ b/battery_wgt.lua
@@ -0,0 +1,204 @@
+-- Battery status widget
+--
+-- Based on Battery Arc Widget by Pavel Makhov
+-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/batteryarc-widget
+-- @copyright 2020 Pavel Makhov
+-- The MIT License (MIT)
+--
+-- Copyright (c) 2017
+--
+-- Permission is hereby granted, free of charge, to any person obtaining a copy
+-- of this software and associated documentation files (the "Software"), to deal
+-- in the Software without restriction, including without limitation the rights
+-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+-- copies of the Software, and to permit persons to whom the Software is
+-- furnished to do so, subject to the following conditions:
+--
+-- The above copyright notice and this permission notice shall be included in all
+-- copies or substantial portions of the Software.
+--
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-- SOFTWARE.
+
+local awful = require("awful")
+local beautiful = require("beautiful")
+-- local menubar_it = require("menubar.icon_theme")
+-- local menubar_utils = require("menubar.utils")
+local naughty = require("naughty")
+local wibox = require("wibox")
+
+local BatteryWidget = {}
+BatteryWidget.__index = BatteryWidget
+
+setmetatable(BatteryWidget, {
+ __call = function (cls, ...) return cls.new(...) end,
+})
+
+local COLORS = {
+ MAIN_FG = beautiful.fg_color,
+ MAIN_BG = '#ffffff11',
+
+
+ CHARGING = "#43a047",
+ CHARGE_MEDIUM = "#c0ca33",
+ CHARGE_LOW = "#e53935",
+
+ NOTIFY_LOW_FG = "#EEE9EF",
+ NOTIFY_LOW_BG = "#F06060",
+}
+
+function BatteryWidget:_show_battery_warning(charge_percent)
+ naughty.notify({
+ -- icon = warning_msg_icon,
+ -- icon_size = 100,
+ title = 'Low battery',
+ text = string.format('battery at %d%%', charge_percent),
+ timeout = 25, -- show the warning for a longer time
+ hover_timeout = 0.5,
+ bg = COLORS.NOTIFY_LOW_BG,
+ fg = COLORS.NOTIFY_LOW_FG,
+ width = 300,
+ })
+end
+
+function BatteryWidget:_update()
+ local capacity = self._bat.capacity
+ if not capacity then
+ local cl = self._bat.capacity_level
+ if cl == 'Full' then capacity = 100
+ elseif cl == 'High' then capacity = 75
+ elseif cl == 'Normal' then capacity = 50
+ elseif cl == 'Low' then capacity = 25
+ elseif cl == 'Critical' then capacity = 5
+ end
+ end
+
+ -- hide the widget if the battery is full
+ if self._bat.status == self._bat.STATUS.FULL then
+ self._placeholder:set_children({})
+ return
+ end
+
+ -- show the widget if it was previously hidden
+ if next(self._placeholder.children) == nil then
+ self._placeholder:set_children({self._arc})
+ end
+
+ if self._level_text ~= nil then
+ --- if battery is fully charged (100) there is not enough place for three digits, so we don't show any text
+ self._level_text.text = (capacirty and capacity >= 100) and '' or
+ string.format('%d', capacity // 1)
+ end
+
+ if self._bat.status == self._bat.STATUS.CHARGING then
+ self._arc.bg = COLORS.CHARGING
+ else
+ self._arc.bg = COLORS.MAIN_BG
+ end
+
+ if capacity then
+ self._arc.value = capacity
+
+ if capacity < 15 then
+ self._arc.colors = { COLORS.CHARGE_LOW }
+ if self._bat.status == self._bat.STATUS.DISCHARGING and
+ os.difftime(os.time(), self._last_battery_check) > 300 then
+ self:_show_battery_warning(capacity)
+ self._last_battery_check = os.time()
+ end
+ elseif capacity < 40 then
+ self._arc.colors = { COLORS.CHARGE_MEDIUM }
+ else
+ self._arc.colors = { COLORS.MAIN_FG }
+ end
+ end
+
+ -- build tooltip text
+ -- start with name + description
+ local tooltip_text = self._bat.name
+ if self._bat.desc then
+ tooltip_text = string.format('%s (%s)', tooltip_text, self._bat.desc)
+ end
+
+ -- percentage/capacity level
+ if self._bat.capacity then
+ tooltip_text = string.format('%s: %d%%', tooltip_text, self._bat.capacity)
+ elseif self._bat.capacity_level then
+ tooltip_text = string.format('%s: %s', tooltip_text, self._bat.capacity_level)
+ end
+
+ -- status + power (if available)
+ tooltip_text = string.format('%s; %s', tooltip_text, self._bat.status)
+ if self._bat.power then
+ tooltip_text = string.format('%s at %.3gW', tooltip_text, self._bat.power)
+ end
+
+ if self._bat.remaining_seconds then
+ local sec = self._bat.remaining_seconds
+
+ local h = sec // 3600
+ sec = sec - 3600 * h
+
+ local m = sec // 60
+ sec = sec - 60 * m
+
+ local s = sec // 1
+
+ local endstate = self._bat.status == self._bat.STATUS.DISCHARGING and 'empty' or 'full'
+ tooltip_text = string.format('%s; %02d:%02d:%02d until %s', tooltip_text, h, m, s, endstate)
+ end
+ self._tooltip.text = tooltip_text
+end
+
+function BatteryWidget.new(battery, user_args)
+ local self = setmetatable({}, BatteryWidget)
+
+ local args = user_args or {}
+
+ self._bat = battery
+
+ -- optional textbox showing battery charge percentage
+ local show_current_level = args.show_current_level or false
+ if show_current_level then
+ self._level_text = wibox.widget.textbox()
+ end
+
+ -- arc indicating battery charge level
+ self._arc = wibox.widget {
+ self._level_text,
+ max_value = 100,
+ rounded_edge = true,
+ thickness = args.arc_thickness or 4,
+ start_angle = 4.71238898, -- 2pi*3/4
+ bg = COLORS.MAIN_BG,
+ paddings = 2,
+ widget = wibox.container.arcchart
+ }
+
+ -- placeholder layout used to hide the widget on full battery
+ self._placeholder = wibox.layout.flex.horizontal()
+
+ -- the actually returned widget, showing the battery only on the primary screen
+ local ret_widget = awful.widget.only_on_screen(self._placeholder, "primary")
+
+ -- tooltip showing extended battery status
+ self._tooltip = awful.tooltip({})
+ self._tooltip:add_to_object(ret_widget)
+
+ self._last_battery_check = os.time()
+
+ -- wibox.widget.imagebox
+ -- local it = menubar_it()
+ -- print(it:find_icon_path('battery-full', 32))
+
+ battery:connect_signal('updated', function () self:_update() end)
+
+ return ret_widget
+end
+
+return BatteryWidget