summaryrefslogtreecommitdiff
path: root/lain/widgets/mem.lua
blob: 46bb5f90dc593631b270b5d41ff428208382d8c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

--[[
                                                  
     Licensed under GNU General Public License v2 
      * (c) 2013,      Luke Bonham                
      * (c) 2010-2012, Peter Hofmann              
                                                  
--]]

local newtimer        = require("lain.helpers").newtimer

local wibox           = require("wibox")

local io              = { lines  = io.lines }
local math            = { floor  = math.floor }
local string          = { gmatch = string.gmatch }

local setmetatable    = setmetatable

-- Memory usage (ignoring caches)
-- lain.widgets.mem
local mem = {}

local function worker(args)
    local args     = args or {}
    local timeout  = args.timeout or 3
    local settings = args.settings or function() end

    mem.widget = wibox.widget.textbox('')

    function update()
        mem_now = {}
        for line in io.lines("/proc/meminfo")
        do
            for k, v in string.gmatch(line, "([%a]+):[%s]+([%d]+).+")
            do
                if     k == "MemTotal"  then mem_now.total = math.floor(v / 1024)
                elseif k == "MemFree"   then mem_now.free  = math.floor(v / 1024)
                elseif k == "Buffers"   then mem_now.buf   = math.floor(v / 1024)
                elseif k == "Cached"    then mem_now.cache = math.floor(v / 1024)
                elseif k == "SwapTotal" then mem_now.swap  = math.floor(v / 1024)
                elseif k == "SwapFree"  then mem_now.swapf = math.floor(v / 1024)
                end
            end
        end

        mem_now.used = mem_now.total - (mem_now.free + mem_now.buf + mem_now.cache)
        mem_now.swapused = mem_now.swap - mem_now.swapf

        widget = mem.widget
        settings()
    end

    newtimer("mem", timeout, update)

    return mem.widget
end

return setmetatable(mem, { __call = function(_, ...) return worker(...) end })