]> git.madduck.net Git - etc/awesome.git/blob - widget/fs.lua

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

e680a3c42a94065722708d7a5167cb6a8d4f4bf2
[etc/awesome.git] / widget / fs.lua
1 --[[
2
3      Licensed under GNU General Public License v2
4       * (c) 2018, Uli Schlacter
5       * (c) 2018, Otto Modinos
6       * (c) 2013, Luca CPZ
7
8 --]]
9
10 local helpers    = require("lain.helpers")
11 local Gio        = require("lgi").Gio
12 local focused    = require("awful.screen").focused
13 local wibox      = require("wibox")
14 local naughty    = require("naughty")
15 local math       = math
16 local sformat    = string.format
17 local tconcat    = table.concat
18 local tonumber   = tonumber
19 local query_size = Gio.FILE_ATTRIBUTE_FILESYSTEM_SIZE
20 local query_free = Gio.FILE_ATTRIBUTE_FILESYSTEM_FREE
21 local query_used = Gio.FILE_ATTRIBUTE_FILESYSTEM_USED
22 local query      = query_size .. "," .. query_free .. "," .. query_used
23
24 -- File systems info
25 -- lain.widget.fs
26
27 local function factory(args)
28     local fs = {
29         widget = wibox.widget.textbox(),
30         units = {
31             [1] = "Kb", [2] = "Mb", [3] = "Gb",
32             [4] = "Tb", [5] = "Pb", [6] = "Eb",
33             [7] = "Zb", [8] = "Yb"
34         }
35     }
36
37     function fs.hide()
38         if not fs.notification then return end
39         naughty.destroy(fs.notification)
40         fs.notification = nil
41     end
42
43     function fs.show(seconds, scr)
44         fs.hide(); fs.update()
45         fs.notification_preset.screen = fs.followtag and focused() or scr or 1
46         fs.notification = naughty.notify {
47             preset  = fs.notification_preset,
48             timeout = seconds or 5
49         }
50     end
51
52     local args      = args or {}
53     local timeout   = args.timeout or 600
54     local partition = args.partition
55     local showpopup = args.showpopup or "on"
56     local settings  = args.settings or function() end
57
58     fs.followtag           = args.followtag or false
59     fs.notification_preset = args.notification_preset
60
61     if not fs.notification_preset then
62         fs.notification_preset = {
63             font = "Monospace 10",
64             fg   = "#FFFFFF",
65             bg   = "#000000"
66         }
67     end
68
69     function fs.update()
70         local notifytable = { [1] = sformat("%-10s %-5s %s\t%s\t\n", "fs", "used", "free", "size") }
71         fs_now = {}
72
73         for _, mount in ipairs(Gio.unix_mounts_get()) do
74             local path = Gio.unix_mount_get_mount_path(mount)
75             local root = Gio.File.new_for_path(path)
76             local info = root:query_filesystem_info(query)
77
78             if info then
79                 local size = info:get_attribute_uint64(query_size)
80                 local used = info:get_attribute_uint64(query_used)
81                 local free = info:get_attribute_uint64(query_free)
82
83                 if size > 0 then
84                     local units = math.floor(math.log(size)/math.log(1024))
85
86                     fs_now[path] = {
87                         units      = fs.units[units],
88                         percentage = math.floor(100 * used / size), -- used percentage
89                         size       = size / math.pow(1024, math.floor(units)),
90                         used       = used / math.pow(1024, math.floor(units)),
91                         free       = free / math.pow(1024, math.floor(units))
92                     }
93
94                     if fs_now[path].percentage > 0 then -- don't notify unused file systems
95                         notifytable[#notifytable+1] = sformat("\n%-10s %-5s %3.2f\t%3.2f\t%s", path,
96                         fs_now[path].percentage .. "%", fs_now[path].free, fs_now[path].size,
97                         fs_now[path].units)
98                     end
99                 end
100             end
101         end
102
103         widget = fs.widget
104         settings()
105
106         if partition and fs_now[partition] and fs_now[partition].used >= 99 then
107             if not helpers.get_map(partition) then
108                 naughty.notify {
109                     preset = naughty.config.presets.critical,
110                     title  = "Warning",
111                     text   = partition .. " is full",
112                 }
113                 helpers.set_map(partition, true)
114             else
115                 helpers.set_map(partition, false)
116             end
117         end
118
119         fs.notification_preset.text = tconcat(notifytable)
120     end
121
122     if showpopup == "on" then
123        fs.widget:connect_signal('mouse::enter', function () fs.show(0) end)
124        fs.widget:connect_signal('mouse::leave', function () fs.hide() end)
125     end
126
127     helpers.newtimer(partition or "fs", timeout, fs.update)
128
129     return fs
130 end
131
132 return factory