From facfd47bd1f2226efbda4eeeb91a0eb34d56f2b8 Mon Sep 17 00:00:00 2001 From: streetturtle Date: Mon, 3 Feb 2020 22:40:47 -0500 Subject: Add list of processes to cpu widget --- cpu-widget/cpu-widget.lua | 165 +++++++++++++++++++++++++++++++++------------- 1 file changed, 118 insertions(+), 47 deletions(-) (limited to 'cpu-widget') diff --git a/cpu-widget/cpu-widget.lua b/cpu-widget/cpu-widget.lua index e5762f9..783be1d 100644 --- a/cpu-widget/cpu-widget.lua +++ b/cpu-widget/cpu-widget.lua @@ -35,7 +35,14 @@ local function worker(args) color = "linear:0,0:0,20:0,#FF0000:0.3,#FFFF00:0.6," .. color } - local rows = { + local cpu_rows = { + { widget = wibox.widget.textbox }, + spacing = 4, + layout = wibox.layout.fixed.vertical, + + } + + local process_rows = { { widget = wibox.widget.textbox }, spacing = 4, layout = wibox.layout.fixed.vertical, @@ -70,68 +77,132 @@ local function worker(args) --- 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 function starts_with(str, start) + return str:sub(1, #start) == start + end + local cpus = {} - watch([[bash -c "cat /proc/stat | grep '^cpu.'"]], 1, + watch([[bash -c "cat /proc/stat | grep '^cpu.' ; ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head"]], 1, function(widget, stdout) local i = 1 - for cur in stdout:gmatch("[^\r\n]+") do - if cpus[i] == nil then cpus[i] = {} end + local j = 1 + for line in stdout:gmatch("[^\r\n]+") do + if starts_with(line, 'cpu') then - 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+)') + if cpus[i] == nil then cpus[i] = {} end - local total = user + nice + system + idle + iowait + irq + softirq + steal + local name, user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice = + line:match('(%w+)%s+(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)%s(%d+)') - 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 + local total = user + nice + system + idle + iowait + irq + softirq + steal - cpus[i]['total_prev'] = total - cpus[i]['idle_prev'] = idle + 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 - if i == 1 then - widget:add_value(diff_usage) - end + cpus[i]['total_prev'] = total + cpus[i]['idle_prev'] = idle - 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 - }, + if i == 1 then + widget:add_value(diff_usage) + end + + local row = wibox.widget { - 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, + { + text = name, + forced_width = 40, + widget = wibox.widget.textbox + }, + { + text = math.floor(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 = "linear:150,0:0,0:0,#D08770:0.3,#BF616A:0.6," .. beautiful.fg_normal, + widget = wibox.widget.progressbar, + + }, + layout = wibox.layout.align.horizontal + } + + cpu_rows[i] = row + i = i + 1 + else + local pid, cmd, cpu, mem, cmd = line:match('(%d+)%s+(%w+)%s+([%d.]+)%s+([%d.]+)') + + if pid == nil then + pid = 'PID' + cmd = 'Name' + cpu = '%CPU' + mem = '%MEM' - }, - layout = wibox.layout.align.horizontal - } + end - rows[i] = row - i = i + 1 + local row = wibox.widget { + { + { + text = pid, + forced_width = 40, + widget = wibox.widget.textbox + }, + { + text = cmd, + forced_width = 40, + widget = wibox.widget.textbox + }, + { + { + text = cpu, + forced_width = 40, + widget = wibox.widget.textbox + }, + { + text = mem, + forced_width = 40, + widget = wibox.widget.textbox + }, + layout = wibox.layout.align.horizontal + }, + layout = wibox.layout.align.horizontal + }, + widget = wibox.container.background + } + + row:connect_signal("mouse::enter", function(c) c:set_bg(beautiful.bg_focus) end) + row:connect_signal("mouse::leave", function(c) c:set_bg(beautiful.bg_normal) end) + + + process_rows[j] = row + + j = j + 1 + end + end popup:setup { { - rows, - layout = wibox.layout.align.vertical, + cpu_rows, + { + orientation = 'horizontal', + forced_height = 15, + color = beautiful.bg_focus, + widget = wibox.widget.separator + }, + process_rows, + layout = wibox.layout.fixed.vertical, }, margins = 8, widget = wibox.container.margin -- cgit v1.2.3