lain/widget/fs.lua

157 lines
5.1 KiB
Lua
Raw Normal View History

2013-09-07 12:06:42 +02:00
--[[
Licensed under GNU General Public License v2
2018-02-16 17:21:09 +01:00
* (c) 2018, Uli Schlacter
* (c) 2018, Otto Modinos
* (c) 2013, Luca CPZ
2013-09-07 12:06:42 +02:00
--]]
2022-03-22 19:45:38 +01:00
local helpers = require(tostring(...):match(".*lain") .. ".helpers")
2018-02-16 17:21:09 +01:00
local Gio = require("lgi").Gio
local focused = require("awful.screen").focused
local wibox = require("wibox")
local naughty = require("naughty")
local gears = require("gears")
2018-02-16 17:21:09 +01:00
local math = math
local string = string
2018-02-16 17:21:09 +01:00
local tconcat = table.concat
local type = type
2018-02-16 17:21:09 +01:00
local query_size = Gio.FILE_ATTRIBUTE_FILESYSTEM_SIZE
local query_free = Gio.FILE_ATTRIBUTE_FILESYSTEM_FREE
local query_used = Gio.FILE_ATTRIBUTE_FILESYSTEM_USED
local query = query_size .. "," .. query_free .. "," .. query_used
-- File systems info
2017-02-08 14:15:48 +01:00
-- lain.widget.fs
2017-01-21 00:09:54 +01:00
local function factory(args)
2020-11-29 22:48:32 +01:00
args = args or {}
2018-02-16 17:21:09 +01:00
local fs = {
widget = args.widget or wibox.widget.textbox(),
2018-02-16 17:21:09 +01:00
units = {
[1] = "Kb", [2] = "Mb", [3] = "Gb",
[4] = "Tb", [5] = "Pb", [6] = "Eb",
[7] = "Zb", [8] = "Yb"
}
}
2013-09-07 12:06:42 +02:00
function fs.hide()
if not fs.notification then return end
naughty.destroy(fs.notification)
fs.notification = nil
end
2017-01-24 18:42:44 +01:00
function fs.show(seconds, scr)
fs.hide()
fs.update(function()
fs.notification_preset.screen = fs.followtag and focused() or scr or 1
fs.notification = naughty.notify {
preset = fs.notification_preset,
timeout = type(seconds) == "number" and seconds or 5
}
end)
end
2013-09-07 12:06:42 +02:00
2018-02-16 17:21:09 +01:00
local timeout = args.timeout or 600
local partition = args.partition
local threshold = args.threshold or 99
2018-02-16 17:21:09 +01:00
local showpopup = args.showpopup or "on"
local settings = args.settings or function() end
2017-01-08 14:45:20 +01:00
fs.followtag = args.followtag or false
2017-01-22 02:13:02 +01:00
fs.notification_preset = args.notification_preset
if not fs.notification_preset then
2017-01-25 18:38:50 +01:00
fs.notification_preset = {
font = "Monospace 10",
fg = "#FFFFFF",
bg = "#000000"
}
2017-01-22 02:13:02 +01:00
end
2013-09-07 12:06:42 +02:00
local function update_synced()
local pathlen = 10
2018-02-16 17:21:09 +01:00
fs_now = {}
2020-05-23 15:17:15 +02:00
local notifypaths = {}
2018-02-16 17:21:09 +01:00
for _, mount in ipairs(Gio.unix_mounts_get()) do
local path = Gio.unix_mount_get_mount_path(mount)
local root = Gio.File.new_for_path(path)
local info = root:query_filesystem_info(query)
if info then
local size = info:get_attribute_uint64(query_size)
local used = info:get_attribute_uint64(query_used)
local free = info:get_attribute_uint64(query_free)
if size > 0 then
local units = math.floor(math.log(size)/math.log(1024))
fs_now[path] = {
units = fs.units[units],
percentage = math.floor(100 * used / size), -- used percentage
2020-05-23 15:17:15 +02:00
size = size / math.pow(1024, units),
used = used / math.pow(1024, units),
free = free / math.pow(1024, units)
}
if fs_now[path].percentage > 0 then -- don't notify unused file systems
2020-05-23 15:17:15 +02:00
notifypaths[#notifypaths+1] = path
if #path > pathlen then
pathlen = #path
end
end
2018-02-16 17:21:09 +01:00
end
2017-01-21 00:09:54 +01:00
end
2018-02-16 17:21:09 +01:00
end
2017-01-21 00:09:54 +01:00
2018-02-16 17:21:09 +01:00
widget = fs.widget
settings()
if partition and fs_now[partition] and fs_now[partition].percentage >= threshold then
2018-02-16 17:21:09 +01:00
if not helpers.get_map(partition) then
naughty.notify {
preset = naughty.config.presets.critical,
title = "Warning",
text = string.format("%s is above %d%% (%d%%)", partition, threshold, fs_now[partition].percentage)
2018-02-16 17:21:09 +01:00
}
2017-01-21 00:09:54 +01:00
helpers.set_map(partition, true)
else
helpers.set_map(partition, false)
2013-09-07 12:06:42 +02:00
end
2018-02-16 17:21:09 +01:00
end
2017-01-24 18:42:44 +01:00
2020-05-23 15:17:15 +02:00
local fmt = "%-" .. tostring(pathlen) .. "s %4s\t%6s\t%6s\n"
local notifytable = { [1] = string.format(fmt, "path", "used", "free", "size") }
fmt = "\n%-" .. tostring(pathlen) .. "s %3s%%\t%6.2f\t%6.2f %s"
for _, path in ipairs(notifypaths) do
notifytable[#notifytable+1] = string.format(fmt, path, fs_now[path].percentage, fs_now[path].free, fs_now[path].size, fs_now[path].units)
end
2018-02-16 17:21:09 +01:00
fs.notification_preset.text = tconcat(notifytable)
2013-09-07 12:06:42 +02:00
end
function fs.update(callback)
Gio.Async.start(gears.protected_call.call)(function()
update_synced()
if type(callback) == "function" and callback then
callback()
end
end)
end
if showpopup == "on" then
2016-12-10 15:45:50 +01:00
fs.widget:connect_signal('mouse::enter', function () fs.show(0) end)
fs.widget:connect_signal('mouse::leave', function () fs.hide() end)
end
2013-09-07 12:06:42 +02:00
2018-02-16 17:21:09 +01:00
helpers.newtimer(partition or "fs", timeout, fs.update)
2017-01-26 20:53:55 +01:00
return fs
2013-09-07 12:06:42 +02:00
end
return factory