diff options
-rw-r--r-- | cpu-widget/cpu-widget.lua | 117 |
1 files changed, 99 insertions, 18 deletions
diff --git a/cpu-widget/cpu-widget.lua b/cpu-widget/cpu-widget.lua index 0e027dd..e5762f9 100644 --- a/cpu-widget/cpu-widget.lua +++ b/cpu-widget/cpu-widget.lua @@ -5,12 +5,14 @@ -- https://github.com/streetturtle/awesome-wm-widgets/tree/master/cpu-widget -- @author Pavel Makhov --- @copyright 2019 Pavel Makhov +-- @copyright 2020 Pavel Makhov ------------------------------------------------- +local awful = require("awful") local watch = require("awful.widget.watch") local wibox = require("wibox") local beautiful = require("beautiful") +local gears = require("gears") local widget = {} @@ -33,33 +35,112 @@ local function worker(args) color = "linear:0,0:0,20:0,#FF0000:0.3,#FFFF00:0.6," .. color } - --- By default graph widget goes from left to right, so we mirror it and push up a bit - local cpu_widget = wibox.container.margin(wibox.container.mirror(cpugraph_widget, { horizontal = true }), 0, 0, 0, 2) - - local total_prev = 0 - local idle_prev = 0 + local rows = { + { widget = wibox.widget.textbox }, + spacing = 4, + layout = wibox.layout.fixed.vertical, - watch([[bash -c "cat /proc/stat | grep '^cpu '"]], 1, - function(widget, 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 popup = awful.popup{ + ontop = true, + visible = false, + shape = gears.shape.rounded_rect, + border_width = 1, + border_color = beautiful.bg_normal, + maximum_width = 300, + offset = { y = 5 }, + widget = {} + } - local diff_idle = idle - idle_prev - local diff_total = total - total_prev - local diff_usage = (1000 * (diff_total - diff_idle) / diff_total + 5) / 10 + cpugraph_widget:buttons( + awful.util.table.join( + awful.button({}, 1, function() + if popup.visible then + --rows = nil + popup.visible = not popup.visible + else + --init_popup() + popup:move_next_to(mouse.current_widget_geometry) + end + end) + ) + ) - widget:add_value(diff_usage) + --- By default graph widget goes from left to right, so we mirror it and push up a bit + local cpu_widget = wibox.container.margin(wibox.container.mirror(cpugraph_widget, { horizontal = true }), 0, 0, 0, 2) - total_prev = total - idle_prev = idle + local cpus = {} + watch([[bash -c "cat /proc/stat | grep '^cpu.'"]], 1, + function(widget, stdout) + local i = 1 + for cur in stdout:gmatch("[^\r\n]+") do + if cpus[i] == nil then cpus[i] = {} end + + local name, user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice = + cur:match('(%w+)%s+(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)') + + local total = user + nice + system + idle + iowait + irq + softirq + steal + + local diff_idle = idle - tonumber(cpus[i]['idle_prev'] == nil and 0 or cpus[i]['idle_prev']) + local diff_total = total - tonumber(cpus[i]['total_prev'] == nil and 0 or cpus[i]['total_prev']) + local diff_usage = (1000 * (diff_total - diff_idle) / diff_total + 5) / 10 + + cpus[i]['total_prev'] = total + cpus[i]['idle_prev'] = idle + + if i == 1 then + widget:add_value(diff_usage) + end + + local row = wibox.widget + { + { + text = name, + forced_width = 40, + widget = wibox.widget.textbox + }, + { + text = string.format('%i%%', diff_usage), + forced_width = 40, + widget = wibox.widget.textbox + }, + { + max_value = 100, + value = diff_usage, + forced_height = 20, + forced_width = 150, + 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 = beautiful.bg_focus, + widget = wibox.widget.progressbar, + + }, + layout = wibox.layout.align.horizontal + } + + rows[i] = row + + i = i + 1 + end + popup:setup { + { + rows, + layout = wibox.layout.align.vertical, + }, + margins = 8, + widget = wibox.container.margin + } end, cpugraph_widget ) return cpu_widget - end return setmetatable(widget, { __call = function(_, ...) |