simple-awesome/simple/widgets/system_resources.lua

202 lines
5.4 KiB
Lua

local beautiful = require("beautiful")
local gears = require("gears")
local naughty = require("naughty")
local wibox = require("wibox")
local config = require("config").widgets.system_resources
local inspect = require("simple/debug/inspect")
local bar = {
{
{
max_value = 1,
value = 0,
widget = wibox.widget.progressbar,
color = beautiful.system_resources_widget_bar_color,
background_color = beautiful.system_resources_widget_bar_bg,
shape = beautiful.system_resources_widget_bar_shape,
border_color = beautiful.system_resources_widget_border_color,
border_width = beautiful.system_resources_widget_border_width,
},
forced_width = beautiful.system_resources_widget_bar_width,
direction = "east",
layout = wibox.container.rotate,
},
margins = beautiful.system_resources_widget_bar_margin,
widget = wibox.container.margin,
}
local bars = wibox.widget {
bar,
bar,
bar,
layout = wibox.layout.flex.horizontal
}
function fileExists(name)
local f = io.open(name, "r")
if f ~= nil then
io.close(f)
return true
end
return false
end
function readCommand(command)
local handle = io.popen(command, "r")
local r = handle:read("*a")
handle:close()
return r
end
local cpuBar = bars:get_children()[1]:get_children()[1]:get_children()[1]
function getCpuData()
local raw = readCommand("cat /proc/stat | head -n 1")
local data = {raw:match((raw:gsub("[^ ]* ", "([^ ]*) ")))}
return {
user = data[3],
nice = data[4],
system = data[5],
idle = data[6],
iowait = data[7],
irq = data[8],
softirq = data[9],
steal = data[10],
}
end
local lastCpuTime = -1
local lastCpuIdle = -1
gears.timer {
timeout = config.bars.refresh_interval,
call_now = true,
autostart = true,
callback = function()
local data = getCpuData()
local currentCpuTime = data.user + data.nice + data.system + data.idle + data.iowait + data.irq + data.softirq + data.steal
local currentCpuIdle = data.idle + data.iowait
if(lastCpuTime >= 0) then
cpuBar.value = 1 - (currentCpuIdle - lastCpuIdle) / (currentCpuTime - lastCpuTime)
end
lastCpuTime = currentCpuTime
lastCpuIdle = currentCpuIdle
end
}
local memoryBar = bars:get_children()[2]:get_children()[1]:get_children()[1]
function getTotalMemory()
return readCommand("cat /proc/meminfo | grep MemTotal | awk '{print $2}'")
end
function getAvailableMemory()
return readCommand("cat /proc/meminfo | grep MemAvailable | awk '{print $2}'")
end
function getFreeMemory()
return readCommand("cat /proc/meminfo | grep MemFree | awk '{print $2}'")
end
gears.timer {
timeout = config.bars.refresh_interval,
call_now = true,
autostart = true,
callback = function()
memoryBar.value = 1 - getAvailableMemory() / getTotalMemory()
end
}
local swapBar = bars:get_children()[3]:get_children()[1]:get_children()[1]
function getTotalSwap()
return readCommand("cat /proc/meminfo | grep SwapTotal | awk '{print $2}'")
end
function getFreeSwap()
return readCommand("cat /proc/meminfo | grep SwapFree | awk '{print $2}'")
end
gears.timer {
timeout = config.bars.refresh_interval,
call_now = true,
autostart = true,
callback = function()
swapBar.value = 1 - getFreeSwap() / getTotalSwap()
end
}
local battery = wibox.widget {
{
markup = "-- %",
align = "center",
valign = "center",
widget = wibox.widget.textbox,
},
margins = beautiful.system_resources_widget_battery_margin,
widget = wibox.container.margin,
}
local batteryText = battery:get_children()[1]
local rawBatteries = readCommand("ls -A1 /sys/class/power_supply")
function getBatteries()
return rawBatteries:gmatch("([^\n]+)")
end
function hasBattery()
return rawBatteries:len() > 0
end
function getBatteryCapacity()
local charge = 0
local capacity = 0
for b in getBatteries() do
if b:sub(1,3) ~= 'hid' and readCommand("cat /sys/class/power_supply/" .. b .. "/type"):match("Battery") then
if fileExists("/sys/class/power_supply/" .. b .. "/energy_now") then
charge = charge + readCommand("cat /sys/class/power_supply/" .. b .. "/energy_now")
capacity = capacity + readCommand("cat /sys/class/power_supply/" .. b .. "/energy_full")
else
charge = charge + readCommand("cat /sys/class/power_supply/" .. b .. "/charge_now")
capacity = capacity + readCommand("cat /sys/class/power_supply/" .. b .. "/charge_full")
end
end
end
return charge / capacity
end
function isCharging()
for b in getBatteries() do
if readCommand("cat /sys/class/power_supply/" .. b .. "/type"):match("Battery") then
return readCommand("cat /sys/class/power_supply/" .. b .. "/status") ~= "Discharging"
end
end
return nil
end
if hasBattery() then
gears.timer {
timeout = config.battery.refresh_interval,
call_now = true,
autostart = true,
callback = function()
batteryText.markup = string.format("%." .. config.battery.precision .. "f", getBatteryCapacity() * 100) .. "%"
end
}
else
battery = nil
end
return {
bars = bars,
battery = battery,
}