local wibox = require("wibox")
local naughty = require("naughty")
local math = math
-local sformat = string.format
+local string = string
local tconcat = table.concat
+local type = type
local tonumber = tonumber
local query_size = Gio.FILE_ATTRIBUTE_FILESYSTEM_SIZE
local query_free = Gio.FILE_ATTRIBUTE_FILESYSTEM_FREE
fs.notification_preset.screen = fs.followtag and focused() or scr or 1
fs.notification = naughty.notify {
preset = fs.notification_preset,
- timeout = seconds or 5
+ timeout = type(seconds) == "number" and seconds or 5
}
end
local args = args or {}
local timeout = args.timeout or 600
local partition = args.partition
+ local threshold = args.threshold or 99
local showpopup = args.showpopup or "on"
local settings = args.settings or function() end
end
function fs.update()
- local notifytable = { [1] = sformat("%-10s %-5s %s\t%s\t\n", "fs", "used", "free", "size") }
+ local notifytable = { [1] = string.format("%-10s %-5s %s\t%s\t\n", "path", "used", "free", "size") }
+ local pathlen = 10
+ local maxpathidx = 1
fs_now = {}
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)
- 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
- size = size / math.pow(1024, math.floor(units)),
- used = used / math.pow(1024, math.floor(units)),
- free = free / math.pow(1024, math.floor(units))
- }
- -- don't notify unused file systems
- if fs_now[path].percentage > 0 then
- notifytable[#notifytable+1] = sformat("\n%-10s %-5s %3.2f\t%3.2f\t%s", path,
- fs_now[path].percentage .. "%", fs_now[path].free, fs_now[path].size,
- fs_now[path].units)
+ 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
+ size = size / math.pow(1024, math.floor(units)),
+ used = used / math.pow(1024, math.floor(units)),
+ free = free / math.pow(1024, math.floor(units))
+ }
+
+ if fs_now[path].percentage > 0 then -- don't notify unused file systems
+ notifytable[#notifytable+1] = string.format("\n%-10s %-3s\t%.2f\t%.2f\t%s", path,
+ math.floor(fs_now[path].percentage) .. "%", fs_now[path].free, fs_now[path].size,
+ fs_now[path].units)
+
+ if #path > pathlen then
+ pathlen = #path
+ maxpathidx = #notifytable
+ end
+ end
end
end
end
widget = fs.widget
settings()
- if partition and fs_now[partition] and fs_now[partition].used >= 99 then
+ if partition and fs_now[partition] and fs_now[partition].percentage >= threshold then
if not helpers.get_map(partition) then
naughty.notify {
preset = naughty.config.presets.critical,
title = "Warning",
- text = partition .. " is full",
+ text = string.format("%s is above %d%% (%d%%)", partition, threshold, fs_now[partition].percentage)
}
helpers.set_map(partition, true)
else
end
end
+ if pathlen > 10 then -- formatting aesthetics
+ local pathspaces
+ for i = 1, #notifytable do
+ pathspaces = notifytable[i]:match("[ ]+")
+ if i ~= maxpathidx and pathspaces then
+ notifytable[i] = notifytable[i]:gsub(pathspaces, pathspaces .. string.rep(" ", pathlen - 10))
+ end
+ end
+ end
+
fs.notification_preset.text = tconcat(notifytable)
end