summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpu-widget/cpu-widget.lua165
1 files changed, 118 insertions, 47 deletions
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