本文来自依云's Blog,转载请注明。
所谓「相见恨晚」,说的就是我第一次看到 inspect.lua 的感觉啊!Lua 这个超小型主打嵌入的语言,连 Readline 都要第三方库来支持,自然是没 Python 那样的补全功能了。不仅如此,连一个展示其数据结构的函数都没有。包括自己在内,不少人零零散散写过各种打印 Lua 表的函数,但像 inspect.lua 这样子优秀的还是第一次见到。
基本用法啊示例什么的不说了,直接在对象上调用 inspect 函数就可以得到一个(可能是巨大的但一定不会是无限的)字符串表示,递归的结构会依据其类型和一个序号来辨识。
既得此神器,自然要用来看看我那自从升级到 3.5 版本之后就一直在慢慢泄漏内存的 Awesome 了:
>>> awesome-client awesome#inspect = dofile('tmpfs/inspect.lua') awesome#f = io.open('tmpfs/output.lua', 'w') awesome#f:write(inspect(_G)) awesome#f:close() awesome#f = nil
然后就是慢慢察看了。我注意到了这么一个变量:
raise_on_click = { [<client 13>] = true, [<client 12>] = true, [<client 14>] = true, [<client 15>] = true, [<client 16>] = true, [<client 17>] = true, [<client 18>] = true, [<client 19>] = true, [<client 20>] = true, [<client 21>] = true, ... }
这个变量由来已久,好像现在已经偏离了当初的设计目的了……不管它,反正呢,它里边保留了所有 Awesome 正管理的客户端对象,有 100 多个呢。可是,我怎么会同时有那么多窗口呢,明明才十几个啊?
检查一下配置文件,终于知道问题在哪里了:
diff --git a/rc.lua b/rc.lua index ad06296..c1422bd 100644 --- a/rc.lua +++ b/rc.lua @@ -991,7 +991,7 @@ end) client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) -client.add_signal("unmanage", function(c) +client.connect_signal("unmanage", function(c) raise_on_click[c] = nil end) -- }}}
add_signal
是 Awesome 3.4 的用法,3.5 应该用connect_signal
才对。这里的client.add_signal
是 Awesome 自己用的另外一个意思的函数……
Jan 11, 2014 11:24:19 PM
咱每次升级都会把自己的配置, 原默认配置和新默认配置diff3一下
Jan 12, 2014 12:29:16 AM
原来还有 diff3~我是升级之后就没原默认配置了,于是就只两方合并了……
Jan 27, 2014 04:10:09 AM
請問怎麼解決awesome裏gtk3的打開對話框會留在窗口列表的問題?似乎我只能重新載入awesome解決……
Jan 27, 2014 12:23:48 PM
我试过 gedit 的「打开」对话框了,没有重现。
你具体是哪个程序的哪个对话框会出现这个问题嘛,awesome 的版本是?
Jan 27, 2014 02:32:44 PM
抱歉我沒說清楚。我發現問題的是Awesome3.4,在用meld的打開對話框的時候。同樣的awesome3.4在gedit的about對話框和nautilus的about對話框也有類似的問題……剛纔去試了一下awesome3.5,沒有這個問題。看來估計是我自己的awesome3.4的配置出問題了……