部分问题是“a”小部件没有位置和大小,因为 awesome 允许小部件同时显示在多个位置。但是,如果我们忽略这个问题,类似以下的方法可能会起作用(老实说:我没有测试过):
function find_widget_in_wibox(wb, widget)
local function find_widget_in_hierarchy(h, widget)
if h:get_widget() == widget then
return h
end
local result
for _, ch in ipairs(h:get_children()) do
result = result or find_widget_in_hierarchy(ch, widget)
end
return result
end
local h = wb._drawable._widget_hierarchy
return h and find_widget_in_hierarchy(h, widget)
end
但是,我必须警告您,由于它访问非公共 API(带有wb._drawable._widget_hierarchy 的部分),因此上述内容可能会在新版本的 awesome 中出现问题。有一种方法可以使用 :find_widgets() 仅使用公共 API,但我现在懒得做。
上述函数获取wibox.hierarchy 实例,该实例表示一个小部件,该小部件允许通过以下方式获取提示的几何形状(在 awesome 4.2 的默认配置中):
local s = screen.primary -- Pick a screen to work with
local h = find_widget_in_wibox(s.mywibox, s.mypromptbox)
local x, y, width, height = h:get_matrix_to_device()
:transform_rectangle(0, 0, h:get_size())
local geo = s.mywibox:geometry()
x, y = x + geo.x, y + geo.y
print(string.format("The widget is inside of the rectangle (%d, %d, %d, %d) on the screen", x, y, width, height)
最后,请注意小部件层次结构仅在重绘期间更新。因此,在启动过程中,上面的代码将根本无法找到小部件,并且在发生某些更改后(例如,您在提示框中输入了另一个字符),上面的代码仍然会“找出”旧的几何图形。