aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/services
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/services')
-rw-r--r--.config/awesome/services/backlight.lua34
-rw-r--r--.config/awesome/services/battery.lua81
-rw-r--r--.config/awesome/services/common.lua87
-rw-r--r--.config/awesome/services/init.lua1
-rw-r--r--.config/awesome/services/osd.lua7
-rw-r--r--.config/awesome/services/playerctl.lua6
6 files changed, 163 insertions, 53 deletions
diff --git a/.config/awesome/services/backlight.lua b/.config/awesome/services/backlight.lua
new file mode 100644
index 0000000..02ed808
--- /dev/null
+++ b/.config/awesome/services/backlight.lua
@@ -0,0 +1,34 @@
+local backlight = require("lib.lit").backlight.new("amdgpu_bl1", 5)
+local gobject = require "gears.object"
+local gtimer = require "gears.timer"
+local naughty = require "naughty"
+local phosphor = require "assets.phosphor"
+local qmath = require "quarrel.math"
+local qvars = require "quarrel.vars"
+
+local backlight_wrapper = gobject {
+ class = {
+ set = function(level, handler)
+ backlight.set(level, handler)
+ end,
+ get = function()
+ return backlight.get()
+ end,
+ },
+}
+
+backlight:connect_signal("brightness", function(_, brightness)
+ local icon_data = qmath.step_value(brightness, {
+ { 0, "cloud_moon" },
+ { 51, "moon" },
+ { 102, "sun_horizon" },
+ { 153, "sun_dim" },
+ { 204, "sun" },
+ { 255 },
+ })
+
+ backlight_wrapper:emit_signal("icon", phosphor[icon_data .. "_fill"], qvars.colors.fg)
+ backlight_wrapper:emit_signal("value", brightness)
+end)
+
+return backlight_wrapper
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
diff --git a/.config/awesome/services/common.lua b/.config/awesome/services/common.lua
index b23a064..ad1f998 100644
--- a/.config/awesome/services/common.lua
+++ b/.config/awesome/services/common.lua
@@ -1,52 +1,61 @@
local gfs = require "gears.filesystem"
local gtimer = require "gears.timer"
local phosphor = require "assets.phosphor"
-local qfs = require "quarrel.fs"
local qjson = require "quarrel.json"
local qmath = require "quarrel.math"
local qnative = require "quarrel.native"
local qstore = require "quarrel.store"
local qvars = require "quarrel.vars"
+local UPower = require("lgi").UPowerGlib
-local q = require "quarrel"
-
-local function register(name, service, icon)
+--- Register a service
+---@param name string
+---@param service Service
+local function register(name, service)
gtimer {
- timeout = 0.5,
+ timeout = 1,
call_now = true,
autostart = true,
callback = function()
- local service_result = table.pack(service())
+ local service_result = table.pack(service[1]())
awesome.emit_signal("services::" .. name, table.unpack(service_result))
- awesome.emit_signal("services::" .. name .. "::icon", icon(table.unpack(service_result)))
- end
+ awesome.emit_signal("services::" .. name .. "::icon", service[2](table.unpack(service_result)))
+ end,
}
end
+--- Read a file and automatically close it
+---@param file FileHandle
+---@param format ReadMode?
+---@return string | number
local function read(file, format)
local content = file:read(format or "a")
- file:seek("set")
+ file:rewind()
return content
end
-- create file in case it's not there yet
-if not gfs.file_readable("/tmp/wp_audio_status") then
+if not gfs.file_readable "/tmp/wp_audio_status" then
assert(io.open("/tmp/wp_audio_status", "w")):write("{}"):close()
end
-qstore.audio_file = assert(io.open("/tmp/wp_audio_status", "r"))
-qstore.battery_capacity_file = assert(io.open("/sys/class/power_supply/BAT0/capacity", "r"))
-qstore.battery_status_file = assert(io.open("/sys/class/power_supply/BAT0/status", "r"))
-qstore.brightness_file = assert(io.open("/sys/class/backlight/amdgpu_bl0/actual_brightness", "r"))
-qstore.wifi_file = assert(io.open("/proc/net/wireless", "r"))
+
+qstore.audio_file = qnative.util.open_file "/tmp/wp_audio_status"
+qstore.brightness_file = qnative.util.open_file "/sys/class/backlight/amdgpu_bl1/actual_brightness"
+qstore.wifi_file = qnative.util.open_file "/proc/net/wireless"
-- follows the format `service = { provider, icon_provider }`
+---@class Service
+---@field [1] fun(): ...
+---@field [2] fun(...): path: string, color: string
+
+---@type table<string, Service>
local services = {
audio = {
-- volume, muted
function()
local audio_status = qjson.decode(read(qstore.audio_file))
local default_sink = audio_status["G435 Wireless Gaming Headset Analog Stereo"]
-
+
if not default_sink then
return nil, false
end
@@ -63,29 +72,11 @@ local services = {
{ 25, "none" },
{ 50, "low" },
{ 75, "high" },
- { 100 }
+ { 100 },
})
return phosphor["speaker_simple_" .. icon_data .. "_fill"], qvars.colors.fg
- end
- },
- battery = {
- -- capacity, status
- function()
- return read(qstore.battery_capacity_file, "n"), read(qstore.battery_status_file, "l")
end,
- function(capacity, status)
- local icon_data = status == "Charging" and { "charging", "green" } or qmath.step_value(capacity, {
- { 0, { "empty", "red" } },
- { 20, { "low", "red" } },
- { 40, { "medium", "yellow" } },
- { 60, { "high", "green" } },
- { 80, { "full", "green" } },
- { 100 }
- })
-
- return phosphor["battery_vertical_" .. icon_data[1] .. "_fill"], qvars.colors[icon_data[2]]
- end
},
brightness = {
-- brightness
@@ -99,29 +90,25 @@ local services = {
{ 102, "sun_horizon" },
{ 153, "sun_dim" },
{ 204, "sun" },
- { 255 }
+ { 255 },
})
return phosphor[icon_data .. "_fill"], qvars.colors.fg
- end
+ end,
},
wifi = {
-- essid, strength, connected
function()
- local lines = {}
-
- for line in qstore.wifi_file:lines() do
- table.insert(lines, line)
- end
- qstore.wifi_file:seek("set")
+ local lines = qstore.wifi_file:lines()
+ qstore.wifi_file:rewind()
- if not lines[3] then
+ if not lines[3] then
return nil, 0, false
end
- local strength = lines[3]:match("^%s*(.*)"):match("^.-%s+.-%s+.-(%S+)%.")
+ local strength = lines[3]:match("^%s*(.*)"):match "^.-%s+.-%s+.-(%S+)%."
- return qnative.get_essid(), math.floor(tonumber(strength) * 10 / 7), true
+ return qnative.net.get_essid(), math.floor(tonumber(strength) * 10 / 7), true
end,
function(_, strength, connected)
if not connected then
@@ -133,14 +120,14 @@ local services = {
{ 25, { "low", "yellow" } },
{ 50, { "medium", "yellow" } },
{ 75, { "high", "green" } },
- { 100 }
+ { 100 },
})
return phosphor["wifi_" .. icon_data[1] .. "_fill"], qvars.colors[icon_data[2]]
- end
- }
+ end,
+ },
}
for name, service in pairs(services) do
- register(name, service[1], service[2])
+ register(name, service)
end
diff --git a/.config/awesome/services/init.lua b/.config/awesome/services/init.lua
index 4ac624f..dc081ff 100644
--- a/.config/awesome/services/init.lua
+++ b/.config/awesome/services/init.lua
@@ -1,2 +1,3 @@
require "services.common"
require "services.playerctl"
+require "services.battery"
diff --git a/.config/awesome/services/osd.lua b/.config/awesome/services/osd.lua
new file mode 100644
index 0000000..c4fa3e7
--- /dev/null
+++ b/.config/awesome/services/osd.lua
@@ -0,0 +1,7 @@
+local battery = require "services.battery"
+local osd = require "ui.osd"
+local phosphor = require "assets.phosphor"
+
+-- battery:connect_signal("icon", function (self, icon, _)
+-- osd.notify(icon, self.level, 100)
+-- end)
diff --git a/.config/awesome/services/playerctl.lua b/.config/awesome/services/playerctl.lua
index 3fb0a3d..f6ee71a 100644
--- a/.config/awesome/services/playerctl.lua
+++ b/.config/awesome/services/playerctl.lua
@@ -1,5 +1,5 @@
-local playerctl = require "lib.bling.signal.playerctl".lib {
- player = { "spotify", "%any" }
+local playerctl = require("lib.bling.signal.playerctl").lib {
+ player = { "spotify", "%any" },
}
playerctl:connect_signal("metadata", function(_, ...)
@@ -39,7 +39,7 @@ playerctl:connect_signal("exit", function(_, ...)
end)
playerctl:connect_signal("no_players", function()
- awesome.emit_signal("services::playerctl::no_players")
+ awesome.emit_signal "services::playerctl::no_players"
end)
return playerctl