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

Get Geometry of widgets with variable size

情况

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

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

问题

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

通知

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

我目前在 Fedora 26 上 运行 很棒的 WM 4.2

部分问题是 "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

但是,我必须警告你上面的内容可能会破坏 awesome 的新版本,因为它访问非 public API(带有 wb._drawable._widget_hierarchy 的部分)。有一种方法可以使用 :find_widgets() 仅使用 public 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)

最后,请注意小部件层次结构仅在重绘期间更新。因此,在启动期间,上面的代码将完全找不到小部件,并且在发生某些更改后(例如,您在提示框中输入了另一个字符),上面的代码仍将 "figure out" 旧几何体。