From 510ef8e178929cf5e0c7fd5a5120fecf5f1b79f2 Mon Sep 17 00:00:00 2001 From: delta Date: Tue, 5 Mar 2024 14:48:59 +0100 Subject: idk anymore --- .config/awesome/services/backlight.lua | 34 +++++++++++++ .config/awesome/services/battery.lua | 81 +++++++++++++++++++++++++++++++ .config/awesome/services/common.lua | 87 +++++++++++++++------------------- .config/awesome/services/init.lua | 1 + .config/awesome/services/osd.lua | 7 +++ .config/awesome/services/playerctl.lua | 6 +-- 6 files changed, 163 insertions(+), 53 deletions(-) create mode 100644 .config/awesome/services/backlight.lua create mode 100644 .config/awesome/services/battery.lua create mode 100644 .config/awesome/services/osd.lua (limited to '.config/awesome/services') 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 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 -- cgit v1.2.3