local wibox = require('wibox') local gears = require('gears') local beautiful = require('beautiful') local watch = require('awful.widget.watch') local icons = require('theme.icons') local dpi = beautiful.xresources.apply_dpi local total_prev = 0 local idle_prev = 0 local slider = wibox.widget { nil, { id = 'cpu_usage', max_value = 100, value = 29, forced_height = dpi(2), color = beautiful.fg_normal, background_color = beautiful.groups_bg, shape = gears.shape.rounded_rect, widget = wibox.widget.progressbar }, nil, expand = 'none', layout = wibox.layout.align.vertical } watch( [[bash -c "cat /proc/stat | grep '^cpu '"]], 5, function(_, stdout) local user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice = stdout:match('(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s') local total = user + nice + system + idle + iowait + irq + softirq + steal local diff_idle = idle - idle_prev local diff_total = total - total_prev local diff_usage = (1000 * (diff_total - diff_idle) / diff_total + 5) / 10 slider.cpu_usage:set_value(diff_usage) total_prev = total idle_prev = idle collectgarbage('collect') end ) local cpu_meter = wibox.widget { { { { image = icons.chart, resize = true, widget = wibox.widget.imagebox }, top = dpi(12), bottom = dpi(12), widget = wibox.container.margin }, slider, spacing = dpi(24), layout = wibox.layout.fixed.horizontal }, left = dpi(24), right = dpi(24), forced_height = dpi(48), widget = wibox.container.margin } return cpu_meter