aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/services/common.lua
blob: 07300dbc3b4662d037ec6b93a31e617bd7e0b68a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
local qfs = require "quarrel.fs"
local gfs = require "gears.filesystem"
local qservice = require "quarrel.service"
local qjson = require "quarrel.json"
local qnative = require "quarrel.native"
local gcolor = require "gears.color"
local qmath = require "quarrel.math"
local phosphor = require "assets.phosphor"
local qvars = require "quarrel.vars"

-- follows the format `service = { provider, icon_provider }`
local services = {
    audio = {
        -- volume, muted
        function()
            if not gfs.file_readable("/tmp/wp_audio_status") then
                awesome.emit_signal("services::audio", -1, false)
                return
            end
            local audio_status = qjson.decode(qfs.read("/tmp/wp_audio_status"))
            local default_sink = audio_status["alsa_output.usb-046d_G435_Wireless_Gaming_Headset_V001008005.1-01.analog-stereo"]
            
            if not default_sink then
                return nil, false
            end

            return default_sink.volume, default_sink.muted
        end,
        function(volume, muted)
            if muted or not volume then
                return gcolor.recolor_image(phosphor["speaker_simple_x_fill"], qvars.colors.red)
            end

            local icon_data = qmath.step_value(volume, {
                { 0, "slash" },
                { 25, "none" },
                { 50, "low" },
                { 75, "high" },
                { 100 }
            })

            gcolor.recolor_image(phosphor["speaker_simple_" .. icon_data .. "_fill"], qvars.colors.fg)
        end
    },
    battery = {
        -- capacity, status
        function()
            return qfs.read("/sys/class/power_supply/BAT0/capacity", "n"), qfs.read("/sys/class/power_supply/BAT0/status", "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 gcolor.recolor_image(phosphor["battery_vertical_" .. icon_data[1] .. "_fill"], qvars.colors[icon_data[2]])
        end
    },
    brightness = {
        -- brightness
        function()
            return qfs.read("/sys/class/backlight/amdgpu_bl0/actual_brightness", "n")
        end,
        function(brightness)
            local icon_data = qmath.step_value(brightness, {
                { 0, "cloud_moon" },
                { 51, "moon" },
                { 102, "sun_horizon" },
                { 153, "sun_dim" },
                { 204, "sun" },
                { 255 }
            })

            return gcolor.recolor_image(phosphor[icon_data .. "_fill"], qvars.colors.fg)
        end
    },
    wifi = {
        -- essid, strength, connected
        function()
            local lines = {}
    
            for line in io.lines("/proc/net/wireless") do
                table.insert(lines, line)
            end

            if not lines[3] then 
                return nil, 0, false
            end

            local strength = lines[3]:match("^%s*(.*)"):match("^.-%s+.-%s+.-(%S+)%.")

            return qnative.get_essid(), math.floor(tonumber(strength) * 10 / 7), true
        end,
        function(_, strength, connected)
            if not connected then
                return gcolor.recolor_image(phosphor.wifi_x_fill, qvars.colors.red)
            end

            local icon_data = qmath.step_value(strength, {
                { 0, { "none", "red" } },
                { 25, { "low", "yellow" } },
                { 50, { "medium", "yellow" } },
                { 75, { "high", "green" } },
                { 100 }
            })

            return gcolor.recolor_image(phosphor["wifi_" .. icon_data[1] .. "_fill"], qvars.colors[icon_data[2]])
        end
    }
}

for name, service in pairs(services) do
    qservice.register(name, service[1], service[2])
end