require("awesome") require("naughty") -- Handle runtime errors after startup do local in_error = false awesome.add_signal("debug::error", function (err) -- Make sure we don't go into an endless error loop if in_error then return end in_error = true naughty.notify({ preset = naughty.config.presets.critical, title = "Oops, an error happened!", text = err }) in_error = false end) end local colors = { header = theme.fg_widget_clock, count = theme.fg_widget_label, index = theme.fg_widget_label, name = theme.fg_widget_value_important, } local function dbg_get(var, depth, indent) local a = "" local text = "" local name = "" local vtype = type(var) local vstring = tostring(var) if vtype == "table" or vtype == "userdata" then if vtype == "userdata" then var = getmetatable(var) end -- element count and longest key local count = 0 local longest_key = 3 for k,v in pairs(var) do count = count + 1 longest_key = math.max(#tostring(k), longest_key) end text = text .. vstring .. " #" .. count .. "" -- descend a table if depth > 0 then -- sort keys FIXME: messes up sorting number local sorted = {} for k, v in pairs(var) do table.insert(sorted, { k, v }) end table.sort(sorted, function(a, b) return tostring(a[1]) < tostring(b[1]) end) -- go through elements for _, p in ipairs(sorted) do local key = p[1]; local value = p[2] -- don't descend _M local d; if key ~= "_M" then d = depth - 1 else d = 0 end -- get content and add to output local content = dbg_get(value, d, indent + longest_key + 1) text = text .. '\n' .. string.rep(" ", indent) .. string.format("%-"..longest_key.."s %s", tostring(key), content) end end else if vtype == "tag" or vtype == "client" then name = " [" .. var.name:sub(1,10) .. "]" end text = text .. vstring .. name or "" end return text end function dbg(...) local num = table.maxn(arg) local text = "dbg #"..num.."" local depth = 2 for i = 1, num do local desc = dbg_get(arg[i], depth, 3) text = text .. string.format("\n%2d %s", i, desc) end naughty.notify{ text = text, timeout = 0, hover_timeout = 0.05, screen = screen.count() } end