mirror of
https://github.com/vincentbernat/i3wm-configuration.git
synced 2025-06-24 18:58:33 +02:00
debug: let dbg()
be the universal thing to debug.
Therefore, we can use it directly on client objects. In this case, we get full details.
This commit is contained in:
parent
8e531b9ca1
commit
edfc26accf
5 changed files with 111 additions and 102 deletions
|
@ -53,6 +53,9 @@ Here some of the things you may be interested in:
|
||||||
- Keybindings are "autodocumented". See `lib/keydoc.lua` to see how
|
- Keybindings are "autodocumented". See `lib/keydoc.lua` to see how
|
||||||
this works. The list of key bindings can be accessed with Mod4 +
|
this works. The list of key bindings can be accessed with Mod4 +
|
||||||
F1.
|
F1.
|
||||||
|
|
||||||
|
- On the debug front, I am quite happy with `dbg()` in
|
||||||
|
`rc/debug.lua`.
|
||||||
|
|
||||||
Things in `lib/` are meant to be reused. I am using my own `loadrc()`
|
Things in `lib/` are meant to be reused. I am using my own `loadrc()`
|
||||||
function to load modules and therefore, I prefix my modules with
|
function to load modules and therefore, I prefix my modules with
|
||||||
|
|
4
rc.lua
4
rc.lua
|
@ -36,6 +36,8 @@ function loadrc(name, mod)
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
loadrc("errors") -- errors and debug stuff
|
||||||
|
|
||||||
-- Global configuration
|
-- Global configuration
|
||||||
modkey = "Mod4"
|
modkey = "Mod4"
|
||||||
config = {}
|
config = {}
|
||||||
|
@ -66,7 +68,7 @@ config.hostname = awful.util.pread('uname -n'):gsub('\n', '')
|
||||||
-- Remaining modules
|
-- Remaining modules
|
||||||
loadrc("xrun") -- xrun function
|
loadrc("xrun") -- xrun function
|
||||||
loadrc("appearance") -- theme and appearance settings
|
loadrc("appearance") -- theme and appearance settings
|
||||||
loadrc("errors") -- errors and debug stuff
|
loadrc("debug") -- debugging primitive `dbg()`
|
||||||
|
|
||||||
loadrc("start") -- programs to run on start
|
loadrc("start") -- programs to run on start
|
||||||
loadrc("bindings") -- keybindings
|
loadrc("bindings") -- keybindings
|
||||||
|
|
|
@ -4,38 +4,6 @@ local volume = loadrc("volume", "vbe/volume")
|
||||||
local brightness = loadrc("brightness", "vbe/brightness")
|
local brightness = loadrc("brightness", "vbe/brightness")
|
||||||
local keydoc = loadrc("keydoc", "vbe/keydoc")
|
local keydoc = loadrc("keydoc", "vbe/keydoc")
|
||||||
|
|
||||||
local function client_info()
|
|
||||||
local v = ""
|
|
||||||
|
|
||||||
-- object
|
|
||||||
local c = client.focus
|
|
||||||
v = v .. tostring(c)
|
|
||||||
|
|
||||||
-- geometry
|
|
||||||
local cc = c:geometry()
|
|
||||||
local signx = (cc.x > 0 and "+") or ""
|
|
||||||
local signy = (cc.y > 0 and "+") or ""
|
|
||||||
v = v .. " @ " .. cc.width .. 'x' .. cc.height .. signx .. cc.x .. signy .. cc.y .. "\n\n"
|
|
||||||
|
|
||||||
local inf = {
|
|
||||||
"name", "icon_name", "type", "class", "role", "instance", "pid",
|
|
||||||
"skip_taskbar", "id", "group_window", "leader_id", "machine",
|
|
||||||
"screen", "hidden", "minimized", "size_hints_honor", "titlebar", "urgent",
|
|
||||||
"focus", "opacity", "ontop", "above", "below", "fullscreen", "transient_for",
|
|
||||||
"maximixed_horizontal", "maximixed_vertical", "sticky", "modal", "focusable"
|
|
||||||
}
|
|
||||||
|
|
||||||
for i = 1, #inf do
|
|
||||||
v = v .. string.format('%2s: <span color="%s">%-20s</span> = <span color="%s">%s</span>\n',
|
|
||||||
i,
|
|
||||||
beautiful.fg_widget_label, inf[i],
|
|
||||||
beautiful.fg_widget_value, tostring(c[inf[i]]))
|
|
||||||
end
|
|
||||||
|
|
||||||
naughty.notify{ text = string.format('<span font="Terminus 8">%s</span>', v:sub(1,#v-1)),
|
|
||||||
timeout = 0, margin = 10, screen = c.screen }
|
|
||||||
end
|
|
||||||
|
|
||||||
local function screenshot(client)
|
local function screenshot(client)
|
||||||
if not client then
|
if not client then
|
||||||
client = "root"
|
client = "root"
|
||||||
|
@ -132,7 +100,7 @@ config.keys.client = awful.util.table.join(
|
||||||
"Switch with master window"),
|
"Switch with master window"),
|
||||||
awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end,
|
awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end,
|
||||||
"Stay on top"),
|
"Stay on top"),
|
||||||
awful.key({ modkey, }, "i", client_info,
|
awful.key({ modkey, }, "i", dbg,
|
||||||
"Get client-related information"),
|
"Get client-related information"),
|
||||||
awful.key({ modkey, }, "m",
|
awful.key({ modkey, }, "m",
|
||||||
function (c)
|
function (c)
|
||||||
|
|
104
rc/debug.lua
Normal file
104
rc/debug.lua
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
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 client_info()
|
||||||
|
local v = ""
|
||||||
|
|
||||||
|
-- object
|
||||||
|
local c = client.focus
|
||||||
|
v = v .. tostring(c)
|
||||||
|
|
||||||
|
-- geometry
|
||||||
|
local cc = c:geometry()
|
||||||
|
local signx = (cc.x > 0 and "+") or ""
|
||||||
|
local signy = (cc.y > 0 and "+") or ""
|
||||||
|
v = v .. " @ " .. cc.width .. 'x' .. cc.height .. signx .. cc.x .. signy .. cc.y .. "\n\n"
|
||||||
|
|
||||||
|
local inf = {
|
||||||
|
"name", "icon_name", "type", "class", "role", "instance", "pid",
|
||||||
|
"skip_taskbar", "id", "group_window", "leader_id", "machine",
|
||||||
|
"screen", "hidden", "minimized", "size_hints_honor", "titlebar", "urgent",
|
||||||
|
"focus", "opacity", "ontop", "above", "below", "fullscreen", "transient_for",
|
||||||
|
"maximixed_horizontal", "maximixed_vertical", "sticky", "modal", "focusable"
|
||||||
|
}
|
||||||
|
|
||||||
|
for i = 1, #inf do
|
||||||
|
v = v .. string.format('%2s: <span color="%s">%-20s</span> = <span color="%s">%s</span>\n',
|
||||||
|
i,
|
||||||
|
beautiful.fg_widget_label, inf[i],
|
||||||
|
beautiful.fg_widget_value, tostring(c[inf[i]]))
|
||||||
|
end
|
||||||
|
|
||||||
|
naughty.notify{ text = string.format('<span font="Terminus 8">%s</span>', v:sub(1,#v-1)),
|
||||||
|
timeout = 0, margin = 10, screen = c.screen }
|
||||||
|
end
|
||||||
|
|
||||||
|
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 .. " <span color='"..colors.count.."'>#" .. count .. "</span>"
|
||||||
|
-- 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("<span color='"..colors.index.."'>%-"..longest_key.."s</span> %s",
|
||||||
|
tostring(key), content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if vtype == "tag" or vtype == "client" then
|
||||||
|
name = " [<span color='"..colors.name.."'>" .. var.name:sub(1,10) .. "</span>]"
|
||||||
|
end
|
||||||
|
text = text .. vstring .. name or ""
|
||||||
|
end
|
||||||
|
|
||||||
|
return text
|
||||||
|
end
|
||||||
|
|
||||||
|
function dbg(...)
|
||||||
|
local num = table.maxn(arg)
|
||||||
|
local text = "<span color='"..colors.header.."'>dbg</span> <span color='"..colors.count.."'>#"..num.."</span>"
|
||||||
|
local depth = 2
|
||||||
|
local clients = 0
|
||||||
|
|
||||||
|
for i = 1, num do
|
||||||
|
local desc = dbg_get(arg[i], depth, 3)
|
||||||
|
text = text .. string.format("\n<span color='"..colors.index.."'>%2d</span> %s", i, desc)
|
||||||
|
if type(arg[i]) == "client" then
|
||||||
|
client_info(arg[i])
|
||||||
|
clients = clients + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Display only if we don't have only clients to be displayed
|
||||||
|
if clients ~= num then
|
||||||
|
naughty.notify{ text = text, timeout = 0, hover_timeout = 0.05, screen = screen.count() }
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,6 +1,3 @@
|
||||||
require("awesome")
|
|
||||||
require("naughty")
|
|
||||||
|
|
||||||
-- Handle runtime errors after startup
|
-- Handle runtime errors after startup
|
||||||
do
|
do
|
||||||
local in_error = false
|
local in_error = false
|
||||||
|
@ -15,68 +12,3 @@ do
|
||||||
in_error = false
|
in_error = false
|
||||||
end)
|
end)
|
||||||
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 .. " <span color='"..colors.count.."'>#" .. count .. "</span>"
|
|
||||||
-- 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("<span color='"..colors.index.."'>%-"..longest_key.."s</span> %s",
|
|
||||||
tostring(key), content)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if vtype == "tag" or vtype == "client" then
|
|
||||||
name = " [<span color='"..colors.name.."'>" .. var.name:sub(1,10) .. "</span>]"
|
|
||||||
end
|
|
||||||
text = text .. vstring .. name or ""
|
|
||||||
end
|
|
||||||
|
|
||||||
return text
|
|
||||||
end
|
|
||||||
|
|
||||||
function dbg(...)
|
|
||||||
local num = table.maxn(arg)
|
|
||||||
local text = "<span color='"..colors.header.."'>dbg</span> <span color='"..colors.count.."'>#"..num.."</span>"
|
|
||||||
local depth = 2
|
|
||||||
|
|
||||||
for i = 1, num do
|
|
||||||
local desc = dbg_get(arg[i], depth, 3)
|
|
||||||
text = text .. string.format("\n<span color='"..colors.index.."'>%2d</span> %s", i, desc)
|
|
||||||
end
|
|
||||||
|
|
||||||
naughty.notify{ text = text, timeout = 0, hover_timeout = 0.05, screen = screen.count() }
|
|
||||||
end
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue