获取可变大小的小部件的几何

时间:2017-12-05 07:42:13

标签: awesome-wm

场合

我有一个pop_up小部件(比如文本框),我可以通过相应地设置属性x和y任意放置在屏幕上。 另一方面,我使用提示,它位于默认的wibar中。

我想将pop_up小部件直接放在提示符

下面

问题

我还无法收集有关提示几何的任何有用信息。对于几何,我的意思是它的x和y值以及它的高度和宽度。我通过使用wibar本身的高度解决了y定位问题。 但我坚持使用x-positioning。 有没有办法在工具栏中获取小部件的宽度?

通知

我读了一些关于forced_width的内容,但在这种情况下,这对我来说听起来像是一个黑客。所以我宁愿避免强迫任何宽度。

我目前在Fedora 26上运行了令人敬畏的WM 4.2

1 个答案:

答案 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;弄清楚"旧几何。