场合
我有一个pop_up小部件(比如文本框),我可以通过相应地设置属性x和y任意放置在屏幕上。 另一方面,我使用提示,它位于默认的wibar中。
我想将pop_up小部件直接放在提示符
下面问题
我还无法收集有关提示几何的任何有用信息。对于几何,我的意思是它的x和y值以及它的高度和宽度。我通过使用wibar本身的高度解决了y定位问题。 但我坚持使用x-positioning。 有没有办法在工具栏中获取小部件的宽度?
通知
我读了一些关于forced_width的内容,但在这种情况下,这对我来说听起来像是一个黑客。所以我宁愿避免强迫任何宽度。
我目前在Fedora 26上运行了令人敬畏的WM 4.2
答案 0 :(得分:0)
问题的一部分是" a" widget没有位置和大小,因为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)
最后,请注意窗口小部件层次结构仅在重新绘制期间更新。因此,在启动过程中,上面的代码根本无法找到窗口小部件,并且在更改了某些内容之后(例如,您在提示框中输入了另一个字符),上面的代码仍然会#34;弄清楚"旧几何。