diff options
| author | streetturtle <streetturtle@users.noreply.github.com> | 2020-02-17 21:24:40 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-17 21:24:40 -0500 | 
| commit | 572d2590ef6e0abe3f0005904ee30aa9c2da7912 (patch) | |
| tree | 210a6a7f942723dfa6d59135452aca50679a08af /storage-widget | |
| parent | 541f6edd54cf827fe23c576db03e5b96339999d1 (diff) | |
| parent | d0de6acdd797c12af40bb79f69c3361c57ce8ee7 (diff) | |
Merge pull request #117 from reppard/reppard/storage-widget
storage-widget: initial implementation
Diffstat (limited to 'storage-widget')
| -rw-r--r-- | storage-widget/README.md | 24 | ||||
| -rw-r--r-- | storage-widget/out.gif | bin | 0 -> 103946 bytes | |||
| -rw-r--r-- | storage-widget/storage-widget.lua | 156 | 
3 files changed, 180 insertions, 0 deletions
diff --git a/storage-widget/README.md b/storage-widget/README.md new file mode 100644 index 0000000..48d2ffe --- /dev/null +++ b/storage-widget/README.md @@ -0,0 +1,24 @@ +# Storage Widget + +This widget shows disk usage. When clicked another widget appears with more detailed information. By default it monitors the "/" mount. It can be configured with a +list of mounts to monitor though only the first will show in the wibar. To have +multiple mounts displayed on the wibar simply define multiple `storage_widgets` +with different mounts as arguments. + + +```lua +  local storage_widget = require("awesome-wm-widgets.storage-widget.storage-widget") +  ... +  s.mywibox:setup { +      s.mytasklist, -- Middle widget +      { -- Right widgets +      storage_widget(), --default +      wibox.widget.textbox(':'), +      storage_widget({ mounts = { '/', '/mnt/musicj' } }), -- multiple mounts +  ... + +``` + +## Installation + +Please refer to the [installation](https://github.com/streetturtle/awesome-wm-widgets#installation) section of the repo. diff --git a/storage-widget/out.gif b/storage-widget/out.gif Binary files differnew file mode 100644 index 0000000..736f894 --- /dev/null +++ b/storage-widget/out.gif diff --git a/storage-widget/storage-widget.lua b/storage-widget/storage-widget.lua new file mode 100644 index 0000000..d719f60 --- /dev/null +++ b/storage-widget/storage-widget.lua @@ -0,0 +1,156 @@ +local awful = require("awful") +local watch = require("awful.widget.watch") +local wibox = require("wibox") +local beautiful = require("beautiful") +local gears = require("gears") + +local storage_graph_widget = {} + +local function worker(args) +    local args = args or {} +    local mounts = args.mounts or {'/'} + +    storage_graph_widget = wibox.widget { +        max_value = 100, +        forced_height = 20, +        forced_width = 35, +        paddings = 1, +        margins = 4, +        border_width = 0.5, +        border_color = beautiful.fg_normal, +        background_color = beautiful.bg_normal, +        bar_border_width = 1, +        bar_border_color = beautiful.bg_focus, +        color = "linear:150,0:0,0:0," +          .. beautiful.fg_normal +          .. ":0.3," .. beautiful.bg_urgent .. ":0.6," +          .. beautiful.fg_normal, +        widget = wibox.widget.progressbar, +    } + +    local disk_rows = { +        { widget = wibox.widget.textbox }, +        spacing = 4, +        layout = wibox.layout.fixed.vertical, +    } + +    local disk_header = { +      { +        markup = '<b>Mount</b>', +        forced_width = 150, +        align  = 'left', +        widget = wibox.widget.textbox, +      }, +      { +        markup = '<b>Used</b>', +        align  = 'left', +        widget = wibox.widget.textbox, +      }, +      layout = wibox.layout.align.horizontal +    } + +    local popup = awful.popup{ +        ontop         = true, +        visible       = false, +        shape         = gears.shape.rounded_rect, +        border_width  = 1, +        border_color  = beautiful.bg_normal, +        bg            = beautiful.bg_focus, +        maximum_width = 400, +        offset        = { y = 5 }, +        widget        = {} +    } +    popup:connect_signal("mouse::enter", function(c) is_update = false end) +    popup:connect_signal("mouse::leave", function(c) is_update = true end) + +    storage_graph_widget:buttons( +      awful.util.table.join( +        awful.button({}, 1, function() +          if popup.visible then +            popup.visible = not popup.visible +          else +            popup:move_next_to(mouse.current_widget_geometry) +          end +        end) +        ) +      ) + +    local disk_widget = wibox.container.margin(wibox.container.mirror(storage_graph_widget, { horizontal = true }), 0, 0, 0, 2) + +    local disks = {} +    watch([[bash -c "df | tail -n +2"]], 60, +        function(widget, stdout) +          for line in stdout:gmatch("[^\r\n$]+") do +            local filesystem, size, used, avail, perc, mount = +              line:match('([%p%w]+)%s+([%d%w]+)%s+([%d%w]+)%s+([%d%w]+)%s+([%d]+)%%%s+([%p%w]+)') + +            disks[mount]            = {} +            disks[mount].filesystem = filesystem +            disks[mount].size       = size +            disks[mount].used       = used +            disks[mount].avail      = avail +            disks[mount].perc       = perc +            disks[mount].mount      = mount + +            if disks[mount].mount == mounts[1] then +              widget.value = tonumber(disks[mount].perc) +            end +          end + +          for k,v in ipairs(mounts) do + +            local row = wibox.widget{ +              { +                  text = disks[v].mount, +                  forced_width = 150, +                  widget = wibox.widget.textbox +              }, +              { +                  max_value = 100, +                  value = tonumber(disks[v].perc), +                  forced_height = 20, +                  paddings = 1, +                  margins = 4, +                  border_width = 1, +                  border_color = beautiful.bg_focus, +                  background_color = beautiful.bg_normal, +                  bar_border_width = 1, +                  bar_border_color = beautiful.bg_focus, +                  color = "linear:150,0:0,0:0," +                    .. beautiful.fg_normal +                    .. ":0.3," .. beautiful.bg_urgent .. ":0.6," +                    .. beautiful.fg_normal, +                  widget = wibox.widget.progressbar, + +              }, +              { +                  text = math.floor(disks[v].used/1024/1024) +                    .. '/' +                    .. math.floor(disks[v].size/1024/1024) .. 'GB(' +                    .. math.floor(disks[v].perc) .. '%)', +                  widget = wibox.widget.textbox +              }, +              layout = wibox.layout.align.horizontal +            } + +            disk_rows[k] = row +          end +          popup:setup { +              { +                  disk_header, +                  disk_rows, +                  layout = wibox.layout.fixed.vertical, +              }, +              margins = 8, +              widget = wibox.container.margin +          } +        end, +        storage_graph_widget +    ) + +    return disk_widget +end + +return setmetatable(storage_graph_widget, { __call = function(_, ...) +    return worker(...) +end })  | 
