【问题标题】:Get Geometry of widgets with variable size获取具有可变大小的小部件的几何形状
【发布时间】:2017-12-06 20:35:11
【问题描述】:

情况

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

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

问题

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

通知

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

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

【问题讨论】:

    标签: awesome-wm


    【解决方案1】:

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

    最后,请注意小部件层次结构仅在重绘期间更新。因此,在启动过程中,上面的代码将根本无法找到小部件,并且在发生某些更改后(例如,您在提示框中输入了另一个字符),上面的代码仍然会“找出”旧的几何图形。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2019-07-11
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      相关资源
      最近更新 更多