diff options
Diffstat (limited to 'awesome/.config/awesome/lain/widget/fs.lua')
| -rw-r--r-- | awesome/.config/awesome/lain/widget/fs.lua | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/awesome/.config/awesome/lain/widget/fs.lua b/awesome/.config/awesome/lain/widget/fs.lua new file mode 100644 index 0000000..b3a2dad --- /dev/null +++ b/awesome/.config/awesome/lain/widget/fs.lua @@ -0,0 +1,156 @@ +--[[ + + Licensed under GNU General Public License v2 + * (c) 2018, Uli Schlacter + * (c) 2018, Otto Modinos + * (c) 2013, Luca CPZ + +--]] + +local helpers = require("lain.helpers") +local Gio = require("lgi").Gio +local focused = require("awful.screen").focused +local wibox = require("wibox") +local naughty = require("naughty") +local gears = require("gears") +local math = math +local string = string +local tconcat = table.concat +local type = type +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 +-- lain.widget.fs + +local function factory(args) + args = args or {} + + local fs = { + widget = args.widget or wibox.widget.textbox(), + units = { + [1] = "Kb", [2] = "Mb", [3] = "Gb", + [4] = "Tb", [5] = "Pb", [6] = "Eb", + [7] = "Zb", [8] = "Yb" + } + } + + function fs.hide() + if not fs.notification then return end + naughty.destroy(fs.notification) + fs.notification = nil + end + + 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 + + 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 + + fs.followtag = args.followtag or false + fs.notification_preset = args.notification_preset + + if not fs.notification_preset then + fs.notification_preset = { + font = "Monospace 10", + fg = "#FFFFFF", + bg = "#000000" + } + end + + local function update_synced() + local pathlen = 10 + fs_now = {} + + local notifypaths = {} + 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 + 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 + notifypaths[#notifypaths+1] = path + + if #path > pathlen then + pathlen = #path + end + end + end + end + end + + widget = fs.widget + settings() + + 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 = string.format("%s is above %d%% (%d%%)", partition, threshold, fs_now[partition].percentage) + } + helpers.set_map(partition, true) + else + helpers.set_map(partition, false) + end + end + + 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 + + fs.notification_preset.text = tconcat(notifytable) + 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 + fs.widget:connect_signal('mouse::enter', function () fs.show(0) end) + fs.widget:connect_signal('mouse::leave', function () fs.hide() end) + end + + helpers.newtimer(partition or "fs", timeout, fs.update) + + return fs +end + +return factory |
