aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/services/battery.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/services/battery.lua')
-rw-r--r--.config/awesome/services/battery.lua81
1 files changed, 81 insertions, 0 deletions
diff --git a/.config/awesome/services/battery.lua b/.config/awesome/services/battery.lua
new file mode 100644
index 0000000..98bacc9
--- /dev/null
+++ b/.config/awesome/services/battery.lua
@@ -0,0 +1,81 @@
+local UPower = require("lgi").UPowerGlib
+local gobject = require "gears.object"
+local gtimer = require "gears.timer"
+local phosphor = require "assets.phosphor"
+local qmath = require "quarrel.math"
+local qvars = require "quarrel.vars"
+
+local upower = assert(UPower.Client.new_full())
+local inner
+
+for _, device in ipairs(upower:get_devices()) do
+ if UPower.Device.kind_to_string(device.kind) == "battery" and device.model == "Primary" then
+ inner = device
+ break
+ end
+end
+
+local _level, _state
+
+---@class Battery: gears.object
+---@field _private { level: number, state: string}
+local battery = gobject {
+ class = {
+ set_level = function(self, level)
+ _level = level
+ self:emit_signal("level", level)
+ end,
+ get_level = function()
+ return _level
+ end,
+
+ set_state = function(self, state)
+ _state = state
+ self:emit_signal("state", state)
+ end,
+ get_state = function()
+ return _state
+ end,
+ },
+ enable_properties = true,
+}
+
+local function icon_handler()
+ local icon_data = battery.state == "charging" and { "charging", "green" }
+ or qmath.step_value(battery.level, {
+ { 0, { "empty", "red" } },
+ { 20, { "low", "red" } },
+ { 40, { "medium", "yellow" } },
+ { 60, { "high", "green" } },
+ { 80, { "full", "green" } },
+ { 100 },
+ })
+
+ battery:emit_signal("icon", phosphor["battery_vertical_" .. icon_data[1] .. "_fill"], qvars.colors[icon_data[2]])
+end
+
+local function level_handler()
+ battery.level = qmath.percentage(inner.energy, inner.energy_full)
+end
+
+local function state_handler()
+ battery.state = UPower.Device.state_to_string(inner.state)
+end
+
+function inner.on_notify.state()
+ state_handler()
+ icon_handler()
+end
+
+function inner.on_notify.energy()
+ level_handler()
+ icon_handler()
+end
+
+gtimer.delayed_call(function()
+ state_handler()
+ level_handler()
+ icon_handler()
+end)
+
+return battery